欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring整合Struts2的两种方法小结

程序员文章站 2023-12-21 09:25:28
spring提供了一个contextloaderlistener,该监听类实现了servletcontextlistener接口。该类可以作为listener使用,它会在创...

spring提供了一个contextloaderlistener,该监听类实现了servletcontextlistener接口。该类可以作为listener使用,它会在创建时自动查找web-inf/下的applicationcontext.xml文件,因此如果只有一个配置文件且配置文件命名为applicationcontext.xml,则只需在web.xml文件中增加如下配置片段:

<!-- 使用contextloaderlistener初始化spring容器 -->
 <listener>
  <listener-class>org.springframework.web.context.contextloaderlistener
  </listener-class>
 </listener>

如果有多个配置文件需要载入,则考虑使用<context-param.../>元素确定配置文件的文件名。,contextloaderlistener加载时,会查找名为contextconfiglocation的初始化参数,因此配置<context-param.../>时应指定参数名为contextconfiglocation。

<?xml version="1.0" encoding="gbk"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
 xsi:schemalocation="http://java.sun.com/xml/ns/javaee
 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
 <context-param>
  <param-name> contectconfiglocation </param-name>
  <param-value>/web-inf/daocontext.xml,/web-inf/applicationcotext.xml
  </param-value>
 </context-param>
 <!-- 使用contextloaderlistener初始化spring容器 -->
 <listener>
  <listener-class>org.springframework.web.context.contextloaderlistener
  </listener-class>
 </listener> 
</web-app>

spring根据配置文件创建webapplicationcontext对象,并将其保存在web应用的servletcontext中。如果要获取应用中的applicationcontext实例,则可以根据

如下获取:

webapplicationcontext ctx=webapplicationcontextutils.getwebapplicationcontext(servletcontext)

让spring管理控制器

当struts2将请求转发给指定的action时,struts2中的该action只是一个傀儡,他只是一个代号,并没有指定实际的实现类,当然也不可能创建action实例,二隐藏在该action下的是spring容器中的action实例,他才是真正处理用户请求的控制器。

其中struts2只是一个伪控制器,这个伪控制器的功能实际由spring容器中的控制器来完成,这就实现了让核心控制器调用spring容器中的action来处理用户请求。在这种策略下,处理用户请求的action由spring插件负责创建,但spring插件创建action实例时。并不是利用配置action时指定的class属性来创建该action实例,而是从spring容器中取出对应的bean实例完成创建。

web.xml

<?xml version="1.0" encoding="gbk"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
 xsi:schemalocation="http://java.sun.com/xml/ns/javaee
 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
 <!-- 使用contextloaderlistener初始化spring容器 -->
 <listener>
  <listener-class>org.springframework.web.context.contextloaderlistener
  </listener-class>
 </listener>
 <!-- 定义struts 2的filterdispathcer的filter -->
 <filter>
  <filter-name>struts2</filter-name>
  <filter-class>org.apache.struts2.dispatcher.ng.filter.strutsprepareandexecutefilter</filter-class>
 </filter>
 <!-- filterdispatcher用来初始化struts 2并且处理所有的web请求。 -->
 <filter-mapping>
  <filter-name>struts2</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>
</web-app>

applicationcontext.xml

<?xml version="1.0" encoding="gbk"?>
<!-- spring配置文件的根元素,使用spring-beans-3.0.xsd语义约束 -->
<beans xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
 xmlns="http://www.springframework.org/schema/beans"
 xsi:schemalocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
 <!-- 定义一个业务逻辑组件,实现类为myserviceimp -->
 <bean id="myservice" 
  class="com.bh.service.impl.myserviceimpl"/>
 <!-- 让spring管理的action实例,因为每个action里包含请求的状态信息,所以必须配置scope不能为单例 -->
 <bean id="loginaction" class="com.bh.action.loginaction"
  scope="prototype">
  <!-- 依赖注入业务逻辑组件 -->
  <property name="ms" ref="myservice"/>
 </bean>
</beans>

struts.xml

<?xml version="1.0" encoding="gbk"?>
<!-- 指定struts 2配置文件的dtd信息 -->
<!doctype struts public
 "-//apache software foundation//dtd struts configuration 2.1.7//en"
 "http://struts.apache.org/dtds/struts-2.1.7.dtd">
<!-- struts 2配置文件的根元素 -->
<struts>
 <!-- 配置了系列常量 -->
 <constant name="struts.i18n.encoding" value="gbk"/> 
 <constant name="struts.devmode" value="true"/> 
 <package name="lee" extends="struts-default">
  <!-- 定义处理用户请求的action,该action的class属性不是实际处理类
   , 而是spring容器中的bean实例-->
  <action name="loginpro" class="loginaction">
   <!-- 为两个逻辑视图配置视图页面 -->
   <result name="error">/web-inf/content/error.jsp</result>
   <result name="success">/web-inf/content/welcome.jsp</result>
  </action>
  <!-- 让用户直接访问该应用时列出所有视图页面 -->
  <action name="*">
   <result>/web-inf/content/{1}.jsp</result>
  </action>
 </package>
</struts>

使用自动装配

通过设置struts.objectfactory.spring.autowire常量可以改变spring插件额自动装配策略,该常量可以接受如下几个值:

name:根据属性名自动装配。spring插件会查找容器中全部bean,找到其中id属性与action所需的业务逻辑组件同名的bean,将该bean实例注入到action实例。

type:根据属性类型自动装配。spring插件会查找容器中全部bean,找出其类型恰好与action所需的业务逻辑组件相同的bean,将该bean实例注入到action实例。

auto:spring插件会自动检测需要使用哪种自动装配方式。

constructor:与type类似,区别是constructor使用构造器来构造注入的所需参数而不是使用设值注入方式。

web.xml

<?xml version="1.0" encoding="gbk"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
 xsi:schemalocation="http://java.sun.com/xml/ns/javaee
 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
  <listener>
  <listener-class>org.springframework.web.context.contextloaderlistener
  </listener-class>
 </listener>
  <filter>
  <filter-name>struts2</filter-name>
  <filter-class>org.apache.struts2.dispatcher.ng.filter.strutsprepareandexecutefilter</filter-class>
 </filter>
 <filter-mapping>
  <filter-name>struts2</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>
</web-app>

applicationcontext.xml

<?xml version="1.0" encoding="gbk"?>
<!-- spring配置文件的根元素,使用spring-beans-3.0.xsd语义约束 -->
<beans xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
 xmlns="http://www.springframework.org/schema/beans"
 xsi:schemalocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
 <!-- 定义一个业务逻辑组件,实现类为myserviceimp -->
 <bean id="ms" class="com.bh.service.impl.myserviceimpl"/>
</beans>

struts.xml

<?xml version="1.0" encoding="gbk"?>
<!-- 指定struts 2配置文件的dtd信息 -->
<!doctype struts public
 "-//apache software foundation//dtd struts configuration 2.1.7//en"
 "http://struts.apache.org/dtds/struts-2.1.7.dtd">
<!-- struts 2配置文件的根元素 -->
<struts>
 <!-- 配置了系列常量 -->
 <constant name="struts.i18n.encoding" value="gbk"/> 
 <constant name="struts.devmode" value="true"/>
 <package name="lee" extends="struts-default">
  <!-- 定义处理用户请求的action -->
  <action name="loginpro"
   class="com.bh.action.loginaction">
   <!-- 为两个逻辑视图配置视图页面 -->
   <result name="error">/web-inf/content/error.jsp</result>
   <result name="success">/web-inf/content/welcome.jsp</result>
  </action>
  <!-- 让用户直接访问该应用时列出所有视图页面 -->
  <action name="*">
   <result>/web-inf/content/{1}.jsp</result>
  </action>
 </package>
</struts>

以上这篇spring整合struts2的两种方法小结就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

上一篇:

下一篇: