问题:
使用saveError(HttpSession,ActionMessages messages);保存了错误信息。
第一次返回时显示了错误信息,第二次发送请求时错误信息却没了,感到奇怪,深入了解便发现了struts1.x对
缓存信息处理机制的奥妙。
code: save error message
protected void saveErrors(HttpSession session, ActionMessages errors) {
// Remove the error attribute if none are required
if ((errors == null) || errors.isEmpty()) {
session.removeAttribute(Globals.ERROR_KEY);
return;
}
// Save the errors we need
session.setAttribute(Globals.ERROR_KEY, errors);//session范围
}
ActionServlet 中对每次请求的处理:
*/
1. public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
process(request, response);
}
2.
protected void process(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
ModuleUtils.getInstance().selectModule(request, getServletContext());
ModuleConfig config = getModuleConfig(request);
RequestProcessor processor = getProcessorForModule(config);
if (processor == null) {
processor = getRequestProcessor(config);
}
processor.process(request, response);
}
3.
public void process(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
// Wrap multipart requests with a special wrapper
request = processMultipart(request);
// Identify the path component we will use to select a mapping
String path = processPath(request, response);
if (path == null) {
return;
}
if (log.isDebugEnabled()) {
log.debug("Processing a '" + request.getMethod() + "' for path '"
+ path + "'");
}
// Select a Locale for the current user if requested
processLocale(request, response);
// Set the content type and no-caching headers if requested
processContent(request, response);
processNoCache(request, response);
// General purpose preprocessing hook
if (!processPreprocess(request, response)) {
return;
}
this.processCachedMessages(request, response);//缓存信息处理机制
4.
protected void processCachedMessages(HttpServletRequest request,
HttpServletResponse response) {
HttpSession session = request.getSession(false);
if (session == null) {
return;
}
// Remove messages as needed
ActionMessages messages =
(ActionMessages) session.getAttribute(Globals.MESSAGE_KEY);
if (messages != null) {
if (messages.isAccessed()) {//是否移除普通消息
session.removeAttribute(Globals.MESSAGE_KEY);
}
}
// Remove error messages as needed
messages = (ActionMessages) session.getAttribute(Globals.ERROR_KEY);
if (messages != null) {
if (messages.isAccessed()) {
session.removeAttribute(Globals.ERROR_KEY);
}
}
}
由此我得到了结论。
这个问题刚好解决了目前困扰我的一个问题:
1.附件上传功能:
当用户新增一条业务数据时,此时没有业务id,同时这个功能里要增加附件,附件作为单独部分处理,
但是此时没有业务id,不好对把附件id与业务id关联只得把附件id用session缓存起来,此时问题来了,
当新增业务数据时,上传附件,但却没有增加业务数据去进行了,其它的业务操作,当用户第二次进入该功能点
时,因为session缓存,此时该条数据依然存在,给用户造成了困扰。
而用struts1的缓存处理机制很好的解决了我的问题:
code:
if (messages.isAccessed()) {//是否移除普通消息
session.removeAttribute(Globals.MESSAGE_KEY);
}
分享到:
相关推荐
10. **Plug-in机制**:Struts1支持插件,可以扩展框架功能,例如国际化、缓存管理等。 通过阅读和理解Struts1 API开发文档,开发者可以更好地掌握这个框架,从而更高效地构建Java Web应用。文档中包含了大量的示例...
6. **性能优化**:虽然Struts1本身不支持拦截器,但通过"saif(struts1 interceptor)"插件,开发者可以实现缓存管理、性能统计等优化措施,提升应用程序的性能。 7. **与Struts2的对比**:虽然Struts1的拦截器机制受...
5. 插件初始化,Struts1支持插件机制,增强了框架的可扩展性。`freeze()`方法使配置冻结,确保配置稳定。 接着,当客户端发出请求,ActionServlet通过`web.xml`中的配置拦截请求。在`HttpServlet`的`service()`方法...
9. **性能优化**:在实际项目中,还需要考虑性能优化,如缓存机制、数据库连接池的配置、Struts1 的拦截器配置等。 10. **测试**:结合 Spring 的 Test 模块和 Mock 对象,可以方便地对 Struts1 和 Spring 组件进行...
导入这些jar包后,开发者可以利用Struts2的拦截器(Interceptor)机制实现缓存策略,通过自定义拦截器存储和检索缓存数据。同时,配置Struts2的XML配置文件(struts.xml或struts-default.xml)来指定哪些Action应该...
- **性能优化** - 采用了高效的缓存机制,减少重复加载资源带来的性能损耗。 综上所述,Struts2是一款功能强大且高度可定制化的Java Web开发框架,通过学习其工作机制和关键组件,开发者能够更好地利用Struts2的...
7. **Plug-in机制**:Struts1支持插件扩展,开发者可以创建自己的插件来增强框架的功能,比如国际化、缓存管理和数据校验。 8. **Validation框架**:Struts1提供了内置的验证框架,可以在ActionForm级别进行数据...
- 为提高性能,可以考虑使用缓存机制来存储已加载的语言资源。 通过以上步骤,我们就能够在Struts1应用中实现多国语言支持,提供更好的用户体验。在实际项目中,可能还需要考虑到更多细节,如资源文件的版本管理、...
在性能方面,Struts 1通过使用缓存和优化的请求处理机制,确保了良好的运行效率。尽管随着时间的推移,出现了许多其他MVC框架,如Spring MVC和Struts 2,但Struts 1因其简单易用和广泛的社区支持,仍然在许多现有...
Hibernate提供了Session接口来处理数据库的CRUD(创建、读取、更新、删除)操作,以及事务管理和缓存机制。使用Hibernate,开发者可以避免编写大量的JDBC代码,提高了开发效率。 **Struts1.x与Hibernate整合:** 在...
7. **错误和异常处理**:Struts1提供了全局的错误处理机制,能够统一处理异常并展示友好的错误页面。 综上所述,这个新闻管理系统后台利用SSH框架的集成,实现了高效、灵活且易于维护的后端功能。开发者可以通过...
Hibernate支持多种数据库,提供了缓存机制、事务管理和查询语言HQL,使得数据库操作更加便捷和高效。 SSH1的整合使用,通常涉及到以下步骤: 1. **配置Struts1**:设置struts-config.xml文件,定义ActionMapping、...
9. **Plug-in插件**:Struts1支持插件机制,可以方便地扩展框架功能,如国际化、缓存等。 10. ** strutstags标签库**:提供了丰富的JSP标签,简化了页面的编写,例如`<s:form>`、`<s:textfield>`等,这些标签与...
Hibernate的缓存机制(如第一级缓存和第二级缓存)提高了性能,降低了数据库的负载。 Struts1则是MVC设计模式的实现,负责处理HTTP请求并分发到相应的控制器、模型和视图。在Struts1中,Action类作为控制器接收请求...
通过实体类和映射文件,开发者可以方便地进行CRUD(创建、读取、更新、删除)操作,同时,Hibernate的缓存机制和事务管理也能提高系统性能和数据一致性。 Spring框架作为核心的依赖注入(DI)和面向切面编程(AOP)...
- **缓存机制**:为了提高性能,可以考虑使用缓存来存储已加载的资源包。 总的来说,Struts1和Struts2都提供了完善的国际化支持,但Struts2在灵活性和易用性上有所提升。理解并熟练掌握这两个框架的国际化机制,有...
6. **Plug-ins**:Struts1支持插件机制,可以扩展其功能,例如国际化、验证、缓存等。 7. **生命周期**:一个典型的Struts1请求生命周期包括请求到达、DispatcherServlet拦截、ActionMapping查找、Action执行、结果...
然而,由于Struts2的出现,Struts1逐渐被淘汰,因为Struts2在很多方面有所改进,如更强大的插件支持、更灵活的拦截器机制等。尽管如此,理解Struts1的原理对于理解其他MVC框架,尤其是Struts2,仍然很有帮助。 然后...
同时,他们还引入了缓存机制,以优化数据访问速度,减少数据库的负载,从而提升整体系统性能。 【JSP】:JavaServer Pages(JSP)是Java平台上的一种动态网页技术,它允许开发者在HTML代码中嵌入Java代码,实现...