Spring 与 Struts 框架的整合通常有好几种方法。每种方法都有不同的特点,而且之间的差异也挺大,对于初学者来说非常难已弄懂每种方法是如何正确配置的。通常大家在网上或者书上看到的 spring 与 struts 整 合都是只介绍一到两种,而且各自介绍的方法又大有差异。这样使初学者更难入手,甚至把各个方法混淆在一起(本人初学时就是如此)。后来经过一段时间的摸 索,参考了大量的资料后,总结出了以下四种方法。四种方法从易到难,从不常用到常用。当然这只是本人的个人观点,没有任何权威性可言,仅供参考。
(所有方法的前提是你已经为项目添加好了 spring 与 struts 类库)
第一种:
需要配置的文件有: web.xml applicationContext.xml
步骤
1 、先配置 web.xml. ,首先让容器在启动的时候加载 applicationContext.xml
需要在 web.xml 当中添加如下内容:
< servlet > < servlet-name > context </ servlet-name > < servlet-class > org.springframework.web.context.ContextLoaderServlet </ servlet-class > < load-on-startup > 1 </ load-on-startup > </ servlet > |
( 这只是一种,还可以配置 Listener ,具体内容请上网搜索。 )
这里的介绍有个前提,那就是你的 applicationContext.xml 文件存放到 WEB-INF/ 文件夹下,不能是在别的文件夹,同时文件名也不可以更改为其它的文件名。
如果你真的更改了 applicationContext.xml 这个文件的路径或名字那么请在 web.xml 中加上以下内容:
<context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/classes/spring.xml </param-value> </context-param> |
(红色部分是你自己的路径和文件名)
2 、配置 applicationContext.xml
这里假设你有一个 ( Userdao .java) 类用于进行数据库的操作(具体的操作可暂时忽略)
那么我们在 applicationContext.xml 文件中进行如下配置:
< bean id = "userdao" class = "cn.oyangk.dao.Userdao" > </ bean > |
同时也有一个接口 ( IUserDAO .java) ,为什么要接口呢?其实这是一种编程思想――面向接口编程。
你的 Userdao .java 类实现了这个接口,那么我们在 struts 当中的 Action 中可以这样操作了。
ServletContext context = this.getServlet().getServletContext(); WebApplicationContext wac = WebApplicationContextUtils. getWebApplicationContext(context); // 只有通过此种配置方法才可以使用此方法 IUserDAO dao = (IUserDAO)wac.getBean("userdao"); // 通过 WebApplicationContext 得到 bean |
这样我们就可以将操作数据库的 DAO 通过 Spring 来管理了。当我们需要使用的时候,只需通过上面的方法就可以从 spring 当中得到我们想要的 DAO 类 .
所有方法的前提是你已经为项目添加好了 spring 与 struts 类库)
首先你的 web.xml 文件不需要像第一种方法那样去做任何的添加。只需保持默认的就行,也就是在你添加好 struts 及 spring 支持后默认的内容就可以。
以下为你需要进行更改的步骤:
1、 首先为了让 struts 能认识到 spring 那么先在 struts-config.xml 文件中添加 spring 插件。具体内容如下:
<!-- 添加 spring 支持 --> < plug-in className = "org.springframework.web.struts.ContextLoaderPlugIn" > < set-property property = "contextConfigLocation" value = "/WEB-INF/applicationContext.xml" /> </ plug-in > |
2、 修改你的 action 对应的 type 。这是因为,为了让 spring 来管理 action 那么我们需要将 action 生成权力交给 spring 具体参考以下例子:
< action attribute = "userForm" input = "/jsp/errors.jsp" name = "userForm" path = "/user" scope = "request" type="org.springframework.web.struts.DelegatingActionProxy" / > <!-- 截获 action ,让 spring 来生成 action --> |
红色部分为关键的一句。通俗一点来讲,就是当我们提交表单时, struts 会把我们提交的请求先转发给 spring 。这里的红色部分所显示的类,就是用来截获我们的请求。
当 spring 截获到请求后。它就会在 applicationContext.xml 当中寻找对就的 bean 。这里通过 action 当中的 path=”/user” 与 applicationContext.xml 中 bean 的 name 相等来进行匹配。
3、 修改 applicationContext.xml 文件。示例如下:
// 这个类是你的具体实现类,用来操作数据库的!当然他也实现了一个接口,这个接口我们会在 Action 当中使用到。
< bean id = "userdao" class = "cn.oyangk.dao.UserDAOImpl" > </ bean >
// 通过此处的 name = "/user" 与上面的 action 进行匹配。这样 spring 就知道我们的请求是转向哪个 action
< bean name = "/user" class = "cn.oyangk.struts.action.UserAction" >
< property name = "userdao" >
< ref bean = "userdao" />
</ property >
</ bean >
4、 现在再来看 UserAction 这个类。
在这里我们只需要定义 UserDAOImpl 这个类的接口,并生成 setter 方法。
具体实现原理及过程:首先当我们提交一个请求到 struts 时, struts 会转发到 spring ,或者说是 spring 截获了我们的请求。然后 spring 根据 path 寻找对应的 action ,将请求转发到相应的 action ,同时实例化一个在此 action 当中设置好了的 dao 对象。此处为 userdao 。此后当我们在 action 类中进行操作时,由于 spring 已经将我们需要的 dao 类实例化好了,我们只需要拿到这个类的引用就可以。那如何拿到这个引用呢?这里就是为什么我们要在 action 定义这个类接口了。 spring 通过接口的 setter 方法使接口能够操作 userdao 了。