javaweb实验9.docx
- 文档编号:6263434
- 上传时间:2023-05-09
- 格式:DOCX
- 页数:14
- 大小:19.97KB
javaweb实验9.docx
《javaweb实验9.docx》由会员分享,可在线阅读,更多相关《javaweb实验9.docx(14页珍藏版)》请在冰点文库上搜索。
javaweb实验9
实验九:
会话管理
实验目的:
1、了解Web服务器对客户跟踪的各种方法;
2、掌握使用Cookie技术跟踪会话的方法;
3、掌握使用HttpSession对象跟踪会话的方法;
实验内容
1、利用Session机制实现用户的登录及退出。
2、利用Cookie技术实现用户的自动登录。
3、在Servlet中利用Session机制实现模拟购物车。
实验步骤:
R0:
准备工作
S0-1:
创建web工程book,将素材中的bookDB.txt拷贝至工程的src目录下,将素材中的image目录拷贝到WebContent目录下。
S0-2:
在src目录下创建Book类domain.Book,代码如下:
publicclassBook{
privateintid;
privateStringname;
privateStringpic;
privatedoubleprice;
privateStringdiscrip;
publicintgetId(){returnid;}
publicvoidsetId(intid){this.id=id;}
publicStringgetName(){returnname;}
publicvoidsetName(Stringname){this.name=name;}
publicStringgetPic(){returnpic;}
publicvoidsetPic(Stringpic){this.pic=pic;}
publicdoublegetPrice(){returnprice;}
publicvoidsetPrice(doubleprice){this.price=price;}
publicStringgetDiscrip(){returndiscrip;}
publicvoidsetDiscrip(Stringdiscrip){this.discrip=discrip;}
publicBook(){super();}
publicBook(intid,Stringname,Stringpic,doubleprice,Stringdiscrip){
super();
this.id=id;
this.name=name;
this.pic=pic;
this.price=price;
this.discrip=discrip;
}
@Override
publicStringtoString(){
return"Book[id="+id+",name="+name+",pic="+pic
+",price="+price+",discrip="+discrip+"]";
}
}
S0-3:
在src目录下创建访问数据类dao.BookDao,该类具有“查询所有书目”和“根据id查询某本书”的功能,代码如下:
publicclassBookDao{
//获取所有的书
publicList
List
//FileReaderfr=null;
BufferedReaderbr=null;
try{
list=newArrayList
//使用类加载的方法读取站点中的资源文件
br=newBufferedReader(newInputStreamReader(this.getClass()
.getClassLoader().getResourceAsStream("bookDB.txt")));
Stringline=null;
while((line=br.readLine())!
=null){
String[]fields=line.split("");
Bookbook=newBook(Integer.parseInt(fields[0]),fields[1],
fields[2],Double.parseDouble(fields[3]),fields[4]);
list.add(book);
}
}catch(Exceptione){
e.printStackTrace();
}finally{
try{//关闭文件输入流
br.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
returnlist;
}
//根据id获取某一本书
publicBookgetOne(intid){
List
returnlist.get(id-1);
}
}
S0-4:
在WebContent目录下创建index.jsp文件,显示站内图书信息:
<%--显示站内图书信息--%>
<%
BookDaodao=newBookDao();
List
inti=0;
for(Bookbook:
list){
if(i%2==0){
%>
<%
}
%>
src="<%=book.getPic()%>"/> <%=book.getName()%> <%=book.getPrice()%>书名:
单价:
<%=book.getDiscrip()%>
id=<%=book.getId()%>">购买
<%
i++;
if(i%2==0){
%>
<%
}
%>
<%
}
if(i%2!
=0){
%>
<%
}
%>
R1:
利用Session机制实现用户的登录及退出。
S1-1:
在src目录下创建User类domain.User,代码如下:
publicclassUser{
privateStringusername;
privateStringpass;
publicStringgetUsername(){returnusername;}
publicvoidsetUsername(Stringusername){this.username=username;}
publicStringgetPass(){returnpass;}
publicvoidsetPass(Stringpass){this.pass=pass;}
publicUser(Stringusername,Stringpass){
super();
this.username=username;
this.pass=pass;
}
publicUser(){super();}
}
S1-2:
在src目录下创建访问数据类dao.UserDao,该类具有“根据用户名查询用户”的功能,代码如下:
publicclassUserDao{
//根据用户名username获取一个用户
publicUsergetUser(Stringusername){
BufferedReaderbr=null;
try{//使用类加载的方法读取站点中的资源文件
br=newBufferedReader(newInputStreamReader(this.getClass()
.getClassLoader().getResourceAsStream("userDB.txt")));
Stringline=null;
while((line=br.readLine())!
=null){
String[]fields=line.split("");
if(username.equals(fields[0])){
Useruser=newUser(fields[0],fields[1]);
returnuser;
}
}
}catch(Exceptione){
e.printStackTrace();
}finally{
try{//关闭文件输入流
br.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
returnnull;
}
}
S1-3:
在webContent目录下创建login.jsp,显示用户的登录界面。
代码如下:
用户名:
密码:
S1-4:
在src目录下新建web.LoginServlet,映射为/loginServlet,实现用户的登录处理。
在其doPost方法中添加代码如下:
Stringusername=request.getParameter("username");
Stringpass=request.getParameter("pass");
/*
*查询数据库中的用户表来检测用户登录信息的准确性,后面讲解!
检测用户登录信息,
*①若登录信息正确,则在会话域中存储用户并重定向至index.jsp页面,显示用户欢迎信息。
*②否则在会话域中存储用户名并重定向至login.jsp,重新登录
*/
UserDaodao=newUserDao();
Useruser=dao.getUser(username);
HttpSessionsession=request.getSession();
if(user!
=null&&user.getPass().equals(pass)){
session.setAttribute("user",user);
response.sendRedirect(this.getServletContext().getContextPath()+"/index.jsp");
}else{
session.setAttribute("username",username);
response.sendRedirect(this.getServletContext().getContextPath()+"/login.jsp");
}
S1-5:
修改login.jsp,在用户重新登录时,回显用户名。
解决如下:
<%Stringusername=(String)session.getAttribute("username");%>
用户名:
"": username%>"/> 密码: S1-6: 修改index.jsp,在显示图书信息上方显示用户的登录状态。 补充代码如下: 80%"> <%-- 从session中获取用户的登录状态,根据用户的登录状态不同,而显示不同信息 ①若用户未登录,则显示“欢迎您的到来! 请登录” ②若用户已登录,则显示“***,欢迎您! 我的购物车 退出” --%> <% Useruser=(User)session.getAttribute("user"); if(user==null){ %> 欢迎您的到来! 请 <% }else{ %> <%=user.getUsername()%>,欢迎您! <% } %>
S1-7:
在src目录下新建web.LogoutServlet,映射为/logoutServlet,实现用户的退出登录处理。
在其doGet方法中添加代码如下:
request.getSession().removeAttribute("user");
response.sendRedirect(getServletContext().getContextPath()+"/index.jsp");
R2:
利用Cookie技术实现用户的自动登录。
S2-1:
修改LoginServlet,实现用户登录后,利用Cookie技术在客户端保存用户的登录信息,以便下次访问web站点时,可以直接从客户端Cookie中读取登录信息,直接登录。
修改代码如下:
if(user!
=null&&user.getPass().equals(pass)){
/*利用Cookie技术保存用户登录信息
*①创建Cookie对象
*②设置cookie对象的有效期限,单位为妙
*③添加cookie对象到response对象中,由response对象发送其至客户端
*/
Cookiecookie=newCookie("username",username);
cookie.setMaxAge(5*60);//5秒
Cookiecookie1=newCookie("pass",pass);
cookie1.setMaxAge(5*60);
response.addCookie(cookie);
response.addCookie(cookie1);
session.setAttribute("user",user);
response.sendRedirect(this.getServletContext().getContextPath()+"/index.jsp");
}else{
session.setAttribute("username",username);
response.sendRedirect(this.getServletContext().getContextPath()+"/login.jsp");
}
S2-2:
修改index.jsp,读取客户端携带的cookie,找到名为username的cookie信息,显示用户欢迎信息。
修改代码如下:
80%"> <%--先读取客户端携带的cookie,获取用户登录的信息--%> <% Useruser=null; Stringusername=null; Stringpass=null; Cookiecookies[]=request.getCookies(); if(cookies! =null){ for(Cookiecookie: cookies){ if("username".equals(cookie.getName())){ username=cookie.getValue(); } if("pass".equals(cookie.getName())){ pass=cookie.getValue(); } if(username! =null&&pass! =null){ user=newUser(username,pass); break; } } } %> …… R3: 在Servlet中利用Session机制实现模拟购物车。 S3-1: 在src目录下创建ShoppingCartItem类domain.ShoppingCartItem,代码如下: publicclassShoppingCartItem{ privateBookbook; privateintcount; privatedoublesubPrice; publicdoublegetSubPrice(){returnbook.getPrice()*count;} publicvoidsetSubPrice(doublesubPrice){this.subPrice=subPrice;} publicBookgetBook(){returnbook;} publicvoidsetBook(Bookbook){this.book=book;} publicintgetCount(){returncount;} publicvoidsetCount(intcount){this.count=count;} } S3-2: 在src目录下创建ShoppingCart类domain.ShoppingCart,代码如下: publicclassShoppingCart{ privateMap privatedoubletotalPrice; publicMap publicvoidsetItems(Map publicdoublegetTotalPrice(){ totalPrice=0; Set for(Entry set){ totalPrice+=entry.getValue().getSubPrice(); } returntotalPrice; } publicvoidsetTotalPrice(doubletotalPrice){this.totalPrice=totalPrice;} } S3-3: 在src目录下新建web.BuyServlet,映射为/buy.do,实现图书购买处理。 在其doGet方法中添加代码如下: //获取图书id intid=Integer.parseInt(request.getParameter("id")); //根据id获取图书对象 BookDaodao=newBookDao(); Bookbook=dao.getOne(id); /*将待购买的图书存放到购物车中 *①从session中获取购物车,若还没有购物车则创建购物车对象,并添加到session中 *②若待购买的图书在购物车中已经存在,则修改购物车中该购物项的数量+1 *③若待购买的图书在购物车中不存在,则在购物车中新增购物项,且数量为1 */ HttpSessionsession=request.getSession(); ShoppingCartcart=(ShoppingCart)session.getAttribute("cart"); if(cart==null){ cart=newShoppingCart(); session.setAttribute("cart",cart); } ShoppingCartItemitem=cart.getItems().get(id); if(item==null){ item=newShoppingCartItem(); item.setBook(book); item.setCount (1); }else{ item.setCount(item.getCount()+1); } cart.getItems().put(id,item); //到showCart.jsp中显示购物车 //request.getRequestDispatcher("/showCart.jsp").forward(request,response);? 为什么不能用 response
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- javaweb 实验
![提示](https://static.bingdoc.com/images/bang_tan.gif)