zoukankan      html  css  js  c++  java
  • Struts2学习笔记

    1.关于Struts2中的struts.xml文件中action设置

             <!-- 它是一个通用action,此处的*表明它可以处理任意的请求-->
             <action name="*" >                                                      <!-- 此处的{1}代表前面第一个星号所匹配的字串 -->
                 <result name="success">/WEB-INF/content/{1}.jsp</result>            <!--跳转到*(所代表的任意字符)号页面-->    
             </action>
                 
             <!-- 它是一个匹配*Action*的action-->
             <action name="*Action*" >                                               <!-- 此处的{1}代表前面第一个星号所匹配的字串 -->
                 <result name="success">/WEB-INF/content/{1}_{2}.jsp</result>        <!--跳转匹配*Action*的页面-->
             <!--例如,输入/test/abcActionxyz跳转页面为/test//WEB-INF/content/abc_xyz.jsp -->
             </action>

                                            <!-- 该action负责处理loginPro的请求,                                         指定method,则由method的方法处理,                                         没有指定method,由LoginProAction的execute()方法处理 -->       <action name="loginPro"       class="org...XX.action.LoginproAction"       method="xyz"></action>

    2.安装Struts2的

      (1)拷JAR包。appstruts2-blank.warWEB-INFlib下的所有JAR包;

      (2)修改web.xml文件an。加载Struts 2的核心Filter;

      (3)在classes目录下增加一个Struts 2的配置文件:struts.xml(struts2-blank.war下的struts.xml拷入即可);

    3.Struts2的开发步骤:

      (1)先定义一个能发送请求的页面:

          可以是超链接,也可以是表单;(个别情况下用户可以直接以GET方法发送请求)

      (2)开发Action类(Action的三个要求):

          Struts2 对Action并没有过多的要求,只要求:

          A. 推荐实现Action接口,或继承ActionSupport类;

            ActionSupport实现了Action接口,它增加了一些类型转换支持、输入校验支持等功能。

            而且它实现execute()方法,该方法直接返回SUCCESS;

          B. 为每个请求参数都提供Field,并为之提供相应的setter和getter方法;

            为需要传到页面的处理结果也定义Field,并提供对应的setter和getter方法。

            Struts2不会区分Action里的哪个Field用于封装请求参数,哪个Field用于封装处理结果。

            对系统而言,封装请求参数的Field和封装处理结果的Field完全平等;

          C. 该Action类应该有无参数的构造器(默认为execute)

          D. 返回值必须是String;

          E. (重复强调)Action的处理方法不能有形参声明;

       (3) 配置Action

          所有的Action都要放在Package里配置;

          <action.../>元素通常有如下常用属性:

          -name:指定该Action处理哪个请求;

          -class:制定该Action对应的处理类;

          -method:指定使用Action的哪个方法来处理用户请求,默认值为execute();

         并为处理返回的字符串,指定相应的物理视图<result name="">"/*.jsp"</result>

        /************************************

          Action接口与ActionSupport

          Action接口中定义了5个字符串常量(ERROR"error",INPUT"input",LOGIN"login",NONE"none",SUCCESS"success"),

          和一个execute()抽象方法;

        ************************************/

    4.Struts2详细运行机制:

      (1)浏览器发送请求:abc.action(-action后缀可以保留,也可以省略);

      (2)浏览器发送的请求,首先被StrutsPrepareAndExecuteFilter拦截

        --因为我们在web.xml中指定StrutsPrepareAndExecuteFilter来过滤所有的用户请求;

      (3)StrutsPrepareAndExecuteFilter会去创建Action实例;

          例如(简介):我们请求abc.action,StrutsPrepareAndExecuteFilter会搜索struts.xml文件中name为abc的Action配置,

          根据class属性,“使用反射”来创建Action实例;

          例如(详解):

          //假如该Filter收到abc.action的请求,通过解析struts.xml获取类名

          String clazzProp="MyAction";

          //反射:通过类名为参数反射,获取Action类对应的Class对象

          Class actionClazz=Class.forName(clazzProp);

          //用反射创建了Action的实例(要求Action类有无参数构造器

          Object actionInst=actionClazz.newInstance();

      (4)调用

          Map<String,String> paramMap=request.getParameterMap() //返回所有的请求参数;

          使用循环(String paramName:em)

          {

          //得到请求参数名对应的setter方法

          Action类.getMethod("set"+paraName的首字母大写);

          Method setter=actionClazz.getMethod("set"+paramName.substring(0,1).toUpperCase()

                  +paramName.substring(1),String.class);

          //得到请求参数对应的值

          String paramValue=paramMap.get(paramName);

          //以Action实例为调用者,调用setter方法,把请求参数值作为参数值传入

          setter.invoke(actionInst,paramVaue);    /*invoke的使用举例与解释:

                                   *String result = (String)method.invoke(obj ,sql);

                                   *执行obj的method方法(参数为sql),返回String类型结果 */

         }

      (5)再次通过反射来调用method属性所指定的方法;

          返回一个字符串;

      (6)根据strut.xml文件中的<result.../>元素的name以及物理视图资源,

          跳转到实际的视图资源;

     ===============如何在action中访问Servlet API===============

    总有些时候,需要访问Servlet API

    比如需要把数据存入session、Application,或添加cookie:response.addCookie()

    Struts2提供了两种方式访问Servlet API:

      伪访问:借助于ActionContext

          ActionContext提供了getSession  -模拟访问Http Session

                    getApplication -模拟访问Appication

      真访问:(比如要添加Cookie):借助于ServletActonContext(需要导入HttpServletResponse包)

          ServletActonContext提供了如下静态方法:

            - static PageContext       getPageContext()
            - static HttpServletRequest   getRequest()
            - static HttpServletResponse   getResponse()
            - static ServletContext      getServletContext()

    =================Struts2常量配置=================

      Struts2常量,也叫Struts2属性,作用:控制整个Struts2的应用特性;

      一个常量名 指定一个常量值,配置方式有3种:

        - 在web.xml中:每个常量要4行:

          <!-- 通过Filter配置初始化参数,就可配置Struts2的常量 -->

          <init-param>

            <param-name>常量名</param-name>

            <param-value>常量值</param-value>

          </init-param>

        - 在struts.xml文件配置(推荐)

          <constant name="常量名" value="常量值"/>  --每行配置一个常量

        - 额外增加一个struts.properties配置文件

          常量名=常量值                 --每行配置一个常量

       /*****************常用常量********************

        <!-- 编码格式 -->
        <constant name="struts.i18n.encoding" value="UTF-8" />
        <!-- 上传文件大小限制设置 -->
        <constant name="struts.multipart.maxSize" value="-1" />
        <!-- 把它设置为开发模式,发布时要设置为false -->
        <constant name="struts.devMode" value="true" />
      
      其他:Struts2常用的constant总结

      ********************************************/

    ==============Struts2包含其他配置文件及包配置=================

    include其他配置文件
      企业开发--模块化开发
      - 开发阶段:每个人都维护自己的配置文件
      - 销售阶段:软件做成模块化:
        <struts>
          <!-- 包含了其他配置文件 -->
          <include file="struts-books.xml"></include>
          <!-- 指定了namespace为/users,以为着该包下面所有的Action都处于/user空间下 -->
          <package name="books" extends="struts-default" namespace="books">
            <action>
              <result>***</result>
            </action>
          </package>
        </struts>

      /****************************

        Struts的配置文件,包括:

        Struts-default.xml  - Struts2的核心包使用该配置文件;

        Struts-plugin.xml   - Struts2的插件包使用该配置文件;

        Struts.xml      - Struts2应用使用该配置文件;

        Struts-abc.xml    - 这种其他的配置文件,必须被include才会加载

      ****************************/
      配置包:
      每个package元素定义了一个包配置。定义package元素时可以指定如下几个属性:
      - name:必填属性,指定该包的名字,该名字是该包被其他包引用的key;
      - extends:可选属性,该属性指定该包继承其他包,继承其他包可以继承其他包中的Action定义、拦截器定义等;
      - namespace:可选属性,定义该包的命名空间;
      - abstract:可选属性,指定该包是否是一个抽象包,抽象包中不能包含Action定义;

    ===================struts2的结果配置===================

      逻辑试图名与物理视图的关系,是通过<result.../>元素来管理
      标准的result格式:
        <result name="" type="">
          <param></param>      //param输入属性元素,例:<param name="location">物理视图的位置</name>
          <param></param>     
          ...
        </result>

        //可以简化为如下(常用):

        <result name="逻辑视图名" type="视图类型">物理视图的位置</result>

      支持如下属性
        - name:指定逻辑视图名;默认是success;
        - type:指定所使用的物理视图模型;
          dispatcher(默认值),相对应的是redirect(重定向)

          ...
          (其他在struts-default.xml文件中的struts-default抽象包中result-type)

    /*********************************
    forward与redirect的区别?
      forward:依然是一次请求,地址栏的URL没有变化,请求参数和请求属性都不会丢失;
      redirect:重新发送一次新请求(就跟直接在地址栏输入新URL,并回车的效果是一样的)
            地址栏的URL会改变,请求参数和请求属性全部都丢失;

    *********************************/

      常见的结果类型:
        chain     - Action处理完用户请求后,转发到下一个Action继续处理。
                 形成链式处理;
        dispatcher   - 默认值
                 转发到JSP页面
        redirect     - 直接"重定向"到新的URL,会生成一次新的请求,原有的请求参数、请求属性都会丢失。
                 与默认的dispatcher对应;
        plainText      - 直接显示视图页面的源代码;
        stream      - 直接生成"二进制"流作为相应;

      全局result与局部result:
        result元素放在action,就是局部result;
        result元素放在global-results,就是全局result;
       尽量少用全局result — 只有在多个Action都具有某个通用性质的result时,才考虑使用全局result;

      动态结果:
         在定义物理视图资源时,可以直接使用OGNL表达式,所以这个物理视图资源可以动态的改变;
         动态方法调用(DMI Dyna Method Invocation)
         用处不是特别大,大致了解就行
        功能:可以在提交请求时,直接提交给Action的指定方法;
         就在页面上指定请求地址为:action名字!方法名
         - 表明将请求提交给指定Action的指定方法处理

  • 相关阅读:
    docker容器中查看容器linux版本
    mac 安装docker
    音视频流处理
    激光雷达
    sick 激光
    Ubuntu 14.04 安装Docker
    W: GPG error: http://ppa.launchpad.net trusty InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 8CF63AD3F06FC659
    rtp发送 h265
    pytorch 环境搭建
    Linux 修改文件夹的用户组权限
  • 原文地址:https://www.cnblogs.com/otio/p/4089606.html
Copyright © 2011-2022 走看看