Action

来源:互联网 发布:描绘网络的 电影 编辑:程序博客网 时间:2024/06/10 16:13

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方法。

0 0