Struts2-Action

Action类的三种实现方式

1.POJO的实现方式

优点:无耦合 缺点:东西都要自己实现

在Struts2中,Action可以不继承特殊的类或不实现任何特殊的接口,仅仅是一个POJO。POJO全称是Plain Ordinary Java Object(简单的Java对象),只要具有一部分getter/setter方法的类就可以称作POJO。一般在这个POJO类中,要有一个公共的无参的构造方法(采用默认的构造方法就可以)和一个execute()方法。execute()方法是Action类默认请求请求处理方法。

public String execute() throws Exception{
  return "success";
}

execute()方法的要求如下:

  • 方法的权限修饰符为public
  • 返回一个字符串,就是指示的下一个页面的Result
  • 方法没有参数

满足上述要求的POJO都可算作是Struts2的Action实现,但在实际开发中,通常会让开发者自己编写Action类实现Action接口或者继承ActionSupport类。

2.实现Action接口

当Action类处理用户请求成功后,有人喜欢返回welcome字符串,有人喜欢返回success字符串,如此将不利于项目的统一管理。问了让用户开发的Action类更规范,Struts2提供一个Action接口,用户在实现Action控制类时,可以实现Struts2提供的这个Action接口。Action接口中的具体代码如下所示:

public interface Action {

    public static final String SUCCESS = "success";
    public static final String NONE = "none";
    public static final String ERROR = "error";
    public static final String INPUT = "input";
    public static final String LOGIN = "login";

    public String execute() throws Exception;

}

3.继承ActionSupport类(推荐)

有表单校验,错误信息设置,读取国际化信息这三个功能

由于Action接口简单,为开发者提供的帮助较小,所以在实际开发过程中,Action类很少直接实现Action接口,通常都是继承ActionSupport类。

public class HelloWorldAction extends ActionSupport{

    @Override
    public String execute() throws Exception{
        return super.execute();
    }
}

ActionSupport类本身实现了Action接口,还实现了一堆其他的接口,来为用户提供更多的功能。

ActionSupport类中提供了许多默认方法。实际上ActionSupport类是Struts2默认的Action处理类。

由于自定义的Action类继承了ActionSupport类,因此必须定义一个变量serialVersionUID。这是因为ActionSupport类实现了Serialzable接口,任何实现了Serialzable接口的类都必须声明变量serialVersionUID。

Action处理请求参数

属性驱动

第一种方式,与基本数据类型的属性对应

在Struts2中,可以直接在Action中定义各种Java基本数据类型的字段,使这些字段与表单数据相对应,并利用这些字段进行数据传递。

public class UserAction{
  private String username;
  private String password;
  //此处省略两个属性的getter和setter方法
}

第二种,直接使用域对象

在基本数据类型字段驱动方式中,若需要传入的数据很多的话,那么Action的属性也会变得很多。再加上属性有对应的getter/setter方法,Action类的代码会很庞大。

把这些东西提取出来,单独作为一个域对象,这个对象就是用来封装这些数据的,在相应的Action里直接使用这个对象,而且可以在多个Action里使用。

public class User{
  private String username;
  private String password;
  //两个字段的get和set方法...
}
public class UserLoginAction extends ActionSupport{
  private User user;
  //user的get和set方法
}

在使用域对象的属性驱动方式传值时,如果JSP页面是负责取值的,那么取值的格式必须为“对象.属性名”;如果JSP页面是负责传值的,那么传值的格式可以为“模型对象名.属性名”,也可以直接是“属性名”。

缺点:在页面上使用了OGNL表达式,页面不通用了,离开了Struts2框架后就不能用了

模型驱动(在开发中应用比较多)

1.让action类实现ModelDriven接口

2.重写getModel方法

3.在action中实例化一个model对象,让getModel方法返回这个对象

public class LoginAction extends ActionSupport implements ModelDriven<User>{
  private User user=new User();
  public User getModel(){
    return user;
  }
}

自定义拦截器栈

需要实现Interceptor接口。然而在实际开发中,更常用的方式是继承抽象拦截器类AbstractInterceptor。该类实现了Interceptor接口,并提供了init()方法和destroy()方法的空实现。到时候只需要实现Interceptor()方法就可以了。

标签库

Struts标签库被定义在struts-tags.tld文件中,可以在struts-core-2.3.24.jar中的META-INF目录下找到它。要使用struts2的标签库,一般只需在JSP文件使用taglib指定导入即可。

<%@tablib prefix="s" uri="/struts-tags"%>

iterator标签

<s:iterator var="name" value="{'java',"javaweb"}">

</s:iterator>

value指定迭代的数组或集合对象

var指定了元素集合的id

property标签

<s:property value=""/>

value指定需要输出的属性值,如果没有指定该属性,则默认输出ValueStack栈顶的值。

<s:debug>标签用于在调试程序时输出更多的调试信息,主要输出ValueStack和StackContext中的信息。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值