zoukankan      html  css  js  c++  java
  • Struts2入门介绍(二)

    一、Struts执行过程的分析。

      当我们在浏览器中输入了网址http://127.0.0.1:8080/Struts2_01/hello.action的时候,Struts2做了如下过程:

      1、Struts2首先使用过滤器,拦截我们的URL请求,以下的过程全部在过滤器中进行。

      2、获得请求的路径,然后截取Action的名字,本示例中会截取字符串"hello"。

      3、在src目录下找到struts.xml文件,使用dom4j解析该文件,得到里面的数据。

      4、用字符串"hello"去struts.xml文件中匹配action标签中的name值。

      5、匹配到了action中的name值,然后去查找该action标签中的class属性,得到该action的全路径。

      6、使用反射方法调用该action中的hello方法,反射代码如下。

                Class calzz = Class.forName("com.jack.action.HelloAction1");
                Method m = calzz.getMethod("hello",String.class);
                m.invoke(calzz.newInstance());

      7、得到action的返回值。然后去action的result标签中匹配name属性的值。

      8、匹配成功后,跳转到result标签中的配置的路径中去。

    二、Struts2常量的配置

      1、如何查看struts2的常量有哪些

        (1)在struts2-core-2.3.24.jar包下面有一个default.propreties文件,该文件中保存了所有的常量

          

      2、Struts2的常量配置有三种方式

      1、在struts.xml的<struts></struts>标签中配置

      <!-- 
                constant标签用来配置常量
                name属性的值:default.properties文件中的常量名称。
                value属性的值:要配置的常量的值
             -->
            <constant name="struts.i18n.encoding" value="UTF-8"></constant>

      2、在src下面创建struts.properties文件,在里面进行配置

    # struts.locale=en_US
    struts.i18n.encoding=UTF-8
    
    ### valid values are: name, type, auto, and constructor (name is the default)
    struts.objectFactory.spring.autoWire = name
    
    struts.objectFactory.spring.useClassCache = true
    
    struts.objectFactory.spring.autoWire.alwaysRespect = false
    
    struts.objectFactory.spring.enableAopSupport = false
    
    struts.multipart.parser=jakarta
    struts.multipart.saveDir=
    struts.multipart.maxSize=2097152

      3、在web.xml中进行配置 

     <filter>
          <filter-name>struts2</filter-name>
          <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
            <init-param>
                <param-name>struts.i18n.encoding</param-name>
                <param-value>UTF-8</param-value>
            </init-param>
      </filter>

    三、分模块开发

      当一个项目有多人进行开发时,可以每个人都写一个配置文件,然后通过引入的方式,将其引入struts.xml文件中。

      (1)在Action包下面建一个hello.xml文件写入配置    

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- 引入dtd约束 -->
       <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
        
        <struts>
            <!-- 
                constant标签用来配置常量
                name属性的值:default.properties文件中的常量名称。
                value属性的值:要配置的常量的值
             -->
            <constant name="struts.i18n.encoding" value="UTF-8"></constant>
            <!-- 
                配置package标签:该标签类似于Java中的包,Struts标签中可以有多个package标签
                                 这些package标签的name属性的值必须不同
                name属性的值:这个名称可以随意起名,它表示一个包名,用来区分不同的package
                extends属性的值:这个属性的值是固定的,其值为“struts-default”,只有在此配置了
                                 这个属性,该类采有action的功能,类似于Java中的继承
                namespace属性的值:该属性是名称空间,该属性的值一般为“/”,用于和action标签中得
                                name属性组成访问路径
             -->
            <package name="demo" extends="struts-default" namespace="/">
               <!-- 
                       配置action标签:该标签用来配置action,一个package标签中可以有多个action
                                     标签,这些action标签的name属性的值必须不同
                       name属性的值:name属性的值可以随意起,该值用来和package标签中的namespace
                                      属性的值一起构成该action的访问路径
                       class属性的值:该值是要配置的action所在类的全路径。
                       method属性的值:该属性用来配置该action对应于类中的哪一个方法,其值为要访问的类中的
                                     那个方法的方法名(execute方法默认访问,不用配置)。
                -->
                <action name="hello" class="com.jack.action.HelloAction1" method="hello">
                    <!-- 
                        配置result标签:如果配置的该action方法中有返回值,并且返回值不是none,则必须
                                      要配置该标签,否则会出现404错误
                        
                        name属性的值:该属性的值就是action方法所返回的那个值。
                        该标签中的值为:action返回该属性后,要重定向到那个路径
                     -->
                    <result name="ok">/hello.jsp</result>
                </action>
            </package>
        </struts>

      (2)在struts.xml中引入该文件 

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- 引入dtd约束 -->
       <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
        
        <struts>
          <include file="com/jack/action/hello.xml"></include>
        </struts>

    四、Action的访问配置

      我们知道要访问一个Action,必须要对该Action进行配置。配置的方式有三种

      1、使用method属性配置  

        可以使用<action>标签中的method属性来配置。在<action>标签的method属性中配置对应的要访问的的方法名称即可完成。

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- 引入dtd约束 -->
       <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
        
        <struts>
          <!-- 
                constant标签用来配置常量
                name属性的值:default.properties文件中的常量名称。
                value属性的值:要配置的常量的值
             -->
            <constant name="struts.i18n.encoding" value="UTF-8"></constant>
            <!-- 
                配置package标签:该标签类似于Java中的包,Struts标签中可以有多个package标签
                                 这些package标签的name属性的值必须不同
                name属性的值:这个名称可以随意起名,它表示一个包名,用来区分不同的package
                extends属性的值:这个属性的值是固定的,其值为“struts-default”,只有在此配置了
                                 这个属性,该类采有action的功能,类似于Java中的继承
                namespace属性的值:该属性是名称空间,该属性的值一般为“/”,用于和action标签中得
                                name属性组成访问路径
             -->
            <package name="demo" extends="struts-default" namespace="/">
               <!-- 
                       配置action标签:该标签用来配置action,一个package标签中可以有多个action
                                     标签,这些action标签的name属性的值必须不同
                       name属性的值:name属性的值可以随意起,该值用来和package标签中的namespace
                                      属性的值一起构成该action的访问路径
                       class属性的值:该值是要配置的action所在类的全路径。
                       method属性的值:该属性用来配置该action对应于类中的哪一个方法,其值为要访问的类中的
                                     那个方法的方法名(execute方法默认访问,不用配置)。
                -->
                <action name="hello" class="com.jack.action.HelloAction1" method="hello">
                    <!-- 
                        配置result标签:如果配置的该action方法中有返回值,并且返回值不是none,则必须
                                      要配置该标签,否则会出现404错误
                        
                        name属性的值:该属性的值就是action方法所返回的那个值。
                        该标签中的值为:action返回该属性后,要重定向到那个路径
                     -->
                    <result name="ok">/hello.jsp</result>
                </action>
                <!-- 配置test方法的访问 -->
                 <action name="test" class="com.jack.action.HelloAction1" method="test"> </action>
                
                 <!-- 配置test1方法的访问 -->
                 <action name="test1" class="com.jack.action.HelloAction1" method="test1"></action>
            </package>
        </struts>

      缺点:如果一个Action类中有很多的方法,要写很多的<action>标签来配置,这样显得混乱。

      2、使用通配符来配置(重点)

        在配置文件中还可以使用通配符的方式来配置,好处是如果有很多的方法,只需要配置一个<action>标签,就可以完成整个类的配置。

      

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- 引入dtd约束 -->
       <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
        
        <struts>
          <!-- 
                constant标签用来配置常量
                name属性的值:default.properties文件中的常量名称。
                value属性的值:要配置的常量的值
             -->
            <constant name="struts.i18n.encoding" value="UTF-8"></constant>
            <!-- 
                配置package标签:该标签类似于Java中的包,Struts标签中可以有多个package标签
                                 这些package标签的name属性的值必须不同
                name属性的值:这个名称可以随意起名,它表示一个包名,用来区分不同的package
                extends属性的值:这个属性的值是固定的,其值为“struts-default”,只有在此配置了
                                 这个属性,该类采有action的功能,类似于Java中的继承
                namespace属性的值:该属性是名称空间,该属性的值一般为“/”,用于和action标签中得
                                name属性组成访问路径
             -->
            <package name="demo" extends="struts-default" namespace="/">
             
                <!-- 
                    使用通配符来配置访问方式时,要使用到*来进行匹配
                    name属性的值:在name属性中要写有*,该*表示匹配要访问的方法名称(hello、test),
                                    其中可以直接写*号,也可以写多个*号。该值用来和package标签中的namespace
                                      属性的值一起构成该action的访问路径
                    class属性的值:该值是要配置的action所在类的全路径。
                    method属性的值:该值要使用{1},{}中的数字表示要截取的name属性之中的*的顺序,为1表示截取
                                         第一个*,为2表示截取第二个,该*表示Action中的方法的名称
                    示例:hello方法的路径为:HelloAction_hello
                        test方法的路径为:HelloAction_test
                 -->
                <action name="HelloAction_*" class="com.jack.action.HelloAction1" method="{1}">
                    <!-- 
                        配置result标签:如果配置的该action方法中有返回值,并且返回值不是none,则必须
                                      要配置该标签,否则会出现404错误
                        name属性的值:该属性的值就是action方法所返回的那个值。
                        该标签中的值为:action返回该属性后,要重定向到那个路径
                     -->
                    <result name="ok">/hello.jsp</result>
                </action>
              
            </package>
        </struts>

      3、动态方式访问(一般用不到)

        动态访问方式在Struts2中默认不开启,要使用必须要现在struts的配置文件中配置一个常量来开启支持 

    <struts>
          <!-- 
                constant标签用来配置常量
                name属性的值:default.properties文件中的常量名称。
                value属性的值:要配置的常量的值
             -->
             <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
    </struts>

        访问方式中不用进行特殊配置

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- 引入dtd约束 -->
       <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
        
        <struts>
          <!-- 
                constant标签用来配置常量
                name属性的值:default.properties文件中的常量名称。
                value属性的值:要配置的常量的值
             -->
             <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
            <constant name="struts.i18n.encoding" value="UTF-8"></constant>
            <!-- 
                配置package标签:该标签类似于Java中的包,Struts标签中可以有多个package标签
                                 这些package标签的name属性的值必须不同
                name属性的值:这个名称可以随意起名,它表示一个包名,用来区分不同的package
                extends属性的值:这个属性的值是固定的,其值为“struts-default”,只有在此配置了
                                 这个属性,该类采有action的功能,类似于Java中的继承
                namespace属性的值:该属性是名称空间,该属性的值一般为“/”,用于和action标签中得
                                name属性组成访问路径
             -->
            <package name="demo" extends="struts-default" namespace="/">
             
                <!-- 
                    使用通配符来配置访问方式时,要使用到*来进行匹配
                    name属性的值:在name属性中要写有*,该*表示匹配要访问的方法名称(hello、test),
                                    其中可以直接写*号,也可以写多个*号。该值用来和package标签中的namespace
                                      属性的值一起构成该action的访问路径
                    class属性的值:该值是要配置的action所在类的全路径。
                    method属性的值:该值要使用{1},{}中的数字表示要截取的name属性之中的*的顺序,为1表示截取
                                         第一个*,为2表示截取第二个,该*表示Action中的方法的名称
                    示例:hello方法的路径为:HelloAction_hello
                        test方法的路径为:HelloAction_test
                 -->
               <action name="HelloAction1" class="com.jack.action.HelloAction1">
                   <result name="ok">/hello.jsp</result>
               </action>
            </package>
        </struts>

        该URL的写法和其他不同

        如访问hello方法:URL为:http://ip:端口/项目名称/HelloAction1!hello.action

         

        

  • 相关阅读:
    JNI内存使用问题(转载)
    typearray和obtainStyledAttribute的作用
    handler looper代码总结(原创)精品推荐
    Appium和Robotium在文字输入上的区别
    老李分享:robotium3.6与4.0 later 的区别 2
    老李分享:robotium3.6与4.0 later 的区别 1
    老李分享:robotium常用API 2
    老李分享:robotium常用API 1
    老李分享:Android -自动化埋点 3
    老李分享:Android -自动化埋点 2
  • 原文地址:https://www.cnblogs.com/jack1995/p/6958514.html
Copyright © 2011-2022 走看看