Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。通俗的说就是页面端将信息提交给Struts,Struts负责将页面提交的数据生成模型,并调用业务层完成本次请求。
1 加载struts2 jar包
在pom.xml中加载struts2.jar包
<!-- struts -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.3.4.1</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.3.4.1</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-convention-plugin</artifactId>
<version>2.3.4.1</version>
</dependency>
在上面的代码中需要注意:
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.3.4.1</version>
</dependency>
<dependency>
要让Spring管理Struts,必须导入上面的jar包。当web容器启动的时候,Struts的Action将会被加入spring上下文中(即使用了@Action注解的类将会统一由Spring管理)。
2 添加struts.xml
在\src\main\resources下添加struts.xml配置文件。
struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 指定由spring负责action对象的创建 -->
<constant name="struts.objectFactory" value="spring" />
<!-- 所有匹配*.action的请求都由struts2处理 -->
<constant name="struts.action.extension" value="action" />
<!-- 是否启用开发模式 -->
<constant name="struts.devMode" value="true" />
<!-- struts配置文件改动后,是否重新加载 -->
<constant name="struts.configuration.xml.reload" value="true" />
<!-- 设置浏览器是否缓存静态内容 -->
<constant name="struts.serve.static.browserCache" value="false" />
<!-- 请求参数的编码方式 -->
<constant name="struts.i18n.encoding" value="utf-8" />
<!-- 每次HTTP请求系统都重新加载资源文件,有助于开发 -->
<constant name="struts.i18n.reload" value="true" />
<!-- 文件上传最大值 -->
<constant name="struts.multipart.maxSize" value="104857600" />
<!-- 让struts2支持动态方法调用 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<!-- Action名称中是否还是用斜线 -->
<constant name="struts.enable.SlashesInActionNames" value="false" />
<!-- 允许标签中使用表达式语法 -->
<constant name="struts.tag.altSyntax" value="true" />
<!-- 对于WebLogic,Orion,OC4J此属性应该设置成true -->
<constant name="struts.dispatcher.parametersWorkaround" value="false" />
<constant name="struts.multipart.saveDir" value="/tmp"/>
<package name="basePackage" extends="struts-default">
</package>
</struts>
3 配置web.xml
在web.xml中加入:
<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>*.action</url-pattern>
</filter-mapping>
表示拦截所有后缀名为action的访问。
4 编写Action类
创建action包,并在此包下创建UserAction类,结构如下图所示。
UserAction类代码如代码清单1所示。
代码清单1:UserAction.java
package ilv.action;
import org.apache.log4j.Logger;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
@ParentPackage("basePackage")
@Namespace("/")
@Action(value="userAction")
public class UserAction {
/**
* Logger for this class
*/
private static final Logger logger = Logger.getLogger(UserAction.class);
public void test() {
logger.info("进入Action");
}
}
注意:
@ParentPackage(“basePackage”),表示将这个Action类加入web.xml中的basePackage命名空间中
@Action(value=”userAction”)表示将这个Action类命名为userAction
@Namespace(“/”)表示这个Action类的访问空间为当前目录
5 测试
删除Tomcat关联项目ilv_ic,重新进行关联,启动Tomcat,在浏览器中输入:
http://localhost:8080/ilv_ic/userAction!test.action
测试test方法,如果打印语句,表示Struts2配置成功。
6 深度整合
(1)修改UserAction代码
//创建用户业务类接口
private UserServiceI userService;
public UserServiceI getUserService() {
return userService;
}
@Autowired
public void setUserService(UserServiceI userService) {
this.userService = userService;
}
@Autowired表示spring自动注入生成的对象,即当调用 UserAction 对象时,Spring会自动生成实现了 UserServiceI 的 UserServiceImpl 对象,并赋值给 userService 变量。
(2)修改test方法
public void test() {
logger.info("进入Action");
//UserServive不需要创建,Autowired将会自动创建对应类对象,
//并赋值给userServive变量
userService.test();
}
重新启动Tomcat,在浏览器中输入:
http://localhost:8080/ilv_ic/userAction!test.action
测试test方法,如果能调用UserServiceImpl对象打印语句,表示Struts2与Spring整合成功。
为了更好的理解整合后的执行机制,可结合下图理解。
当用户在浏览器输入:
http://localhost:8080/ilv_ic/userAction!test.action
表示访问 ilv_ic 应用程序中 UserAction 对象的 test 方法。由于我们配置了Spring和Struts文件,因此使用:
“注解变量” + “!” + “方法” + “.action”
这种规则访问。