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
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>