一.功能描述

 页面如下所示:

运行报错:

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属性导致如下代码空指针异常。

二.问题如下:

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的?

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的所有属性?

相关代码如下:

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

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

完整代码如下:

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 平台简易即时通讯的研究与设计[转]

    摘要:论文简单介绍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+servlet简易购物车系统

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

  6. 基于session 的springMvc 国际化

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

  7. localStorage存值取值以及存取JSON,以及基于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. HDU 2089 数位dp/字符串处理 两种方法

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  2. 《C标准库》——之<ctype.h>

    在没读<ctype.h>的源码之前,我一直以为我们平时用的isalnum.isdigit.isalpha等这些函数,是靠判断写出来的. 比如: int isdigit(int c){ re ...

  3. C#部分---"++"在前在后的区别。

    int a=5; int b=a++;//int b=a;a=a+1 int c=++a;//a=a+1;int c=a

  4. CSS3教程:pointer-events属性值详解 阻止穿透点击

    转:http://www.poluoluo.com/jzxy/201109/142876.html 在某个项目中,很多元素需要定位在一个地图层上面,这里就要用到很多绝对定位或者相对定位的元素,但是这样 ...

  5. 共享内存+互斥量实现linux进程间通信 分类: Linux C/C++ 2015-03-26 17:14 67人阅读 评论(0) 收藏

    一.共享内存简介 共享内存是进程间通信中高效方便的方式之一.共享内存允许两个或更多进程访问同一块内存,就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针,两个进程可以对一块共享 ...

  6. 论文笔记之:Decoupled Deep Neural Network for Semi-supervised Semantic Segmentation

    Decoupled Deep Neural Network for Semi-supervised Semantic Segmentation xx

  7. SpringMVC给外部资源加版本号避免缓存

    一.属性文件:version.properties ->内容:version=201608  二.java代码 public class configVersion implements Ser ...

  8. c++时间处理

    struct tm;这是一个结构体,包括了时间的各个属性年月日,时分秒 time(time_t * t);获取从1900年到现在经过的毫秒数,或者也可以这么用time_t t=time(NULL); ...

  9. linux操作文本文件

    打开文件 #vi 文件名 保存退出 从编辑模式退到命令行模式,按esc键 保存退出命令 #:wq 强制退出,不保存 #:q!

  10. linq字符串搜索条件,排序条件-linq动态查询语句 Dynamic LINQ

    在做搜索和排序的时候,往往是前台传过来的字符串做条件,参数的数量还不定,这就需要用拼sql语句一样拼linq语句.而linq语句又是强类型的,不能用字符串拼出来. 现在好了,有个开源的linq扩展方法 ...