http://blog.sina.com.cn/jiwenbin550
在我们集成struts2+spring+hibernate,也就是所谓的S2SH,不可避免的要引入struts2-spring-plugin.jar插件。当引入这个插件后,原先所struts创建的action类,交给了spring创建。在struts2-spring-plugin.jar中有一个struts-plugin.xml,里面声明了action类由spring工厂创建。在struts2插件文档里,这样写着“The Spring Plugin works by overriding the Struts ObjectFactory to enhance the creation of core framework objects。”这个插件重写了struts的对象工厂,当创建一个action类时,它会根据struts的配置文件的class属性的值与spring配置文件中的id属性的值相匹配。如果没有与之相匹配,将会像没有使用这个插件前一样创建,然后由spring自动装配。
那时我有些不是很明白,为什么我的action类没有写注解@Component("xxAction"),还是可以被spring自动装配。那是因为action类被struts和struts2-spring-plugin创建,再由spring自动装配,但不由spring管理。如果我们想使用spring复杂的aop或spring其他的功能时,强烈建议将acion类注册到spring容器中。
今天,再次做测试,又有了出乎意料的结果。在此说明,我的测试中用的是annotion注解,不是xml文件。
之前,我们说过,当创建一个action类时,它会根据struts的配置文件的class属性的值与spring配置文件中的id属性的值相匹配。如果没有与之相匹配,将会像没有使用这个插件前一样创建,然后由spring自动装配。这两种情况会出现不同的结果。现在我们慢慢来说明。
假设我们有一个AddUserAction的类,位于com.action包下,它有属性userService:
package com.action;
import com.opensymphony.xwork2.ActionSupport;
import com.service.UserService;
public class AddUserAction extends ActionSupport {
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
@Override
public String execute() throws Exception {
System.out.println(userService==null);
return SUCCESS;
}
}
以上这个类是我们最简单的action类,在没有引入struts2-spring-plugin.jar插件时,action类是由struts创建的,我们struts.xml文件是这样写的:
<struts>
<package name="registration" extends="struts-default">
<action name="addUser" class="com.action.AddUserAction">
<result>success.jsp</result>
</action>
</package>
</struts>
但如果我们引入struts2-spring-plugin.jar插件后,如果我们的struts.xml文件还是如同以上一样写,就会出现struts的配置文件的class属性的值与spring配置文件中的id属性的值不匹配,因为action类没有注册到spring的容器中。那action的创建由strutst和struts2-spring-plugin.jar插件创建,默认地根据名字到spring容器中去找相应的对象进行自动装配(不管你是否愿意,只要提供了set方法),所以userService不会是null值,这个action类的scope也默认的是prototype,但这个action类不在spring容器中。
自然的,以上这种情况不是我们想要的,因为很多情况都不在我们的控制范围内。那只要我们将action类的创建交给spring,就可以自主也配置我们想要的属性。这时我们将原来的action类改为:
package com.action;
mport javax.annotation.Resource;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import com.opensymphony.xwork2.ActionSupport;
import com.service.UserService;
@Component("addUserAction")
@Scope("prototype")
public class AddUserAction extends ActionSupport {
private UserService userService;
@Resource(name="userService")
public void setUserService(UserService userService) {
this.userService = userService;
}
@Override
public String execute() throws Exception {
System.out.println(userService==null);
return SUCCESS;
}
}
在第二个action类中,我们加入了相应的annotion,把我们的action类注册到spring容器中。我们的struts.xml文件也改为:
<struts>
<package name="registration" extends="struts-default">
<action name="addUser" class="addUserAction">
<result>success.jsp</result>
</action>
</package>
</struts>
这时,struts的配置文件的class属性的值与spring配置文件中的id属性的值匹配。如果我们不想装配userService,可以将@Resource(name="userService")删除。
所以,在struts.xml里的class的属性值决定你以那种方式创建action类,我个人倾向于将action类交给spring管理和自动装配。
分享到:
相关推荐
通过以上这些实例,你可以逐步学习和掌握Struts2的配置、Action、拦截器、结果类型、OGNL表达式、数据绑定、国际化、安全等方面的知识。这些实例不仅提供了理论知识,还提供了实践经验,对于深化对Struts2的理解和...
总的来说,"Struts2项目实例"涵盖了Java web开发中的关键环节,从Action设计、数据库操作、视图展现到框架配置,为我们提供了一个学习和实践Struts2的好起点。通过分析和理解这个实例,开发者可以更好地掌握Struts2...
本实例将详细讲解如何使用Struts2实现一个简单的登录功能。 一、Struts2框架简介 Struts2是由Apache软件基金会开发的开源框架,它继承了Struts1的优点并解决了其存在的问题。Struts2的核心是Action类和配置文件,...
在Struts2框架中,Action类是业务逻辑处理的核心组件,它负责接收并处理来自用户的请求。本实例探讨了如何让一个Action类处理多个请求,这在开发中常见于需要集中处理相似请求的情况,可以提高代码复用性和结构的...
提供的压缩包文件可能包含了一些示例代码,每个子文件夹可能对应一个具体的实例,如01_zmhh、02_zmhh等,这些实例可以帮助我们逐步了解和掌握Struts2的各个功能点。在实际学习过程中,可以通过运行这些实例,观察...
总之,"Struts2项目实例"是一个实践性的学习资源,它能够帮助开发者从理论走向实践,深入理解Struts2框架的运作方式,并提升其在实际开发中的应用能力。通过逐步分析和模仿这个实例,学习者能够更好地掌握Struts2,...
在"STRUTS2学习实例8"中,你可能将学习如何创建一个完整的Struts2应用,包括定义Action,配置struts.xml,使用拦截器,以及构建视图。文件名"eight"可能指的是第8个步骤或示例,具体的学习内容可能涉及更复杂的功能...
总结,"struts2简单实例"展示了如何使用Struts2框架构建一个简单的学生信息查询功能,涵盖了配置文件、Action实现、数据传输以及视图展示等多个方面,是学习和理解Struts2工作原理的好例子。通过这个实例,开发者...
总结,这个实例展示了如何使用Struts2框架构建一个简单的登录功能,包括Action配置、Action类的编写以及视图的创建。实际开发中,登录功能会涉及到更复杂的验证和安全考虑,如密码加密、验证码、记住我功能等,但这...
Struts2是一个强大的Java Web应用程序框架,用于构建和维护可扩展、结构清晰的MVC(Model-View-Controller)架构的应用程序。这个“Struts2实例3源码”...通过这种方式,你可以逐步构建起对Struts2框架的全面认识。
10. **插件系统**:Struts2拥有丰富的插件生态系统,如struts2-dojo-plugin提供AJAX支持,struts2-convention-plugin简化了Action类和Action方法的自动映射。 以上就是Struts2实例工程中涉及的关键知识点,通过学习...
本实例将向您展示如何在MyEclipse环境中搭建并运行一个基础的Struts2项目。 首先,我们需要了解Struts2的基本架构。Struts2的核心组件包括Action类、配置文件(struts.xml)、拦截器(Interceptors)和结果类型(Results...
【标题】"jsp+struts2完整实例"揭示了这个项目是基于Java Web技术栈,主要使用了JSP(JavaServer Pages)和Struts2框架来实现一个完整的应用程序。Struts2是一个开源的MVC(Model-View-Controller)框架,它在Java ...
本实例是针对初学者的一个实践教程,旨在帮助理解并掌握Struts2框架的基本用法。 在Struts2框架中,核心组件包括Action类、配置文件(struts.xml)、拦截器(Interceptors)以及结果类型(Result)。Action类是业务...
总的来说,"Struts2典型小实例源代码"提供了一个基础的Struts2应用模型,涵盖了Action、配置、视图和拦截器等关键组件。通过深入学习和分析这个实例,开发者可以更好地理解和运用Struts2框架,构建更高效的企业级web...
"STRUTS2站点,STRUTS2学习实例10"很可能是针对Struts2框架的一个教学资源,旨在帮助开发者深入理解Struts2的工作原理和实践应用。 在Struts2的学习实例10中,我们可能会涵盖以下几个核心知识点: 1. **Action类与...