2.3.6显示国际化信息
在 JSP 中,可以使用 ResourceBundle 类来显示国际化信息。ResourceBundle 是用于加载不同语言和区域的文本资源文件的类,它可以帮助我们实现国际化。
以下是一个示例代码:
1.创建资源文件
在项目中创建多个资源文件,例如:
MessageBundle.properties
greeting=Hello
MessageBundle_zh_CN.properties
greeting=你好
2.在 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); %>
此代码将重定向到 http://example.com/newpage.jsp 网页。
2.4.2处理http文件头
在 JSP 中,可以使用 response 对象来处理 HTTP 文件头。HTTP 文件头包含一些元数据,如 MIME 类型、缓存控制等信息。
下面是一些处理 HTTP 文件头的示例:
1.设置 MIME 类型
<% String mimeType = "text/html"; response.setContentType(mimeType); %>
2禁用浏览器缓存
<% response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); response.setHeader("Pragma", "no-cache"); response.setDateHeader("Expires", 0); %>
3设置文件下载时的文件名
<% 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"); %>
在上面的代码中,getAttribute 和 setAttribute 方法用于存储和检索与会话相关联的数据。这些数据将在整个会话期间保持不变,直到会话结束为止。
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对象的应用:
- 用户认证和授权:使用session对象来存储用户的身份验证信息和授权信息。通过在登录时创建一个session对象,并在每个请求中使用该对象进行身份验证,可以确保只有经过身份验证的用户才能访问受保护的页面。
- 购物车功能:使用session对象来存储用户购物车中的商品信息。当用户添加新的商品时,将其添加到session对象中。在购物车结算页面中,可以从session对象中检索商品信息以获取总价和其他详细信息。
- 多步表单处理:使用session对象来存储多步表单处理的数据。例如,当用户填写长表单时,其可能需要在多个步骤中分别提交表单数据。使用session对象,可以轻松地在每个步骤之间传递表单数据,而不必担心数据丢失或混乱。
- 分布式应用程序:如果您正在构建分布式应用程序,则可以使用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}
获取该属性。