四种方式:
目的:如果要保存某些HTTP请求过程中所产生的数据
问题:由于HTTP协议是无状态协议(虽然Socket连接是有状态的,但每次用HTTP协议进行数据传输后就关闭的Socket连接,因此,HTTP协议并不会保存上一次的状态)
解决办法:需要一种类似全局变量的机制保证数据在不同的HTTP请求之间共享。URL重写,隐藏域表单,Session和Cookie可以做到。
一:URL重写
<%@ page language="java" pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
URL重写
超链接1
<%-- 第二种URL重写的方式
--%>
<%-- 第三种URL重写的方式
--%>
<%-- 第四种URL重写的方式 --%>
它对应的servlet代码:
package service;
import java.io.IOException;
import java.net.URLDecoder;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/url")
public class URLServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
String age = request.getParameter("age");
System.out.println(name + "\t" + age);
name = URLDecoder.decode(name,"utf-8");// 进行解码操作
System.out.println(name + "\t" + age);
}
}
二:隐藏域表单
目标:实现一个简单的对话页面,即在a页面先输入名称。然后在b页面输入想说的话,再次到b页面,显示刚才说的话,并可以重新说话。
a页面:
<%@ page language="java" pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
隐藏域表单技术
b页面:
<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
隐藏域表单技术
${param.name }:${param.content }
servlet:
三:Cookie技术(浏览器端)
Cookie是通过将数据保存在客户端的硬盘(永久Cookie)或内存(临时Cookie)中来实现数据共享的一种机制。大小限制在4KB
如果不使用setMaxAge方法,Cookie的超时时间为-1,在这种情况下,Cookie就是临时Cookie,也就是说这种Cookie实际上并不保存在客户端硬盘上,而是保存在客户端内存中的。永久Cookie和临时Cookie在第二次向服务端发出HTTP请求时生成Cookie字段。如果第一次将Cookie写入客户端(不管是硬盘还是内存),在同一台机器上第二次访问该网站的jsp页面时,会自动将客户端的cookie作为HTTP请求头的Cookie字段值传给服务端,如果有多个Cookie,中间用";"隔开。
永久Cookie和临时Cookie的区别:
<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Cookie技术
<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%>
Cookie技术
欢迎您,${USERNAME }
servlet:
package service;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
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 javax.servlet.http.HttpSession;
@WebServlet("/cookie")
public class CookieServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 能进入这个方法说明,用户登录信息已经在cookie中保存了
// 取出用户登录信息
Cookie[] cookies = request.getCookies();
String name1 ="";
String pass1 = "";
for (Cookie cookie : cookies) {
String name = cookie.getName();
if("USERNAME".equals(name)) {
name1 = cookie.getValue();
}else if("USERPASS".equals(name)) {
pass1 = cookie.getValue();
}
}
// 你的登录信息必须保存在session中
HttpSession session = request.getSession();
session.setAttribute("USERNAME", name1);
session.setAttribute("USERPASS", pass1);
response.sendRedirect("c2.jsp");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
String pass = request.getParameter("pass");
String re = request.getParameter("re");
// 如果选中了记住我,将用户信息保存到cookie中去
if(re!=null) {
// 产生cookie对象
Cookie cookie1 = new Cookie("USERNAME", name);
Cookie cookie2 = new Cookie("USERPASS", pass);
// 设置cookie的生命周期
cookie1.setMaxAge(60*60*24);
cookie2.setMaxAge(60*60*24);
// 将cookie保存到浏览器中
response.addCookie(cookie1);
response.addCookie(cookie2);
}
// 你的登录信息必须保存在session中
HttpSession session = request.getSession();
session.setAttribute("USERNAME", name);
session.setAttribute("USERPASS", pass);
response.sendRedirect("c2.jsp");
}
}
四:session技术(服务端):
实现一个简单的购物车模板,可以将货物批量添加到购物车,并在购物车显示物品,数量及其总价,还可返回物品列表继续购物。
物品列表:
<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
商品显示
查看购物车
购物车:
<%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
购物车显示
名称
价格
数量
${gi.goodsName }
${gi.goodsPrice }
${gi.goodsNum }
总价:${sum }
继续购物
servlet:
package service;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
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;
import bean.GoodsInfo;
import dao.GoodsInfoDAO;
@WebServlet("/goods")
public class GoodsServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
private GoodsInfoDAO gidao = new GoodsInfoDAO();
// 负责显示商品列表
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getSession().setAttribute("GOODSLIST", gidao.findAllGoods());//将查询结果放入session容器
response.sendRedirect("d1.jsp");//重定向
}
// 负责加入购物车
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();//获取session对象
String[] ids = request.getParameterValues("check");//获取已选物品的id列表
// 将选中的商品加入到购物车中
// 首先判断购物车是否存在
List list = null;
if(session.getAttribute("GWCLIST")==null) {//当还没有选任何物品的时候,需要新建一个浏览器接收用来显示的容器
list = new ArrayList();
}else {//如果已经有了这个容器,并且是浏览器方利用session容器将其包含再传过来的,那就获取到这个容器
list = (List)session.getAttribute("GWCLIST");
}
// 将选中的商品加入到购物车(GWCLIST)中
for (String id : ids) {//现在只需要将已选列表添加到显示容器中
int i = Integer.parseInt(id);
GoodsInfo gi = gidao.findById(i);
// 如果商品存在购物车,则数量+1,否则添加进入购物车
int index = list.indexOf(gi);
if(index==-1) { //不存在
gi.setGoodsNum(1);
list.add(gi);
}else { //存在
gi = list.get(index);
gi.setGoodsNum(gi.getGoodsNum()+1);
}
}
session.setAttribute("GWCLIST", list);//将显示列表添加到session并起名为GWCLIST
response.sendRedirect("d1.jsp");//重定向
}
}
总结: