对struts2简单理解,未完待续

版权声明:代码共享,欢迎copy https://blog.csdn.net/qq_29073921/article/details/82623330

一、struts2的概念

来自百度百科:

        Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。

         是由传统Struts1和WebWork两个经典框架发展而来,但主要核心还是Webwork。采用拦截器的机制来处理用户的请求,使业务逻辑控制器与Servlet API完全脱离开。

二、struts2的流程

Struts2的下载和安装 
http://struts.apache.org/download.cgi 去下载Struts2 最新版

         struts2常与spring、hibernate构成SSH框架;

        在使用struts2框架的过程中,需要两个配置文件,分别为web.xmlstruts.xml,服务器一启动就加载web.xml的配置,web.xml启动时,在StrutsPrepareAndExecuteFilter的init()方法中将会读取类路径下默认的配置文件struts.xml完成初始化操作;struts2读取到struts.xml后,以javabean形式存放在内存中,以后struts2对用户的每次请求处理将使用内存中的数据,而不是每次都读取struts.xml文件。

(1) 客户端(Client)向Action发用一个请求(Request) 
(2) Container通过web.xml映射请求,并获得控制器(Controller)的名字 
(3) 容器(Container)调用控制器(StrutsPrepareAndExecuteFilter或FilterDispatcher)。在Struts2.1以前调用FilterDispatcher,Struts2.1以后调用StrutsPrepareAndExecuteFilter 
(4) 控制器(Controller)通过ActionMapper获得Action的信息 
(5) 控制器(Controller)调用ActionProxy 
(6) ActionProxy读取struts.xml文件获取action和interceptor stack的信息。 
(7) ActionProxy把request请求传递给ActionInvocation 
(8) ActionInvocation依次调用action和interceptor 
(9) 根据action的配置信息,产生result 
(10) Result信息返回给ActionInvocation 
(11) 产生一个HttpServletResponse响应 
(12) 产生的响应行为发送给客服端。 

三、struts2的使用

1.web.xml的配置

因为Struts2将核心控制器设计成Filter,而不是一个普通Servlet。故为了让Web应用加载FilterDispatcher,只需要在web.xml文件中配置FilterDispatcher即可。
标准配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <display-name>Struts Blank</display-name>

    <filter>
    <!-- 配置Struts2核心Filter的名字 -->
        <filter-name>struts2</filter-name>
        <!-- 配置Struts2核心Filter的实现类 -->
        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
          <init-param>
          <!-- 配置Struts2框架默认加载的Action包结构,可以没有。 -->
          <param-name>actionPackages</param-name>
          <param-value>org.apache.struts2.showcase.person</param-value>
          </init-param>
          <!-- 配置Struts2框架的配置提供者类 -->
          <init-param>
          <param-name>configProviders</param-name>
          <param-value>lee.MyConfigurationProvider</param-value>
          </init-param>
    </filter>
<!-- 配置Filter拦截的URL -->
    <filter-mapping>
    <!-- 配置Struts2的核心FilterDispatcher拦截所有用户请求 -->
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
</web-app>


*如上,当配置Struts2的FilterDispatcher类时,可以指定一系列的初始化参数,为该Filter配置初始化参数时,其中有3个初始化参数有特殊意义:
config:使用逗号隔开的字符串,每个字符串都是一个XML配置文件的位置。Struts框架将自动加载该属性指定的系列配置文件。
actionPackages:使用逗号隔开的字符串,每个字符串都是一个包空间,Struts2框架将扫描这些包空间下的Action。
configProviders:配置自己的ConfigurationProvider类。
还可以在此处配置Struts2常量,每个<init-param>元素配置一个Struts2常量,其中<param-name>子元素指定了常量name,而<param-value>子元素指定了常量value。
*在web.xml中配置了<Filter>元素,还需要配置该Filter拦截的URL。通常,我们让该Filter拦截所有的用户请求。可以能过<filter-mapping>元素配置。

2.struts.xml的配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

<!-- consant 常量,struts.devMode表示开发者模式,当为true时如果改变了其中的一些代码,可以不用重新启动tomcat-->
<constant name="struts.devMode" value="true" />

<!--package可以有多个解决重名的情况, namespace 可以不写,默认是如何路径都可以,也可以写成/xx/yy ,必须是/开头-->
    <package name="default" namespace="/" extends="struts-default">

       <default-action-ref name="index" />

       <global-results>
           <result name="error">/error.jsp</result>
       </global-results>

       <global-exception-mappings>
           <exception-mapping exception="java.lang.Exception" result="error"/>
       </global-exception-mappings>

<!-- action里面那个name属性值得是URL输入的路径名 ,如“http://localhost:8080/Struts2Demo/hello”,则会根据result反馈Hello.jsp-->
       <action name="hello" class="com.styspace.struts2.action.action2">
           <result>  /Hello.jsp</result>
       </action>

<!-- action里面class属性值,会有对应的这个类,执行该类里面的execute()方法-->

       <action name="action" class="com.styspace.struts2.action.action2">
           <result name="success">/Action.jsp</result>
       </action>

<!-- action里面method属性值,会有对应class这个类中的add方法,然后执行该方法-->

<action name="userAdd" class="com.bjsxt.struts2.user.action.UserAction" method="add">
            <result>/user_add_success.jsp</result>
        </action>

<!-- 一般action里面不用method属性值,而是用DMI(动态方法调用)可以通过http://localhost:8080/Struts2Demo/user!addURL调用,其中user指的是action中的name值-->
        
        <action name="user" class="com.bjsxt.struts2.user.action.UserAction">
            <result>/user_add_success.jsp</result>
        </action>

<!-- 更简单的方法,通配符,name=“student*”会匹配URL中所有Studentxx,而method=“{1}”指的是name中第一个“*”匹配的值 同理,result中{1}也是一样的-->


        <action name="Student*" class="com.bjsxt.struts2.action.StudentAction" method="{1}">

            <result>/Student{1}_success.jsp</result>
        </action>
<!-- 甚至可以有多个通配符,class属性中也可以用{1}来匹配,最简化-->
        <action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}">
            <result>/{1}_{2}_success.jsp</result>
            <!-- {0}_success.jsp -->
        </action>


    </package>
    <!-- Add packages here -->

</struts>

3.struts的注解开发方式

常用注解

@NameSpace

  • 出现的位置:它只能出现在

    • package上或者Action类上。一般情况下都是写在Action 类上。
  • 作用:指定当前Action 中所有动作方法的名称空间
  • 属性: 
    • value:指定名称空间的名称。写法和 xml配置时一致。不指定的话,默认名称空间是”“。

@ParentPackage

  • 出现的位置: 
    • 它只能出现在 package上或者Action类上。一般情况下都是写在Action类上。
  • 作用:指定当前动作类所在包package标签的父包。 
    • 由于我们已经是在类中配置了,所以无需在指定包名了。
  • 属性:

    • value:指定父包的名称。

@Action

  • 出现的位置:

    • 它只能出现在 Action类上或者动作方法上。一般情况下都是写在动作方法上。
  • 作用:指定当前动作方法的动作名称。 
    • 也就是 xml配置时 action标签的name 属性
  • 属性: 
    • value:指定动作名称。
    • results[]:它是一个数组,数据类型是注解。用于指定结果视图。此属性可以没有,当没有 
      该属性时,表示不返回任何结果视图。即使用 response 输出响应正文。 
      interceptorRefs[]:它是一个数组,数据类型是注解。用于指定引用的拦截器。

@Result

  • 出现的位置:

    • 它可以出现在动作类上,也可以出现在 Action注解中。
  • 作用:出现在类上,表示当前动作类中的所有动作方法都可以用此视图。 
    • 出现在Action注解中,表示当前Action可用此视图。
  • 属性: 
    • name:指定逻辑结果视图名称。
    • type :指定前往视图的方式。例如:请求转发,重定向,重定向到另外的动作。
    • location:指定前往的地址。可以是一个页面,也可以是一个动作。
  • 注意 : 此注意是一个数组,在Action注解中的写法:可配多个试图 

    result={ 
    @Result(name="",type="",location=""), 
    @Result(name="",type="",location="") 

@Results

  • 出现的位置: 
    • 它可以出现在动作类上,也可以出现在 Action注解中。
  • 作用:用于配置多个结果视图。
  • 属性:

    • value:它是一个数组,数据类型是result注解。
  • 注意 : 是写在动作类上,而且可以写多个,写在Action类上后,方法就不用配置@Result注解

@InterceptorRef

  • 出现的位置:

    • 它可以出现在动作类上或者Action注解中。
  • 作用:用于配置要引用的拦截器或者拦截器栈
  • 属性: 
    • value:用于指定拦截器或者拦截器栈常用注解

       

四、对请求参数的封装

1、属性驱动

  1.1、 无实体类★

         属性驱动-set方式(常用场景-分页)

         只需要在action中通过相应的属性(需要有set方法)

  1.2、 有实体类★

        属性驱动-页面表达式方式(常用场景-封装成多个对象)
        将页面传递过来的数据封装成一个对象
        在action中,提供一个javabean对象,提供他的get和set方法 
        在页面中,修改表单子标签的name属性 
            name="javabean对象名称.bean属性名称"

2、模型驱动★★(最常用到)

      步骤:
            1.action要实现ModelDriven接口
            2.在action中提供一个javabean对象(必须初始化)
            3.重写接口的getModel方法
            4.将javabean对象通过getModel方法的返回.

3、封装集合数据(不常用)

        大前提:
            action中需要提供一个集合,提供这个集合的get和set方法.
        
        批量封装成list
            修改页面上的表单子标签的name属性
                name="集合属性名称[索引].bean属性"
        批量封装成map
            修改页面上的表单子标签的name属性
                name="集合属性名称['key名称'].bean属性"

Strurs2的拦截器:

       过滤器是servlet规范中的一部分,任何java web项目都可以使用。

       拦截器是struts2框架自己的,只用使用struts2框架的工程才能使用。

      过滤器在url-pattern中配置/*之后,可以对所有要访问的资源拦截。

      拦截器他是只有struts2核心内部后,才会起作用,如果访问的是jsp、html、css、image或者js是不会进行拦截的。

     同时。拦截器是AOP思想的具体体现形式。

 参考文章:

https://www.cnblogs.com/huskyking/p/5557681.html
https://blog.csdn.net/u011958281/article/details/74685659
https://blog.csdn.net/Kato_op/article/details/80295731
https://www.cnblogs.com/jimsu/p/6045794.html

猜你喜欢

转载自blog.csdn.net/qq_29073921/article/details/82623330