今天查找一个问题:我在列表页面添加一个查询条件,然后查询符合条件的数据.查询结果正确.然后我进入其它菜单项操作,当我再次进入列表页面时,系统还是按刚才的查询条件查询的.只要不我修改或清空查询条件,查询条件一直存在.我用的struts1.
很奇怪.以前没遇到过.先是怀疑客户端错误:
1:是不是IE缓存?抓包页面确实是被重新请求了.请求的URL中也没有上次的查询条件.那就不是IE缓存的问题.
2:那是不是页面的COOKIE保存了数据呢?抓包里返回的页面直接就填写了这些查询条件.
这样,问题就排除了客户端设置错误的可能了.那问题肯定在服务器上,一定时服务器端什么地方保存了ActionForm!
于是我就debug服务器端代码追查,在传到我写的Action里的from就已经有查询条件了,于是再往上一级查,找到了拼装ActionForm的方法,在struts1的RequestProcessor类里,代码如下:
private static ActionForm lookupActionForm(HttpServletRequest request, String attribute, String scope)
{
// Look up any existing form bean instance
if (log.isDebugEnabled()) {
log.debug(
" Looking for ActionForm bean instance in scope '"
+ scope
+ "' under attribute key '"
+ attribute
+ "'");
}
ActionForm instance = null;
HttpSession session = null;
if ("request".equals(scope)) {
instance = (ActionForm) request.getAttribute(attribute);
} else {
session = request.getSession();
instance = (ActionForm) session.getAttribute(attribute);
}
return (instance);
}
从if ("request".equals(mapping.getScope())) { request.setAttribute(mapping.getAttribute(), instance); }这句可以看出来,原来当scorp是request时,会把Form保存在request里,否则保存在session里.从这里知道是哪儿存的了,我的配置文件没有配置scope属性,默认值就是session,也就是在这里会把ActionForm存到session里.
下面再找是怎么取的:在RequestUtils.createActionForm(request, mapping, moduleConfig, servlet);方法里,会调用它本身的另一个方法:
private static ActionForm lookupActionForm(HttpServletRequest request, String attribute, String scope)
{
// Look up any existing form bean instance
if (log.isDebugEnabled()) {
log.debug(
" Looking for ActionForm bean instance in scope '"
+ scope
+ "' under attribute key '"
+ attribute
+ "'");
}
ActionForm instance = null;
HttpSession session = null;
if ("request".equals(scope)) {
instance = (ActionForm) request.getAttribute(attribute);
} else {
session = request.getSession();
instance = (ActionForm) session.getAttribute(attribute);
}
return (instance);
}
这下明朗了吧?原来是scope搞的鬼.还是对struts研究不深,对scope属性作用不了解.
分享到:
相关推荐
10. **生命周期管理**:Struts 1.x 使用Servlet容器管理Bean的生命周期,对于非持久性的数据,通常使用Request或Session范围的Bean。 然而,随着时间的推移,Struts 1.x 因为其局限性和安全问题,逐渐被Struts 2 和...
在JavaWeb开发中,Struts和Spring是两个非常重要的框架,它们在企业级应用中有着广泛的应用。Struts是MVC(Model-View-Controller)架构模式的一个实现,主要用于控制应用程序的流程,而Spring则是一个全面的轻量级...
Spring的API包括了Bean工厂、ApplicationContext、AOP代理等,它们使得开发者能够轻松管理对象的生命周期,并进行灵活的依赖注入。Spring MVC则提供了DispatcherServlet、ModelAndView等类来处理HTTP请求和响应。 3...
Spring的IoC容器管理着应用对象的生命周期和依赖关系,而AOP则允许开发者定义横切关注点,如日志、事务管理等,以减少代码的重复和增强模块的独立性。Spring还提供了数据访问抽象,使得与数据库的交互更加简单,它...
1. **Struts框架**:Struts框架是JavaWeb开发中的核心组件,它通过Action和ActionForm实现业务逻辑与视图的分离。ActionServlet负责接收请求,转发给相应的Action,然后Action再调用Service层处理业务逻辑,最后由...
在Java Web应用程序开发中,Struts1框架帮助开发者构建可维护性、可扩展性和结构清晰的Web应用。 Struts1框架的核心组成部分包括: 1. **ActionServlet**:这是Struts框架的入口点,负责接收HTTP请求,解析请求...
1. **Struts工作原理**:介绍请求处理流程,从用户请求到响应的整个生命周期。 2. **Struts配置详解**:讲解struts-config.xml的各个元素和配置方法。 3. **Action和ActionForm**:阐述如何创建和使用这两个关键类。...
在选课系统中,Spring管理着所有bean的生命周期,包括DAO(数据访问对象)、Service以及Action等组件。它通过IoC容器管理对象的依赖关系,降低了组件间的耦合度。同时,Spring的事务管理确保了数据操作的原子性和...
1. Spring的IoC和AOP:理解如何通过配置文件控制对象的生命周期,以及如何使用AOP实现横切关注点。 2. Struts的MVC模式:了解Action类、ActionForm、Result和JSP视图之间的关系,以及如何处理请求和转发响应。 3. ...
Spring 是一个全面的企业级应用开发框架,它提供了一个轻量级的容器,用于管理对象的生命周期和依赖注入。Spring 的核心特性包括: - 依赖注入(Dependency Injection, DI):允许开发者通过配置文件或注解来管理...
1. **理解Struts框架**:熟悉Struts框架的基本概念、架构与工作原理,掌握其在MVC模式中的角色定位,特别是视图和控制器组件的运作机制。 2. **掌握Struts控制器与视图组件**:熟练运用Struts的控制器组件如Action...
在这个系统中,Spring主要负责管理对象的生命周期和依赖关系,以及提供事务管理。例如,通过Spring的IoC容器,可以方便地注入Struts的Action和Hibernate的数据访问对象(DAO),确保它们的实例化和配置。此外,...
首先,Spring框架作为整个系统的“胶水”,负责管理对象的生命周期和依赖关系。通过Spring的IoC(Inversion of Control)容器,可以轻松地实现组件间的解耦,提高系统的可维护性和可扩展性。同时,Spring还提供了AOP...
1. **Struts**:作为MVC(模型-视图-控制器)设计模式的实现,Struts在JavaWeb应用中负责处理HTTP请求,并将这些请求映射到相应的业务逻辑上。它通过Action和ActionForm类来处理用户输入,利用配置文件(struts-...
在这个“房屋租赁系统”中,开发人员选择了Struts作为主要的MVC(模型-视图-控制器)框架,Servlet作为服务器端的控制层组件,而JSP则用于展示用户界面。同时,数据持久化层采用了DAO(数据访问对象)设计模式,并...
《CattTelecom:基于Struts的项目...通过对该项目的分析和代码阅读,开发者可以深入理解Struts的生命周期、请求处理流程,以及如何将Struts与其他技术如Hibernate、Spring等集成,进一步提升自己的JavaWeb开发技能。
SSH 是三个开源框架的缩写,分别是 Spring、Struts 和 Hibernate,它们在 JavaWeb 开发中起到了至关重要的作用。Spring 提供了全面的架构支持,Struts 负责 MVC(Model-View-Controller)设计模式的实现,而 ...
你需要理解如何使用SQL进行数据操作,并且熟悉如何在Struts1中与数据库交互,如使用DAO(Data Access Object)模式。 3. **Action和ActionForm**:Action是处理用户请求的中心,它接收请求,调用业务逻辑并返回结果...
在Java Web开发中,"整合开发王者归来"通常指的是将几种主流的技术框架融合在一起,以构建高效、可维护的Web应用程序。在这个特定的案例中,我们关注的是第七章关于Servlet的内容,结合了JSP(JavaServer Pages)、...
1. **Struts配置**:展示如何在struts-config.xml或struts2的配置文件中定义Action和ActionMapping,以及ActionForm的使用。 2. **Spring配置**:包括bean的定义、依赖注入的配置,以及Spring MVC的配置,如...