zoukankan      html  css  js  c++  java
  • Struts2 -action处理业务请求

    struts2与mvc

                       view层:应用程序输出页面或者界面:jsp、html等

                      controller层   :Struts2 :1、核心控制器strutsPrepareAndExecuteFiler(通过web.xml配置)

                        2、业务控制器(action)

                       model层:应用程序的业务逻辑和业务数据,由封装数据的和处理业务的javabase组成

    Action的作用

                       1、控制业务逻辑:如果业务逻辑很复杂,可以把业务逻辑构建为业务类,在Action中调用业务类

          2、返回结果字符集

          3、方便的处理数据:比如在Action中以属性方法接受用户数据

              Action接受参数的方式一:属性方式(参数字段不是少的时候应用)

    <struts>
        <!-- 设置开发者模式 -->
        <constant name="struts.devMode" value="true"></constant>
        <!-- 设置 struts2编码格式-->
        <constant name="struts.i18n.encoding" value="UTF-8"></constant>
        <package name="default" namespace="/" extends="struts-default">
            <action name="hello" class="action.HelloAction">
                <result>/hello.jsp</result>
            </action>
        </package>
    </struts>

                          taglib标签库

                         <%@taglib uri="/struts-tags" prefix="s" %>     引用<s:property value="属性名">   表示引用Action类属性的值

               Action接受参数的方式二:JavaBase方式,将模型数据从Action中分离了出来,使Action结构更加清晰

                          1、定义实体类并,为实体添加属性和setter及getter方法

            2、为Action类添加实体属性和setter及getter方法。例如 private User user;

            3、修改表单参数name为实体对象名.属性名 。例如:name=“user.username”

            4、取值通过<s:property name="实体对象名.属性名"/>的方式。

        Action接受参数的方式三:ModeDriven方法(较少用)

                           1、定义实体类并,为实体添加属性和setter及getter方法

            2、创建Action类,实现ModelDriven接口,重写getModel()方法,该方法返回值为实体属性。例如  public User getModel() return user

            3、为Action类添加JavaBase类型属性,并需要实例化,不需要setter及getter方法。例如 private User user=new User();

            4、form表单项的name属性,以及页面的取值时通过<s:property value="属性名"/>方式,

                   ModeDriven与前2者区别(三种方式可以混合使用):

                相同点:与JavaBase方式定义Action属性的方式类似,与属性方式在jsp页面中的方式相同。

                不同点:ModeDriven方式一个Action对应一个Model用于接受参数。而JavaBase方式一个Action可以对应多个Model

                                                ModeDriven方法与属性方式同时存在Action时,对于相同的属性,ModeDriven方式优先被赋值。

       在<action>标签中使用method属性调用Action中的指定业务方法

           访问Action时,默认调用的execute方法,可以在Action中定义多个业务方法,方法签名要和public String execute()相同,例如 public String add()

                        可以使用method属性配置指定调用的方法,例如<action method=“add”/〉

           一个Action可以配置多个<action>来对应Action中的多个方法,使用不同的name属性值和method属性值配置

              例如

    <struts>
        <!-- 设置开发者模式 -->
        <constant name="struts.devMode" value="true"></constant>
        <!-- 设置 struts2编码格式-->
        <constant name="struts.i18n.encoding" value="UTF-8"></constant>
        <package name="default" namespace="/" extends="struts-default">
            <!-- 配置多个action对应一个Action中的多个方法 -->
            <action name="hello" class="action.HelloAction" method="execute">
                <result>/hello.jsp</result>
            </action>
            <action name="hello2" class="action.HelloAction" method="add">
                <result>/success.jsp</result>
            </action>
            <action name="hello3" class="action.HelloAction" method="updata">
                <result>/success2.jsp</result>
            </action>
        </package>
    </struts>  

            〈include〉标签:需要配置的〈action〉过多时,可以使用〈include〉标签按照模块包含多个xml配置文件

                                  使struts.xml结构清晰直观,减少各个模块内容的互相干扰,各司其职。

                                 1、按照模块在不同的xml中配置〈action〉

                 例如  struts_user.XML:

                        <package.....> <action....></action> </package>

              2、在struts.xml中使用〈include〉标签包含多个xml文件

                 例如:struts.xml:

                       <include file="struts_user.xml" />

       动态方法调用 :   在Action中调用指定业务方法 (有安全隐患,会暴露一些方法给用户) 

          1、只需要配置一个<action>标签,也不需要使用method属性

          2、调用时指出Action名和指定方法: 

            例如  在form的action=“actionname!methodname”  

              <!-- 设置 禁用动态方法调用 -->

                  <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>

       使用通配符简化〈action〉配置

             用*号匹配到内容替换对应的大括号位置上的内容,一般使用1个*号

    <!-- 使用通配符配置action -->
            <action name="*_*" class="action.{1}Action" method="{1}">
                <result>/{1}_{2}.jsp</result>
            </action>
    <!--等价于-->
          <action name="user_add" class="action.userAction" method="{add}">
                <result>/user_add.jsp</result>
            </action>

                         当有多action 匹配时的顺序  :1、优先使用完全匹配,其次才使用通配符。

           当有多个通配符匹配时:1、优先写在前面的通配符    

           默认Action:当访问的Action找不到的时候,会访问默认Action

          <default-action-ref  name="user" />     ----表示找不到Action时,访问名为user的Action

          <action name="user">  <result>/index.jsp</result></action>

         

  • 相关阅读:
    简明Python3教程 12.问题解决
    简明Python3教程 11.数据结构
    【SPOJ 694】Distinct Substrings
    【codeforces Manthan, Codefest 17 C】Helga Hufflepuff's Cup
    【CF Manthan, Codefest 17 B】Marvolo Gaunt's Ring
    【CF Manthan, Codefest 17 A】Tom Riddle's Diary
    【SPOJ 220】 PHRASES
    【POJ 3261】Milk Patterns
    【POJ 3294】Life Forms
    【POJ 1226】Substrings
  • 原文地址:https://www.cnblogs.com/hjiongjiong/p/4540779.html
Copyright © 2011-2022 走看看