Struts2的Action
为方便起见,struts2中也为我们提供了一个基本的Action父类—-ActionSupport。
struts2不要求我们自己设计的Action类继承任何的struts基类或struts接口,但是我们为了方便实现我们自己的action,大多数情况下都会继承ActionSupport类,并重写此类里的public String execute() throws Exception方法。因为此类中实现了很多的实用借口,提供了很多默认方法,这些默认方法包括国际化信息的方法、默认的处理用户请求的方法等,这样可以大大的简化Acion的开发。
Action接口与ActionSupport类的区别
Action接口有:
public static final Java.lang.String SUCCESS =”success”;
public static final java.lang.String NONE = “none”;
public static final java.lang.String INPUT = “input”;
public static final java.lang.String LOGIN = “login”;
public abstract java.lang.String execute() throws java.lang.Exception;
而Actionsupport这个工具类在实现了Action接口的基础上还定义了一个validate()方法,重写该方法,它会在execute()方法之前执行,如校验失败,会转入input处,必须在配置该Action时配置input属性。 另外,Actionsupport还提供了一个getText(String key)方法还实现国际化,该方法从资源文件上获取国际化信息.
Action配置中的各项默认值
<action name=“login" class=“com.lovo.aciton.LoginAction" method="execute" >
<result name="success">/hello.jsp</result>
</action>
如果没有为action指定class,默认是ActionSupport。
如果没有指定result的name属性,默认值为success。
如果没有为action指定method,默认执行action中的execute() 方法。
Action通配符配置方式
<action name="user_*" class="com.lovo.action.UserAction" method="{1}“ >
<result name="success"></result>
<result name="input">/addUser.jsp</result>
</action>
UserAction中有以下两个处理方法:
public String add() throws Exception{
}
public String update() throws Exception{
}
Jsp中如果请求提交项是:user_add.action那就执行add();
如果是user_update.action那就执行update()
动态请求Action方法
第一种方式:指定method属性;
第二种方式:通配符方式(官网推荐使用);
第三种方式:感叹号方式(官网不推荐使用) 用这种方式需要先开启一个开关
<constant name=“struts.enable.DynamicMethodInvocation” value=“true” />
请求url形如:
/工程名/action配置name!Action方法名.action
Action中result的各种转发类型
<action name=“login" class=“com.lovo.aciton.LoginAction" method="execute" >
<result name="success">/hello.jsp</result>
</action>
struts2中提供了多种结果类型,常用的类型有: dispatcher(默认值)、 redirect 、 redirectAction 、 plainText
下面是redirectAction 结果类型的例子,如果重定向的action在同一个包下:
<result type="redirectAction">helloworld</result>
如果重定向的action在别的命名空间下:
<result type="redirectAction">
<param name="actionName">helloworld</param>
<param name="namespace">
/包的namespace
</param>
</result>
plainText:显示原始文件内容,例如:当我们需要原样显示jsp文件源代码 的时候,我们可以使用此类型。
<result name="source" type="plainText ">
<param name="location">/xxx.jsp</param>
<param name="charSet">UTF-8</param><!-- 指定读取文件的编码 -->
</result>
多个Action共享全局result配置
当多个action中都使用到了相同视图,这时我们应该把result定义为全局视图。struts1中提供了全局forward,struts2中也提供了相似功能:
<package ……>
<global-results>
<result name="message">/message.jsp</result>
</global-results>
</package>
配置时为Action的属性注入值
Struts2为Action中的属性提供了依赖注入功能,在struts2的配置文件中,我们可以很方便地为Action中的属性注入值。注意:属性必须提供setter方法。
public class HelloWorldAction{
private String savePath;
public String getSavePath() {
return savePath;
}
public void setSavePath(String savePath) {
this.savePath = savePath;
}
}
<package name="itcast" namespace="/test" extends="struts-default">
<action name="helloworld" class="cn.itcast.action.HelloWorldAction" >
<param name="savePath">/images</param>
<result name="success">/hello.jsp</result>
</action>
</package>
上面通过节点为action的savePath属性注入“/images”
指定需要Struts 2处理的请求后缀
前面我们都是默认使用.action后缀访问Action。其实默认后缀是可以通过常量”struts.action.extension“进行修改的,例如:我们可以配置Struts 2只处理以.do为后缀的请求路径:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.action.extension" value="do"/>
</struts>
如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。如:
<constant name="struts.action.extension" value="do,Go"/>
Action中如何操作作用域对象
方法一:通过Action实现下面三个接口
RequestAware可以得到一个Map形式的request
SessionAware可以得到一个Map形式的Session
ServletRequestAware可以得到一个真正的HttpServletRequest对象
Action中如何操作作用域对象
方法二:
使用ActionContext对象
在业务方法中添加如下代码:
ActionContext ctx = ActionContext.getContext();
ctx.getApplication().put("app", "应用范围");//往ServletContext里放入app
ctx.getSession().put("ses", "session范围");//往session里放入ses
ctx.put("req", "request范围");//往request里放入req
方法三:
使用ServletActionContext对象
在业务方法中添加如下代码:
HttpServletRequest request=ServletActionContext.getRequest();
ServletContext servletContext = ServletActionContext.getServletContext();
HttpServletResponse response = ServletActionContext.getResponse();
Struts2之装载表单提交数据
Struts2装载表单数据有两种方式:
1、Field-Driven(属性驱动)
2、Model-Driven(模型驱动)
之前我们都采用的第一种方式,即在Action中书写属性,并提供相应的get/set方法。
注意:
1、如果属性是简单数据类型(如:基本数据类型、字符串、日期等),提交项的名称与对应属性名保持一致;
2、如果属性是Bean对象类型,那么提交项的名称应为Bean对象名称.属性名。
Model-Driven(模型驱动)
ModelDriven主要用于在Action直接封装Bean对象(与属性驱动的第二个用途一样)。
实现方式:Action需要实现ModelDriven接口,重写getModel方法。