JSP内置对象、Servlet与MVC

目录

  • 1、JSP内置对象
      • 1. 1、**`out` 对象**
      • 1.2、 **`request` 对象**
      • 1.3、 **`response` 对象**
      • 1.4、 **`session` 对象**
      • 1.5、 **`application` 对象**
      • 1.6、 **`cookie` 对象**
  • 2、Servlet
    • 2.1、Servlet 概念
    • 2.2、Servlet 体系结构
    • 2.3、Servlet 接口
    • 2.4、ServletConfig 接口
    • 2.5、Servlet 案例
      • 2.5.1 创建Servlet类
      • 2.5.2 配置web.xml
      • 2.5.3 部署和运行
    • 2.6、请求处理与响应
        • 基本用法
        • 多个URL映射
  • 3、MVC
    • 3.1、 MVC 的概念
    • 3.2、 MVC 的角色
      • 3.2.1、模型(Model)
      • 3.2.2、视图(View)
      • 3.2.3、控制器(Controller)
    • 3.3、MVC 的优点
      • 3.3.1、职责分离
      • 3.3.2、可维护性
      • 3.3.3、可扩展性
      • 3.3.4、可测试性
  • 4、Filter过滤器
    • 4.1、什么是过滤器
    • 4.2、过滤器的作用
    • 4.3、工作原理
      • 4.3.1、过滤器链
      • 4.3.2、过滤器的生命周期
    • 4.4、编写过滤器
      • 4.4.1、实现Filter接口
      • 4.4.2、示例代码
    • 4.5、配置过滤器
      • 4.5.1、使用web.xml配置
      • 4.5.2、使用注解配置
  • 5、EL表达式
    • 5.1、什么是EL表达式
    • 5.2、EL表达式的优势
    • 5.3、基本结构
    • 5.4、访问变量
    • 5.5、内置对象
    • 5.6、运算符
      • 5.6.1、算术运算符
      • 5.6.2、比较运算符
      • 5.6.3、逻辑运算符
      • 5.6.4、空值运算符
      • 5.6.5、字符串运算符
    • 5.7、访问对象属性
    • 5.8、访问集合
      • 5.8.1、访问List
      • 5.8.2、访问Map
  • 6、JSTL标签
    • 6.1、概述
      • 6.1.1、什么是JSTL
      • 6.1.2、JSTL的优势
    • 6.2、核心功能与标签库分类
      • 6.2.1、核心标签库(Core Tag Library)
      • 6.2.2、格式化标签库(Formatting Tag Library)
      • 6.2.3、SQL标签库(SQL Tag Library)
      • 6.2.4、XML标签库(XML Tag Library)
    • 6.3、核心标签库(Core Tag Library)
      • 6.3.1、`<c:out>`
      • 6.3.2、`<c:set>`
      • 6.3.3、`<c:if>`
      • 6.3.4、`<c:choose>`、`<c:when>`、`<c:otherwise>`
      • 6.3.5、`<c:forEach>`
      • 6.3.6、`<c:url>`
    • 6.4、格式化标签库(Formatting Tag Library)
      • 6.4.1、`<fmt:formatDate>`
      • 6.4.2、`<fmt:formatNumber>`
    • 6.5、示例

1、JSP内置对象


1. 1、out 对象

  • 类型javax.servlet.jsp.JspWriter

  • 作用:用于向客户端输出内容。

  • 常用方法

    • void print(String):输出字符串。
    • void println(String):输出字符串并换行。
    • void write(String):输出字符串。
    • void close():关闭输出流。
  • 特点

    • out 对象是一个带缓冲的输出流,类似于 PrintWriter,但功能更强大。
    • 可以通过 page 指令的 buffer 属性配置缓冲区大小。
  • 示例

    <%String name = "WeTab AI";out.println("Hello, " + name);
    %>
    

1.2、 request 对象

  • 类型javax.servlet.http.HttpServletRequest

  • 作用:代表客户端的HTTP请求,用于获取请求参数、请求头等信息。

  • 常用方法

    • String getParameter(String name):获取指定名称的请求参数值。
    • String[] getParameterValues(String name):获取指定名称的多个请求参数值(如复选框)。
    • Cookie[] getCookies():获取客户端发送的Cookie。
    • String getHeader(String name):获取指定的请求头信息。
    • HttpSession getSession():获取与当前请求关联的会话。
  • 特点

    • request 对象是客户端请求的入口,所有请求参数和请求头都可以通过它访问。
  • 示例

    <%String username = request.getParameter("username");out.println("Hello, " + username);
    %>
    

1.3、 response 对象

  • 类型javax.servlet.http.HttpServletResponse

  • 作用:代表服务器对客户端的响应,用于设置响应头、发送重定向、设置Cookie等。

  • 常用方法

    • void setContentType(String type):设置响应的内容类型。
    • void sendRedirect(String url):重定向到指定的URL。
    • void addCookie(Cookie cookie):向客户端添加Cookie。
  • 特点

    • response 对象是服务器响应的出口,可以控制响应的内容和行为。
  • 示例

    <%response.setContentType("text/html;charset=UTF-8");response.sendRedirect("https://www.example.com");
    %>
    

1.4、 session 对象

  • 类型javax.servlet.http.HttpSession

  • 作用:代表客户端的会话,用于在同一个用户多个请求之间共享数据。

  • 常用方法

    • void setAttribute(String name, Object value):在会话中存储数据。
    • Object getAttribute(String name):获取会话中的数据。
    • void invalidate():销毁会话。
    • String getId():获取会话ID。
  • 特点

    • session 对象是基于Cookie或URL重写实现的,默认情况下会话数据存储在服务器端。
    • 会话的生命周期从用户访问开始,直到会话超时或被销毁。
  • 示例

    <%session.setAttribute("username", "Alice");String username = (String) session.getAttribute("username");out.println("Hello, " + username);
    %>
    

1.5、 application 对象

  • 类型javax.servlet.ServletContext

  • 作用:代表当前Web应用程序的上下文,用于在多个用户和页面之间共享数据。

  • 常用方法

    • void setAttribute(String name, Object value):在应用程序范围内存储数据。
    • Object getAttribute(String name):获取应用程序范围内的数据。
    • String getInitParameter(String name):获取配置参数。
  • 特点

    • application 对象的生命周期与Web应用程序相同,从应用程序启动到停止。
    • 适合存储全局共享的数据,如配置信息或计数器。
  • 示例

    <%Integer count = (Integer) application.getAttribute("visitCount");if (count == null) {count = 1;} else {count++;}application.setAttribute("visitCount", count);out.println("Visit Count: " + count);
    %>
    

1.6、 cookie 对象

  • 类型javax.servlet.http.Cookie

  • 作用:代表客户端的Cookie数据,用于在客户端存储少量信息。

  • 常用方法

    • Cookie(String name, String value):创建一个新的Cookie。
    • void setMaxAge(int seconds):设置Cookie的过期时间。
    • void setPath(String path):设置Cookie的作用路径。
    • void setHttpOnly(boolean):设置Cookie是否只能通过HTTP访问。
  • 特点

    • Cookie是存储在客户端的小型文本文件,通常用于存储用户的偏好设置或会话标识。
    • 可以通过 request.getCookies() 获取客户端发送的Cookie。
  • 示例

    <%Cookie cookie = new Cookie("username", "Bob");cookie.setMaxAge(3600); // 1小时response.addCookie(cookie);
    %>
    

2、Servlet

Servlet是Java EE平台中一个重要的组成部分,主要用于处理客户端请求并生成动态Web内容。

2.1、Servlet 概念

Servlet是运行在Web服务器或应用服务器上的Java类,它不能独立运行,必须依赖于Servlet容器(如Tomcat、Jetty等)。Servlet的主要功能是接收客户端请求,处理业务逻辑,并生成响应返回给客户端。

  • 作用:处理HTTP请求和响应,生成动态内容。
  • 特性:跨平台、安全性高、可扩展性强。

2.2、Servlet 体系结构

Servlet的体系结构主要包括以下几个部分:

  1. Servlet容器:负责Servlet的生命周期管理,如启动、停止、加载和卸载Servlet。
  2. Servlet:处理客户端请求的Java类,实现特定的逻辑。
  3. Web应用程序:一组相关联的资源,包括Servlet、JSP、HTML文件等,部署在Servlet容器中。
  4. 配置文件web.xml,用于配置Servlet、过滤器、监听器等组件。

2.3、Servlet 接口

Servlet接口是所有Servlet类必须实现的接口,它定义了Servlet的生命周期方法:

  • public void init(ServletConfig config) throws ServletException:初始化Servlet,只调用一次。
  • public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException:处理客户端请求,每次请求都会调用。
  • public void destroy():释放Servlet占用的资源,Servlet被卸载时调用。

此外,Servlet还可以继承HttpServlet类,它已经实现了Servlet接口,并提供了doGet、doPost等方法,方便处理HTTP请求。

2.4、ServletConfig 接口

ServletConfig接口用于存储Servlet的配置信息,如Servlet名称、初始化参数等。Servlet容器在初始化Servlet时,会将ServletConfig对象传递给init方法。

  • getServletName():获取Servlet的名称。
  • getInitParameter(String name):获取指定名称的初始化参数。
  • getInitParameterNames():获取所有初始化参数的名称。

2.5、Servlet 案例

下面是一个简单的HelloWorld Servlet示例:

2.5.1 创建Servlet类

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class HelloWorldServlet extends HttpServlet {private static final long serialVersionUID = 1L;public HelloWorldServlet() {super();}public void init() throws ServletException {// 初始化代码}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html");response.setCharacterEncoding("UTF-8");response.getWriter().println("<h1>Hello, World!</h1>");}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 处理POST请求}public void destroy() {// 销毁代码}
}

2.5.2 配置web.xml

WEB-INF目录下的web.xml文件中配置Servlet:

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"version="3.1"><servlet><servlet-name>HelloWorldServlet</servlet-name><servlet-class>HelloWorldServlet</servlet-class></servlet><servlet-mapping><servlet-name>HelloWorldServlet</servlet-name><url-pattern>/hello</url-pattern></servlet-mapping>
</web-app>

2.5.3 部署和运行

将Web应用程序部署到Tomcat服务器,启动服务器,访问http://localhost:8080/your-webapp-context/hello,应该会看到Hello, World!的输出。

2.6、请求处理与响应

Servlet通过service方法处理客户端请求,根据请求的方法(如GET、POST)调用相应的do方法(如doGet、doPost)。在方法中,可以获取请求参数、设置响应头、输出响应内容等。

  • 获取请求参数

    String param = request.getParameter("paramName");
    
  • 设置响应头

    response.setContentType("text/html");
    response.setCharacterEncoding("UTF-8");
    
  • 输出响应内容

    PrintWriter out = response.getWriter();
    out.println("<html><body>");
    out.println("<h1>Hello, World!</h1>");
    out.println("</body></html>");
    

通过这些方法,Servlet可以灵活地处理各种HTTP请求,并生成动态的HTML内容返回给客户端。

  • 通过@WebServlet注解来代替xml文件

    在Servlet 3.0规范及更高版本中,引入了注解配置的方式,使得开发者可以不用再手动编辑web.xml文件来配置Servlet、过滤器等组件。通过使用@WebServlet注解,可以方便地映射URL到Servlet类上。

    基本用法

    最基本的用法是直接在Servlet类上添加@WebServlet注解,并指定URL模式:

    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;@WebServlet("/hello")
    public class HelloWorldServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {response.setContentType("text/html");response.getWriter().write("<h1>Hello, World!</h1>");}
    }
    

    在这个例子中,@WebServlet("/hello")表示将URL路径/hello映射到HelloWorldServlet类上。

    多个URL映射

    如果一个Servlet需要处理多个URL路径,可以使用数组的形式指定多个URL模式:

    @WebServlet({ "/hello", "/hi" })
    public class HelloWorldServlet extends HttpServlet {// ...
    }
    

    这样,访问/hello/hi都会被映射到同一个Servlet上。

3、MVC

3.1、 MVC 的概念

MVC 是一种将应用程序的逻辑分离的设计模式,它将应用程序分为三个核心部分:

  1. 模型(Model):负责处理应用程序的数据逻辑,与数据库、文件系统等数据源交互,提供数据的存储、检索和更新功能。
  2. 视图(View):负责展示数据,将模型中的数据显示给用户,通常是用户界面(UI)部分。
  3. 控制器(Controller):负责处理用户输入,并决定如何与模型和视图交互,是应用程序的核心逻辑层。

通过将应用程序的不同职责分离到不同的组件中,MVC模式使得代码更易于维护、扩展和测试。


3.2、 MVC 的角色

3.2.1、模型(Model)

  • 功能

    • 处理应用程序的数据逻辑。
    • 负责与数据源(如数据库、文件系统)进行交互。
    • 提供数据的增删改查(CRUD)操作。
  • 特点

    • 与业务逻辑紧密相关。
    • 不关心数据的展示方式,只负责数据的管理。
  • 示例

    • 在Java中,模型通常是一个Java类,封装了数据的属性和操作方法。

    • 例如:

      public class User {private String name;private int age;// Getter 和 Setter 方法public String getName() { return name; }public void setName(String name) { this.name = name; }public int getAge() { return age; }public void setAge(int age) { this.age = age; }
      }
      

3.2.2、视图(View)

  • 功能

    • 负责将模型中的数据显示给用户。
    • 通常是用户界面(UI)部分,如HTML页面、JSP页面、移动端界面等。
  • 特点

    • 与业务逻辑无关,只负责数据的展示。
    • 视图通常是被动接收数据,不直接与模型交互。
  • 示例

    • 在Web开发中,视图通常是HTML或JSP页面。

    • 例如:

      <html>
      <body><h1>User Information</h1><p>Name: ${user.name}</p><p>Age: ${user.age}</p>
      </body>
      </html>
      

3.2.3、控制器(Controller)

  • 功能

    • 接收用户的请求,并根据请求调用相应的模型和视图。
    • 处理业务逻辑,决定数据的流向。
  • 特点

    • 是模型和视图之间的桥梁,负责协调它们的工作。
    • 处理用户的输入和输出,决定如何处理请求。
  • 示例

    • 在Java Web开发中,控制器通常是一个Servlet。

    • 例如:

      @WebServlet("/user")
      public class UserController extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 获取用户数据(模型)User user = new User();user.setName("John Doe");user.setAge(30);// 将数据传递给视图request.setAttribute("user", user);request.getRequestDispatcher("/user.jsp").forward(request, response);}
      }
      

3.3、MVC 的优点

3.3.1、职责分离

MVC模式将应用程序的不同职责分离到不同的组件中,使得代码结构更清晰,易于维护。

3.3.2、可维护性

由于模型、视图和控制器是独立的,所以在修改某个部分时,不会影响到其他部分。例如,修改视图的样式不会影响业务逻辑。

3.3.3、可扩展性

通过MVC模式,可以方便地扩展应用程序的功能。例如,可以很容易地添加新的控制器或视图来支持新的业务需求。

3.3.4、可测试性

由于MVC的职责分离,每个部分都可以独立测试。例如,可以单独测试模型层的业务逻辑,而无需依赖视图。

4、Filter过滤器

4.1、什么是过滤器

过滤器是Servlet规范中定义的一种组件,它可以在Web应用程序中对请求和响应进行拦截和处理。过滤器可以对多个Servlet或JSP页面进行统一的处理,而无需在每个Servlet或JSP中重复编写相同的代码。

4.2、过滤器的作用

过滤器的主要作用包括:

  • 用户认证:在请求到达Servlet之前,检查用户是否已登录,如果没有登录,则重定向到登录页面。

  • 日志记录:记录请求和响应的信息,用于调试和监控。

  • 内容压缩:在响应返回给客户端之前,对响应内容进行压缩,以减少传输时间。

  • 编码处理:统一设置请求和响应的字符编码,避免乱码问题。

  • 授权控制:根据用户角色和权限,决定是否允许访问某些资源。


4.3、工作原理

4.3.1、过滤器链

多个过滤器可以组成一个过滤器链(Filter Chain),每个过滤器都可以对请求和响应进行处理。过滤器链的执行顺序由Web应用程序的部署描述符(如web.xml)或注解配置决定。

4.3.2、过滤器的生命周期

过滤器的生命周期由Servlet容器管理,主要包括以下几个阶段:

  • 初始化:当Servlet容器启动时,会创建过滤器实例,并调用其init方法进行初始化。

  • 服务:每当有请求匹配过滤器的映射规则时,Servlet容器会调用过滤器的doFilter方法对请求和响应进行处理。

  • 销毁:当Servlet容器关闭或重新加载Web应用程序时,会调用过滤器的destroy方法,释放过滤器占用的资源。


4.4、编写过滤器

4.4.1、实现Filter接口

要创建一个过滤器,需要实现javax.servlet.Filter接口,并重写其中的三个方法:

  • init(FilterConfig filterConfig):初始化方法,在过滤器实例创建时调用,可以在这里进行一些初始化操作,如获取初始化参数。

  • doFilter(ServletRequest request, ServletResponse response, FilterChain chain):核心处理方法,对请求和响应进行处理。

  • destroy():销毁方法,在过滤器实例被销毁前调用,用于释放资源。

4.4.2、示例代码

下面是一个简单的过滤器示例,用于记录请求的URL和方法:

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;@WebFilter("/*")
public class LoggingFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("LoggingFilter initialized.");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {HttpServletRequest httpRequest = (HttpServletRequest) request;System.out.println("Request URL: " + httpRequest.getRequestURL());System.out.println("Request Method: " + httpRequest.getMethod());// 继续处理请求chain.doFilter(request, response);}@Overridepublic void destroy() {System.out.println("LoggingFilter destroyed.");}
}

4.5、配置过滤器

4.5.1、使用web.xml配置

在传统的Servlet配置中,可以在web.xml文件中配置过滤器:

<filter><filter-name>LoggingFilter</filter-name><filter-class>com.example_loggingfilter</filter-class>
</filter><filter-mapping><filter-name>LoggingFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

4.5.2、使用注解配置

在Servlet 3.0及更高版本中,可以使用@WebFilter注解来简化过滤器的配置:

import javax.servlet.annotation.WebFilter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;@WebFilter("/*")
public class LoggingFilter implements Filter {// 实现Filter接口的方法
}

5、EL表达式

5.1、什么是EL表达式

EL表达式(Expression Language)是JSP 2.0规范中引入的一种简单表达式语言,主要用于在JSP页面中访问和操作数据。EL表达式以“${”开头,“}”结尾,可以在JSP页面中直接嵌入,而无需编写脚本代码。

5.2、EL表达式的优势

  • 简洁性:EL表达式语法简洁,易于阅读和编写。

  • 易于维护:减少了JSP页面中的脚本代码,使得页面更加清晰和易于维护。

  • 与JSTL结合使用:EL表达式常与JSTL(JSP Standard Tag Library)结合使用,进一步提高了JSP开发的效率。

5.3、基本结构

EL表达式的最基本形式是:

${expression}

其中,expression是需要计算的表达式。

5.4、访问变量

EL表达式可以访问以下几种变量:

  • 页面作用域变量:通过pageContext对象访问。

  • 请求作用域变量:通过request对象访问。

  • 会话作用域变量:通过session对象访问。

  • 应用程序作用域变量:通过application对象访问。

例如:

  • 访问请求作用域的"name"变量:${requestScope.name}

  • 访问会话作用域的"user"变量:${sessionScope.user}

  • 访问应用程序作用域的"config"变量:${applicationScope.config}

  • 访问页面作用域的"param"变量:${param.paramName}

5.5、内置对象

EL表达式提供了一些内置对象,可以直接在表达式中使用:

  • pageContext:访问JSP页面的PageContext对象。

  • request:访问HttpServletRequest对象。

  • session:访问HttpSession对象。

  • application:访问ServletContext对象。

  • param:访问请求参数。

  • paramValues:访问多个同名请求参数。

  • header:访问请求头信息。

  • headerValues:访问多个同名请求头信息。

  • cookie:访问Cookie信息。

  • initParam:访问ServletContext的初始化参数。

例如:

  • 访问请求参数"name":${param.name}

  • 访问请求头"User-Agent":${header['User-Agent']}


5.6、运算符

EL表达式支持以下运算符:

5.6.1、算术运算符

  • 加法:+

  • 减法:-

  • 乘法:*

  • 除法:/

  • 模运算:%

例如:

  • ${5 + 3} 结果为8

  • ${10 / 2} 结果为5

5.6.2、比较运算符

  • 等于:==

  • 不等于:!=

  • 小于:<

  • 大于:>

  • 小于等于:<=

  • 大于等于:>=

例如:

  • ${5 == 5} 结果为true

  • ${10 < 5} 结果为false

5.6.3、逻辑运算符

  • 与:&&

  • 或:||

  • 非:!

例如:

  • ${true && false} 结果为false

  • ${true || false} 结果为true

  • ${!false} 结果为true

5.6.4、空值运算符

  • 空值合并运算符:??

如果左边的值为null,则返回右边的值。

例如:

  • ${name ?? 'default'} 如果name为null,则返回’default’

5.6.5、字符串运算符

  • 字符串连接:+

例如:

  • ${'Hello' + ' World'} 结果为’Hello World’

5.7、访问对象属性

假设有一个JavaBean类Person,有name和age属性:

public class Person {private String name;private int age;// getters and setters
}

在JSP页面中,可以这样访问:

  • ${person.name}

  • ${person.age}


如果JavaBean有嵌套属性,也可以链式访问。

假设Person对象有一个Address属性,Address有street和city属性:

public class Address {private String street;private String city;// getters and setters
}public class Person {private String name;private int age;private Address address;// getters and setters
}

在JSP页面中,可以这样访问:

  • ${person.address.street}

  • ${person.address.city}


5.8、访问集合

5.8.1、访问List

假设有一个List对象items,包含多个字符串:

List<String> items = Arrays.asList("apple", "banana", "cherry");
request.setAttribute("items", items);

在JSP页面中,可以这样访问:

  • ${items[0]} 结果为"apple"

  • ${items[2]} 结果为"cherry"

5.8.2、访问Map

假设有一个Map对象map,键为字符串,值为整数:

Map<String, Integer> map = new HashMap<>();
map.put("one", 1);
map.put("two", 2);
request.setAttribute("map", map);

在JSP页面中,可以这样访问:

  • ${map['one']} 结果为1

  • ${map.two} 结果为2

6、JSTL标签

6.1、概述

6.1.1、什么是JSTL

JSTL是JSP标准标签库,它定义了一组标准标签,用于执行常见的JSP开发任务。通过使用JSTL标签,开发者可以避免在JSP页面中嵌入大量的Java代码,从而使页面更加简洁、易于维护和阅读。

6.1.2、JSTL的优势

  • 减少脚本代码:使用JSTL标签可以减少JSP页面中的脚本代码(如<% %>),提高页面的可读性。

  • 提高开发效率:JSTL提供了许多现成的标签,可以直接完成常见的任务,如条件判断、循环、国际化等。

  • 可重用性:JSTL标签库可以被多个JSP页面重用,减少了重复代码。

  • 易于维护:通过标签库,JSP页面可以更加结构化,便于团队协作和维护。


6.2、核心功能与标签库分类

JSTL标签库主要分为以下几类:

6.2.1、核心标签库(Core Tag Library)

核心标签库提供了常用的标签,如条件判断、循环、变量操作、URL处理等。

核心标签库的URI:http://java.sun.com/jsp/jstl/core

核心标签库的前缀通常为c

6.2.2、格式化标签库(Formatting Tag Library)

格式化标签库用于格式化日期、数字、货币等数据,支持国际化和本地化。

格式化标签库的URI:http://java.sun.com/jsp/jstl/fmt

格式化标签库的前缀通常为fmt

6.2.3、SQL标签库(SQL Tag Library)

SQL标签库提供了对数据库的操作支持,如查询、插入、更新和删除等。

SQL标签库的URI:http://java.sun.com/jsp/jstl/sql

SQL标签库的前缀通常为sql

6.2.4、XML标签库(XML Tag Library)

XML标签库提供了对XML文档的操作支持,如解析、转换、遍历等。

XML标签库的URI:http://java.sun.com/jsp/jstl/xml

XML标签库的前缀通常为x


6.3、核心标签库(Core Tag Library)

核心标签库是JSTL中最常用的一部分,提供了以下功能标签:

6.3.1、<c:out>

用于输出表达式的值,类似于JSP中的<%= %>

语法

<c:out value="${expression}" default="defaultValue" escapeXml="true|false"/>

示例

<c:out value="${user.name}" default="Guest"/>

如果${user.name}为空,则输出"Guest"。

6.3.2、<c:set>

用于设置变量的值或对象的属性。

语法

<c:set var="variableName" value="${expression}" scope="page|request|session|application"/>

示例

<c:set var="username" value="${user.name}" scope="session"/>

${user.name}的值赋给username,并存储在会话作用域中。

6.3.3、<c:if>

用于条件判断。

语法

<c:if test="${condition}"><!-- 如果条件为真,执行这里的代码 -->
</c:if>

示例

<c:if test="${user.age > 18}"><p>You are an adult.</p>
</c:if>

6.3.4、<c:choose><c:when><c:otherwise>

类似于Java中的switch-case语句,用于多条件判断。

语法

<c:choose><c:when test="${condition1}"><!-- 如果 condition1 为真,执行这里的代码 --></c:when><c:when test="${condition2}"><!-- 如果 condition2 为真,执行这里的代码 --></c:when><c:otherwise><!-- 如果所有条件都不满足,执行这里的代码 --></c:otherwise>
</c:choose>

示例

<c:choose><c:when test="${user.age < 18}"><p>You are a minor.</p></c:when><c:when test="${user.age >= 18 && user.age < 60}"><p>You are an adult.</p></c:when><c:otherwise><p>You are a senior.</p></c:otherwise>
</c:choose>

6.3.5、<c:forEach>

用于遍历集合或数组。

语法

<c:forEach var="item" items="${collection}"><!-- 遍历集合中的每个元素 -->
</c:forEach>

示例

<c:forEach var="item" items="${items}"><p>${item}</p>
</c:forEach>

6.3.6、<c:url>

用于创建URL,支持编码。

语法

<c:url value="/path" var="urlVariable"/>

示例

<c:url value="/user/profile" var="profileUrl"/>
<a href="${profileUrl}">View Profile</a>

6.4、格式化标签库(Formatting Tag Library)

格式化标签库用于格式化数据,如日期、数字、货币等。

6.4.1、<fmt:formatDate>

用于格式化日期。

语法

<fmt:formatDate value="${date}" pattern="yyyy-MM-dd"/>

示例

<fmt:formatDate value="${now}" pattern="yyyy-MM-dd HH:mm:ss"/>

6.4.2、<fmt:formatNumber>

用于格式化数字。

语法

<fmt:formatNumber value="${number}" type="currency"/>

示例

<fmt:formatNumber value="${price}" type="currency" currencyCode="USD"/>

6.5、示例

以下是一个完整的JSP页面示例,展示了JSTL标签的使用:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %><html>
<head><title>JSTL Example</title>
</head>
<body><h1>JSTL Example</h1><!-- 输出变量 --><p>User Name: <c:out value="${user.name}"/></p><!-- 条件判断 --><c:if test="${user.age > 18}"><p>You are an adult.</p></c:if><!-- 多条件判断 --><c:choose><c:when test="${user.age < 18}"><p>You are a minor.</p></c:when><c:otherwise><p>You are an adult or senior.</p></c:otherwise></c:choose><!-- 遍历集合 --><c:forEach var="item" items="${items}"><p>${item}</p></c:forEach><!-- 格式化日期 --><p>Current Date: <fmt:formatDate value="${now}" pattern="yyyy-MM-dd HH:mm:ss"/></p><!-- 格式化数字 --><p>Price: <fmt:formatNumber value="${price}" type="currency" currencyCode="USD"/></p></body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/66352.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文解读 | NeurIPS'24 IRCAN:通过识别和重新加权上下文感知神经元来减轻大语言模型生成中的知识冲突...

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 点击 阅读原文 观看作者讲解回放&#xff01; 作者简介 史丹&#xff0c;天津大学博士生 内容简介 大语言模型&#xff08;LLM&#xff09;经过海量数据训练后编码了丰富的世界知识。最近的研究表明&#xff0c…

大语言模型训练所需的最低显存,联邦大语言模型训练的传输优化技术

联邦大语言模型训练的传输优化技术 目录 联邦大语言模型训练的传输优化技术大语言模型训练所需的最低显存大语言模型训练所需的最低显存 基于模型微调、压缩和分布式并行处理的方法,介绍了相关开源模型及技术应用 核心创新点 多维度优化策略:综合运用基于模型微调、模型压缩和…

(CICD)自动化构建打包、部署(Jenkins + maven+ gitlab+tomcat)

一、平滑发布与灰度发布 **什么叫平滑&#xff1a;**在发布的过程中不影响用户的使用&#xff0c;系统不会因发布而暂停对外服务&#xff0c;不会造成用户短暂性无法访问&#xff1b; **什么叫灰度&#xff1a;**发布后让部分用户使用新版本&#xff0c;其它用户使用旧版本&am…

Python 科学计算

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

【pytorch】注意力机制-1

1 注意力提示 1.1 自主性的与非自主性的注意力提示 非自主性提示&#xff1a; 可以简单地使用参数化的全连接层&#xff0c;甚至是非参数化的最大汇聚层或平均汇聚层。 自主性提示 注意力机制与全连接层或汇聚层区别开来。在注意力机制的背景下&#xff0c;自主性提示被称为查…

Qt窗口获取Tftpd32_svc服务下载信息

前言 一个由Qt开发的Windows小工具需要布置Tftp协议服务端来支持设备下载数据&#xff0c;并显示下载列表&#xff08;进度、下载源等&#xff09;。 考虑开发方便&#xff0c;优先使用了Qtftp方案&#xff0c;经测试发现&#xff0c;不够稳定&#xff0c;会有下载超时的情况&a…

<OS 有关> DOS 批处理命令文件,用于创建 python 虚拟机,并进入虚拟机状态执行后继命令 判断虚拟机是否存在,在批处理文件中自定义 虚拟机名字

前言&#xff1a; 经常要敲重复的命令&#xff1a; python -m venv venv.\venv\Scripts\activate.bat (虽然能按 Tab 省几下&#xff0c;多了也烦恼&#xff0c;后来写了四行脚本 start.bat) DOS批处理 create_venv_start.bat 功能&#xff1a; 批处理显示支持中文在 creat…

【算法刷题】leetcode hot 100 哈希篇

文章目录 1. 两数之和49. 字母异位词分组128. 最长连续序列总结 1. 两数之和 leetcode&#xff1a;https://leetcode.cn/problems/two-sum/description/?envTypestudy-plan-v2&envIdtop-100-liked暴力解决&#xff1a; public int[] twoSum(int[] nums, int target) {for …

iOS 逆向学习 - iOS Architecture Cocoa Touch Layer

iOS 逆向学习 - iOS Architecture Cocoa Touch Layer 一、Cocoa Touch Layer 简介二、Cocoa Touch Layer 的核心功能1. UIKit2. Event Handling&#xff08;事件处理&#xff09;3. Multitasking&#xff08;多任务处理&#xff09;4. Push Notifications&#xff08;推送通知&…

网站常用功能模块-鉴权

一&#xff1a;JWT是什么&#xff1f; 常用鉴权方式有很多种&#xff0c;今天主要介绍基于token的鉴权方式JWT&#xff08;Json JSON Web Token&#xff09;。因为这种方式实现起来方便快捷。整体实现逻辑如下 第一次登陆时&#xff0c;前端携带账号和密码请求登录接口。服务…

stm32的掉电检测机制——PVD

有时在一些应用中&#xff0c;我们需要检测系统是否掉电了&#xff0c;或者要在掉电的瞬间需要做一些处理。 STM32内部自带PVD功能&#xff0c;用于对MCU供电电压VDD进行监控。 STM32就有这样的掉电检测机制——PVD(Programmable Voltage Detecter)&#xff0c;即可编程电压检…

Flink系列知识讲解之:深入了解 Flink 的网络协议栈

Flink系列知识之&#xff1a;深入了解 Flink 的网络协议栈 Flink 的网络协议栈是组成 flink-runtime 模块的核心组件之一&#xff0c;也是每个 Flink 任务的核心。它连接着来自所有任务管理器的各个工作单元&#xff08;子任务&#xff09;。这是流数据流过的地方&#xff0c;…

基于深度学习的视觉检测小项目(六) 项目的信号和变量的规划

• 关于前后端分离 当前流行的一种常见的前后端分离模式是vueflask&#xff0c;vueflask模式的前端和后端之间进行数据的传递通常是借助 API&#xff08;应用程序编程接口&#xff09;来完成的。vue通过调用后端提供的 API 来获取或提交数据。例如&#xff0c;前端可能通过发送…

党员学习交流平台

本文结尾处获取源码。 本文结尾处获取源码。 本文结尾处获取源码。 一、相关技术 后端&#xff1a;Java、JavaWeb / Springboot。前端&#xff1a;Vue、HTML / CSS / Javascript 等。数据库&#xff1a;MySQL 二、相关软件&#xff08;列出的软件其一均可运行&#xff09; I…

web实操9——session

概念 数据保存在服务器HttpSession对象里。 session也是域对象&#xff0c;有setAttribute和getAttribute方法 快速入门 代码 获取session和塞入数据&#xff1a; 获取session获取数据&#xff1a; 请求存储&#xff1a; 请求获取&#xff1a; 数据正常打印&#xff1a…

面向对象分析和设计OOA/D,UML,GRASP

目录 什么是分析和设计&#xff1f; 什么是面向对象的分析和设计&#xff1f; 迭代开发 UML 用例图 交互图 基于职责驱动设计 GRASP 常见设计原则 什么是分析和设计&#xff1f; 分析&#xff0c;强调是对问题和需求的调查研究&#xff0c;不是解决方案。例如&#x…

Nginx:限流限速

1. 什么是限流限速? 限流限速是Nginx运维中一个非常重要的功能,用于防止服务器过载和保护资源免受滥用。它可以通过限制客户端的请求速率或上传/下载速度来实现。 限流:控制单位时间内允许处理的请求数量。这有助于防止过多的并发请求导致服务器性能下降或崩溃。限速:限制…

探索 JMeter While Controller:循环测试的奇妙世界

嘿&#xff0c;宝子们&#xff01;今天咱们就来聊聊 JMeter 里超级厉害的 While 控制器&#xff0c;它就像是一把神奇的钥匙&#xff0c;能帮我们打开循环测试的大门&#xff0c;模拟出各种各样复杂又有趣的场景哦&#xff01; 一、While 控制器初印象 想象一下&#xff0c;你…

迈向AGI,3、2、1,2025上链接!

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 往期精彩文章推荐 关于AI TIME AI TIME源起于2019年&#xff0c;旨在发扬科学思辨精神&#xff0c;邀请各界人士对人工智能理论、算法和场景应用的本质问题进行探索&#xff0c;加强思想碰撞&#xff0c;链接全…

JVM对象内存分配

1 栈上分配 栈空间随着方法执行完毕而回收通过栈上分配对象内存空间的方式&#xff0c;减少对堆空间的使用&#xff0c;从而减少gc的压力&#xff0c;提升程序性能 逃逸分析&#xff1a;分析对象的作用域&#xff0c;判断对象所需内存是否可以在栈上分配当对象没有被外部方法或…