(四)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> 

  

  

  

 

posted @ 2018-08-08 20:49  跃小云  阅读(682)  评论(0编辑  收藏  举报