Struts2学习笔记

时间:2023-03-08 23:06:43
Struts2学习笔记

一、struts2的工作原理

 Struts2学习笔记 

上图为struts整体结构。

1.客户端初始化一个指向servlet的请求;

2.请求通过一系列过滤器(其中的ActionContextCleanUp为可选过滤器,对struts与其他框架集成有帮助),到达StrutsPrepareAndExecuteFilter过滤器;

3.StrutsPrepareAndExecuteFilter询问ActionMapper是否调用某个action;

4.AcitonMapper决定调用某个action,Filter将请求的处理交给ActionProxy;

5.ActionProxy通过Configuration Manager询问框架的配置文件找到需要的Action类;

6.ActionProxy创建一个ActionInvocation实例;

7.ActionInvocation实例使用命名模式来调用,在调用Action的前后,涉及到相关拦截器(Intercepter)的调用;

8.一旦Action调用完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果,返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper

struts与mvc模型

控制:XML文件Struts-config.xml,与之相关联的是Controller,它可以称作为Struts神经中枢。

视图:主要由JSP生成页面完成视图,Struts提供丰富的JSP 标签库: Html,Bean,Logic,Template等,这有利于分开在Struts中,承担MVC中Controller角色的是一个Servlet,叫ActionServlet。ActionServlet是一个通用的控制组件。这个控制组件提供了处理所有发送到Struts的HTTP请求的入口点。它截取和分发这些请求到相应的动作类(这些动作类都是Action类的子类)。另外控制组件也负责用相应的请求参数填充 Action From(通常称之为FromBean),并传给动作类(通常称之为ActionBean)。动作类实现核心商业逻辑,它可以访问java bean 或调用EJB。最后动作类把控制权传给后续的JSP 文件,后者生成视图。所有这些控制逻辑利用Struts-config.xml文件来配置。表现逻辑和程序逻辑。

模型:模型以一个或多个java bean的形式存在。这些bean分为三类:Action Form、Action、JavaBean or EJB。Action Form通常称之为FormBean,封装了来自于Client的用户请求信息,如表单信息。Action通常称之为ActionBean,获取从ActionSevlet传来的FormBean,取出FormBean中的相关信息,并做出相关的处理,一般是调用Java Bean或EJB等。

流程:在Struts中,用户的请求一般以*.do作为请求服务名,所有的*.do请求均被指向ActionSevlet,ActionSevlet根据Struts-config.xml中的配置信息,将用户请求封装成一个指定名称的FormBean,并将此FormBean传至指定名称的ActionBean,由ActionBean完成相应的业务操作,如文件操作,数据库操作等。每一个*.do均有对应的FormBean名称和ActionBean名称,这些在Struts-config.xml中配置。

核心:Struts的核心是ActionSevlet,ActionSevlet的核心是Struts-config.xml。

二、struts2的实现流程

1.包含jar包到项目lib目录

2.配置web项目的web.xml文件,添加struts2滤器:

<filter>

    <filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepaerAndExecuteFilter</filter-class>
</filter> <filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

3.创建action类,继承ActionSupport类:

  public class HelloWorldAction extends ActionSupport{

    //默认执行execute()方法

    public String execute(){}

4.创建struts2的核心配置文件struts.xml并配置action:

  <struts>

    <include file="struts-users.xml"></include>                    //通过include标签实现多个配置文件的组件式包含。

    

    <package name="default" namespace="/" extends="struts-default">       //配置文件中可有多个package,但名称必须唯一。

      <intercepters>                                 //定义拦截器。。。

        <intercepter name="timer" class="com.kay.Timer"></intercepter>

      </intercpters>

      <global-results>                                //全局结果集

          <result name="input">/error.jsp</result>

      </global-results>     

      <action name="helloworld" class="com.action.HelloWorldAction">      //每个包可以定义多个action,name为其访问路径,有命名空间需添加命名空间前缀

        <result>/result.jsp</result>                              //结果集,无name与type为默认结果

      </action>

      <param name="url">http://www.sina.com</param>             //参数

    </package>

    <constant name="struts.i18n.reload" value="true"></constant>          //常量值,参考struts.propertise

  </struts>

补充:调用动态方法:

  第一种-同一action下的不同方法可通过配置同一package下的不同action标签实现,指向同一class,通过method属性区别(name不能相同)。

  第二种-通过通配符实现:

      <action name="helloworld_*" name="{1}" class....>

        <result  name = "add">/{1}.jsp</result>                //通过...helloworld_add.action实现

    或:<action name="*_*" name="{2}" class="com.action.{1}Action">

        <resutl name="add">/{2}.jsp</result>                  //通过HelloWorld_add.action实现

5.接收参数

  -使用Action的属性接收参数:

    直接在继承ActionSupport的Action中添加参数同名字段,并添加getter和setter,可通过字段直接调用参数;简单,但参数数量多时不宜使用;

  -使用DomainModel接收:

    创建对象类封装参数,通过action中添加对象字段实现调用,参数传递页面须将参数名称改为对象.参数(user.password)以传递到指定对象。

  -使用ModelDriven接收:

    为Action添加ModelDriven接口,同时将封装参数的对象类,并在Action类中添加getModel方法(返回对象user);调用时须先对对象类进行实例化                 (DomainModel不需要实例化),同时参数传递页面的参数名称不需添加对象前缀。

  当参数为复杂对象时,第三种方法可直接通过数组的下标,对象的“."字段调用进行传递。。。