10__jsp入门el表达式入门CookieSession

news/2024/12/30 1:16:56/

jsp入门&el表达式入门&Cookie&Session

第一部分:jsp入门和el表达式入门

1. jsp的入门

1.1 什么是jsp:
(1)sun公司用于动态网站开发技术servlet,因为使用servlet如果向页面输出内容很麻烦,有了jsp,使用jsp向页面输出内容很方便,jsp就是servlet,最终会被编译成servlet,放到tomcat的work目录。
(2)jsp:java server pages,java服务器端页面,jsp会编译成servlet,通过tomcat服务器进行运行。
1.2 jsp在什么时候编译成servlet:在访问jsp时候会编译成servlet
1.3 jsp的组成:html+java代码+jsp自身的一些东西
1.4 jsp里面如何嵌入java代码,有三种方式
第一种方式:<%! %> : 在里面定义变量,这个变量是成员变量
= 生成的servlet代码(jsp01_jsp.java)不会在任何一个方法里面,而是在外面,是一个成员变量。
第二种方式:<%= %> :表示向页面输出内容(固定值、变量)
= 生成的servlet代码(jsp01_jsp.java)会在service方法(_jspService)里面,里面的代码是out.print(“hello” );
= 后面不要加分号,错误代码:<%=“hello”; %>。
第三种方式:<% %> :编译成servlet之后,代码生成在service方法里面
= 编译成servlet之后,代码生成在service方法(_jspService)里面

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>My JSP 'jsp01.jsp' starting page</title></head><body><h1>hello jsp....</h1><!-- 第一种嵌入方式 --><%! int m = 10; %><!-- 第二种嵌入方式 --><%="hello" %><!-- 第三种嵌入方式 --><%for(int i=0;i<3;i++) {}%></body>
</html>

1.5 在jsp中html代码和java代码混合使用
(1)在jsp中生成五行五列的表格
(2)基本实现的步骤
= 五行:循环五次,生成tr
= 五列:在每行里面循环五次,生成td
(3)代码
<table border="1" cellpadding="10">
<%
for(int i=1;i<=5;i++) {
%>
<tr>
<%
for(int j=1;j<=5;j++) {
%>
<td>itcast</td>
<%
}
%>
</tr>
<%
}
%>
</table>

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>My JSP 'table.jsp' starting page</title></head><body><!-- 使用html+java代码生成五行五列表格 --><table border="1" cellpadding="10"><%for(int i=1;i<=5;i++) {%><tr><%for(int j=1;j<=5;j++) {%><td>itcast</td><% }%></tr><% }%></table></body>
</html>

2. el表达式的入门

2.1 作用:获取域对象里面的值,不能使用在html中,使用在jsp中
2.2 写法:${设置的名称}
2.3 通过例子演示el表达式
(1)创建jsp页面,在jsp中向两个域对象里面设置值(servletContext、request)
(2)在jsp中首先使用传统方式获取域对象里面的值
(3)在jsp再使用el表达式获取域对象里面的值
(4)代码
<!-- 向域对象里面设置值 servletContext和request-->
<%
//向servletContext域里面设置值
getServletContext().setAttribute("context", "contextvalue");
//向request域里面设置值
request.setAttribute("request", "requsetvalue");
%>
<!-- 使用传统方式获取域对象里面的值 -->
<%=getServletContext().getAttribute("context") %>
<%=request.getAttribute("request") %>
<!-- 使用el表达式获取域对象里面的值 -->

<hr/>
${context }
<br/>
${request }

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>My JSP 'el01.jsp' starting page</title></head><body><!-- 向域对象里面设置值  servletContext和request--><%//向servletContext域里面设置值getServletContext().setAttribute("context", "contextvalue");//向request域里面设置值request.setAttribute("request", "requsetvalue");%><!-- 使用传统方式获取域对象里面的值 --><%=getServletContext().getAttribute("context") %><%=request.getAttribute("request") %><!-- 使用el表达式获取域对象里面的值 --><hr/>${context }<br/>${request }</body>
</html>

2.4 其他的问题
(1)使用el表达式获取的域对象名称不存在
= 如果使用传统方式获取域对象的值不存在,返回null,容易造成空指针异常
= 使用el表达式获取的域对象名称不存在,返回空字符串 “”,不会造成空指针异常

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>My JSP 'el01.jsp' starting page</title></head><body><!-- 向域对象里面设置值 equest--><%//向request域里面设置值request.setAttribute("request", "requsetvalue");%><!-- 使用传统方式获取域对象里面的值 --><%=request.getAttribute("aaa") %><!-- 使用el表达式获取域对象里面的值 --><hr/>${bbb }</body>
</html>

(2)如果分别向多个域对象里面设置值,名称都相同
= 使用el表达式获取的值是域范围小的里面的值(servletContext和request取request设置的值)
= 分别获取不同的域对象里面的值
${requestScope.msg }
${applicationScope.msg } //ServletContext

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>My JSP 'el01.jsp' starting page</title></head><body><!-- 向域对象里面设置值  servletContext和request--><%//向request域里面设置值request.setAttribute("msg", "requsetvalue");//向servletContext域里面设置值getServletContext().setAttribute("msg", "contextvalue");%><!-- 使用传统方式获取域对象里面的值 --><%=getServletContext().getAttribute("msg") %><%=request.getAttribute("msg") %><!-- 使用el表达式获取域对象里面的值 --><hr/>${requestScope.msg }<br/>${applicationScope.msg }</body>
</html>

第二部分:会话管理 cookie技术

1. 会话管理的简介

1.1 什么是会话:打开浏览器,进行网页的浏览,到关闭浏览器的过程,称为一次会话
1.2 会话技术用两种技术
(1)cookie技术:客户端的技术
(2)session技术:服务器端的技术
1.3 使用域对象是否保存购物信息
(1)使用request域是否保存购物信息(不能保存)
= 因为request域范围是一次请求,所以最终结算时候在request域里面没有任何购物信息。
在这里插入图片描述
(2)使用servletContext域是否保存购物信息(不适合保存,因为你要做很多的判断来区分不同的人的购物信息)
= 因为每个项目有一个servletContext域对象,不同的人购物的商品都要存到这个域里面。
在这里插入图片描述
1.4 使用cookie和session技术保存购物信息
(1)使用cookie保存购物信息
= 第一次购买鼠标,在服务器端得到鼠标,把鼠标放到cookie里面,把cookie返回到浏览器中
= 第二次购物键盘,携带浏览器里面鼠标发送请求,在服务器端分别得到购物的商品和携带商品,把这两个
商品放到cookie里面,把cookie返回到浏览器中
=最终结算:携带浏览器中的商品发送请求,完成结算
在这里插入图片描述
(2)使用session保存购物信息
= 第一次购买百度,在服务器端得到百度,开辟一个空间,把百度放到空间里面,返回一把可以打开空间
的钥匙,把这把返回到浏览器中
= 第二次购买IBM,携带浏览器中的钥匙发送请求,在服务器端得到购买的商品和携带钥匙,使用钥匙打开
空间,把购买的商品放到空间中,返回一把新的钥匙到浏览器中
= 最终结算:携带着浏览器中的钥匙发送请求,在服务器端获取钥匙,使用钥匙打开空间,把空间中的商品
取出来,最终完成结算
在这里插入图片描述

2. 练习一:使用cookie实现记录用户的上次访问时间

2.1 需求的描述
(1)创建servlet,当第一次访问这个servlet时候,产生访问时间,向页面输出内容
(2)当第二次访问这个servlet时候,有第一次时间,把第一次产生的时候显示到页面上;
第二次访问产生新的时间
(3)当第三次访问这个servlet时候,有第二次时间,把第二次时候显示到页面上,
第三次访问产生新的时间

2.2 Cookie的api
(1)Cookie[] getCookies() :得到所有的cookie
(2)addCookie(Cookie cookie) :把cookie返回到浏览器中(回写)
(3)new Cookie(java.lang.String name, java.lang.String value)
两个参数:第一个参数是cookie名称,第二个参数是值
(4)getName() :得到cookie的名称
(5)getValue() :得到cookie的值
2.3 实现步骤的分析(画图)
* 1、判断是否是第一次访问
* 获取所有的cookie,判断cookie里面是否有名称 lastVisit的cookie
* 2、如果没有有相同名称的cookie,是第一次访问,直接向页面输出内容
* 获取第一次访问的时间,把时间放到cookie里面,把cookie回写到浏览器
* 3、如果不是第一次,获取携带过来的时间,把这个时间显示到页面上
* 获取这次访问产生的时间,把时间放到cookie里面,把cookie回写到浏览器
使用cookie记录用户访问时间
2.4 代码实现练习
(1)代码
//获取所用的cookie
Cookie[] cookies = request.getCookies();
//判断是否有名称是 lastVisit的cookie
Cookie cookie = findCookie(cookies,"lastVisit");
//如果是第一次
if(cookie == null) {
//向页面输出内容
response.getWriter().write("welcome");
} else {//不是第一次
//获取携带过来的时间,把这个时间显示到页面上
String times = cookie.getValue();
response.getWriter().write(times);
}
//得到产生的时间
Date date = new Date();
String times = date.toLocaleString();
//把时间放到cookie里面
Cookie c1 = new Cookie("lastVisit",times);
//把cookie回写到浏览器中
response.addCookie(c1);

package cn.itcast.cookie;
import java.io.IOException;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*** 实现记录用户的上次访问时间*/
public class CookieDemo1 extends HttpServlet {/*** 步骤* 1、判断是否是第一次访问* 	 获取所有的cookie,判断cookie里面是否有名称 lastVisit的cookie* 2、如果没有有相同名称的cookie,是第一次访问,直接向页面输出内容*  获取第一次访问的时间,把时间放到cookie里面,把cookie回写到浏览器* 3、如果不是第一次,获取携带过来的时间,把这个时间显示到页面上*  获取这次访问产生的时间,把时间放到cookie里面,把cookie回写到浏览器*/public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//获取所用的cookieCookie[] cookies = request.getCookies();//判断是否有名称是 lastVisit的cookieCookie cookie = findCookie(cookies,"lastVisit");//如果是第一次if(cookie == null) {//向页面输出内容response.getWriter().write("welcome");} else {//不是第一次//获取携带过来的时间,把这个时间显示到页面上String times = cookie.getValue();response.getWriter().write(times);}//得到产生的时间Date date = new Date();String times = date.toLocaleString();//把时间放到cookie里面Cookie c1 = new Cookie("lastVisit",times);//设置为持久化的cookiec1.setMaxAge(3600);//把cookie回写到浏览器中response.addCookie(c1);}//判断是否有名称是 lastVisit的cookieprivate Cookie findCookie(Cookie[] cookies, String name) {if(cookies == null) {return null;}for (Cookie cookie : cookies) {//得到cookie的名称String cookieName = cookie.getName();//判断是否相同if(name.equals(cookieName)) {//有相同的cookiereturn cookie;}}return null;}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}
}

3. cookie的api使用

3.1 cookie的分类
(1)cookie分成两类
第一类:会话级别的cookie,在关闭浏览器之后,cookie销毁了,在默认的情况下是会话级别的cookie
第二类:持久化的cookie,在一定的时间范围内,cookie一致有效。
= 设置成持久化的cookie,使用setMaxAge(int expiry) :参数是秒(ps:int表示时间一般为秒,long表示时间一般为毫秒)。
3.2 常用的方法
(1)Cookie[] getCookies() :得到所有的cookie
(2)addCookie(Cookie cookie) :把cookie返回到浏览器中(回写)
(3)new Cookie(java.lang.String name, java.lang.String value)
两个参数:第一个参数是cookie名称,第二个参数是值
(4)getName() :得到cookie的名称
(5)getValue() :得到cookie的值
(6)setMaxAge(int expiry) :设置cookie的有效时长
(7)setPath(java.lang.String uri) :设置cookie的有效路径
= 比如通过setPath方法设置了一个路径,在浏览器的地址栏输入一个地址,如果这个地址包含设置的路径,
才会携带cookie信息过来
= 举例
setPath("/day10")
访问路径: http://127.0.0.1/day10/demo1 ,会携带cookie信息
访问路径: http://127.0.0.1/day09/demo2 , 不会携带cookie信息
setPath("/")
3.3 使用注意事项
= cookie大小有限制
= 创建cookie时候至少两部分内容,一个name,一个value
= 在默认的情况下,cookie是一个会话级别cookie
3.4 销毁持久化的cookie
第一步:创建一个和要销毁cookie项目名称的cookie new Cookie(“name”,"");(要写一个空字符串)
第二步:设置cookie有效时长 setMaxAge(0)
第三步:设置有效路径 ,要和销毁的cookie的路径一致 setPath("/")
第四步:把cookie回写到浏览器中

4. 练习二:使用cookie记录用户浏览的商品

4.1 准备工作
(1)创建商品列表页面
4.2 基本步骤
(1)使用超链接提交不同的商品,每个商品是id值区分
(2)在servlet中得到点击商品的id值,把id值放到cookie里面,再把cookie回写浏览器中
(3)如果第一次访问商品id=1.把1放到cookie里面,返回到浏览器中
第二次访问携带id=1的值进行访问,在服务器端得到当前浏览商品id和携带的id值,把这两个id值放到cookie里面,
返回到浏览器中。
4.3 画图分析实现的步骤
使用cookie记录用户浏览商品
4.4 代码实现
(1)实现的步骤
* 1、判断是否是第一次浏览
* * 得到所有的cookie,判断cookie里面是否有名称是his的cookie,如果有不是第一次
* 2、如果是第一次,得到id值,把值放到cookie里面,把cookie返回到浏览器
* 3、如果不是第一次,得到当前商品的id,得到前一次回写到浏览器的id值,在前一次的基础之上追加新的id值
* * 比如值 1,2,追加值 1,2,3
* * 判断当前浏览的商品,在cookie里面是否存在相同的商品的id,如果存在,不进行追加的操作
* * 把值放到cookie里面,把cookie返回到浏览器
4.5 在servlet中完成把浏览记录存到cookie
(1)代码

if(cookie == null) {//放到cookieCookie c1 = new Cookie("his",id);//持久化的cookiec1.setMaxAge(3600);c1.setPath("/");//回写到浏览器response.addCookie(c1);
} else {//不是第一次//得到cookie的值     1,2,3String values = cookie.getValue();//分割字符串String[] ids = values.split(",");//比较当前浏览商品的id,和数组里面的id值boolean flag = checkIds(ids,id);//如果没有相同的id,才进行操作if(!flag) {//在前一次的基础之上追加新的id值String newValue = values+","+id;Cookie c2 = new Cookie("his",newValue);//持久化的cookiec2.setMaxAge(3600);c2.setPath("/");//回写到浏览器response.addCookie(c2);}
}

4.6 在jsp中显示浏览商品的图片和名称
(1)代码

<%
Cookie[] cookies = request.getCookies();
Cookie cookie = MyCookieUtils.findByCookie(cookies, "his");
if(cookie == null) {
%>
<h2>没有任何的浏览记录</h2>
<% 		
} else { //获取商品的id值  1,2,3String values = cookie.getValue();//显示商品的图片和商品的名称String[] names = {"手电筒","手机","电视","冰箱"};//得到id对应的商品的名称String[] ids = values.split(",");for(String id1:ids) {String name = names[Integer.parseInt(id1)-1];
%>
<img src="/day09-4/img/<%=id1 %>.jpg"/> <%=name %>
<% }
}
%>

4.7 实现清空浏览记录
(1)销毁持久化的cookie操作
(2)步骤
* 1、创建一个和要销毁cookie相同名称的cookie
* 2、设置cookie的有效时长是 0
* 3、设置路径一致的
* 4、把cookie回写到浏览器
(3)代码

//创建一个和要销毁cookie相同名称的cookie 名称 his
Cookie cookie = new Cookie("his","");
//设置有效时长 0
cookie.setMaxAge(0);
//设置路径一致的
cookie.setPath("/");
//把cookie回写到浏览器
response.addCookie(cookie);
<%@ page import="cn.itcast.utils.MyCookieUtils"%>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>My JSP 'product.jsp' starting page</title></head><body><img src="/day09-4/img/1.jpg"/><a href="/day09-4/cookieDemo1?id=1">手电筒</a><img src="/day09-4/img/2.jpg"/><a href="/day09-4/cookieDemo1?id=2">手机</a><img src="/day09-4/img/3.jpg"/><a href="/day09-4/cookieDemo1?id=3">电视</a><img src="/day09-4/img/4.jpg"/><a href="/day09-4/cookieDemo1?id=4">冰箱</a><h2><a href="/day09-4/clearCookie">清空浏览记录</a></h2><h2>浏览商品的记录</h2><%Cookie[] cookies = request.getCookies();Cookie cookie = MyCookieUtils.findByCookie(cookies, "his");if(cookie == null) {%><h2>没有任何的浏览记录</h2><% 		} else { //获取商品的id值  1,2,3String values = cookie.getValue();//显示商品的图片和商品的名称String[] names = {"手电筒","手机","电视","冰箱"};//得到id对应的商品的名称String[] ids = values.split(",");for(String id1:ids) {String name = names[Integer.parseInt(id1)-1];%><img src="/day09-4/img/<%=id1 %>.jpg"/> <%=name %><% }}%></body>
</html>package cn.itcast.cookie;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.itcast.utils.MyCookieUtils;
public class CookieDemo1 extends HttpServlet {/*** 实现记录用户浏览商品* 1、判断是否是第一次浏览* 	* 得到所有的cookie,判断cookie里面是否有名称是his的cookie,如果有不是第一次* 2、如果是第一次,得到id值,把值放到cookie里面,把cookie返回到浏览器* 3、如果不是第一次,得到当前商品的id,得到前一次回写到浏览器的id值,在前一次的基础之上追加新的id值* 	* 比如值 1,2,追加值 1,2,3*  * 判断当前浏览的商品,在cookie里面是否存在相同的商品的id,如果存在,不进行追加的操作*  * 把值放到cookie里面,把cookie返回到浏览器*/public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//得到浏览商品idString id = request.getParameter("id");//判断是否是第一次浏览//得到所有的cookie,判断cookie里面是否有名称是his的cookieCookie[] cookies = request.getCookies();Cookie cookie = MyCookieUtils.findByCookie(cookies, "his");//如果是第一次if(cookie == null) {//放到cookieCookie c1 = new Cookie("his",id);//持久化的cookiec1.setMaxAge(3600);c1.setPath("/");//回写到浏览器response.addCookie(c1);} else {//不是第一次//得到cookie的值     1,2,3String values = cookie.getValue();//分割字符串String[] ids = values.split(",");//比较当前浏览商品的id,和数组里面的id值boolean flag = checkIds(ids,id);//如果没有相同的id,才进行操作if(!flag) {//在前一次的基础之上追加新的id值String newValue = values+","+id;Cookie c2 = new Cookie("his",newValue);//持久化的cookiec2.setMaxAge(3600);c2.setPath("/");//回写到浏览器response.addCookie(c2);}}//回到商品的页面response.sendRedirect("/day09-4/product.jsp");}//判断当前点击的商品的id值在数组里面是否存在相同的值private boolean checkIds(String[] ids, String id) {for (String idv : ids) {if(idv.equals(id)) {return true;}}return false;}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}
}package cn.itcast.utils;
import javax.servlet.http.Cookie;
public class MyCookieUtils {//判断cookie里面是否有名称是his的cookiepublic static Cookie findByCookie(Cookie[] cookies,String name) {if(cookies == null) {return null;}for (Cookie cookie : cookies) {//得到cookie的名称String cookieName = cookie.getName();if(cookieName.equals(name)) {return cookie;}}return null;}
}package cn.itcast.cookie;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ClearCookie extends HttpServlet {/*** 清空浏览记录(销毁持久化的cookie)* 步骤:* 1、创建一个和要销毁cookie相同名称的cookie* 2、设置cookie的有效时长是 0* 3、设置路径一致的* 4、把cookie回写到浏览器*/public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//创建一个和要销毁cookie相同名称的cookie 名称 hisCookie cookie = new Cookie("his","");//设置有效时长 0cookie.setMaxAge(0);//设置路径一致的cookie.setPath("/");//把cookie回写到浏览器response.addCookie(cookie);//回到页面response.sendRedirect("/day09-4/product.jsp");}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}
}

第三部分:会话管理 session技术

1. session的简介

1.1 session是服务器端的技术
1.2 创建session:使用request里面getSession()创建session对象,名称:HttpSession
1.3 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),
注意:一个浏览器独占一个session对象(默认情况下)
(1)演示一个浏览器独占一个session对象
= 创建servlet1,创建session对象,输出session的id值,向页面输出超链接,到servlet2里面
= 创建servlet2,创建session对象,输出session的id值
1.4 session域对象
(1)servletContext域对象和request域对象
(2)域对象:在一定的范围内,存值和取值
(3)session域对象,范围是一次会话,存值和取值
(4)存值的方法:setAttribute(java.lang.String name, java.lang.Object value)
取值的方法:getAttribute(java.lang.String name)

package cn.itcast.session;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class Servlet1 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//创建session对象HttpSession session = request.getSession();System.out.println("servlet1 id:: "+session.getId());//向页面输出超链接到servlet2response.getWriter().write("<a href='/day09-5/servlet2'>servlet2</a>");}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}
}package cn.itcast.session;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class Servlet2 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//创建session对象HttpSession session = request.getSession();System.out.println("servlet2 id:: "+session.getId());}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}
}

2. 练习:使用session实现简单的购物车

2.1 功能描述
(1)创建商品列表页面,点击一个商品时候,把这个商品加入到购物车里面,
(2)如果重复点击一个商品,做数量上的增加
(3)在结算页面中显示商品名称和数量
2.2 实现的步骤
第一步:判断是否是第一次加入到购物车
= 判断session里面是否有名称是cart的值
第二步:如果是第一次加入到购物车,
= 得到商品id,根据id得到名称,把名称和数量1加入到购物车
第三步:如果不是第一次加入到购物车,
= 判断当前要加入到购物车的商品在购物车里面是否存在,如果已经存在,
获取出商品数量,+1,放回购物车里面
如果不存在,直接把商品名称和数量1加入到购物车
第四步:把购物车放到session里面
使用session实现购物车
2.3 代码实现
session实现购物车

(1)实现把商品放到购物车
//得到商品的id
String id = request.getParameter("id");
//根据id得到商品的名称
String[] names = {"手电筒","手机","电视","冰箱"};
String name = names[Integer.parseInt(id)-1];
//判断是否是第一次加入到购物车
Map<String,Integer> map = (Map<String, Integer>) request.getSession().getAttribute("cart");
//如果是第一次
if(map == null) {
//创建购物车
map = new HashMap<String,Integer>();
//把商品名称和数量1 放到购物车
map.put(name, 1);
} else {//不是第一次
//判断当前加入到购物车的商品,在购物车里面是否存在
if(map.containsKey(name)) {//有相同名称的商品
//获取商品的数量
int num = map.get(name);
//把数量+1,放回map里面
map.put(name, num+1);
} else { //没有相同名称的商品
//直接把名称和数量1放到购物车
map.put(name, 1);
}
}
//把购物车放到session里面
request.getSession().setAttribute("cart", map);
(2)在购物车页面里面显示商品的信息
<%
//判断session里面是否有信息
Map<String,Integer> map = (Map<String, Integer>) request.getSession().getAttribute("cart");
if(map == null) {
%>
<h2>没有任何的购物信息</h2>
<%
} else {
//从map里面获取商品的信息
//遍历map集合
Set<String> set = map.keySet();
//遍历set,得到每个商品的名称,根据名称得到数量
for(String name : set) {
int num = map.get(name);
%>
名称:<%=name %>,数量: <%=num %> <br/>
<%
}
}
%>

3. session的创建和销毁(清空购物车)

3.1 session的创建
(1)使用request里面方法 getSession()可以创建session对象,名称是HttpSession
3.2 session的销毁
有三种方式
(1)非正常关闭服务器
(2)session默认的过期时间
/conf/web.xml
<session-config>
<session-timeout>30</session-timeout>
</session-config>
(3)调用session里面方法 invalidate()
3.3 代码
//创建session
HttpSession session = request.getSession();
//调用销毁
session.invalidate();
//回到页面
response.sendRedirect("/day09-6/cart.jsp");

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>My JSP 'cart.jsp' starting page</title></head><body><h1>结算页面</h1><h2><a href="/day09-6/clearSession">清空购物车</a></h2><!-- 获取session中的购物车里面的商品的信息(从session里面获取map集合值) --><%//判断session里面是否有信息Map<String,Integer> map = (Map<String, Integer>) request.getSession().getAttribute("cart");if(map == null) {%><h2>没有任何的购物信息</h2><% 	} else {//从map里面获取商品的信息//遍历map集合Set<String> set = map.keySet();//遍历set,得到每个商品的名称,根据名称得到数量for(String name : set) {int num = map.get(name);%>名称:<%=name %>,数量: <%=num %> <br/><% }}   	%></body>
</html><%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>My JSP 'product.jsp' starting page</title></head><body><img src="/day09-6/img/1.jpg"/><a href="/day09-6/sessionDemo1?id=1">手电筒</a><img src="/day09-6/img/2.jpg"/><a href="/day09-6/sessionDemo1?id=2">手机</a><img src="/day09-6/img/3.jpg"/><a href="/day09-6/sessionDemo1?id=3">电视</a><img src="/day09-6/img/4.jpg"/><a href="/day09-6/sessionDemo1?id=4">冰箱</a></body>
</html>package cn.itcast.session;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SessionDemo1 extends HttpServlet {/*** 实现简单的购物车的功能第一步:判断是否是第一次加入到购物车   = 判断session里面是否有名称是 cart的值第二步:如果是第一次加入到购物车,      = 创建购物车,得到商品id,根据id得到名称,把名称和数量1加入到购物车第三步:如果不是第一次加入到购物车,判断当前要加入到购物车的商品在购物车里面是否存在,如果已经存在,获取出商品数量,+1,放回购物车里面如果不存在,直接把商品名称和数量1加入到购物车第四步:把购物车放到session里面*/public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//得到商品的idString id = request.getParameter("id");//根据id得到商品的名称String[] names = {"手电筒","手机","电视","冰箱"};String name = names[Integer.parseInt(id)-1];		//判断是否是第一次加入到购物车Map<String,Integer> map = (Map<String, Integer>) request.getSession().getAttribute("cart");//如果是第一次if(map == null) {//创建购物车map = new HashMap<String,Integer>();//把商品名称和数量1 放到购物车map.put(name, 1);} else {//不是第一次//判断当前加入到购物车的商品,在购物车里面是否存在if(map.containsKey(name)) {//有相同名称的商品//获取商品的数量int num = map.get(name);//把数量+1,放回map里面map.put(name, num+1);} else { //没有相同名称的商品//直接把名称和数量1放到购物车map.put(name, 1);}}//把购物车放到session里面request.getSession().setAttribute("cart", map);//直接向页面输出两个超链接,一个是继续购物,一个是去结算response.setContentType("text/html;charset=utf-8");response.getWriter().write("<a href='/day09-6/product.jsp'>继续购物</a>" +" <a href='/day09-6/cart.jsp'>去结算</a>");}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}
}package cn.itcast.session;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class ClearSession extends HttpServlet {/*** 实现销毁session(清空购物车的功能)*/public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//创建sessionHttpSession session = request.getSession();//调用销毁session.invalidate();//回到页面response.sendRedirect("/day09-6/cart.jsp");}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}
}

4. 使用session进行验证码校验

session验证码

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>My JSP 'login.jsp' starting page</title></head><body><h1>登录页面</h1><h2>${msg }</h2><form method="post" action="/day09-7/login">username:<input type="text" name="username" id="usernameid"/><br/>password:<input type="password" name="password" id="passwordid"/><br/>code:<input type="text" name="code"/><a href="#" onclick="loadCode();"><img id="img1" src="/day09-7/code"/></a><br/><input type="submit" value="登录"/></form></body><script type="text/javascript">//实现看不清换一张function loadCode() {//得到img标签var img1 = document.getElementById("img1");img1.src = "/day09-7/code?"+new Date().getTime();}</script>package cn.itcast.code;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginServlet extends HttpServlet {/*** 实现验证码的操作*/public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//获取输入的验证码的值request.setCharacterEncoding("utf-8");String codeInput = request.getParameter("code");//获取session里面的验证码的值String codeSession = (String) request.getSession().getAttribute("code");//进行比较if(codeInput.equals(codeSession)) {//相同response.getWriter().write("success");} else {//失败,回到登录页面,同时携带错误信息request.setAttribute("msg", "验证码校验失败");request.getRequestDispatcher("/login.jsp").forward(request, response);}}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}
}package cn.itcast.code;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CodeServlet extends HttpServlet {/*** 实现验证码的操作第一步:生成图片第二步:生成随机的数字和字母第三步:把数字和字母画到图片上第四步:把图片显示到页面上*/public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//生成图片int width = 150;int height = 50;BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);//得到画笔Graphics2D g2d = (Graphics2D) bufferedImage.getGraphics();//生成四个随机的数字和字母
//		String words = "asdfghjklqwertyuiopzxcvbASDFGHJKLQWERTYUIOPZXCVB1234567890";String words = "\u7684\u4e00\u4e86\u662f\u6211\u4e0d\u5728\u4eba\u4eec\u6709\u6765\u4ed6\u8fd9\u4e0a\u7740\u4e2a\u5730\u5230\u5927\u91cc\u8bf4\u5c31\u53bb\u5b50\u5f97\u4e5f\u548c\u90a3\u8981\u4e0b\u770b\u5929\u65f6\u8fc7\u51fa\u5c0f\u4e48\u8d77\u4f60\u90fd\u628a\u597d\u8fd8\u591a\u6ca1\u4e3a\u53c8\u53ef\u5bb6\u5b66\u53ea\u4ee5\u4e3b\u4f1a\u6837\u5e74\u60f3\u751f\u540c\u8001\u4e2d\u5341\u4ece\u81ea\u9762\u524d\u5934\u9053\u5b83\u540e\u7136\u8d70\u5f88\u50cf\u89c1\u4e24\u7528\u5979\u56fd\u52a8\u8fdb\u6210\u56de\u4ec0\u8fb9\u4f5c\u5bf9\u5f00\u800c\u5df1\u4e9b\u73b0\u5c71\u6c11\u5019\u7ecf\u53d1\u5de5\u5411\u4e8b\u547d\u7ed9\u957f\u6c34\u51e0\u4e49\u4e09\u58f0\u4e8e\u9ad8\u624b\u77e5\u7406\u773c\u5fd7\u70b9\u5fc3\u6218\u4e8c\u95ee\u4f46\u8eab\u65b9\u5b9e\u5403\u505a\u53eb\u5f53\u4f4f\u542c\u9769\u6253\u5462\u771f\u5168\u624d\u56db\u5df2\u6240\u654c\u4e4b\u6700\u5149\u4ea7\u60c5\u8def\u5206\u603b\u6761\u767d\u8bdd\u4e1c\u5e2d\u6b21\u4eb2\u5982\u88ab\u82b1\u53e3\u653e\u513f\u5e38\u6c14\u4e94\u7b2c\u4f7f\u5199\u519b\u5427\u6587\u8fd0\u518d\u679c\u600e\u5b9a\u8bb8\u5feb\u660e\u884c\u56e0\u522b\u98de\u5916\u6811\u7269\u6d3b\u90e8\u95e8\u65e0\u5f80\u8239\u671b\u65b0\u5e26\u961f\u5148\u529b\u5b8c\u5374\u7ad9\u4ee3\u5458\u673a\u66f4\u4e5d\u60a8\u6bcf\u98ce\u7ea7\u8ddf\u7b11\u554a\u5b69\u4e07\u5c11\u76f4\u610f\u591c\u6bd4\u9636\u8fde\u8f66\u91cd\u4fbf\u6597\u9a6c\u54ea\u5316\u592a\u6307\u53d8\u793e\u4f3c\u58eb\u8005\u5e72\u77f3\u6ee1\u65e5\u51b3\u767e\u539f\u62ff\u7fa4\u7a76\u5404\u516d\u672c\u601d\u89e3\u7acb\u6cb3\u6751\u516b\u96be\u65e9\u8bba\u5417\u6839\u5171\u8ba9\u76f8\u7814\u4eca\u5176\u4e66\u5750\u63a5\u5e94\u5173\u4fe1\u89c9\u6b65\u53cd\u5904\u8bb0\u5c06\u5343\u627e\u4e89\u9886\u6216\u5e08\u7ed3\u5757\u8dd1\u8c01\u8349\u8d8a\u5b57\u52a0\u811a\u7d27\u7231\u7b49\u4e60\u9635\u6015\u6708\u9752\u534a\u706b\u6cd5\u9898\u5efa\u8d76\u4f4d\u5531\u6d77\u4e03\u5973\u4efb\u4ef6\u611f\u51c6\u5f20\u56e2\u5c4b\u79bb\u8272\u8138\u7247\u79d1\u5012\u775b\u5229\u4e16\u521a\u4e14\u7531\u9001\u5207\u661f\u5bfc\u665a\u8868\u591f\u6574\u8ba4\u54cd\u96ea\u6d41\u672a\u573a\u8be5\u5e76\u5e95\u6df1\u523b\u5e73\u4f1f\u5fd9\u63d0\u786e\u8fd1\u4eae\u8f7b\u8bb2\u519c\u53e4\u9ed1\u544a\u754c\u62c9\u540d\u5440\u571f\u6e05\u9633\u7167\u529e\u53f2\u6539\u5386\u8f6c\u753b\u9020\u5634\u6b64\u6cbb\u5317\u5fc5\u670d\u96e8\u7a7f\u5185\u8bc6\u9a8c\u4f20\u4e1a\u83dc\u722c\u7761\u5174\u5f62\u91cf\u54b1\u89c2\u82e6\u4f53\u4f17\u901a\u51b2\u5408\u7834\u53cb\u5ea6\u672f\u996d\u516c\u65c1\u623f\u6781\u5357\u67aa\u8bfb\u6c99\u5c81\u7ebf\u91ce\u575a\u7a7a\u6536\u7b97\u81f3\u653f\u57ce\u52b3\u843d\u94b1\u7279\u56f4\u5f1f\u80dc\u6559\u70ed\u5c55\u5305\u6b4c\u7c7b\u6e10\u5f3a\u6570\u4e61\u547c\u6027\u97f3\u7b54\u54e5\u9645\u65e7\u795e\u5ea7\u7ae0\u5e2e\u5566\u53d7\u7cfb\u4ee4\u8df3\u975e\u4f55\u725b\u53d6\u5165\u5cb8\u6562\u6389\u5ffd\u79cd\u88c5\u9876\u6025\u6797\u505c\u606f\u53e5\u533a\u8863\u822c\u62a5\u53f6\u538b\u6162\u53d4\u80cc\u7ec6";//创建Random对象Random r = new Random();int x = 25;int y = 30;//设置颜色g2d.setColor(Color.YELLOW);//设置字体的样式g2d.setFont(new Font("宋体",Font.BOLD,25));//rotate(double theta, double x, double y) StringBuffer buffer = new StringBuffer();//弧度=角度*3.14/180for(int i=1;i<=4;i++) {int idx = r.nextInt(words.length());			//根据位置得到具体的字符char ch = words.charAt(idx);buffer.append(ch);//旋转+- 30度int jiaodu = r.nextInt(60)-30;double hudu = jiaodu*Math.PI/180;//旋转的效果//g2d.rotate(hudu, x, y);//把字符画到图片上g2d.drawString(ch+"", x, y);x += 25;//转回去//g2d.rotate(-hudu, x, y);}//生成三条干扰线g2d.setColor(Color.green);int x1,y1,x2,y2;for(int m=1;m<=3;m++) {x1 = r.nextInt(width);y1 = r.nextInt(height);x2 = r.nextInt(width);y2 = r.nextInt(height);g2d.drawLine(x1, y1, x2, y2);}//把buffer放到session里面request.getSession().setAttribute("code", buffer.toString());//把图片显示到页面上ImageIO.write(bufferedImage, "jpg", response.getOutputStream());}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}
}

http://www.ppmy.cn/news/238249.html

相关文章

python模块之feedparser学习使用

今天在看书的时候无意间发现了一个号东西就是feedparser模块&#xff0c;feedparser 号称是一个 universal feed parser&#xff0c;使用它我们可轻松地实现从任何 RSS 或 Atom 订阅源得到标题、链接和文章的条目了&#xff0c;这个号称并不是说的话&#xff0c;是因为这个模块…

收集一些c/c++技术

下面是整理的一些c/c方面的相关代码demo&#xff0c;后续将持续更新下去。 这是单独稍微大一些的项目地址&#xff08;给出博客地址&#xff0c;博客中附带项目git地址&#xff09;&#xff1a;、 标题&#xff1a; 扫雷小游戏 (22条消息) 基于QT开发的扫雷小游戏_GT199309…

进入IT领域,多久能月入过万?

当下打拼的很多人都有这样的困惑&#xff1a;刚毕业或者工作时间不长&#xff0c;也有一些基本技能&#xff0c;对未来有美好憧憬&#xff0c;一身干劲&#xff0c;却拿着微薄的薪水过着捉襟见肘的生活。 有些同龄人进入IT领域后快速升职加薪&#xff0c;观望者经常会问&#…

QMI8658 - 姿态传感的零偏(常值零偏)标定

1. 零偏 理论上在静止状态下三轴输出为0,0,0&#xff0c;但实际上输出有一个小的偏置&#xff0c;这是零偏的静态分量&#xff08;也称固定零偏&#xff09;。 陀螺生产出来后就一直固定不变的零偏值。对于传统的高性能惯性器件来说&#xff0c;该误差在出厂标定时往往就被补偿…

使用spring的优势

使用spring的优势 1、Spring通过DI、AOP和消除样板式代码来简化企业级Java开发 ​2、Spring框架之外还存在一个构建在核心框架之上的庞大生态圈&#xff0c;它将Spring扩展到不同的领域&#xff0c;如Web服务、REST、移动开发以及NoSQL ​3、低侵入式设计&#xff0c;代码的…

【电泳仪品牌】生科必知的电泳仪品牌

推荐阅读&#xff1a; 《利斧科学&#xff08;CLS)电泳个性化定制解决方案》 hi~大家好&#xff01;我是三三。今天和大家来分享下实验室里的那些电泳那些事儿&#xff01; 话说电泳可以说是我们实验室里很常用的主儿了&#xff01;不管是蛋白质、核酸、细胞、病毒等&#xf…

Spring的好处及特点

Spring是一个轻量级控制反转&#xff08;IOC&#xff09;和面向切面&#xff08;AOP&#xff09;的容器框架&#xff0c;它主要是为了解决企业应用开发的复杂性而诞生的。 目的:解决企业应用开发的复杂性。 功能&#xff1a;使用基本的javaBean代替EJB. 范围&#xff1a;任何的…

2023年品牌营销趋势是什么?如何提升品牌知名度

从过去一年我们都能够感受到&#xff0c;有很多消费品企业和个体&#xff0c;在面临大环境挑战的时候经历了低谷期和迷茫期。那么从广告营销方面来说&#xff0c;2023年品牌营销趋势是什么呢?今天跟大家聊一聊2023年品牌营销5大趋势。 随着消费多元化时代的到来&#xff0c;品…