Struts2中的Action

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 ERROR = "error"; 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>
上面通过<param>节点为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方法。
















  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值