《Servlet高级应用》
目录
一、组件跳转
主要方式
- 请求转发:使用request对象,将请求转发给其他Servlet或Jsp;
- 重定向:使用response对象,响应至其他url。
区别
-
请求转发可携带数据,重定向不可携带数据;
-
请求转发是一个请求,而重定向是两个请求;
-
请求转发只能转发到本应用的其他Servlet,而重定向可以转到其他应用中。
案例一
- webapp/index.jsp
<h2>
<a href="/test.do?action=forward">测试请求转发</a>
</h2>
<h2>
<a href="/test.do?action=redirect">测试重定向</a>
</h2>
- webapp/test.jsp
<%@ page contentType="text/html;charset=UTF-8"%>
<html>
<head>
<title>测试页面</title>
</head>
<body>
<h1>Welcome To Test!</h1>
<%-- ${} el表达式取值 --%>
<h2>${id}——${name}</h2>
</body>
</html>
- TestServlet
package com.hpr.servlet;
import javax.servlet.ServletException;
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("/test.do")
public class TestServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//乱码问题处理
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTF-8");
//获取指令参数
String action = request.getParameter("action");
//判断指令
if (action.equals("forward")) {
//设置request域参数
request.setAttribute("id", "1001");
request.setAttribute("name", "Alice");
//请求转发至jsp
request.getRequestDispatcher("./test.jsp").forward(request, response);
} else if (action.equals("redirect")) {
//设置request域参数
request.setAttribute("id", "1001");
request.setAttribute("name", "Alice");
//重定向至jsp
response.sendRedirect("./test.jsp");
}
}
}
- 启动服务器,分别点击链接进行测试

执行结果
- 请求转发结果

- 重定向结果

二、数据传递作用域
三大作用域
- request域:一次http请求;
- session域:表示浏览器与服务器之间的“会话”;
- application域:实为Servlet上下文,即服务器全局参数。
案例二
- index.jsp
<hr>
<h3>
<a href="/test.do?action=scope">作用域测试</a>
</h3>
- TestServlet
//判断指令
if (action.equals("forward")) {
//设置request域参数
request.setAttribute("id", "1001");
request.setAttribute("name", "Alice");
//请求转发至jsp
request.getRequestDispatcher("./test.jsp").forward(request, response);
} else if (action.equals("redirect")) {
//重定向
response.sendRedirect("./test.jsp");
} else if (action.equals("scope")) {
//1.request域
request.setAttribute("req", "request域参数");
//2.session域
HttpSession session = request.getSession();
session.setAttribute("ses", "session域参数");
//3.application域
ServletContext application = request.getServletContext();
application.setAttribute("app", "application域参数");
//4.请求转发至test.jsp
request.getRequestDispatcher("./test.jsp").forward(request, response);
}
- test.jsp
<hr>
<h2>request域:${req}</h2>
<h2>session域:${ses}</h2>
<h2>application域:${app}</h2>
<h3>
<a href="/test.do?action=redirect">刷新</a>
</h3>
- 启动测试

执行结果

经验分享
-
点击“刷新”,request域参数失效;
-
关闭浏览器再打开,session域参数失效(session可在web.xml设置过期时长);
<session-config>
<!-- 设置session过期时长,单位:分钟 -->
<session-timeout>30</session-timeout>
</session-config>
- 只要不重启服务器,application域参数将永不失效。
三、Cookie
Cookie,有时也用其复数形式 Cookies。类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。
案例三
- index.jsp
<hr>
<h3>
<a href="/test.do?action=cookie">生成cookie测试</a>
</h3>
- test.jsp
<hr>
<h3>
<a href="/test.do?action=getCookie">获取cookie测试</a>
</h3>
- TestServlet
else if (action.equals("cookie")) {
//生成cookie
Cookie c1 = new Cookie("userId", "1001");
//设置过期时长(单位:秒)
c1.setMaxAge(60);
Cookie c2 = new Cookie("password", "123456");
//永不过期
c2.setMaxAge(-1);
response.addCookie(c1);
response.addCookie(c2);
response.sendRedirect("./test.jsp");
} else if (action.equals("getCookie")) {
//获取前端传来的cookie
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
System.out.println(cookie.getName() + "——" + cookie.getValue());
}
response.sendRedirect("./test.jsp");
}
- 生成cookie测试

- 获取cookie测试

执行结果

四、过滤器
过滤器,顾名思义就是对事物进行过滤,Web过滤器是一种切面式编程,即对请求响应的统一处理(如字符集设置),加上逻辑判断可实现拦截效果功能,如登录控制,权限管理,过滤敏感词汇等。

案例四
- 删除HelloServlet、TestServlet中乱码处理的相关代码;
- 新增com.hpr.filter包,并添加CharacterEncodingFilter类如下;
package com.hpr.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//配置过滤路径
@WebFilter("*.do")
public class CharacterEncodingFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
//乱码问题处理
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTF-8");
//执行过滤链中下一过滤
filterChain.doFilter(request, response);
}
}
- 启动测试

执行结果

总结
重点
- 组件跳转的主要两种方式;
- 数据传递三大作用域;
- Cookie的生成与获取;
- 过滤器的书写方式及使用。
难点
- 数据传递三大作用域;
- 过滤器的书写方式及使用。
本文详细介绍了Servlet中的组件跳转,包括请求转发和重定向的区别与使用案例。接着讨论了数据传递的三种作用域:request、session和application,并通过实例展示了它们的特点。此外,还讲解了Cookie的生成与获取以及过滤器的使用,提供了一个过滤字符编码的过滤器示例。
231

被折叠的 条评论
为什么被折叠?



