一.功能描述

 页面如下所示:

运行报错:

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. XACT_ABORT 用法

    首先创建一张表 Create Table TranTable(    Id INT IDENTITY(1,1) PRIMARY KEY,    Priority TINYINT--最大值255) 1. ...

  2. 学习iOS笔记第一天的C语言学习记录

    c语言基础学习 int num1 = 15; int num2 = 5; int temp = 0; //先把num1放到temp里 temp = num1; //先把num2放到num1里 num1 ...

  3. 浅谈C中的malloc和free

    转自http://bbs.bccn.net/thread-82212-1-1.html非常感谢作者 浅谈C中的malloc和free 在C语言的学习中,对内存管理这部分的知识掌握尤其重要!之前对C中的 ...

  4. 【渗透测试学习平台】 web for pentester -2.SQL注入

    Example 1 字符类型的注入,无过滤 http://192.168.91.139/sqli/example1.php?name=root http://192.168.91.139/sqli/e ...

  5. phpwind8.7升级9.0.1过程(一)本地和服务器数据同步的部署

    在使用phpwind的过程中需要将整个网站论坛的模板从phpwind8.7升级到phpwind9.0.1 需要首先在本地搭建和服务器端一样的环境然后在本地尝试性升级之后,然后在服务器端进行升级. 以下 ...

  6. 《Linux与Qt程序设计》知识框架

    本文主要是通过一本书来大致了解Qt开发的框架,不对具体内容做详细分析. 1.首先弄清楚概念:定义->以自己的话理解是什么-> 实现的是什么功能->用在哪些地方 2.前面认识到的知识点 ...

  7. NGUI Font

    ---------------------------------------------------------------------------------------------------- ...

  8. 【转】DBMS_STATS.GATHER_TABLE_STATS详解 2012-04-22 09:20:10

    [转]DBMS_STATS.GATHER_TABLE_STATS详解 2012-04-22 09:20:10 分类: Linux 由于Oracle的优化器是CBO,所以对象的统计数据对执行计划的生成至 ...

  9. Linux中的15个‘echo’ 命令实例

    echo是一种最常用的与广泛使用的内置于Linux的bash和C shell的命令,通常用在脚本语言和批处理文件中来在标准输出或者文件中显示一行文本或者字符串. echo命令的语法是: echo [选 ...

  10. mysql提权笔记

    最近小菜遇到mysql提权,总是会搞错,就记记笔记吧!以后方便用 先说手工吧! mysql<5.0,导出路径随意:5.0<=mysql<5.1,则需要导出至目标服务器的系统目录(如: ...