struts2的控制组件类型:
核心控制器:过滤器(Struts2提供的一个过滤器,由web.xml的filter和filter-mapping元素来设置)
业务逻辑控制器:Action
创建业务逻辑控制器步骤:
创建Action类
创建struts.xml配置包、动作等内容
创建Action类
创建Action类方法:
- POJO
- 实现Action接口
- 扩展ActionSupport类(扩展ActionSupport类,可以使我们创建的Action更简单、更规范)
扩展ActionSupport类创建动作类语法
- 扩展ActionSupport类
- 根据需保存的数据声明成员变量
- 定义对应传入参数的属性的setter和getter方法。
- 动作类通过属性的setter方法获取客户端传来的数据,并保存在动作类成员变量中,客户端则通过属性的getter方法获取动作类的数据
- 动作被访问后默认执行execute()方法:
public String execute() throws Exception - 按照execute()的语法规范创建其他action业务方法。
- 动作处理客户端请求后会返回一个字符串,这个字符串称为逻辑视图
- 当动作类继承了ActionSupport后,通常使用以下一些常量作为动作执行后的返回值: INPUT 、SUCCESS、LOGIN、NONE和ERROR
**ERROR:**表示动作类执行失败
**SUCCESS:**表示动作类执行成功,并将由相关的视图页面显示结果
**LOGIN:**表示需要先登录才可以执行动作
**INPUT:**表示需要输入全部数据才能执行动作或数据输入无效需重新输入
**NONE:**表示动作类执行成功,但不显示任何页面
在struts.xml中配置包和动作
配置包:使用package标记,可以包含多个动作,常用属性如下:
name:定义包的名字,唯一性
namespace:定义包的运行路径,防止动作名冲突
extends:配置继承的父包
例如:
<package name="lab" namespace="/hello" extends="struts-default">
……
</package>
定义动作:使用action标记,在动作标记内包含定义结果、拦截器引用、异常等内容的子标记,常用属性如下:
name:指定客户端发送请求的地址映射名称
class:指定进行业务逻辑处理的动作类全限定性名称
method:指定动作类中进行业务处理的具体方法名称
<action name="userAction" class="com.sise.UserAction" method="addUser">
……
</action>
定义动作结果:使用result标记,可以在一个标记对中使用一个或多个result标记为动作指定一个或多个结果映射,常用属性如下:
name:指定结果的逻辑视图名字,默认值为“success”
type:指定结果类型,默认值为“dispatcher”
<action name="userAction" class="com.sise.UserAction" method="addUser">
<result name="input">/input.jsp</result>
<result name="success"
type="redirect">/admin.jsp</reslut>
</action>
常用结果类型:
- dispatcher:默认结果类型,将请求转发给视图页面。使用的视图技术是JSP。
- redirect:重定向到其他视图页面或动作,参数不能传递
- redirectAction:动作转向结果类型,表示将访问转到其他动作,参数不能传递
- chain:动作链结果类型,表示请求将转到一系列的其他动作进行处理,参数不能传递
Action处理请求参数方法:
属性驱动:通过属性进行数据传递。
-属性为基本数据类型
-属性为域对象
模型驱动:通过Action实现ModelDriven接口来接
收请求参数。
1.属性为基本数据类型:
语法:
-请求参数为基本数据类型。
-Action类中声明存储客户端参数的变量。
-在Action类中定义与客户端参数名以及类型一致的属性的setter和getter方法。
2.属性为域对象
语法:
-创建域对象类,其中属性为基本数据类型。
-Action类中声明存储域对象的变量。
-在Action类中定义与域对象类型和名字一致的属性的setter和getter方法。
-请求参数格式为:域对象.基本数据类型属性。
3.模型驱动处理请求参数
语法:
-客户端参数是基本数据类型。
-创建域对象类,其中属性名字及类型和客户端参数一致。
-Action类实现ModelDriven接口,实例化域对象,并重写getModel()方法返回域对象。
执行动作中不同的方法
1.使用通配符*号。通过在struts.xml中对动作名使用通配符可以在不同请求情况下执行不同动作方法。例如:
<package name="methodDemo" namespace="/user" extends="struts-default">
<action name="*Action" method="{1}" class=“…" >
<result name=“...”>/insertUser.jsp</result>
<result name=“...”>/editUser.jsp</result>
<allowed-methods>insertUser,editUser</allowed-methods>
</action>
2.动态方法调用(DMI),格式:在URL中使用:动作名!方法名.action来调用动作的不同处理方法。例如:
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
<package name=“MethodDemo" namespace="/user" extends="struts-default">
<action name=“userAction" class=“…" >
<result name=“...”>/insertUser.jsp</result>
<result name=“...”>/editUser.jsp</result>
<allowed-methods>insertUser,editUser</allowed-method>
</action>
</package>
Action访问Servlet API
常用方式:
-使用ActionContext类来访问
-使用ServletActionContext类来访问
-通过实现xxxAware接口访问
示例:
https://download.csdn.net/download/weixin_43906969/13203846
pom.xml导入的依赖:
<dependencies>
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
<version>7.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.ow2.asm/asm-commons -->
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm-commons</artifactId>
<version>7.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.ow2.asm/asm-tree -->
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm-tree</artifactId>
<version>7.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.javassist/javassist -->
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.20.0-GA</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.12.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/ognl/ognl -->
<dependency>
<groupId>ognl</groupId>
<artifactId>ognl</artifactId>
<version>3.1.26</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.struts/struts2-core -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.5.22</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>