Servlet相关接口(1)——RequestDispatcher,Cookie,HttpSession

在这里插入图片描述

RequestDispatcher

在Web程序中,经常是由多个Servlet来完成请求。RequestDispatcher接口就是为了多个Servlet之间的调整而实现的。该接口由HttpServletRequest的getRequestDispatcher()方法取得。调用时指定跳转的URL地址即可完成跳转。有两种方法实现跳转:include() 和 forward()。

  • include()
    在当前的Servlet中显示另一个Servlet的内容
    		RequestDispatcher dispatcher = request.getRequestDispatcher("/SecondServlet");
            dispatcher.include(request,response);
    
  • forward() ——请求转发
    跳转到其他Servlet,而不会返回跳转前的Servlet
    地址栏的地址不会发生变化
    		//在跳转时可以传递参数 
    		request.setAttribute("message",myMsg);
            RequestDispatcher dispatcher = request.getRequestDispatcher("/SecondServlet");
            dispatcher.forward(request,response);
    

附:另一种跳转——重定向,但他不是RequestDispatcher的方法,是HttpServletResponse的方法:
sendRedirect() —— 地址栏会改变

response.sendRedirect(request.getContextPath()+"/SecondServlet");

会话管理

  • 使用隐藏域
    指将表单中的内容在显示界面时隐藏,即不显示数据。在input标签的属性值设为hidden,将会话的标识记录到隐藏域的value属性中,随表单一起提交。这种一般极少使用。

  • 使用URL重写
    指在URL地址的末尾添加会话标识,改写了原先的URL地址。
    本质是用于唯一标识会话信息,以参数的形式添加到URL中,服务单接收到请求后,解析出会话标识,然后利用会话标识查找出与当前请求对应的会话对象。

  • 使用Cookie
    Cookie时
    eg:页面访问次数

package com.example;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(
        name = "CookieServlet",
        urlPatterns = {"/CookieServlet"}
)
public class CookieServlet extends HttpServlet {

    private static final long serialVersionUID   = 1L;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        Cookie cookie = null;
        Cookie[] cookies = req.getCookies();
        if (cookies != null){
            for (int i=0;i<cookies.length;i++){
                if (cookies[i].getName().equals("visitTime")){
                    int value = Integer.parseInt(cookies[i].getValue())+1;
                    cookies[i].setValue(Integer.toString(value));
                    resp.addCookie(cookies[i]);
                    cookie = cookies[i];
                    break;
                }
            }
        }
        if (cookie == null){
            int maxAge = -1;
            cookie = new Cookie("visitTime","1");
            cookie.setPath(req.getContextPath());
            cookie.setMaxAge(maxAge);
            resp.addCookie(cookie);
        }

        System.out.println(cookie.getValue());
        
        resp.setContentType("text/html;charset=utf-8");
        resp.setCharacterEncoding("utf-8");
        PrintWriter out = resp.getWriter();
        out.println("<!DOCTYPE HTML>");
        out.println("<html>");
        out.println("<head><title>访问次数</title></head>");
        out.println("<body>");
        out.println("<h3>访问次数:"+cookie.getValue()+"</h3>");
        out.println("</body>");
        out.println("</html>");
        out.flush();
        out.close();
    }
}

在这里插入图片描述

  • 使用HttpSession
    利用服务器来管理会话
    当程序为某个客户端的请求创建了一个session时,服务器会检查客户端的请求是否已经包含了一个session标识,如果已经有了session标识,服务器就把该session检索出来使用;若不含session标识,就为客户端创建一个该请求的唯一session标识。
    session保存在服务器,相比起来session应该存放一些敏感数据,更安全!

HttpSession的消亡:
①将浏览器关闭
②调用HttpSession的invalidate()方法
③session超时

HttpSession的有效期:
①在浏览器中统一设置
②调用session的setMaxInactiveInterval(long interval)方法
③在web.xml中修改,如:

  <session-config>
        <!-- 会话超时为30min       -->
        <session-timeout>30</session-timeout>
    </session-config>

一个session与JSP结合使用的简单例子

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>水果店</title>
<style type="text/css">
        h1{
            text-align: center;
        }
        table{
            width:60%;
            margin:0 auto;
            border: 1px solid red;
            border-collapse: collapse;
        }
        td{
            border:1px solid red;
            text-align: center;
        }
        #btn{
        	margin-top:20px;
        	text-align: center;
        }
    </style>
</head>
<body>
	 	<h1>开心水果店</h1>
	 	<form action="CartServlet" method="post">
	 		<table id="fruits">
            <tr>
                <td>水果种类</td>
                <td>单价</td>
                <td>购买数量</td>
            </tr>
            <tr>
                <td>苹果</td>
                <td>5.5</td>
                <td><input type="text" name="apple_amount"></td>
            </tr>
            <tr>
                <td>香蕉</td>
                <td>4.5</td>
                <td><input type="text" name="banana_amount"></td>
            </tr>
            <tr>
                <td>葡萄</td>
                <td>6.8</td>
                <td><input type="text" name="grape_amount"></td>
            </tr>
        </table>
        <div id="btn"><input type="submit" value="加入购物车"></div>
	 	</form>
        
</body>
</html>
package com.example;

import java.io.IOException;
import java.util.HashMap;

import javax.servlet.RequestDispatcher;
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 javax.servlet.http.HttpSession;


@WebServlet(
		name = "CartServlet",
		urlPatterns = {"/CartServlet"}
		)
public class CartServlet extends HttpServlet {
	
	private static final long serialVersionUID = 1L;
    public CartServlet() {
        super();
    }
    
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}


	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		response.setContentType("text/html;charset=utf-8");
        response.setCharacterEncoding("utf-8");
		
		HttpSession session = request.getSession();
		HashMap map = (HashMap) session.getAttribute("cart");
		if(map == null) {
			map = new HashMap();
			map.put("apple", 0);
			map.put("banana", 0);
			map.put("grape",0);
			session.setAttribute("cart", map);
		}
		String appleAmount = request.getParameter("apple_amount");
		String bananaAmount = request.getParameter("banana_amount");
		String grapeAmount = request.getParameter("grape_amount");
		
		int newAppleAmount = (int)map.get("apple")+Integer.parseInt(appleAmount);
		int newBananaAmount = (int)map.get("banana")+Integer.parseInt(bananaAmount);
		int newGrapeAmount = (int)map.get("grape")+Integer.parseInt(grapeAmount);
		
		map.put("apple", newAppleAmount);
		map.put("banana", newBananaAmount);
		map.put("grape",newGrapeAmount);
		
		session.setAttribute("cart", map);
		
		RequestDispatcher dispatcher = request.getRequestDispatcher("/shoppingcart.jsp");
		dispatcher.forward(request, response);
		
	}

}

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ page import="java.util.*" %>
    <%
    session = request.getSession();
	HashMap map = (HashMap) session.getAttribute("cart");
	String apple = Integer.toString((int)map.get("apple"));
	String banana = Integer.toString((int)map.get("banana"));
	String grape = Integer.toString((int)map.get("grape"));
	double total = (int)map.get("apple")*5.5+(int)map.get("banana")*4.5+(int)map.get("grape")*6.8;
    %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>购物车</title>
<style type="text/css">
	 	h1{
            text-align: center;
        }
        table{
            width:60%;
            margin:0 auto;
            border: 1px solid red;
            border-collapse: collapse;
        }
        td{
            border:1px solid red;
            text-align: center;
        }
        #back{
        	margin-top:20px;
        	text-align: center;
        }
</style>
</head>
<body>
	<h1>购物车</h1>
	<table id="shoppingcart">
            <tr>
                <td>水果种类</td>
                <td>总数量</td>        
            </tr>
            <tr>
                <td>苹果</td>
                <td><%=apple %></td>
            </tr>
            <tr>
                <td>香蕉</td>
                <td><%=banana %></td>
            </tr>
            <tr>
                <td>葡萄</td>
                <td><%=grape %></td>
            </tr>
            <tr>
            	<td colspan="2">总消费:<%=total %></td>
            </tr>
        </table>
        
        <div id="back"><a href="shopping.jsp">回到水果店</a></div>

</body>
</html>

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值