此博客用于个人学习,来源于网上,对知识点进行一个整理。
一,请求转发和重定向:
1.使用例:
// TODO Auto-generated method stub
response.setContentType("text/html;charset=UTF-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
//老方法:输出结果
/*
* if("admin".equals(username) && "123".equals(password)) {
* response.getWriter().write("<h1>登录成功</h1>");
* }else {
* response.getWriter().write("<h1>登录失败</h2>");
* }
*/
//新的方式:页面跳转:重定向和请求转发
if("admin".equals(username) && "123".equals(password)) {
//1.重定向
response.sendRedirect("login_success.html");
//2.请求转发
request.getRequestDispatcher("login_success.html").forward(request, response);
}else{
response.getWriter().write("<h1>登录失败</h2>");
}
2.两者区别:
请求转发:
- 地址上显示的是请求 servlet 的地址。返回 200 ok
- 请求次数只有一次,因为是服务器内部帮客户端执行了后续的工作
- 只能跳转自己项目的资源路径
- 效率上稍微高一点,因为只执行一次请求
- 可以使用上一次的 request 对象
重定向:
- 地址上显示的是最后的那个资源的路径地址
- 请求次数最少有两次,服务器在第一次请求后,会返回 302 以及一个地址,浏览器在根据这个地址,执行第二次访问
- 可以跳转到任意路径,即使不是自己的工程也可以跳
- 效率稍微低一点,执行两次请求
- 后续的请求,没法使用上一次的 request 存储的数据,或者没法使用上一次的 request 对象,因为这是两次不同的请求
二,Cookie:
其实是一份小数据,是服务器给客户端,并且存储在客户端上的一份小数据。
1.应用场景:
自动登录、浏览记录、购物车。
2.为什么要有这个 Cookie:
http 的请求是无状态的。客户端与服务器在通讯的时候是无状态的,其实就是客户端在第二次来访的时候,服务器根本就不知道这个客户端以前有没有来访问过。为了更好的用户体验,更好的交互 [自动登录],其实从公司层面讲,就是为了更好的收集用户习惯[大数据]。
3.Cookie的简单使用:
- 添加 cookie 给客户端:
response.setContentType("text/html;charset=UTF-8");
//获取Cookie对象
Cookie cookie = new Cookie("aa", "bb");
//添加cookie
response.addCookie(cookie);
//如果添加成功就输出请求成功
response.getWriter().write("请求成功!");
现象:客户端收到的信息里面,响应头中多了一个字段 Set-Cookie。
- 获取从客户端带过来的 Cookie:
//获取客户端带过来的Cookie:Cookie[] request.getCookies():获取客户端带来的Cookie数组,如果是第一次响应,对应的数值为null
Cookie[] cookies = request.getCookies();
//遍历Cookie,但要先进行判断
if(cookies != null) {
for (Cookie c : cookies) {
String cookieName = c.getName();
String cookieValue = c.getValue();
System.out.println(cookieName+"=="+cookieValue);
}
}
- 其他常用方法:
Cookie[] cookies = request.getCookies();
if(cookies != null) {
for (Cookie c : cookies) {
String cookieName = c.getName();
String cookieValue = c.getValue();
System.out.println(cookieName+"=="+cookieValue);
}
}
Cookie cookie1 = new Cookie("name", "zhangsan");
/*
* 关闭浏览器后,cookie就没有了。--->针对没有设置cookie的有效期。
* expiry:有效以秒计算。
* 正值:表示在这个数字过后,cookie将会失效。
* 负值:关闭浏览器,那么cookie就失效,默认值是 -1
*/
cookie1.setMaxAge(60 * 60 * 24 * 7);
Cookie cookie2 = new Cookie("age", "18");
response.addCookie(cookie1);
response.addCookie(cookie2);
由于使用了 setMaxAge 这个方法,所以浏览器关闭后依然可以保存之前的数值。
//赋值新的值
cookie.setValue(newValue);
//用于指定只有请求了指定的域名,才会带上该cookie
cookie.setDomain(".baidu.com");
//只有访问该域名下的cookieDemo的这个路径地址才会带cookie
cookie.setPath("/CookieDemo");
4.例子一:记录上次登录的时间:
demo03.java:
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("gbk");
String username = request.getParameter("username");
String password = request.getParameter("password");
if("admin".equals(username) && "123".equals(password)) {
Cookie[] cookies = request.getCookies();
//从数组中找出我们的cookie
Cookie cookie = util.cookieUtil.getCookie(cookies, "lastTime");
if(cookie == null) {
//第一次登录,需要服务端传输cookie给客户端
Cookie c = new Cookie("lastTime", System.currentTimeMillis()+"");
c.setMaxAge(60*60);
response.addCookie(c);
response.getWriter().write("<h1>欢迎到来,"+username+"</h1>");
}else {
//将lastTime的值从String转为long的类型
long lastTime = Long.parseLong(cookie.getValue());
//将lastTime改为date格式输出
response.getWriter().write("<h1>欢迎到来,"+username+",您上次的登录时间为"+new Date(lastTime)+"</h1>");
//更新数据
response.addCookie(new Cookie("lastTime", System.currentTimeMillis()+""));
}
}else{
response.getWriter().write("<h1>登录失败</h1>");
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
还有一个工具类用于获取需要的 cookie:CookieUtil.java
public static Cookie getCookie(Cookie[] cookies,String name) {
if(cookies != null) {
for (Cookie cookie : cookies) {
if(cookie.getName().equals(name)) {
return cookie;
}
}
}
return null;
}
5.例子二:显示商品浏览记录:
-
准备工作:
-
拷贝基础课第一天的 html 原型文件,到工程的 WebContent 里面。
-
在 WebContent 目录下新建一个 jsp 文件, product_list.jsp, 然后拷贝原来 product_list.html 的内容到 jsp 里面。 建好之后,jsp 里面的所有 ISO-8859-1 改成 UTF-8
拷贝 html 标签的所有内容,替换 jsp 的 html 标签即可
-
修改 product_info.html 里面的手机数码超链接地址
- 手机数码(current)
-
-
修改首页(index.html)顶部的手机数码跳转的位置为 product_list.jsp
- 手机数码(current)
-
分析用法:
- Jsp 里面使用 Java 代码:
-
Jsp:Java Server Pager —> 最终会翻译成一个类, 就是一个 Servlet
-
定义全局变量
<%! int a = 99; %>
-
定义局部变量
<% int b = 999; %>
-
进行输出
<%=a %>
<%=b %>
-
清除浏览记录:
由于 Cookie 本身没有一个 delete 方法,可以使用 setMaxAge 这个方法,将参数设为0,从而实现清除操作。
/** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub Cookie cookie = new Cookie("history", ""); //设置时间为0,相当于清除Cookie cookie.setMaxAge(0); cookie.setPath("/CookieDemo2"); response.addCookie(cookie); //跳转回原始页面 response.sendRedirect("product_list.jsp"); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); }
6.总结:
-
服务器给客户端发送过来的一小份数据,并且存放在客户端上
-
获取 cookie, 添加 cookie
request.getCookie();
response.addCookie();
-
Cookie分类:
-
会话 Cookie:默认情况下,关闭了浏览器,那么 cookie 就会消失
-
持久Cookie:在一定时间内,都有效,并且会保存在客户端上。
cookie.setMaxAge(0); //设置立即删除
cookie.setMaxAge(100); //100 秒
-
-
Cookie 的安全问题:
由于 Cookie 会保存在客户端上,所以有安全隐患问题。还有一个问题,Cookie 的大小与个数有限制。为了解决这个问题 —> Session .
三,Session:
会话,Session 是基于 Cookie 的一种会话机制。Cookie 是服务器返回一小份数据给客户端,并且存放在客户端上。Session 是数据存放在服务器端。
1.常用API:
//获取Session对象 HttpSession session = request.getSession(); //获取SessionID:String getId() String id = session.getId(); //存储数据:void setAttribute(name, value) session.setAttribute("", ""); //取出数据:Object getAttribute(name) session.getAttribute(""); //移除数据:void removeAttribute(name) session.removeAttribute("");
2.Session 何时创建,何时销毁:
-
创建:当 Servlet 调用的时候便创建了:request.getSession();
-
销毁
- 关闭服务器了。
- 超过有效期,默认 30min。也有持久型的,Redis,即使关了浏览器,也不会消失。
3.例子三:简易购物车:
-
进行分析:
-
Session 的处理程序 demo01.java:
/** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.setContentType("text/html;charset=utf-8"); //1.获取骑士id int id = Integer.parseUnsignedInt(request.getParameter("id")); String[] names = {"空我","亚吉陀","龙骑","剑","甲斗"}; String name = names[id]; //2.获取购物车里面Session存放的信息,并且用一个map集合储存 Map<String,Integer> map = (Map<String, Integer>) request.getSession().getAttribute("cart"); //3.首先判断map是否有存放东西 if(map == null) { //如果没有,进行map重新赋值 map = new LinkedHashMap<String, Integer>(); request.getSession().setAttribute("cart", map); } //4.再对购物车是否有这个骑士进行判断 if(map.containsKey(name)) { //如果有这种商品,数量加一 map.put(name, map.get(name)+1); }else { //如果没有这种商品,数量为一 map.put(name, 1); } //5.输出界面的跳转 response.getWriter().write("<a href='index.jsp'><h1>继续购物</h1></a>"); response.getWriter().write("<a href='account.jsp'><h1>去结算</h1></a>"); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); }
- 商品页面 index.jsp:
<body> <a href="demo01?id=0"><h3>空我</h3></a><br> <a href="demo01?id=1"><h3>亚吉陀</h3></a><br> <a href="demo01?id=2"><h3>龙骑</h3></a><br> <a href="demo01?id=3"><h3>剑</h3></a><br> <a href="demo01?id=4"><h3>甲斗</h3></a><br> </body>
- 结算页面:account.jsp:
<h2>您目前购买的商品有:</h2><br> <% Map<String,Integer> map = (Map<String,Integer>)session.getAttribute("cart"); if(map != null){ for(String key : map.keySet()){ int value = map.get(key); %> <h2>商品名称:<%=key %> 数量:<%=value %></h2> <% } } %> <a href="deletedemo"><h2>清空购物车</h2></a>
- 清空购物车 deletedemo.java:
/** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub HttpSession session = request.getSession(); //方式一:移除Session中的cart数据 session.removeAttribute("cart"); //方式二:销毁整个Session session.invalidate(); //跳转回购物车页面 response.sendRedirect("account.jsp"); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); }