4种对话跟踪
客户端打开与服务器的连接发出请求到服务器响应客户端请求的全过程称之为会话。通俗的讲会话就是你通过浏览器与服务器之间的一次通话,会话是用来识别用户的,一旦你关闭了浏览器,虽然会话没有结束,但是你重新打开浏览器时,已经不能再次利用上一次的会话了,它会新建一个新的会话。
会话跟踪是一种灵活、轻便的机制,它使Web上的状态编程变为可能。
HTTP是一种无状态协议,每当用户发出请求时,服务器就会做出响应,客户端与服务器之间的联系是离散的、非连续的。
当用户在同一网站的多个页面之间转换时,根本无法确定是否是同一个客户,会话跟踪技术就可以解决这个问题。
当一个客户在多个页面间切换时,服务器会保存该用户的信息。
有四种方法可以实现会话跟踪技术:URL重写、隐藏表单域、Cookie、Session。
1).隐藏表单域:<input type="hidden">
在表单form内声明一个type类型为hidden的input标签,用来传递数据(可以在页面内先用JQuery获取要传递的值存入这个input标签的value中)和做一些其它的功能。它的优点是提供了一种往form中存取数据的方法。
测试页面:page1.html,page2.jsp
由page1向page2提交表单,并通过隐藏表单域的方式提交page1的ID
page1.html关键代码:
<form action="page2.jsp" method="post"> <input type="hidden" name="id" value="1"> 帐号:<input type="text" name="username" value="nangua" /><br /> <input type="submit" value="我要登录" /><br /> </form>
page2.jsp关键代码:
<% String id = request.getParameter("id"); %> <h1>收到id:<%=id%></h1>
2).URL 重写:URL 可以在后面附加参数,和服务器的请求一起发送,这些参数为名字/值对。
URL重写的目的是为了防止用户(浏览器)禁用cookie。
测试页面:page1.jsp ,page2.jsp
这里先写一个小例子:
page1.jsp关键代码:
<% String url = "page2.jsp?id=1"; %> <a href='<%=response.encodeUrl(url)%>'>page2.jsp</a>
page2.jsp关键代码:
<% String id = request.getParameter("id"); %> <%=id %>
通过在url后面直接追加参数的方式可以将id传给page2,因此,如果把会话id编写在URL中,即使浏览器关闭了或不支持cookie,也能够实现会话跟踪。
弊端:这意味着应用程序中的所有页面(至少是那些带有对其他页面引用的页面)都必须是JSP页面,这样页面引用才能以动态方式进行编码,如果遗漏了一个ur,那么服务就会失去对会话的跟踪。
因此,我们可以通过以下方式实现通过对URL重写实现会话跟踪:
page1.jsp关键代码:
<%=session.getId()%> <% String url = "page2.jsp?id=1"; String a = response.encodeURL("page2.jsp"); %> <a href='<%=a%>'>page2.jsp</a>
page2.jsp关键代码:
<% String id = request.getParameter("id"); %> <%=id %>
运行效果:
可以看到,page2的URL后边增加一个JSESSIONID 即当前会话的sessionID。这样便可实现在无cookie的情况下实现会话跟踪了。
3).Cookie:一个 Cookie 是一个小的,已命名数据元素。服务器使用 SET-Cookie 头标将它作为 HTTP
响应的一部分传送到客户端,客户端被请求保存 Cookie 值,在对同一服务器的后续请求使用一个
Cookie 头标将之返回到服务器。与其它技术比较,Cookie 的一个优点是在浏览器会话结束后,甚至
在客户端计算机重启后它仍可以保留其值。
测试程序:
同样是page1.jsp和page2.jsp
page1.jsp关键代码:
<% Cookie cookie = new Cookie("ID", "jiangzhengnan"); cookie.setMaxAge(30*60);//设置放置sessionId的cookie的生命周期为30分钟 response.addCookie(cookie); %> <a href='page2.jsp'>page2.jsp</a>
page2.jsp关键代码:
<% Cookie cookies[]=request.getCookies(); Cookie sCookie=null; String svalue=null; String sname=null; for(int i=0;i<cookies.length;i++){ sCookie=cookies[i]; svalue=sCookie.getValue(); sname=sCookie.getName(); out.write("name:["+sname + "] value:["+svalue + "]"); } %>
运行图示:
可以看到最后是我自己设置的cookieid
4).Session:使用 setAttribute(String str,Object obj)方法将对象捆绑到一个会话
9种隐式对象
什么是隐式对象?
JSP的隐式对象是指在JSP页面系统中已经默认内置的Java对象,这些对象不需要开发人员显式声明即可使用。
1、application:
1.1 application对象有效的范围是从web应用程序服务器一开始执行,到web服务器结束服务为止。
1.2 对于一个网站中所有的JSP页面,application对象只有一个。它们操作的是同一个application对象。
1.3 application是一个全局变量,所有访问同一服务器的客户都可访问application对象。
使用下面一个小例子来证明,在开启了服务器后,在不同的浏览器中访问,可以看到计数器是不断上升的,而不会从1开始。
<% int count = 0; if(application.getAttribute("count") == null){ count = 1; application.setAttribute("count", count); }else{ //值得注意的是,如果存进去的是int值,那么返回的也将是int值,而不是String类型的值 count = (Integer)(application.getAttribute("count")); count ++; application.setAttribute("count", count); } out.print("你是第"+count+"位访客..."); %>
1.4 获取服务器系统相关信息
application对象负责提供应用程序在服务器中运行时的一些全局信息,因此我们可以利用application来获取一些系统相关信息。
<% out.print("服务器信息: " + application.getServerInfo()+"<br/>"); out.print("Java Servlet API 主版本号: " + application.getMajorVersion()+"<br/>"); out.print("Java Servlet API 次版本号: "+application.getMinorVersion()+"<br/>"); out.print("本网页的真实路径:"+application.getRealPath("index1.jsp")+"<br/>"); %>
将得到输出结果:
服务器信息: Apache Tomcat/7.0.55
Java Servlet API 主版本号: 3
Java Servlet API 次版本号: 0本网页的真实路径:E:\Code\Java-Newer\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\jsp_ysdx\index1.jsp
2、config
2.1 config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数及服务器的有关信息。
2.2 主要是对web.xml的数据进行读取。实际上是通过getServletContext()方法获得application对象,再根据application对象获得。
可以直接在网页中获得web.xml中设置的数据
<servlet> <servlet-name>Config</servlet-name> <!-- 此处要设置为将使用该数据的网页名 --> <jsp-file>/index1.jsp</jsp-file> <init-param> <param-name>username</param-name> <param-value>Chalmers</param-value> </init-param> <init-param> <param-name>password</param-name> <param-value>123456</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>Config</servlet-name> <url-pattern>/servlet/config</url-pattern> </servlet-mapping>
out.print("username: " + config.getInitParameter("username") + "<br/>"); out.print("password:" + config.getInitParameter("password"));
输出结果为:
username: Chalmers
password:123456
3、exception
作用如名所示,用来处理页面异常的。
3.1 exception对象常用方法如下
(1)getMessage()方法
(2)toString()方法
(3)printStackTrace()方法
(4)getLocalizedMessage()方法
(5)fillStackTrace()方法
3.2 用法:
注意:exception对象只能在定义了<%@ page isErrorPage="true"%>中使用,否则没有该对象
testException.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page errorPage="handleException.jsp"%> <% int a = 0; int b = 10 / a; %>
handleException.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page isErrorPage="true"%> <% out.print(exception.getMessage() + "<br/>"); exception.printStackTrace(); %>
4、out
4.1 out对象主要用于向浏览器端输出数据
4.2 out实际上是带有缓冲特性的PrinterWriter,可以称之为JspWriter。缓冲区容量是可以设置的,甚至也可以关闭,
只要通过page指令的buffer属性就可以达到此目的。
4.3 JSP文件代码中的文件内容会自动生成out.print()或者out.println()输出。
5、page
5.1 page对象指代JSP页面本身、代表了正在运行的由JSP文件产生的类对象。
5.2 page对象的常用方法如下。
(1)getClass()方法
(2)equals()方法
(3)clone()方法
实际上就是从Object中继承的方法
6、request
6.1 请求有效:请求页面A,并向A中传递某些参数。
6.2 请求有效对象在处理结束时就会失效。
6.3 request对象可以获取哪些信息
6.3.1 建立HTML表单
<form action=“action” method=“method” name=“name”>。。。</form>
6.3.2 用REQUEST对象处理
JSP页面将数据存放在request对象里,并将该请求传递到下一个页面,下一个页面访问request对象,处理上一个JSP页面传递过来的数据。
6.3.3 通过超链接来传递
<a href="aaa.jsp?aa=aa&bb=bb&cc=cc">aaa</a>
6.3.4 通过jsp动作标签param来进行传递
6.4 传递一组数据
//发送一组数据到receive.jsp <form action="receive.jsp" method="post"> 跑步<input type="checkbox" name="habits" value="running" /><br /> 阅读<input type="checkbox" name="habits" value="reading" /><br /> 游戏<input type="checkbox" name="habits" value="game" /><br /> <input type="submit" value="提交" /> </form>
//接收
//参数要一致
String[] habits = request.getParameterValues("habits"); for(String s : habits){ out.print(s+"<br/>"); }
7、response
7.1 response对象负责将服务器端的数据发送回浏览器的客户端。主要用于向客户端发送数据,如Cookie、HTTP文件头等信息。
7.2 利用response实现自动刷新
7.2.1 刷新当前界面
response.setHeader("refresh", "3"); out.print(new Date().toString());
结果:每隔3秒刷新一次界面,显示当前时间
7.2.2 跳转界面
<% out.print("3秒后刷新..."); response.setHeader("refresh", "3;url=count.jsp"); %>
7.3 添加Cookie
<% Cookie cookie = new Cookie("username", "Chalmers"); //设置保存时间为60*60秒 cookie.setMaxAge(60 * 60); response.addCookie(cookie); %>
<% Cookie[] cookies = request.getCookies(); for (Cookie c : cookies) { if (c.getName().equals("username")) { out.print(c.getValue()); return; } } out.print("没有..."); %>
8、pageContext
8.1 pageContext对象能够存取其他隐含对象。
8.2 当隐含对象本身也支持属性时,pageContext对象也提供存取那些属性的方法。
9、session
9.1 session对象用于存储一个用户的会话状态,也就是说,session对象是对某个用户的会话过程中的信息存储。
9.2 当客户端访问服务器时,会在服务器中搜索对应的sessionID,如果没有找到,那么便会创建一个,如果找到了便直接使用。
所以在session 的有效时间内,每个客户端只有一个sessionID。
10、pageContext,request、session、application传递参数的使用范围:
10.1 设置参数值
<% pageContext.setAttribute("pageContext", "true"); request.setAttribute("request", "true"); session.setAttribute("session", "true"); application.setAttribute("application", "true"); %>
10.2 当前页面中,所有的对象都可以通过getAttribute获得值
10.2 在request的forward方法传递中,pageContext接收数据失败,所以pageContext只能在定义页面中使用。
10.3 request的include方法同上
10.4 如果使用response的sendRedirect方法,那么request也将接收失败。原因:客户端向服务端请求数据,服务端在向客户端发送数据
完成后,该request便已经结束,客户端访问url时已经是一个新的request了,所以request的使用范围是一个request内。
10.5 在session的有效时间内,数据都是存在的,特别强调的是,关闭浏览器不会清除掉session。
10.6 而application只有在关闭服务端后才会被清除,可见上面的application介绍。
10.7 总结:范围大小: application>session>request>pageContext
Cookie和Session的区别
1:位置:
Cookie是存在浏览器中的,Session是存在服务器中的。
2:安全性:
Cookie的安全性要低于Session,因为Cookie可能会被用户禁用,而且黑客可以分析存放在本地的Cookie并进行Cookie欺骗。
3:数据存储方式:
Session的数据是存在服务器内存中,关掉浏览器,会清空Session。
临时性Cookie存在浏览器的缓存中,关掉浏览器,会清空
永久性Cookie是存在临时文件中,到达有效期前,一直存在
4:存取方式比较(摘自网络):
Cookie中只能保存ASCII字符串,如果需要存取Unicode字符或者二进制数据,需要进行UTF-8、GBK或者BASE64等方式的编码。Cookie中也不能直接存取Java对象,若要存储稍微复杂的信息,使用Cookie是比较困难的。
而Session中可以存取任何类型的数据,包括String、Integer、List、Map等。Session中也可以直接保存JavaBean及至任何Java对象等,使用起来非常方便,可把Session看做是一个Java容器类。
5:对服务器的负担比较:
因为Session是保存在服务端的,如果用户数量极多,对服务器负担较大。
而Cookie是保存在客户端,不占用服务器资源,所以适合于大多数网站。
这里要注意:单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
6:有效期比较(摘自网络):
要达到长久地记录用户的登录信息的效果,使用Cookie会是比较好的选择。只需要设置Cookie的maxAge属性为一个很大很大的数据字或者Integer.MAX_VALUE就可以了。Cookie的maxAge属性支持这样的效果。
使用Session理论上也能实现这种效果。只要调用方法setMaxInactiveInterval(Integer.MAX_VALUE)不就可以了么。但是由于Session依赖于名为JSESSIONID的Cookie,而Cookie JSESSIONID的maxAge默认为-1,关闭了浏览器该Session就会失效,因此Session不能实现信息永久有效的效果。使用URL地址重写也不能实现。
而且如果设置Session的超时时间过长,服务器累计的Session就会越多,越容易导致内存溢出。
7:跨域名比较:
Cookie支持跨域名访问,例如将domain属性设置为“.helloweenvsfei.com”,则以它为后缀的所有域名均可以访问该Cookie。而Session则不会支持跨域名访问,仅在它所在的域名内有效。
*部分测试内容出处:
http://moonmonster.iteye.com/blog/2279988
http://545283613.iteye.com/blog/2279399
http://leaf-stop.iteye.com/blog/2279705
相关推荐
9. 错误处理与日志记录:为了确保系统的稳定性和可追踪性,错误处理和日志记录机制必不可少。当出现异常时,系统会捕获并记录相关信息,帮助开发者定位和解决问题。 综上所述,"JSP+Servlet+Javabean+Mysql网上书店...
虽然具体的文件名没有提供,但通常在这样的项目中,文件名可能会包含与BBS相关的类、配置、JSP页面或者数据库脚本等。例如,可能会有如下文件: 1. `User.java`:表示用户实体类,包含用户的属性和方法。 2. `...
在IT行业中,构建一个功能完善的在线购物车...同时,数据库技术如MySQL的使用也是必不可少的,它提供了数据持久化和高效查询的能力。通过这些技术的结合,我们可以构建出一个稳定、可扩展且用户友好的在线购物车系统。
9. **测试**:系统开发过程中,单元测试和集成测试必不可少,以确保各个组件的正确性和整体功能的完整性。 10. **优化**:对于性能优化,可能包括数据库查询优化、减少不必要的网络请求、缓存策略等,以提升用户...
在JSP中,我们通常会用到EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library)来简化页面逻辑。 分页的核心在于如何根据用户请求的数据范围,从数据库中获取相应页面的数据。这个过程通常...
Servlet会与数据库交互,获取或更新数据,然后将结果返回给JSP,由JSP进行渲染展示。Servlet也可以用于处理用户的登录验证、权限控制等功能。 3. **Selvert**:描述中提到的"SELVERT"可能是笔误,更常见的应该是...
学生信息管理系统是一个基于Web的应用程序,它利用JSP(JavaServer Pages)、JavaBean和Servlet技术来实现对学生的数据进行存储、检索和管理。这个系统通常包括注册、登录、信息查看、信息更新、删除和查询等功能,...
本文将深入探讨如何在Linux系统上搭建一个支持JSP应用的环境,主要包括Tomcat 4、Java Development Kit (JDK) 和 PostgreSQL 数据库的安装与配置。下面我们将详细地介绍每个步骤。 首先,我们来了解JDK(Java ...
Tomcat是Apache软件基金会的一个开源项目,作为一个Servlet容器,它支持JSP和Java Servlet,是运行Java Web应用的服务器平台。而MySQL是一种流行的开源关系型数据库管理系统,用于存储和管理应用程序的数据。 在JSP...
2. Java Servlet:虽然JSP本身就是一个Servlet,但在实际应用中,开发者通常会使用单独的Servlet来处理业务逻辑。Servlet是Java EE的一部分,负责接收和响应来自客户端的HTTP请求,进行必要的处理,然后返回响应。在...
3. **Servlet**:在某些情况下,JSP可能会与Servlet结合使用,Servlet主要负责处理复杂的业务逻辑,而JSP则专注于显示数据。 4. **模型(Model)**:封装了数据库操作,如DAO(Data Access Object)层,用于与数据库...
【JSP+Struts2+Hibernate 购物系统】是一个基于Java Web技术构建的电子商务应用程序,它结合了三种核心技术来实现动态网页、业务逻辑控制和数据持久化管理。在这个系统中,JSP(JavaServer Pages)负责展示层,...
9. **测试与调试**:在系统开发过程中,单元测试、集成测试和系统测试都是必不可少的,以确保所有功能都能正常工作,同时找出并修复潜在的bug。 总的来说,"jsp+sevlet+javabean 机票预订系统"是一个综合性的项目,...
《图书管理系统:jsp+servlet+mysql的深度剖析与实践》 图书管理系统是信息化时代图书馆管理的重要工具,它利用先进的计算机技术和数据库技术,实现图书的信息化管理,提高图书借阅、归还、查询等操作的效率。本...
**测试与调试**:在开发过程中,单元测试和集成测试是必不可少的,以确保各个组件和整体功能的正确性。开发者可能会使用JUnit进行单元测试,结合Eclipse或IntelliJ IDEA等IDE进行调试。 **持续集成与部署**:对于...
4. **内置对象**:JSP提供了九个内置对象,包括`request`、`response`、`session`、`application`等,它们可以直接在JSP页面中使用,简化了Web开发。 5. **脚本元素**:JSP中的脚本元素包括声明、表达式和脚本块。...
开发者通常会在JSP页面中嵌入Java代码,这些代码可以在服务器端执行,然后将结果返回给客户端浏览器。 其次,javabean是Java编程中的一个组件模型,它遵循特定的规范,提供了一种封装数据和业务逻辑的方式。在这个...
开发者会学习到如何在JSP中使用EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library)简化页面的编程。 4. **分页功能**:文件名`JDBCPageSize`可能表示项目包含了分页功能。在大型数据集的...
ssm整合开发,小程序毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统...
4. 会话管理:登录成功后,通常会创建一个会话,保存用户的身份信息,以便在后续请求中识别用户。 学习并理解这个登录功能的实现,可以帮助初学者掌握Web开发的基本流程,包括用户交互、服务器处理、数据库操作等...