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中的信息。