likes
comments
collection
share

javaweb (二)——jsp

作者站长头像
站长
· 阅读数 19

@[TOC]

javaweb (二)——jsp

1.1了解jsp页面

1.1.1jsp页面的基本构成

JSP(JavaServer Pages)是一种用于创建动态Web页面的技术,它允许开发者通过在HTML中嵌入Java代码来生成动态内容。以下是一个基本的JSP页面示例和构成:


<!DOCTYPE html>

<html>

<head>

 <title>My First JSP Page</title>

</head>

<body>

 <h1>Hello, <%= request.getParameter("name") %>!</h1>

 <p>Today is <%= new java.util.Date() %>.</p>

</body>

</html>

该页面由HTML标签和JSP脚本构成。其中,<%= ... %>表示输出表达式的结果,而<% ... %>则表示执行一段Java代码。

页面各部分的含义如下:

  • <!DOCTYPE html>:定义文档类型为HTML。

  • <html><head><title>:常规HTML标签,用于定义页面的结构和标题。

  • <body>:包含了页面的主要内容。

  • <h1><p>:用于定义标题和段落的HTML标签。

  • <%= request.getParameter("name") %>:使用JSP表达式输出HTTP请求参数中名为"name"的值。

  • <%= new java.util.Date() %>:使用JSP表达式输出当前时间。

1.1.2jsp程序的运行原理

JSP(JavaServer Pages)是一种基于Java技术的Web开发技术,它提供了一种简单的方式来创建动态Web页面。JSP程序的运行原理可以概括为以下几个步骤:

  1. 客户端发送HTTP请求到Web服务器。请求可能包含一些参数,例如查询字符串或表单数据。

  2. Web服务器接收到请求后,会把它交给Servlet容器进行处理。

  3. Servlet容器根据URL中的扩展名判断该请求是否需要被JSP引擎处理。如果需要,就将请求交给JSP引擎处理。

  4. JSP引擎首先解析JSP文件并生成相应的Java源代码,然后编译并加载该Java源代码。这个过程只在第一次访问JSP页面时进行,之后就会直接使用已编译的类。

  5. 当有新请求到达时,JSP引擎会实例化一个新的Servlet,并且向其中插入处理该请求的Java代码。这些代码包括静态内容和动态内容,动态内容通常由JSP表达式、脚本和自定义标签组成。

  6. 最终,Servlet生成响应并将其返回给客户端浏览器。响应可能包含HTML、CSS、JavaScript等各种类型的内容,以及动态生成的内容。

总的来说,JSP程序的运行原理是:当客户端请求JSP页面时,JSP引擎将JSP文件翻译成Java代码并编译运行,最终生成HTML等内容返回给客户端。这个过程中,JSP引擎和Servlet容器协同工作,共同实现了Web应用程序的动态生成和处理。

1.2脚本标识

1.2.1jsp表达式

JSP (JavaServer Pages) 表达式是一种在 JSP 页面中使用的简单语法,它允许开发人员在 HTML 页面中插入动态值。JSP 表达式通常用于将 Java 对象中的数据显示到网页上。

JSP 表达式的语法如下:


<%= expression %>

其中 expression 是要求值并输出到页面的 Java 表达式。JSP 引擎会计算表达式的值,并将其转换为字符串,然后将其插入到生成的 HTML 中。

例如,下面的 JSP 代码示例将会在网页上显示当前时间:


<html>

  <head>

    <title>Current Time</title>

  </head>

  <body>

    The current time is <%= new java.util.Date() %>.

  </body>

</html>

在这个例子中,new java.util.Date() 是一个 Java 表达式,它将会被计算并输出当前时间。

1.2.2声明标识

在 JSP 页面中,声明标识用于定义一个方法或变量,该方法或变量可以在页面的其他部分中使用。

JSP 声明标识的语法如下:


<%! declaration; %>

其中 declaration 是 Java 代码片段,可以是类、接口、方法或变量的声明。

例如,下面的 JSP 代码示例定义了一个名为 greeting 的变量,并将其设置为字符串 "Hello, world!":


<%@ page language="java" %>

<html>

  <head>

    <title>Declaration Example</title>

  </head>

  <body>

    <%!

      String greeting = "Hello, world!";

    %>

    <h1><%= greeting %></h1>

  </body>

</html>

在这个例子中,第 7 行的声明标识定义了一个名为 greeting 的字符串变量。然后,在第 10 行的表达式中,使用 <%= %> 标识符输出该变量的值。

JSP 声明标识通常用于定义在整个页面中需要使用的共享变量或方法,以避免在每个代码段中重复定义它们。声明标识也可以用于定义自己的 Java 类或接口。

1.2.3脚本程序

在 JSP 页面中,脚本程序块用于编写 Java 代码,可以包括任意的 Java 语句、变量声明和表达式。脚本程序块的语法如下:


<% java code %>

其中 java code 是要执行的 Java 代码片段。

例如,下面的 JSP 代码示例使用脚本程序块计算并输出两个整数的和:


<html>

  <head>

    <title>Scriptlet Example</title>

  </head>

  <body>

    <% 

      int num1 = 5;

      int num2 = 10;

      int sum = num1 + num2;

    %>

    The sum of <%= num1 %> and <%= num2 %> is <%= sum %>.

  </body>

</html>

在这个例子中,第 7-9 行的脚本程序块定义了三个整数变量,并将它们相加并赋值给 sum 变量。然后,在第 11 行的表达式中,使用 <%= %> 标识符输出每个变量的值。

脚本程序块也可以嵌套在其他标记中,例如循环、条件语句或函数调用中,以实现更复杂的逻辑。需要注意的是,脚本程序块中的代码会在页面被处理时执行,因此应该避免在其中包含过多的复杂逻辑和长时间运行的操作。

1.3page指令

在 JSP 页面中,<%@ page %> 指令用于定义页面的属性和配置信息。该指令通常放置在页面的顶部,并包含各种属性及其值。

以下是一些常见的 <%@ page %> 属性:

  • language:指定页面使用的编程语言,默认为 Java。

  • contentType:指定页面内容类型,如文本、HTML 等。

  • pageEncoding:指定页面编码方式,默认为 ISO-8859-1。

  • import:导入其他 Java 类或包。

  • session:指定是否启用会话跟踪。

  • errorPage:指定错误处理页面,用于捕获和处理页面发生的异常。

  • isErrorPage:指定当前页是否为错误处理页面。

  • buffer:指定页面缓冲区大小。

  • autoFlush:指定是否自动刷新缓冲区。

  • isThreadSafe:指定当前页是否线程安全。

例如,下面的 JSP 代码示例使用 <%@ page %> 指令指定了页面的编程语言、内容类型和编码方式:


<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>

<html>

  <head>

    <title>Page Directive Example</title>

  </head>

  <body>

    <!-- 页面内容 -->

  </body>

</html>

在这个例子中,第 1 行的 <%@ page %> 指令指定了页面的编程语言为 Java,内容类型为 HTML(使用 UTF-8 编码方式)。这些属性可以确保页面内容正确显示,并允许在页面中使用 Java 代码。

需要注意的是,<%@ page %> 指令只能出现一次,并且必须放置在 JSP 页面的顶部。指令的各个属性之间用空格分隔。

1.4包含指令

在 JSP 页面中,<%@ include %> 指令可以使用静态包含和动态包含两种方式。

静态包含指的是在编译时将指定的文件内容插入到当前页面中,即使被包含的文件发生了变化,也不会影响已经编译好的页面。这种方式可以提高页面的性能和可维护性,适用于一些稳定的、不常变化的文件。

以下是静态包含的示例:


<%@ include file="header.jsp" %>

<html>

  <head>

    <title>Static Include Example</title>

  </head>

  <body>

    <!-- 页面内容 -->

  </body>

</html>

<%@ include file="footer.jsp" %>

动态包含指的是在运行时根据需要将指定的文件内容包含到当前页面中,即每次请求都会重新加载被包含的文件。这种方式可以实现页面之间的动态交互,但同时也会降低页面的性能和可维护性。

以下是动态包含的示例:


<html>

  <head>

    <title>Dynamic Include Example</title>

  </head>

  <body>

    <!-- 动态包含导航栏 -->

    <jsp:include page="navbar.jsp" />



    <!-- 页面内容 -->



    <!-- 动态包含页脚 -->

    <jsp:include page="footer.jsp" />

  </body>

</html>

在这个例子中,<jsp:include> 标签会在请求页面时动态地加载指定的文件,并将其内容插入到当前页面中。因此,每次请求都会重新加载 navbar.jspfooter.jsp 文件。

需要注意的是,静态包含和动态包含的使用场景不同,在实际开发中应该根据具体情况选择适当的方式。

1.5跳转指令

在 JSP 页面中,<jsp:forward><jsp:include> 标签用于实现页面之间的跳转和包含。

<jsp:forward> 标签用于将当前请求转发到另一个资源(JSP 页面或 Servlet),使得客户端浏览器重新请求该资源。该标签通常用于实现页面之间的流程控制和重定向。

以下是 <jsp:forward> 标签的语法:


<jsp:forward page="url" />

其中 page 属性指定要转发到的资源的 URL。这个 URL 可以是相对路径或绝对路径。例如:


<jsp:forward page="/login.jsp" />

该标签可以放置在任何位置,但是必须位于 <body></body> 标记之间。

<jsp:include> 标签用于将另一个 JSP 页面或 Servlet 的输出包含到当前页面中。该标签通常用于实现页面之间的模块化和代码重用。

以下是 <jsp:include> 标签的语法:


<jsp:include page="url" />

其中 page 属性指定要包含的资源的 URL。这个 URL 可以是相对路径或绝对路径。例如:


<jsp:include page="/navbar.jsp" />

该标签会在当前页面被处理时动态地执行指定资源,并将其内容嵌入到当前页面中。

需要注意的是,<jsp:forward><jsp:include> 标签都是由 JSP 引擎处理的。因此,在使用这些标签时,应该确保目标资源存在,并且不会出现无限循环等问题。 ​

2.1 jsp内置对象概览

javaweb (二)——jsp javaweb (二)——jsp

2.2 4种属性范围

四种属性范围 在 JSP 中,有四种作用域,分别是:页面作用域(page)、请求作用域(request)、会话作用域(session)和应用程序作用域(application)。

  1. 页面作用域(page):变量仅在当前 JSP 页面中有效。该作用域是默认作用域,可以直接使用变量名来引用变量。

  2. 请求作用域(request):变量在一次 HTTP 请求中有效,在同一次请求的多个页面或 Servlet/JSP 中共享。可以通过 request.setAttribute() 方法来设置变量,也可以通过 request.getAttribute() 方法来获取变量。

  3. 会话作用域(session):变量在某个用户的会话期间有效,在同一个用户的多个请求中共享。可以通过 session.setAttribute() 方法来设置变量,也可以通过 session.getAttribute() 方法来获取变量。

  4. 应用程序作用域(application):变量在整个 Web 应用程序的生命周期内有效,在所有用户的所有会话中共享。可以通过 application.setAttribute() 方法来设置变量,也可以通过 application.getAttribute() 方法来获取变量。

操作方法 在 JSP 中,可以通过以下方法来操作四种作用域的属性:

  1. 页面作用域(page):变量仅在当前 JSP 页面中有效。该作用域是默认作用域,可以直接使用变量名来引用变量。

    • 设置属性值:在 JSP 页面中定义变量即可。例如:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

    <% String name = "Tom"; %>

    • 获取属性值:直接使用变量名来引用变量。例如:<%=name%>
  2. 请求作用域(request):变量在一次 HTTP 请求中有效,在同一次请求的多个页面或 Servlet/JSP 中共享。可以通过 request.setAttribute() 方法来设置变量,也可以通过 request.getAttribute() 方法来获取变量。

    • 设置属性值:在 Servlet 或 JSP 页面中调用 request.setAttribute(String name, Object value) 方法设置变量。例如:<%

    request.setAttribute("name", "Tom");

    %>

    • 获取属性值:在 Servlet 或 JSP 页面中调用 request.getAttribute(String name) 方法获取变量。例如:<%=request.getAttribute("name")%>
  3. 会话作用域(session):变量在某个用户的会话期间有效,在同一个用户的多个请求中共享。可以通过 session.setAttribute() 方法来设置变量,也可以通过 session.getAttribute() 方法来获取变量。

    • 设置属性值:在 Servlet 或 JSP 页面中调用 request.getSession().setAttribute(String name, Object value) 方法设置变量。例如:<%

    request.getSession().setAttribute("name", "Tom");

    %>

    • 获取属性值:在 Servlet 或 JSP 页面中调用 request.getSession().getAttribute(String name) 方法获取变量。例如:<%=request.getSession().getAttribute("name")%>
  4. 应用程序作用域(application):变量在整个 Web 应用程序的生命周期内有效,在所有用户的所有会话中共享。可以通过 application.setAttribute() 方法来设置变量,也可以通过 application.getAttribute() 方法来获取变量。

    • 设置属性值:在 Servlet 或 JSP 页面中调用 getServletContext().setAttribute(String name, Object value) 方法设置变量。例如:<%

    getServletContext().setAttribute("name", "Tom");

    %>

    • 获取属性值:在 Servlet 或 JSP 页面中调用 getServletContext().getAttribute(String name) 方法获取变量。例如:<%=getServletContext().getAttribute("name")%>

2.3 request对象

2.3.1访问请求参数

在 JSP 中,请求参数可以通过 request 对象来获取。我们可以使用如下方式从 request 对象中获取请求参数:


String paramName = request.getParameter("paramName");

在上面的代码中,getParameter() 方法接收一个字符串类型的参数,该参数是要获取的请求参数的名称。该方法会返回一个字符串,即请求参数的值。

例如,在以下 JSP 页面中,我们可以获取 name 请求参数的值:


<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>获取请求参数</title>

</head>

<body>

    <% 

        String name = request.getParameter("name");

    %>

    <h1>Hello <%= name %>!</h1>

</body>

</html>

在这个例子中,我们使用了 <% %> 标签来嵌入 Java 代码,调用了 request.getParameter() 方法来获取 name 请求参数的值,并将其显示在页面中。

需要注意的是,如果请求参数不存在,则 getParameter() 方法会返回 null。因此,我们'需要在使用请求参数之前先进行非空判断,以避免出现空指针异常。

2.3.2在作用域中管理信息

在 JavaServer Pages (JSP) 中,可以使用 Servlet API 中的 HttpServletRequest 对象来获取客户端请求信息。HttpServletRequest 对象是一个接口,其实现类是由 Web 容器提供的。

当客户端发出请求时,Web 容器会创建 HttpServletRequest 对象,并将该对象传递给 JSP 页面。在 JSP 页面中,可以通过 request 对象来访问 HttpServletRequest 对象中的所有方法和属性。

request 对象是一种作用域对象,它可以在当前 JSP 页面中存储数据并与其他 JSP 页面共享数据。request 对象中存储的数据只在同一次请求内有效,一旦请求结束,数据就会被销毁。

例如,我们可以使用 request 对象在 JSP 页面之间传递信息,如下所示:

在第一个 JSP 页面中设置属性:


<%

    // 设置属性

    request.setAttribute("name", "John");

%>

在第二个 JSP 页面中获取属性:


<%

    // 获取属性

    String name = (String) request.getAttribute("name");

%>

除了 setAttribute() 和 getAttribute() 方法之外,HttpServletRequest 还提供了许多其他有用的方法,例如 getParameter()、getMethod()、getHeader() 等,这些方法可以帮助我们获取客户端请求的各种信息。

2.3.3获取cookie

在 JSP 中,我们可以通过 HttpServletRequest 对象获取客户端请求中包含的 Cookie,然后将其添加到 request 作用域中以方便其他 JSP 页面访问。

以下是一个示例代码:


<%

    // 获取 HttpServletRequest 对象

    HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();



    // 获取客户端请求中的所有 Cookies

    Cookie[] cookies = request.getCookies();



    // 将 Cookies 添加到 request 作用域中

    request.setAttribute("cookies", cookies);

%>

上述代码首先获取了 HttpServletRequest 对象,并使用它的 getCookies() 方法获取客户端请求中包含的所有 Cookie,然后使用 setAttribute() 方法将这些 Cookie 添加到 request 作用域中,以便其他 JSP 页面可以访问它们。

接着,在其他 JSP 页面中,我们可以通过 request 对象获取这些 Cookie,例如:


<%

    // 获取 request 中的 Cookies

    Cookie[] cookies = (Cookie[]) request.getAttribute("cookies");



    if(cookies != null){

        for(Cookie cookie : cookies){

            // 输出 Cookie 的名称和值

            out.println(cookie.getName() + ": " + cookie.getValue() + "<br>");

        }

    }

%>

上述代码首先获取了 request 对象中的 Cookies,然后遍历这些 Cookie 并输出它们的名称和值。

请注意,通过 request 作用域共享 Cookie 只适用于同一个 Web 应用程序中的 JSP 页面。如果您需要在不同的 Web 应用程序之间共享 Cookie,可以考虑使用 ServletContext 或 HttpSession 来存储和获取它们。

2.3.4解决中文乱码

在 JSP 中,如果客户端提交的表单中包含中文字符,那么在后台获取这些参数时可能会出现乱码问题。这个问题可以通过在 request 作用域中设置编码来解决。

以下是一个示例代码:


<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

</head>

<body>

    <form action="test.jsp" method="post">

        <label for="name">姓名:</label>

        <input type="text" name="name" id="name">

        <br>

        <button type="submit">提交</button>

    </form>

</body>

</html>

上述代码展示了一个简单的表单页面,其中包含一个文本框用于输入姓名,并通过 POST 方法提交表单数据到 test.jsp 页面。

接下来,在 test.jsp 页面中,我们可以使用 request 对象获取客户端提交的参数,并设置编码来解决中文乱码问题,例如:


<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%

    // 获取 request 对象

    request.setCharacterEncoding("UTF-8");



    // 获取客户端提交的参数

    String name = request.getParameter("name");



    // 输出参数值

    out.println("您输入的姓名是:" + name);

%>

上述代码首先设置了 request 对象的编码为 UTF-8,然后使用 getParameter() 方法获取客户端提交的 name 参数,并输出它的值。

请注意,在 JSP 中设置 request 对象的编码只适用于当前页面,如果在其他页面需要获取相同的参数时也需要进行编码设置。

2.3.5获取客户端信息

在 JSP 中,可以使用 HttpServletRequest 对象获取客户端的一些信息,例如客户端的 IP 地址、用户代理等。HttpServletRequest 对象是由 Servlet 容器创建并传递给 JSP 页面的,它包含了客户端请求的相关信息。

以下是一些获取客户端信息的示例代码:

  1. 获取客户端 IP 地址

<%

    // 获取客户端 IP 地址

    String ipAddress = request.getRemoteAddr();



    out.println("客户端 IP 地址:" + ipAddress);

%>

  1. 获取客户端浏览器类型

<%

    // 获取客户端浏览器类型

    String userAgent = request.getHeader("User-Agent");

    

    out.println("客户端浏览器类型:" + userAgent);

%>

  1. 获取客户端请求方式

<%

    // 获取客户端请求方式

    String method = request.getMethod();

    

    out.println("客户端请求方式:" + method);

%>

  1. 获取客户端请求 URL

<%

    // 获取客户端请求 URL

    StringBuffer url = request.getRequestURL();

    

    out.println("客户端请求 URL:" + url);

%>

  1. 获取客户端请求参数

<%

    // 获取客户端请求参数

    String name = request.getParameter("name");

    

    out.println("客户端请求参数 name 的值为:" + name);

%>

上述代码中,我们使用了 HttpServletRequest 对象的 getRemoteAddr() 方法获取客户端的 IP 地址;使用 getHeader() 方法获取客户端浏览器类型;使用 getMethod() 方法获取客户端请求方式;使用 getRequestURL() 方法获取客户端请求 URL;使用 getParameter() 方法获取客户端请求参数。

请注意,在获取客户端信息时需要注意编码问题,可以通过设置 HttpServletRequest 对象的编码方式来解决。

2.3.6显示国际化信息

在 JSP 中,可以使用 ResourceBundle 类来显示国际化信息。ResourceBundle 是用于加载不同语言和区域的文本资源文件的类,它可以帮助我们实现国际化。

以下是一个示例代码:

  1. 创建资源文件

在项目中创建多个资源文件,例如:

MessageBundle.properties


greeting=Hello

MessageBundle_zh_CN.properties


greeting=你好

  1. 在 JSP 页面中使用 ResourceBundle 显示国际化信息

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%

    // 获取 request 对象

    HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();



    // 获取客户端的语言偏好设置

    String lang = request.getHeader("Accept-Language");



    // 根据客户端的语言偏好设置加载对应的资源文件

    ResourceBundle bundle = ResourceBundle.getBundle("MessageBundle", new Locale(lang));



    // 获取资源文件中的 greeting 属性值

    String greeting = bundle.getString("greeting");



    out.println(greeting);

%>

上述代码根据客户端的语言偏好设置加载对应的资源文件,并获取其中的 greeting 属性值进行输出。

在浏览器中访问该页面时,会根据浏览器的语言设置自动加载对应的资源文件,从而实现国际化。

请注意,在创建资源文件时需要按照规范进行命名,并使用 UTF-8 编码保存;在使用 ResourceBundle 类时需要注意参数的传递方式。

2.4 response对象

2.4.1重定向网页

在 JSP 中,可以通过 response 对象的 sendRedirect() 方法来重定向到另一个网页。该方法需要传入一个字符串参数,即重定向到的目标网页的 URL。

以下是一个示例:

<%
    String redirectUrl = "http://example.com/newpage.jsp";
    response.sendRedirect(redirectUrl);
%>

此代码将重定向到 example.com/newpage.jsp 网页。

2.4.2处理http文件头

在 JSP 中,可以使用 response 对象来处理 HTTP 文件头。HTTP 文件头包含一些元数据,如 MIME 类型、缓存控制等信息。

下面是一些处理 HTTP 文件头的示例:

  1. 设置 MIME 类型
<%
    String mimeType = "text/html";
    response.setContentType(mimeType);
%>
  1. 禁用浏览器缓存
<%
    response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
    response.setHeader("Pragma", "no-cache");
    response.setDateHeader("Expires", 0);
%>
  1. 设置文件下载时的文件名
<%
    String fileName = "example.pdf";
    response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
%>

这些示例演示了如何使用 response 对象处理 HTTP 文件头。请注意,在 JSP 中最好将这些代码放在最前面,以确保在向客户端发送任何输出之前处理文件头。

2.4.3设置输出缓冲

在 JSP 中,可以使用 response 对象设置输出缓冲。输出缓冲是一种将输出内容保存在内存中的机制,直到缓冲区满或响应完成时才将其发送到客户端。

以下是一个设置输出缓冲的示例:

<%
    response.setBufferSize(8192);
    out.println("Hello, world!");
%>

该例子中,setBufferSize() 方法设置了输出缓冲的大小为 8KB。此后,所有的输出语句都会被缓存,直到达到缓冲区大小或者 JSP 页面执行完毕,才会将缓冲区中的内容一次性地发送给客户端。

设置输出缓冲可以提高性能,因为减少了与客户端之间的通信次数。但是,如果缓冲区过大,会浪费内存;如果过小,可能会导致频繁的刷新,影响性能。

请根据具体情况权衡利弊,选择合适的输出缓冲大小。

2.5 session对象

2.5.1 创建及获取客户的会话

在 JSP 中,可以通过内置对象 session 来创建和获取客户的会话。

要创建一个新的会话,可以使用以下代码:

<%
  // 创建一个新的 Session 对象
  HttpSession session = request.getSession();
%>

如果客户端已经有一个会话存在,则可以通过以下方式获取该会话:

<%
  // 获取现有的 Session 对象
  HttpSession session = request.getSession(false);
  
  if (session != null) {
    // 会话存在,继续处理请求
  } else {
    // 会话不存在,需要提示用户登录或注册
  }
%>

在上面的代码中,getSession(false) 方法将返回当前请求的会话,如果没有会话存在则返回 null。可以通过检查返回的值来确定是否需要提示用户登录或注册。

一旦获取到了会话对象,就可以使用它来存储和检索用户特定的数据,例如:

<%
  // 存储和检索数据
  String username = (String)session.getAttribute("username");
  session.setAttribute("username", "JohnDoe");
%>

在上面的代码中,getAttributesetAttribute 方法用于存储和检索与会话相关联的数据。这些数据将在整个会话期间保持不变,直到会话结束为止。

2.5.2从会话中移除绑定的对象

在JSP中,可以使用session.removeAttribute(String name)方法从会话中移除绑定的对象,其中参数name表示要移除的对象的名称。如果该名称对应的对象不存在,该方法不会抛出异常,因为它是一个无操作方法。

例如,以下代码将从会话中删除名为"username"的属性:

<%
session.removeAttribute("username");
%>

需要注意的是,使用removeAttribute()方法只会从会话中移除指定名称的绑定对象,而并不会销毁整个会话。如果需要销毁整个会话,可以使用session.invalidate()方法。

2.5.3销毁session

在JSP中,可以使用session.invalidate()方法来销毁当前会话和其中所有的绑定对象。当您调用这个方法时,服务器会立即使当前用户的会话无效,并且不能再使用该会话。此外,服务器也会删除与该会话相关联的任何临时文件或其他资源。

下面是一个简单的示例,演示如何使用session.invalidate()方法来销毁当前会话:

<%
// 获取当前用户的会话
HttpSession session = request.getSession(false);

if (session != null) {
    // 将会话标记为无效
    session.invalidate();
}
%>

需要注意的是,调用session.invalidate()方法将导致整个会话被销毁,因此在执行此操作之前,应该确保不再需要任何绑定到该会话的对象。否则,可能会丢失重要数据。

另外,还要注意的是,如果在会话无效之后尝试访问会话相关的任何属性或方法,都将抛出IllegalStateException异常。通常情况下,建议在调用session.invalidate()方法之后立即重定向到另一个页面,以避免此类问题的发生。

2.5.4会话超时的管理

在JSP中,可以通过配置web.xml文件来管理会话超时。会话超时指的是当用户在一段时间内没有活动时,服务器将自动终止会话并从内存中删除相关的Session对象。

默认情况下,会话超时时间为30分钟,但您可以根据需要修改该值。在web.xml文件中,有一个名为session-config的元素,它用于定义与会话相关的配置信息。其中,session-timeout子元素用于设置会话超时时间(以分钟为单位)。

例如,以下是一个web.xml文件示例,其中会话超时时间被设置为60分钟:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         id="WebApp_ID" version="3.0">
         
    <session-config>
        <session-timeout>60</session-timeout>
    </session-config>
    
    <!-- 其他配置信息 -->
    
</web-app>

在上面的示例中,session-timeout子元素的值为60,表示会话超时时间为60分钟。

还要注意的是,如果您在JSP页面中使用了<%@ page session="false" %>指令,则意味着当前页面不需要会话支持,因此对于该页面,会话超时配置将不起作用。

2.5.5 session对象的应用

在JSP中,session对象是一个非常有用的工具,它允许您在多个请求之间共享数据。使用session对象,您可以将数据存储在会话期间,在后续请求中检索并使用这些数据。

以下是一些session对象的应用:

  1. 用户认证和授权:使用session对象来存储用户的身份验证信息和授权信息。通过在登录时创建一个session对象,并在每个请求中使用该对象进行身份验证,可以确保只有经过身份验证的用户才能访问受保护的页面。

  2. 购物车功能:使用session对象来存储用户购物车中的商品信息。当用户添加新的商品时,将其添加到session对象中。在购物车结算页面中,可以从session对象中检索商品信息以获取总价和其他详细信息。

  3. 多步表单处理:使用session对象来存储多步表单处理的数据。例如,当用户填写长表单时,其可能需要在多个步骤中分别提交表单数据。使用session对象,可以轻松地在每个步骤之间传递表单数据,而不必担心数据丢失或混乱。

  4. 分布式应用程序:如果您正在构建分布式应用程序,则可以使用session对象来存储与当前用户相关的数据。通过将session对象存储在远程服务器上,可以确保即使在多个服务器上运行的应用程序也可以共享数据。

总之,session对象是一种强大的工具,可用于从一个请求到另一个请求传递数据,并且能够极大地简化应用程序的设计和实现。

2.6 application对象

2.6.1访问应用程序初始化参数在JSP中

可以使用application对象访问应用程序初始化参数。应用程序初始化参数是在web.xml文件中定义的键值对,它们可以被整个应用程序访问和共享。 以下代码片段演示如何使用application对象来访问应用程序初始化参数: <%// 获取应用程序初始化参数String dbUrl = application.getInitParameter("dbUrl");String dbUsername = application.getInitParameter("dbUsername");String dbPassword = application.getInitParameter("dbPassword");// 使用初始化参数连接数据库Connection conn = DriverManager.getConnection(dbUrl, dbUsername, dbPassword);%>在上面的代码中,首先通过调用application.getInitParameter()方法获取了定义在web.xml文件中的三个应用程序初始化参数:dbUrl、dbUsername和dbPassword。然后使用这些参数建立一个数据库连接。需要注意的是,application.getInitParameter()方法只能用于访问应用程序初始化参数。如果想要存储或访问其他类型的数据,需要使用ServletContext对象的其他方法,比如setAttribute()和getAttribute()等。

2.6.2管理应用程序环境属性

在JSP中,可以使用application对象来管理应用程序环境属性。应用程序环境属性是应用程序范围内的变量,可以被整个应用程序访问和共享。 以下代码片段演示如何使用application对象来管理应用程序环境属性: <%// 设置应用程序环境属性application.setAttribute("username", "admin");application.setAttribute("email", "admin@example.com");// 获取应用程序环境属性String username = (String) application.getAttribute("username");String email = (String) application.getAttribute("email");%>在上面的代码中,首先通过调用application.setAttribute()方法设置了两个应用程序环境属性:username和email。然后通过调用application.getAttribute()方法获取了这些属性的值,并将它们存储在本地变量username和email中。需要注意的是,application.setAttribute()方法只能用于设置应用程序环境属性。如果想要访问其他类型的数据,需要使用ServletContext对象的其他方法,比如getInitParameter()和getSession()等。另外,为了防止并发问题,需要遵循线程安全的编程实践来处理应用程序环境属性。

2.7 out对象

2.7.1向客户端输出数据

在JSP中,可以使用out对象向客户端输出数据。out对象是一个隐含的JSP对象,它表示JSP页面生成的响应流。 以下代码片段演示如何使用out对象向客户端输出数据: <%// 向客户端输出文本out.print("Hello, World!");// 向客户端输出HTMLout.println("<h1>Welcome to my website!</h1>");// 向客户端输出变量的值String name = "Alice";out.printf("Hello, %s!", name);%> 在上面的代码中,通过调用out.print()方法向客户端输出了一段文本,调用out.println()方法向客户端输出了一段HTML代码,调用out.printf()方法向客户端输出了一个格式化字符串。需要注意的是,out对象只能用于向客户端输出数据。如果想要存储数据或访问其他类型的数据,需要使用其他对象,比如application对象、session对象或request对象等。另外,为了防止安全漏洞,需要遵循安全的编程实践来处理向客户端输出的数据。

2.7.2管理响应缓存

在JSP中,可以使用out对象来管理响应缓存。响应缓存是将JSP页面生成的响应存储在服务器或客户端上,以便于之后的快速访问和重用。 以下代码片段演示如何使用out对象来设置响应缓存:<%// 设置响应头response.setHeader("Cache-Control", "max-age=3600");// 启用响应缓存response.setDateHeader("Expires", System.currentTimeMillis() + 3600000L);// 向客户端输出文本out.print("Hello, World!");%>在上面的代码中,通过调用response.setHeader()方法设置了一个名为“Cache-Control”的响应头,并将其值设置为“max-age=3600”,表示响应最长可以缓存1小时。然后通过调用response.setDateHeader()方法设置了一个名为“Expires”的响应头,并将其值设置为当前时间加上1小时,表示响应过期时间为1小时后。这两个操作共同启用了响应缓存。最后通过调用out.print()方法向客户端输出了一段文本。需要注意的是,缓存策略应该根据具体的业务逻辑进行设置,以确保安全性和可靠性。另外,如果响应缓存不当,可能会导致安全漏洞或数据更新不及时等问题。因此,在使用响应缓存时需要遵循安全的编程实践和最佳实践。

2.8 其他内置对象

2.8.1 获取页面上下文的pagecontext对象

在JSP中,可以通过以下方式获取页面上下文的PageContext对象: java<% PageContext pageContext = (PageContext) request.getAttribute("javax.servlet.jsp.jspPageContext");%>或者使用JSP内置对象pageContext直接获取:java<% PageContext pageContext = pageContext;%>请注意,第二种方法可能会导致变量名冲突,并且不同的JSP容器实现的JSP内置对象可能会略有不同。因此,建议使用第一种方式获取PageContext对象。

2.8.2读取web.xml配置信息的config对象

在 JSP 中,可以通过 getServletContext() 方法获取 ServletContext 对象,然后从中读取 web.xml 配置信息。

要读取 web.xml 中的初始化参数,可以使用 ServletContext 的 getInitParameter(String name) 方法。例如:

String myParam = getServletContext().getInitParameter("myParamName");

要读取 servlet 或 filter 的配置信息,可以使用 ServletContext 的 getServletRegistration(String servletName) 或 getFilterRegistration(String filterName) 方法获取对应的 ServletRegistration 或 FilterRegistration 对象,然后从中读取配置信息。例如:

ServletRegistration registration = getServletContext().getServletRegistration("myServlet");
String initParam = registration.getInitParameter("myInitParam");

FilterRegistration registration = getServletContext().getFilterRegistration("myFilter");
EnumSet<DispatcherType> dispatcherTypes = registration.getDispatcherTypes();

注意,在 JSP 中读取配置信息可能会让代码变得难以维护和测试。建议将配置信息封装到一个 Java 类中,然后在 JSP 中调用该类的方法来获取配置信息。

2.8.3 page对象

在 JSP 中,page 对象是一个隐含对象,可以直接在 JSP 页面中使用。它表示当前 JSP 页面的 Servlet 实例,即被翻译成 Servlet 后的类实例。 page 对象提供了许多有用的方法,比如:- String getPageName(): 获取当前 JSP 页面的文件名。- javax.servlet.jsp.JspWriter getOut(): 获取当前页面响应输出流。- javax.servlet.ServletConfig getServletConfig(): 获取当前 Servlet 的配置信息。- javax.servlet.jsp.PageContext getPageContext(): 获取当前页面上下文对象,可用于获取其他隐含对象。- void include(String relativeUrlPath): 请求包含指定 URL 的资源,就像在页面中包含一段 JSP 或 HTML 代码。- void forward(String relativeUrlPath): 请求转发到指定 URL 的资源,将控制权交给另一个 Servlet 或 JSP 页面。除了这些方法之外,page 对象还有许多其他的方法和属性,用于访问 JSP 页面的各种信息。但是,建议尽量避免在 JSP 中使用 page 对象,以保持代码的简洁和易读性,同时也能更好地分离业务逻辑和视图层。

2.8.4获取异常信息的exception对象

在 JSP 中,可以通过以下方式获取异常信息的 exception 对象:

<%!
Exception exception;
%>

<%
try {
    // some code that may throw an exception
} catch (Exception e) {
    exception = e;
}
%>

<%
if (exception != null) {
    // handle the exception here
}
%>

在上面的代码中,我们声明了一个名为 exception 的变量,然后在 try-catch 块中捕获可能抛出的异常,并将其赋值给该变量。最后,在 JSP 页面的其他部分中,我们可以检查该变量是否为空来确定是否有异常发生并对其进行相应处理。

需要注意的是,在实际开发中,JSP 不推荐使用 Java 代码来完成业务逻辑,而应将其放在 servlet 或其他 Java 类中。在这种情况下,可以使用 request.setAttribute() 方法将异常对象存储在请求属性中,然后在 JSP 中使用 EL 表达式 ${requestScope.exception} 获取该属性。

转载自:https://juejin.cn/post/7267442675846414392
评论
请登录