Struts1.x

  Apache项目的一个子项目

  2001年出现Struts1,成为第一个MVC框架

  2004年成为Apache软件基金会的顶级项目

Struts2.x

  在Struts1.x和webwork的基础上进行合并

  但是struts2和struts1的差异很大,却和webwork几乎相同,级就是说struts2是webwork的更新产品

 

创建一个struts2项目需要将一下jar文件添加到lib目录下

 

添加struts2核心过滤器的配置

<filter>

  <filter-name>struts2</fiter-name>

  <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>  

</filter>

<filter-mapping>

  <filter-name>struts2<filter-name>

  <url-pattern>/*</url-pattern>

</filter-mappping>

 

 

编写一个JSP页面

<body>

  <form action="hellowworld.action"  method="post">

    <lable>姓名:</lable>

    <input type="text" name="name" placeholder="请输入姓名">

    <button type="submit">提交</button>

  </form>

</body>

 在写一个Action,且为其定义一个成员变量name,提供get 、set 方法以及execute方法

public class  HelloWorldAction{

  private String name;

  public String execute(){

    if(name!=null&&!name.isEmpty()){

      return "success";

    }

    return "failtrue";

  }

}

配置Action,在 src 目录中创建struts.xml中

<package name="helloworld" namespace="/helloworld" extends="struts-default">

  <action name="helloworld" class="com.zhidisoft.action.HelloWorldAction">

    <result>/success.jsp</result>

    <result name="failtrue">/failtrue.jsp</result>

  </action>

</package>

 

核心过滤器

  在struts2.1.2之前的核心过滤器为:

    org.apache.struts2.dispatcher.FilterDispatcher

  在struts2.1.3之后核心过滤器被建议改为:

    org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

  StrutsPrepareAndExecuteFilter功能解析

    1.过滤用户请求

    2.初始化请求处理环境

    3.创建Action,调用Action的execute方法

    4.根据execute方法返回结果,将请求发给相应的结果界面

业务逻辑控制器Action

  Struts2中,StrutsPrepareAndExecuteFilter作为核心控制器,统一接受用户请求,对请求做预处理后调用相应的Action来完成具体的业务逻辑处理,所以Action也成为业务逻辑控制器。

  在Struts2中。Action就是一个普通的类

    1、该类定义了一些属性,并为属性提供了对应的setter和getter方法。

    2、Action还提供了一个execute方法来处理用户请求。

    3、Action没有耦合任何Servlet  API所以无法处理请求但是struts2提供了一系列的拦截器将HttpServletRequest中的参数解析出来,交给Action尽心处理。

    4、Struts2真正执行的业务逻辑控制器是Struts2生成的代理Action类,但是该代理Action是以用户定义的Action为代理目标的。

  

Action的实现方式

  1、方式一:

    自定义一个POJO(简单的java对象),不耦合任何的Struts2 API

  2、方式二:

    自定义的Action实现Struts2提供com.opens ymphony.xwork2.Action接口

  3、方式三:

    自定义的Action继承Struts2提供的com.opens ymphony.xwork2.ActionSupport类

    这种方式是Struts2官方建议方式,因为ActionSupport中提供了丰富的功能实现,如数据校验、国际化支出等。

  

Action的实现方式

  public class SupportLoginAction extends ActionSupport{

   private String username;

    public String execute(){

      if("admin".equals(username)&&"admin".equals(password)){

        return "success";

      }

       return "failture";

    }

    //提供username的get、set方法;

  }

Action接收请求参数的方法

  1、使用Action类的属性接收用户请求参数:当请求参数较少时,使用该方式进行参数的接收,在Action中为这些属性提供相应的getter和setter方法,,参数名要和getter/setter方法的名字相同

  

 

  2、使用实体对象方式接收用户请求参数。

 

 

  3、通过HttpServletRequest对象的getParameter()方法

  4:、通过ActionContext对象的getParameters()方法

 

 

Action提高

  如果每一个Action只能处理一种请求,那么在开发的时候就需要编写大量的Action类,难以提高开发效率,Struts2支持同一Action处理多种不同类型的请求以减少Action了类的数量,提高开发效率,同时也有利于项目的维护。例如:你在对一个对象做增删改查等操作时,将这些请求可以放到同一个Action中,那么只需要在该Action中定义多个类似于execute的方法就可以。这样做到后期维护时可以更方便。

  

到这个时候你就会发现问题来了,这么多用户请求想对应的方法在同一个类中,该怎么调用呢?

有三种方式可以解决这个问题

  第一种,在struts.xml中配置多个<action>,通过action标签的method属性指定当前Action处理请求是调用的方法

其中name指定处理请求的Action名称,该名称本人建议为url的一部分;method指定处理本次请求所调用的那个方法 ;class指定处理请求的Action 的全部类名。

  第二种:在struts.xml种只配置一个<action> ,利用struts2提供的动态方法调用功能,在请求的url中包含要处理本次请求的方法名。动态方法调用的url格式为:Action的name属性值_方法名.action,如发送添加用户请求是的URL为:user_add.action,其中user为struts,xml中Action的name属性值,add为处理本次请求的方法名

  第三种:使用通配符*

其中*作为通配符放置在name属性值中,将method属性值指定为{1},{1}的含义为在请求处理时将第一个*的实际值作为方法名,如在请求时请求的URL为addUserAction.action,那么第一个*将被add代替,那么同样method属性值将会被设置为add,那么久调用add方法处理了用户请求。

 

Action中访问Servlet API

   开发时,可能必须在Action中访问Servlet的API,那么可以通过一下2种方式进行

  方式一:通过ActionContext访问ServletAPI

  方式二:通过IOC(控制反转)方式访问ServletAPI

      需要实现如下接口

        RequestAware、SessionAware、ApplicationAware

  以上2种方式访问的并不是真正的原生Servlet API .,ershi Struts抛出访问请求范围、会话范围和应用程序范围中存储属性值的Map类型对象一般情况下已经可以满足开发需要。

 

  在某种特定的情况下,开发人员可能必须访问原生Servlet API如退出登录销毁Session等操作,Struts2页提供了开发人员直接访问Servlet原生API的方式。

  通过ServletActionContext方法

  通过IOC方式

    ServletRequestAware

    ServletContextAware  

 

 

 

  

 

posted on 2017-06-28 11:02  濯墨染半夏  阅读(217)  评论(0)    收藏  举报