Struts2的Action
开发者需要提供大量的Action,并在struts.xml中配置Action.Action类里包含了对用户请求的处理逻辑,因为我们也称Action为业务控制器。
一、编写Action处理类
第一种创建处理类方法 :
struts2采用了低侵入式的设计,struts2不要求Action类继承任何的struts基类,也不需要实现任何接口。Action类只是一个普通的POJO(Plain Ordinary Java Object简单的java对象)
第二种:创建一个类实现Action接口,该接口定义了五个字符串常量。还包含一个String execute()方法
public interface Action{
五个字符串常量
public static final String ERROR="errror";
public static final String INPUT="input";
public static final String LOGIN="login";
public static final String NONE="none";
public static final String SUCCESS="success";
//处理用户请求的execute方法
public String execute()throws Exception;
}
第三种:继承Action接口的实现类ActionSupport,该类提供了很多的默认方法,包括获取国际化信息,数据校验的方法等。大大简化了Action的开发。我们开发中选择第三种
二、配置Action
在struts.xml文件中配置。struts2使用包来组织action。所以action定义放在包定义的下面 。
<action.../>
属性
name:action的名字
class:指定该action的实现类,class属性并不是必须的,如果我们不指定class属性,系统默认使用ActionSupport类
配置Action的默认处理类
如果我们不指定<action>中的class属性,默认使用ActionSupport类。
我们可以使用<default-class-ref class=""></default-class-ref>来指定默认的动作处理类。
三、调用Action方法
我们继承的ActionSupport,当我们执行Action的时候,默认执行他的execute方法,现在我们来执行自己的方法。< action >中有一个method属性,可以指定用户调用哪个方法
例子:
我们写一个Action类,类里有四个方法。
public class Hello extends ActionSupport{
public String addUser(){
System.out.println("添加用户");
return SUCCESS;
}
public String updateUser(){
System.out.println("修改用户");
return SUCCESS;
}
public String selectUser(){
System.out.println("查询用户");
return SUCCESS;
}
public String deleteUser(){
System.out.println("删除用户");
return SUCCESS;
}
}
我们在struts.xml中配置我们的action
<package name="demo" extends="struts-default">
<action name="addUser" class="com.cad.struts2.Hello" method="addUser">
<result name="success">/welcome.jsp</result>
<result name="error">/error.jsp</result>
</action>
<action name="updateUser" class="com.cad.struts2.Hello" method="updateUser">
<result name="success">/welcome.jsp</result>
<result name="error">/error.jsp</result>
</action>
<action name="selectUser" class="com.cad.struts2.Hello" method="selectUser">
<result name="success">/welcome.jsp</result>
<result name="error">/error.jsp</result>
</action>
<action name="deleteUser" class="com.cad.struts2.Hello" method="deleteUser">
<result name="success">/welcome.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
在jsp页面中请求action
<body>
<a href="${pageContext.request.contextPath }/addUser">添加用户</a>
<a href="${pageContext.request.contextPath }/updateUser">修改用户</a>
<a href="${pageContext.request.contextPath }/selectUser">查看用户</a>
<a href="${pageContext.request.contextPath }/deleteUser">删除用户</a>
</body>
四、使用通配符
我们发现这种方式写的很多代码类似,相当冗余,为了解决这个问题,struts2提供了通配符的配置方式帮我们解决这个问题。
<package name="demo" extends="struts-default">
<action name="*" class="com.cad.struts2.Hello" method="{1}">
<result name="success">/{1}.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
action的name中可以使用通配符 * , * 可以匹配所有的action, * 的值为传入的action名字,例如传入了addUser.action,那么 * 的值就为addUser。method属性中可以使用表达式来获取 * 的值,{第几个*}
例如 ” * _ * “,我们传递add_User,那么{1}的值就是add,{2}的值就是User。
五、动态方法调用
(1)使用动态调用前要先将动态调用的常量更改成true,动态调用默认是false,因为不安全。
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
(2)我们配置struts.xml文件 ,不写method值,也不用通配符
<package name="demo" extends="struts-default">
<action name="user" class="com.cad.struts2.Hello" >
<result name="success">/welcome.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
(3)我们更改jsp页面按照动态方法调用的格式,就可以调用相关的方法。
<body>
<a href="${pageContext.request.contextPath }/user!addUser">添加用户</a>
<a href="${pageContext.request.contextPath }/user!updateUser">修改用户</a>
<a href="${pageContext.request.contextPath }/user!selectUser">查看用户</a>
<a href="${pageContext.request.contextPath }/user!deleteUser">删除用户</a>
</body>