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>
相关推荐
落木萧萧8253 分钟前
MyBatis、MyBatis-Plus、JPA、MyBatisGX 写法比较:同一个需求,四种解法
java·后端
彳亍走的猪6 分钟前
Android 全局防抖/防重复点击
android·java·开发语言
lhbian10 分钟前
30分钟搭建PHP+Java全栈Web应用
java·前端·php
有谁看见我的剑了?11 分钟前
Linux 内存巨页与透明巨页学习
java·linux·学习
勿忘,瞬间12 分钟前
Spring Boot
java·数据库·spring boot
SimonKing19 分钟前
AI大模型中转平台,无需科学上网就可以使用国外模型
java·后端·程序员
johnrui20 分钟前
WebFlux 与普通HTTP(Spring MVC)详细对比
spring·http·mvc
自我意识的多元宇宙21 分钟前
二叉树遍历方式代码解读(1递归)
java·数据结构·算法
逻辑驱动的ken30 分钟前
Java高频面试考点04
java·开发语言·算法·哈希算法·散列表
代码漫谈37 分钟前
Spring Boot 配置指南:约定大于配置的应用
java·spring boot·后端