JSP内置对象、Servlet与MVC

目录

1、JSP内置对象


1. 1、out 对象

  • 类型javax.servlet.jsp.JspWriter

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

  • 常用方法

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

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

    jsp 复制代码
    <%
        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 对象是客户端请求的入口,所有请求参数和请求头都可以通过它访问。
  • 示例

    jsp 复制代码
    <%
        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 对象是服务器响应的出口,可以控制响应的内容和行为。
  • 示例

    jsp 复制代码
    <%
        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重写实现的,默认情况下会话数据存储在服务器端。
    • 会话的生命周期从用户访问开始,直到会话超时或被销毁。
  • 示例

    jsp 复制代码
    <%
        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应用程序相同,从应用程序启动到停止。
    • 适合存储全局共享的数据,如配置信息或计数器。
  • 示例

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

  • 类型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。
  • 示例

    jsp 复制代码
    <%
        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类

java 复制代码
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:

xml 复制代码
<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)。在方法中,可以获取请求参数、设置响应头、输出响应内容等。

  • 获取请求参数

    java 复制代码
    String param = request.getParameter("paramName");
  • 设置响应头

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

    java 复制代码
    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模式:

    java 复制代码
    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模式:

    java 复制代码
    @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类,封装了数据的属性和操作方法。

    • 例如:

      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 复制代码
      <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。

    • 例如:

      java 复制代码
      @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和方法:

java 复制代码
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

@WebFilter("/*")
public class LoggingFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("LoggingFilter initialized.");
    }

    @Override
    public 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);
    }

    @Override
    public void destroy() {
        System.out.println("LoggingFilter destroyed.");
    }
}

4.5、配置过滤器

4.5.1、使用web.xml配置

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

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注解来简化过滤器的配置:

java 复制代码
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属性:

java 复制代码
public class Person {
    private String name;
    private int age;
    // getters and setters
}

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

  • ${person.name}

  • ${person.age}


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

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

java 复制代码
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,包含多个字符串:

java 复制代码
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,键为字符串,值为整数:

java 复制代码
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中的<%= %>

语法

jsp 复制代码
<c:out value="${expression}" default="defaultValue" escapeXml="true|false"/>

示例

jsp 复制代码
<c:out value="${user.name}" default="Guest"/>

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

6.3.2、<c:set>

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

语法

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

示例

jsp 复制代码
<c:set var="username" value="${user.name}" scope="session"/>

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

6.3.3、<c:if>

用于条件判断。

语法

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

示例

jsp 复制代码
<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语句,用于多条件判断。

语法

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

示例

jsp 复制代码
<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>

用于遍历集合或数组。

语法

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

示例

jsp 复制代码
<c:forEach var="item" items="${items}">
    <p>${item}</p>
</c:forEach>

6.3.6、<c:url>

用于创建URL,支持编码。

语法

jsp 复制代码
<c:url value="/path" var="urlVariable"/>

示例

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

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

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

6.4.1、<fmt:formatDate>

用于格式化日期。

语法

jsp 复制代码
<fmt:formatDate value="${date}" pattern="yyyy-MM-dd"/>

示例

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

6.4.2、<fmt:formatNumber>

用于格式化数字。

语法

jsp 复制代码
<fmt:formatNumber value="${number}" type="currency"/>

示例

jsp 复制代码
<fmt:formatNumber value="${price}" type="currency" currencyCode="USD"/>

6.5、示例

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

jsp 复制代码
<%@ 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>
相关推荐
xweiran1 小时前
CAS操作的底层原理(总线锁定机制和缓存锁定机制 )
java·cas·处理器·总线锁定·缓存锁定
Miraitowa_cheems1 小时前
[JavaEE] Spring IoC&DI
java·spring·java-ee
V+zmm101341 小时前
基于微信小程序的水果销售系统的设计与实现springboot+论文源码调试讲解
java·微信小程序·小程序·毕业设计·springboot
头发那是一根不剩了1 小时前
java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter
java
小白起 v2 小时前
三天学完微服务其二
java·微服务·架构
huiyunfei2 小时前
MinorGC FullGC
java·jvm·算法
XWM_Web2 小时前
JavaAPI.02.包装类与正则表达式
java·开发语言·学习·eclipse
PangPiLoLo2 小时前
架构学习——互联网常用架构模板
java·学习·微服务·云原生·架构·系统架构·nosql
!!!5252 小时前
SpringBoot-web入门程序剖析
java·spring boot·后端
泷羽Sec-pp3 小时前
基于Centos 7系统的安全加固方案
java·服务器·前端