JavaWeb_16_Servlet高级应用

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

《Servlet高级应用》

目录

  • 组件跳转(熟练)
  • 数据传递作用域(熟练)
  • Cookie(掌握)
  • 过滤器(熟练)

一、组件跳转

主要方式

  • 请求转发:使用request对象,将请求转发给其他Servlet或Jsp;
  • 重定向:使用response对象,响应至其他url。

区别

  • 请求转发可携带数据,重定向不可携带数据;

  • 请求转发是一个请求,而重定向是两个请求;

  • 请求转发只能转发到本应用的其他Servlet,而重定向可以转到其他应用中。

案例一

  1. webapp/index.jsp
<h2>
    <a href="/test.do?action=forward">测试请求转发</a>
</h2>
<h2>
    <a href="/test.do?action=redirect">测试重定向</a>
</h2>
  1. 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>
  1. 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");
        }
    }
}
  1. 启动服务器,分别点击链接进行测试

请添加图片描述

执行结果

  • 请求转发结果

请添加图片描述

  • 重定向结果

请添加图片描述

二、数据传递作用域

三大作用域

  • request域:一次http请求;
  • session域:表示浏览器与服务器之间的“会话”;
  • application域:实为Servlet上下文,即服务器全局参数。

案例二

  1. index.jsp
<hr>
<h3>
    <a href="/test.do?action=scope">作用域测试</a>
</h3>
  1. 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);
}
  1. test.jsp
<hr>
<h2>request域:${req}</h2>
<h2>session域:${ses}</h2>
<h2>application域:${app}</h2>
<h3>
	<a href="/test.do?action=redirect">刷新</a>
</h3>
  1. 启动测试

请添加图片描述

执行结果

请添加图片描述

经验分享

  1. 点击“刷新”,request域参数失效;

  2. 关闭浏览器再打开,session域参数失效(session可在web.xml设置过期时长);

<session-config>
    <!-- 设置session过期时长,单位:分钟 -->
    <session-timeout>30</session-timeout>
</session-config>
  1. 只要不重启服务器,application域参数将永不失效。

三、Cookie

Cookie,有时也用其复数形式 Cookies。类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。

案例三

  1. index.jsp
<hr>
<h3>
    <a href="/test.do?action=cookie">生成cookie测试</a>
</h3>
  1. test.jsp
<hr>
<h3>
    <a href="/test.do?action=getCookie">获取cookie测试</a>
</h3>
  1. 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");
}
  1. 生成cookie测试

请添加图片描述

  1. 获取cookie测试

请添加图片描述

执行结果

请添加图片描述

四、过滤器

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

请添加图片描述

案例四

  1. 删除HelloServlet、TestServlet中乱码处理的相关代码;
  2. 新增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);
    }
}
  1. 启动测试

请添加图片描述

执行结果

请添加图片描述

总结

重点

  1. 组件跳转的主要两种方式;
  2. 数据传递三大作用域;
  3. Cookie的生成与获取;
  4. 过滤器的书写方式及使用。

难点

  1. 数据传递三大作用域;
  2. 过滤器的书写方式及使用。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值