首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | 镜像站
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
Linux资讯 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>编程开发>java>Java基础>正文

WEB开发Struts:Session对象创建和控制

http://www.oklinux.cn  2008-01-20  来源: 赛迪网 dxaw  会员收藏  游客收藏  【 】 

首先谈一下对session对象在web开发中的创建以及sessionId生成并返回客户端的运行机制.

session对象当客 户端首次访问时,创建一个新的session对象.并同时生成一个sessionId,并在此次响应中将sessionId以响应报文的方式些回客户端浏 览器内存或以重写url方式送回客户端,来保持整个会话,只要sever端的这个session对象没有销毁,以后再调用request.getSession()时就直接根据客户端的sessionId来检索server端生成的session对象并返回,不会再次去新建,除非根据此sessionId没有检索到session对象.

下面是在IE下测试,因为IE6.0的一个BUG就是IE的隐私设置即使是阻止所有cookie时,也还是会以会话cookie来保存sessionId.所以下面都是以会话cookie来讨论的,

(1)在server没有关闭,并在session对象销毁时间内, 当客户端再次来请求server端的servlet或jsp时,将会将在第一次请求时生成的sessionId并附带在请求信息头中并向server端发 送,server端收到sessionId后根据此sessionId会去搜索(此过程是透明的)server对应的session对象并直接返回这个 session对象,此时不会重新去建立一个新的session对象.

(2)当server关闭(之 前产生的session对象也就消亡了),或session对象过了其销毁时间后,浏览器窗口不关,并在本浏览器窗口再次去请求sever端的 servlet和jsp时,此时同样会将sessionId(server关闭或session销毁时生成的sessionId)发送到server端, server根据sessionId去找其对应的session对象,但此时session对象已经不存在,此时会重新生成一个新的session对象, 并生成新的sessionId并同样将这个新生成的sessionId以响应报文的形式送到浏览器内存中.

(3)当server没有关闭,并session对象在其销毁时间内,当请求一个jsp页面回客户端后,关闭此浏览器窗口,此时其内存中的sessionId也就随之销毁,在重新去请求sever端的servlet或jsp时,会重新生成一个sessionId给客户端浏览器,并存在浏览内存中.

上面的理论在servlet中测试都是成立的,下面谈一下在struts框架下进行上面的测试时的不同的地方.

先简要说下测试程序的流程:

客户端请求index.do-进入server端的IndexAction-转向login.jsp页面---请求login.do---进入server端的LoginAction.

首先说明:IndexAction中没有去产生session对象,login.jsp中设置<%@ page session="false"%>.

(1)环境servlet jsp:

在sevlet jsp测试跟踪时,在index.do进入IndexAction后转向login.jsp时,此时浏览器内存中是没有会话cookie的,那么在 login.jsp上请求login.do进入LoginAction后,用request.getCookies()测试时,其值是为null的!结果 是稳合的,因为从始置终没有产生过session.

(2)环境struts jsp:

在struts jsp测试跟踪时,跟上面的流程一样,开始想结果也应该是一样的,但经过调试后发现结果却不是所想的那样.在login.do进入 LoginActoin后用,用request.getCookies()测试时,发现其值不为null,即其有name和value,开始很不理解,因 为根本就没有创建过session对象,哪来的会话cookie值呢.但是结果有,那么想着此时浏览器内存中也就应该有会话cookie,问题就在这里! 从哪里来的?

后来经过仔细考虑后,想到struts中的特点,我们自己写的Action类是继续struts的Action的,而且之前 是经过struts的中心控制器ActionServlet来控制转向的,所以我想肯定是在程序进入我自己写的IndexAction之前,struts 框架中的代码肯定已经创建了session对象并已经生成了sessionId.于是就找到相关书籍查看了ActionServlet工作流程以及调用哪 些类,看了之后果然在其中看到了HttpSession session = request.getSession();这样一句话!于是答案也就明白了.

大家知道struts的ActionServlet类中在接收到我们客户端的请求(*.do)后(之前会做一系列初始化工作),并不是直接去处理我们的请求 并调用相应的Action(我们写的如IndexAction),而是将处理工作交给RequestProcessor类,其process方法中会调用 一系列的方法来完成相应的请求处理和转向操作.其中有一个方法引起了我的关注,就是processLocale()方法.

Struts框架:RequestProcess类中的processLocale()方法原型如下:

共2页: 上一页 1 [2] 下一页
protected void processLocale(HttpServletRequest request,
        HttpServletResponse response) {
        // Are we configured to select the Locale automatically?
        if (!moduleConfig.getControllerConfig().getLocale()) {
            return;
        } 

        // Has a Locale already been selected?
        HttpSession session = request.getSession(); JAVA天堂 

        if (session.getAttribute(Globals.LOCALE_KEY) != null) {
            return;
        } 

   // Use the Locale returned by the servlet container (if any)
        Locale locale = request.getLocale(); 

        if (locale != null) {
            if (log.isDebugEnabled()) {
                log.debug(" Setting user locale '"   locale   "'");
            } JAVA天堂 

            session.setAttribute(Globals.LOCALE_KEY, locale);
        }
    }

上一篇:JSP中调用SQL Server存储过程实例讲解   下一篇:详细介绍构建高性能J2EE应用的十个技巧


收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·JSP中调用SQL Server存储过程实例讲解
·在Weblogic上配置JMS服务的方法
·Taglib的打包部署和使用方式详解
·EJB中使用Hibernate的方法以及常见问题
·快速、简便的使用AJAX技术操作的三部曲
·JSP JavaBean Servlet工作原理实例讲解
·用Struts向MYSQL数据库中储存图片实例
·基于JSP实现数据库中图片的存储与显示
·使用AJAX技术实现网页无闪自动局部刷新
·AJAX开发智能的Web应用程序详解
·如何在JSP页面发送一个动态图像
·JSP中的pageEncoding和contentType属性
·用JSP JavaScript打造二级级联下拉菜单
·加快JDBC中JSP数据库的访问速度
·在JSP环境中配置使用fckeditor详细讲解
·对于JSP中表单数据存储的一种通用方法
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·Java入门:状态对象--数据库的替代者
·Java语言怎样调用外部应用程序
·Java语言深入--关于Java语言的内存泄漏
·JSP/Servlet/JSF:Servlet/JSP配置详解
·进阶-怎样使用AJAX进行WEB应用程序开发
·基础:J2ME程序开发之新手入门九大要点
·Java入门--Java语言接口与继承的本质
·JAVA进阶--如何提升JSP应用程序的效率
·对Java中四种XML解析技术之不完全测试
·编写高级 JScript应用代码
·JSP/Servlet/JSF--对标签库的深入研究
·Java入门--关于字符串分割的两种方法
  阅读排行
·使用AJAX技术实现网页无闪自动局部刷新
·快速教您Apache Tomcat SSL的配置
·Java语言深入--java调用C/C 的过程
·用JSP JavaScript打造二级级联下拉菜单
·JAVA进阶--线程运行栈信息的获取讲解
·使用WEBWORK实现文件上传方法实例详解
·J2SE综合--JAVA实现把汉字转化成拼音
·一个非常有趣的使用spring框架AOP例子
·关于java中相对路径,绝对路径问题总结
·高级:lucene全文检索应用示例及代码简
·详细讲解Struts构架中action的跳转大全
·在Weblogic上配置JMS服务的方法
·Hibernate配置文件中的映射元素详解
·对Java中四种XML解析技术之不完全测试
·基于AJAX的动态树型结构的设计与实现
网摘收藏: