首先谈一下对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()方法原型如下:
程序代码:
此类在struts- config.xml配置文件中有对应的配置项: < controller locale="true">< /controller> 其缺省状态locale属性的值为true,也就会调用processLocale方法,并在第一次请求时创建session对象和生成 sessionId.但改为false后,在第一次请求到达ActionServlet后不会调用processLocale方法,也就不会生成 session对象了。
结果也就出来了,在struts应用中,*.do到达server端后经过 ActionServlet后转想我们自己写的IndexAction之前, < controller locale="true">< /controller>(缺省状态) 时,就已经产生了session对象和sessionId,这是struts框架类中生成的,即使我们在IndexAction中写上 HttpSession session = request.getSession();其也是RequestProcess类中的processLocale()方法生成的,此时其session 的isNew也还是true,因为还没有返回客户端,其是新创建的,那么按照上面的流程,当在login.jsp上通过login.do进入 LoginAction后,其request.getCookies()固然也就有值了!并且其值是RequestProcess类中的 processLocale()方法产生session对象时生成的。
如果我们在struts-config.xml中加上< controller locale="false">< /controller> 时,此时如果再根据上面的流程来跟踪程序,并在LoginAction用request.getCookies()测试时,其值是为null的,当然在 IndexAction写上HttpSession session = request.getSession();时其是进入IndexAction时新创建的,isNew也是true.
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();
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 + "'");
}
session.setAttribute(Globals.LOCALE_KEY, locale);
}
}
分享到:
相关推荐
### Hibernate和Struts的整合架构中数据持久化技术的应用研究 #### 摘要与背景 本文探讨了在企业级应用开发中,采用Hibernate和Struts整合架构进行数据持久化技术的应用研究。针对传统单一框架构建的企业应用存在...
当用户登录后,服务器会为该用户创建一个唯一的Session对象,并将其存储在服务器内存中。客户端通过Session ID(通常存储在cookie中)来标识其对应的Session。开发者可以在Session中存储用户信息,如登录状态、...
对于用户登录,Action会检查用户名和密码是否匹配,如果验证成功,可能会创建一个表示已登录状态的session对象。 5. **Model**:在这个案例中,模型可能涉及数据库操作,如查询用户信息。使用DAO(数据访问对象)...
总的来说,Struts2架构的核心在于FilterDispatcher、ActionMapper、ActionProxy、ActionInvocation、拦截器和ActionContext,它们共同协作,实现了请求处理、业务逻辑执行以及响应生成的过程。这种设计模式使得...
在Spring和Struts的整合中,Hibernate常作为数据访问层的工具,Spring可以管理Hibernate的SessionFactory和Session,提供声明式事务管理,而Struts则负责调用业务服务,这些服务再调用Hibernate进行数据操作。...
MVC模式将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller),以实现职责分离,提高代码的可维护性和可扩展性。 一、传统的Java Web开发 在Java Web应用开发中,Servlet和JSP(Java ...
3. **创建Action类**:在Struts的Action类中,注入SessionFactory,获取Session对象。 4. **实例化实体对象**:根据业务需求,创建实体对象并赋值。 5. **打开事务**:开始一个新的数据库事务,以确保一组操作的原子...
在Java Web开发中,EJB(Enterprise JavaBeans)和Struts是两种重要的技术,常被用于构建企业级的、基于模型-视图-控制器(MVC)架构的应用程序。本例子以“网上银行系统”为背景,展示了如何整合这两者来实现一个...
Action类通常是Model层的一部分,它负责处理业务逻辑,并通过getter和setter方法与视图和控制器交换数据。 在给出的示例中,我们看到了一个简单的UserAction类,这个类继承自ActionSupport,实现了登录功能。当...
Struts2是一个强大的Java web框架,它简化了MVC(模型-视图-控制器)架构的实现,提供了丰富的功能和良好的扩展性。本入门篇主要涵盖了Struts2的基础配置、通配符使用、参数注入以及内置对象的获取,非常适合初学者...
Struts主要负责MVC(Model-View-Controller)架构的实现,提供了强大的控制层支持,而Hibernate则是一个对象关系映射(ORM)工具,使得开发者可以方便地在Java应用程序中操作数据库。将两者整合,可以构建出高效、...
在Java Web开发中,Spring、Struts2和iBatis是常见的三大框架,它们共同构建了一个功能强大的MVC(Model-View-Controller)架构。在本项目中,我们关注的是如何利用这些技术来处理“异地登录”问题,尤其是通过`...
Struts2和Hibernate是两种非常流行的Java开源框架,它们分别用于MVC(Model-View-Controller)架构的控制层和数据持久化层。Struts2是Apache软件基金会下的一个项目,它提供了强大的动作调度和视图渲染功能,而...
1. **MVC架构**:MVC模式是软件设计中的一种经典架构,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。在Struts2中,模型处理业务逻辑,视图负责显示用户界面,而控制器接收...
Struts1和Hibernate是两种非常重要的Java开发框架,它们在企业级应用开发中扮演着核心角色。Struts1主要用于控制应用程序的流程,而Hibernate则是一个强大的对象关系映射(ORM)框架,它简化了数据库操作。 **...
- **Session管理**:通过Session对象进行数据库的增删改查操作。 - **事务管理**:支持事务的回滚、提交等操作。 - **缓存机制**:提高数据访问效率,减少数据库访问次数。 2. **工作流程**: - 开启Session。 ...
2. 通过SessionFactory创建Session对象。 3. 使用Session对象执行持久化操作(如save、update、delete等)。 4. 提交事务或回滚事务。 5. 关闭Session和SessionFactory。 #### 四、Struts与Hibernate的整合 在实际...
在Struts2中,你可以创建领域对象,通过setter和getter方法来接收和设置请求参数,这些对象可以在多个Action之间共享,提高了代码的复用性。 4. **Struts2_2.1.6版本的中文问题** 在某些版本的Struts2中,可能出现...
Struts主要负责MVC(Model-View-Controller)架构的实现,提供控制层的功能,而Hibernate则是一个强大的对象关系映射(ORM)工具,用于简化数据库操作。将两者整合可以创建出高效、灵活的Web应用程序。 **Struts 2...
- **Struts2** 则是一个pull-MVC架构,它允许开发者直接从Action中拉取数据,无需将数据放入特定范围。Action类不再需要继承特定的基类,而是可以是任何具有公共getter和setter方法的POJO(Plain Old Java Object)...