(四)Struts2的Action(深入讲解版)
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>