基于session的简易购物车引发的问题

时间:2022-12-15 17:00:28

一.功能描述

基于session的简易购物车引发的问题

 页面如下所示:

运行报错:

java.io.FileNotFoundException: E:\apache-tomcat-8.0.37\work\Catalina\localhost\20161013ShoppingCart\SESSIONS.ser (系统找不到指定的路径。)
at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(FileOutputStream.java:270)
at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
at java.io.FileOutputStream.<init>(FileOutputStream.java:101)
at org.apache.catalina.session.StandardManager.doUnload(StandardManager.java:299)
at org.apache.catalina.session.StandardManager.unload(StandardManager.java:265)
at org.apache.catalina.session.StandardManager.stopInternal(StandardManager.java:384)
at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:221)
at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5533)
at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:221)
at org.apache.catalina.core.ContainerBase.removeChild(ContainerBase.java:821)
at org.apache.catalina.startup.HostConfig.undeploy(HostConfig.java:1395)
at org.apache.catalina.startup.HostConfig.checkResources(HostConfig.java:1321)
at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1581)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:284)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:95)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1140)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1376)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1380at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1348)

at java.lang.Thread.run(Thread.java:745)

定位到问题,发现是confirm无法获取到books属性导致如下代码空指针异常。

基于session的简易购物车引发的问题

二.问题如下:

1.进入不了confirm.jsp页面:是因为打开了E:\apache-tomcat-8.0.37\work\Catalina\localhost\20161013ShoppingCart\org\apache\jsp\confirm_jsp.java文件。

涉及知识点:

Web容器处理JSP文件请求的执行过程主要包括以下4个部分: 
1. 客户端发出Request请求
2. JSP Container 将JSP转译成Servlet的源代码
3. 将产生的Servlet源代码经过编译后,并加载到内存执行
4. 把结果Response(响应)至客户端 很多人都会认为JSP的执行性能会和Servlet相差很多,其实执行性能上的差别只在第一次的执行。因为JSP在执行第一次后,会被编译成Servlet的类文件,即.class,当再重复调用执行时,就直接执行第一次所产生的Servlet,而不再重新把JSP编译成Servelt。因此,除了第一次的编译会花较久的时间之外,之后JSP和Servlet的执行速度就几乎相同了。 在执行JSP网页时,通常可以分为两个时期:转译时期(Translation Time)和请求时期(Request Time) 转译时期:JSP网页转移成Servlet类。
请求时期:Servlet类执行后,响应结果至客户端。 转译期间做了两件事情:
转译时期:将JSP网页转移为Servlet源代码 .java.
编译时期:将Servlet 源代码 .java编译成 Servlet类 .class. 当JSP网页在执行时,JSP Container 会做检查工作,如果发现JSP网页有更新修改时,JSP Container 才会再次编译JSP成Servlet; 如果JSP没有更新时,就直接执行前面所产生的Servlet. 根据以上知识可知,我错误的原因在于:
当JSP网页有更新修改时,confirm_jsp.java文件处于打开状态即confirm_jsp.java文件无法被改动,此时JSP Container 无法将JSP再次编译成 Servlet(无法更新confirm_jsp.java文件),因而运行confirm_jsp.class时不是最新的类,无法打开jsp页面。

参考:http://zhidao.baidu.com/link?url=nr6hYXlgwXdGzGtj28ivQXhFp1YdKGsGbjBickkipI3cIoQ2kLO8BnYAWRJvz7zJsoo61HMdyOU-yyqfATsG-m1LaT0siFhXgwUJ9PMRT_m

2.每个页面的sessionID不一样(session丢失问题):是因为在IE浏览器里我禁用了cookie。

2.1疑惑:IE里浏览器的设置会影响到Eclipse的里的浏览器吗?二者有何关联?

2.2 浏览器和服务器之间如何传递session的?

基于session的简易购物车引发的问题

基于session的简易购物车引发的问题

2.3  不同页面之间是如何传递session的?

只要浏览器不关闭,任意页面的session都是同一个,代表着浏览器和服务器的一次会话。因此不同页面之间可以利用服务器里进行

request.getSession().setAttribute(String attr)和JSP页面里进行session.getAttribute(String attr,String attrVal)。

2.4   session丢失问题常见原因:

推测应该是没有更新http response的头部的set cookie属性,导致session id没有返回给客户端。抓个包包看看服务端在发送重定向响应的时候有没有把session id也放到response的头      部。然后再看看客户端在重定向再请求服务端的时候有没有把session id带上去

参考:http://blog.csdn.net/LLorJJ999/article/details/4107464

2.3 session丢失的解决方法:

3.每个页面的sessionID一样,但servlet1里设置request.getSession().setAttriubte(“books”,book)里设置session的books属性,跳转到step2.jsp却无法获取到session的book属性。

servlet2里request.getSession().setAttriubte(“customer”,customer)里设置session的customer属性,跳转到confirm.jsp页面却可以获取到session的customer属性。这是为什么?同一session为什么不能获取到session的所有属性?

相关代码如下:

基于session的简易购物车引发的问题

基于session的简易购物车引发的问题

基于session的简易购物车引发的问题

打印信息如下:(在Servlet1和Servlet2中能获取到session的book属性,但是step1.jsp和step2.jsp不能获取book属性。customer属性都正常)

基于session的简易购物车引发的问题

原因:在step1.jsp和step2.jsp里我获取session的book属性是错误的!应该是books属性!因为在servlet1里设置session的attribute时是设置的books属性!如此低级的错误,真是对自己无话可说-_-||

完整代码如下:

基于session的简易购物车引发的问题

step1.jsp:

 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h4>Step1:选择要购买的图书:</h4> <%
System.out.println("step1.jsp--->sessionID:"+session.getId() );
System.out.println("step1.jsp :MaxInactiveInterval"+session.getMaxInactiveInterval() ); %>
<br> <form action="<%= request.getContextPath()%>/processStep1" method="post">
<table cellpadding="10" cellspacing="0" border="1">
<tr>
<td>书名</td>
<td>购买</td>
</tr>
<tr>
<td>Java</td>
<td><input type="checkbox" name="book" value="java"></td>
</tr>
<tr>
<td>Oracle</td>
<td><input type="checkbox" name="book" value="Oracle"></td>
</tr>
<tr>
<td>Struts</td>
<td><input type="checkbox" name="book" value="Struts"></td>
</tr>
<tr>
<td>Spring</td>
<td><input type="checkbox" name="book" value="Spring"></td>
</tr>
<tr>
<td>Hibernate</td>
<td><input type="checkbox" name="book" value="Hibernate"></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="Submit">
</td>
</tr>
</table>
</form>
</body>
</html>

ProcessServlet1.java:

 package com.tt.javaweb;

 import java.io.IOException;
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; /**
* Servlet implementation class ProcessStep1Servlet
*/ public class ProcessStep1Servlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.获取选中的图书信息:book
String[] books = request.getParameterValues("book"); //2.把图书信息放入到HttpSession中
HttpSession session = request.getSession();
session.setAttribute("books", books); System.out.println("Servlet1--->sessionID:"+session.getId()); String[] books2=(String[])session.getAttribute("books");
for(String temp:books2){
System.out.println("servlet1,session attribute[[book]:"+temp);
} //3.重定向页面到shoppingCart/step2.jsp
System.out.println(request.getContextPath()+"/shoppingCart/step2.jsp");
response.sendRedirect(request.getContextPath()+"/shoppingCart/step2.jsp");
// request.getRequestDispatcher("/shoppingCart/step2.jsp").forward(request,response);
//f不同页面之间怎样保证相同的sesion
} }

step2.jsp:

 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body> <h4>Step2: 请输入寄送地址和信用卡信息</h4>
<%
System.out.println("step2.jsp--->sessionID:"+session.getId() );
System.out.println("step2.jsp,session attribute:[book]"+session.getAttribute("books") );
System.out.println("step2.jsp :MaxInactiveInterval"+session.getMaxInactiveInterval() );
%>
<br> <form action="<%= request.getContextPath() %>/processStep2" method="post">
<table cellpadding="10" cellspacing="0" border="1"> <tr>
<td colspan="2">寄送信息</td>
</tr> <tr>
<td>姓名:</td>
<td><input type="text" name="name"/></td>
</tr> <tr>
<td>寄送地址:</td>
<td><input type="text" name="address"/></td>
</tr> <tr>
<td colspan="2">信用卡信息</td>
</tr> <tr>
<td>种类:</td>
<td>
<input type="radio" name="cardType" value="Visa"/>Visa
<input type="radio" name="cardType" value="Master"/>Master
</td>
</tr> <tr>
<td>卡号:</td>
<td>
<input type="text" name="card"/>
</td>
</tr> <tr>
<td colspan="2"><input type="submit" value="Submit"/></td>
</tr> </table>
</form> </body>
</html>

ProcessServlet2.java:

 package com.tt.javaweb;

 import java.io.IOException;
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; /**
* Servlet implementation class ProcessStep2Servlet
*/ public class ProcessStep2Servlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//1.获取请求参数:name,address,cardType,card
String name = request.getParameter("name");
String address = request.getParameter("address");
String cardType = request.getParameter("cardType");
String card = request.getParameter("card"); //2.把用户信息封装成一个Customer对象
Customer customer = new Customer(name, address, cardType, card) ; //3.把请求参数存入到HttpSession中
HttpSession session = request.getSession();
session.setAttribute("customer", customer); System.out.println("Servlet2--->sessionID:"+request.getSession().getId());
System.out.println("servlet2,session attribute:[customer]"+session.getAttribute("customer"));
String[] books2=(String[])request.getSession().getAttribute("books"); for(String temp:books2){
System.out.println("servlet2,session attribute[[book]:"+temp);
} //4.重定向页面到confirm.jsp
System.out.println(request.getContextPath()+"/shoppingCart/confirm.jsp");
// request.getRequestDispatcher("/confirm.jsp").forward(request,response);
response.sendRedirect(request.getContextPath() + "/confirm.jsp");
} }

confirm.jsp:

 <%@ page import="com.tt.javaweb.Customer" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h4>Step3:订单确认</h4>
<%
System.out.println("confirm.jsp--->sessionID:"+session.getId() );
System.out.println("confirm.jsp,session attribute:[book]"+session.getAttribute("books") );
System.out.println("confirm.jsp,session attribute:[customer]"+session.getAttribute("customer") ); %>
<br>
<%
String [] books = (String[])request.getSession().getAttribute("books");
Customer customer = (Customer)request.getSession().getAttribute("customer"); //for(String temp:books){
// System.out.println(temp);
//}
%> <table>
<tr>
<td>顾客姓名:</td>
<td><%= customer.getName() %></td>
</tr>
<tr>
<td>地址:</td>
<td><%= customer.getAddress() %></td>
</tr>
<tr>
<td>卡号:</td>
<td><%= customer.getCard() %></td>
</tr>
<tr>
<td>卡的类型:</td>
<td><%= customer.getCardType() %></td>
</tr>
<tr>
<td>Books:</td>
<td>
<%
for(String book: books){
out.print(book);
out.print("<br>");
}
%>
</td>
</tr>
</table> </body>
</html>

基于session的简易购物车引发的问题的更多相关文章

  1. 基于session对象实现简单的购物车应用

    大部分购物网站都会实现购物车的功能,基于session对象的购物车应用可以实现一个用户会话有效期内,用户所选多个商品的存储. 为了实现这样的功能需要编写三个JSP页面,分别是login.jsp.mai ...

  2. Session机制二(简易购物车案例)

    一:案例一(简易购物车) 1.目录结构 2.step1.jsp <%@ page language="java" contentType="text/html; c ...

  3. 基于Android 平台简易即时通讯的研究与设计&lbrack;转&rsqb;

    摘要:论文简单介绍Android 平台的特性,主要阐述了基于Android 平台简易即时通讯(IM)的作用和功能以及实现方法.(复杂的通讯如引入视频音频等可以考虑AnyChat SDK~)关键词:An ...

  4. 基于redis的简易分布式爬虫框架

    代码地址如下:http://www.demodashi.com/demo/13338.html 开发环境 Python 3.6 Requests Redis 3.2.100 Pycharm(非必需,但 ...

  5. javaweb练手项目jsp&plus;servlet简易购物车系统

    简易购物车项目 这是一个用intellij IDEA做的简易的javaweb项目,开发环境使用的jdk1.8和tomcat8以及mysql数据库. 1.项目开发准备: 创建github仓库 项目框架搭 ...

  6. 基于session 的springMvc 国际化

    项目中采用springMvc的框架,需要动态切换语言,找了一些资料,最后决定采用基于session的动态切换,实现动态切换中文,英文,韩文,其实就是把中文翻译成其他语言显示 springMvc国际化包 ...

  7. localStorage存值取值以及存取JSON&comma;以及基于html5 localStorage的购物车

    localStorage.setItem("key","value");//存储变量名为key,值为value的变量 localStorage.key = &q ...

  8. 基于session认证 相亲小作业

    基于session认证  相亲小作业 用户登录 如果男用户登录,显示女生列表 如果女用户登录,显示男生列表 urls ===========================urls========== ...

  9. Django 基于session认证 小作业

    基于session认证  相亲小作业 用户登录 如果男用户登录,显示女生列表 如果女用户登录,显示男生列表 """s4day74 URL Configuration Th ...

随机推荐

  1. a primary example for Functional programming in javascript

    background In pursuit of a real-world application, let’s say we need an e-commerce web applicationfo ...

  2. Linux变量

    变量:(大的分为环境变量与本的变量) 本地变量: 本地变量在用户现在的shell生命期的脚本中使用.例如,本地变量file-name="loop.doc",这个值只在用户当前she ...

  3. HelloX操作系统网络功能简介及使用和开发指南

    HelloX网络功能简介及使用和开发指南 HelloX网络功能简介 作为物联网操作系统,网络功能是必备的核心功能之一.按照规划,HelloX实现了两个不同类型的TCP/IP协议栈,一个面向资源受限的嵌 ...

  4. Myeclipse自动生成javabean的get和set方法

    用Myeclipse开发java web程序,写javabean的时候,如果字段很多的话,写get和set方法是一件很无语和浪费时间的事情,所以Myeclipse提供了一个自动生成这些方法的功能. 首 ...

  5. 将含有父ID的列表转成树

    我们知道数据库一般是以一个列表(id,pid)的形式保存树的.如何提取这棵树呢?最简单的方法就是根据pid循环查表.但是毫无疑问,这会产生巨大的数据库查询开销. 那么一般建议的方法是一次性将全部相关数 ...

  6. SQL语句优化技术分析

    一.操作符优化 1.IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格.但是用IN的SQL性能总是比较低的,从Oracle执行的步骤来分析用IN的SQL与不用 ...

  7. JVM基础系列第11讲:JVM参数之堆栈空间配置

    JVM 中最重要的一部分就是堆空间了,基本上大多数的线上 JVM 问题都是因为堆空间造成的 OutOfMemoryError.因此掌握 JVM 关于堆空间的参数配置对于排查线上问题非常重要. tips ...

  8. Python基础之数组和向量化计算总结

    一.多维数组 1.生成ndarray     (array函数) .np.array()生成多维数组 例如:import numpy as npdata1=[6,7.5,8,0,1]     #创建简 ...

  9. LA 4108 (线段树)

    区间更新 + 统计更新长度 稍稍不注意就T了 #include<bits/stdc++.h> #define lson l, m, rt<<1 #define rson m+1 ...

  10. 单细胞数据高级分析之初步降维和聚类 &vert; Dimensionality reduction &vert; Clustering

    个人的一些碎碎念: 聚类,直觉就能想到kmeans聚类,另外还有一个hierarchical clustering,但是单细胞里面都用得不多,为什么?印象中只有一个scoring model是用kme ...