Java web学习(五)

Struts2框架几乎是目前最优秀的MVC框架之一。Struts2框架是WebWork框架和Struts1框架的结合体。

  1. Struts2结构体系

    注:现在StrutsPrepareAndExecuteFilter过滤器已经代替了FilterDispatcher过滤器。

    工作原理:当客户端发送一个HTTP请求时,需要经过一个过滤器链,这个过滤器链包括ActionContextClearUp过滤器,其他WEB应用过滤器及StrutsPrepareAndExecuteFilter过滤器,其中StrutsPrepareAndExecuteFilter过滤器是必须要配置的。

    当StrutsPrepareAndExecuteFilter过滤器被调用时,ActionMapper将查找需要调用的Action对象,并返回该对象的代理ActionProxy。然后ActionProxy将从配置管理器ConfigurationManager中读取Struts2的相关配置(struts.xml)。Action容器ActionInvocation调用指定的Action对象,在调用之前需要经过Struts2的一系列拦截器。

    当Action处理请求后,将返回相应的结果视图,在这些视图中可以使用Struts2标签显示数据并控制数据逻辑。然后HTTP请求回应给浏览器,在回应的过程中同样经过过滤器。

  2. Struts2的用法

    ①添加jar包

    struts2-core,xwork-core,ognl,freemarker,commons-io,commons-fileupload,javassist-GA,asm-commons,asm,commons-lang

    ②Struts2框架主要通过一个过滤器将Struts2集成到Web应用中,这个过滤器对象就是org.apache.Struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter。通过它Struts2即可拦截Web应用中的http请求,并将这个http请求转发到指定的Action进行处理,Action根据处理的结果返回给客户端相应的页面。因此在Struts2中,过滤器StrutsPrepareAndExecuteFilter是web应用与struts2 API的入口。

    在web.xml中声明struts2提供的过滤器 

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

    ③在web应用的src文件夹下,创建struts.xml,在其中定义Struts2中的Action对象

    <struts>
        <package name="myPackage" extends="struts-default" method="">
            <action name="first" class="">
                 <result name="" type="">/first.jsp</result>
            </action>
       </package>
    </struts>
  3. Action对象

    Action对象主要用来处理http 请求。在struts2 API中,Action对象是一个接口com.opensynphony.xwork.xwork2.Action。在此接口中,定义了五个常量(SUCCESS,NONE,ERROR,INPUT,LOGIN)和一个方法(execute())。

    ①请求参数的注入原理

    在struts2框架中,表单提交的数据会自动注入到与Action对象中相对应的属性中去,它与Spring IOC注入原理一致,通过Action对象为属性提供setter方法进行注入。

    ②Action的基本流程

    当浏览器向web容器发送一个HTTP请求时,Web容器就要调用Struts2过滤器的doFilter()方法。此时Struts2接收到HTTP请求,通过Struts2的内部处理机制会判断这个请求是否与某个Action对象相匹配。如果找到匹配的Action,就会调用Action对象的execute方法,并根据处理结果返回相应的值。然后Struts2通过Action的返回值查找返回值所映射的页面,最后经过一定的视图处理后将页面回应给浏览器。

  4. Struts2的标签库

    首先要引入标签<%@ taglib prefix="s" url="/struts-tags" %>

    ①property 属性 default value escape

    ②set 属性 scope value var

    <s:set var="username" value="kaka" scope="request"/>

    <s:property default="none" value="#request.username"/>

    ③a 属性 action href id method namespace

    ④param 属性 name value

    ⑤action

    ⑥push 将值推入值栈 value

    ⑦include 属性 file

    ⑧url 属性 action method namespace value var

    ⑨if elseif else 属性 test

    10,iterator 属性var value

  5.  传递参数

    ①直接在Action类中定义属性和属性的setter方法。

    ②定义一个对象引用,但在请求参数中必须指定参数锁对应的实体对象。

    public class UserAction extends ActionSupport {
        private User user;
       public User getUser(){
            return user;
       }
       public void setUser(User user){
            this.user = user;
       }
       public String execute(){
            return SUCCESS;
       }
    }
    <input type="text" name="user.username"/>
    <input type="text" name="user.password"/>

    ③采用ModelDriven模式传递参数

    public class UserAction extends ActionSupport implements<User> {
       private User user = new User();
       public User getModel(){
            return this.user;
       }
       public String execute(){
            return SUCCESS;
       }
    }
    <input type="text" name="username"/>
    <input type="text" name="password"/>

    ModelDriven过程:Struts2首先实例化Action对象,然后判断该对象是否实现了ModelDriven接口,若是,则调用getModel方法来获取实体对象模型,在之后的操作中对此实体对象进行赋值。

  6. 为什么要使用struts2代替struts1.x

    (1)struts2的execute方法中的参数不会依赖于servletAPI,实现了也servlet解耦,是一种无侵入式的设计。

    (2)struts2提供了拦截器,利用拦截器可以进行AOP编程,实现权限拦截等功能。

    (3)struts2提供了类型转换器,我们可以很容易地对请求参数转换成需要的类型。

    (4)提供了同种表现层技术支持,如JSP、freeMarker、velocity等

    (5)可以对指定的方法进行校验,可以轻松地实现表单校验功能

    (6)提供了全局范围、包范围和action范围的国际化资源文件管理实现。

  7. Struts2的拦截器

    拦截器是实现AOP的一种,通过它可以在Action执行前后进行一些相应的操作。拦截器能在action被调用之前和被调用之后执行一些“代码”。Struts2框架的大部分核心功能都是通过拦截器来实现的,如防止重复提交、类型转换、对象封装、校验、文件上传、页面预装载等等,都是在拦截器的帮助下实现的。每一个拦截器都是独立装载的(pluggable),我们可以根据实际的需要为每一个action配置它所需要的拦截器。  

    <package name="myFirst" namespace="/" extends="struts-default">
           <interceptors>   
                   <interceptor name="timer"                               class="com.opensymphony.xwork2.interceptor.TimerInterceptor" />
                  <interceptor name="params"
    class="com.opensymphony.xwork2.interceptor.ParametersInterceptor" />
    </interceptors>
     
           <action name="login" class="com.asm.LoginAction">
                    <interceptor-ref name="timer"></interceptor-ref>
                    <interceptor-ref name="params"></interceptor-ref>
                    <result name="loginSuccess">/success.jsp</result>
                    <result name="loginFailure">/failure.jsp</result>
           </action>
    </package>

    注意:虽然extends继承的strust-default自带有params拦截器,但是当我们自己引用了拦截器时,继承struts-default将不会再为我们分配默认的拦截器(有点类似构造器),但是我们仍然可以通过<interceptor-ref name="defaultStack"/>来继续使用struts-defalut的拦截器。

  8. 获取Servlet API

  9. public class Login2Action extends ActionSupport implements RequestAware,SessionAware,ApplicationAware {
        private String username;
        Map request;
        Map session;
        Map application;
        public String execute() throws Exception {
             request.put("req", "requst属性");
             session.put("ses", "sesion属性");
             application.put("app", "application属性");
             return SUCCESS;
        }
        public void setRequest(Map<String, Object> request) {
             this.request=request;
        }
        public void setSession(Map<String, Object> session) {
             this.session=session;
        }
        public void setApplication(Map<String, Object> application) {
             this.application=application;
        }
        ...省略username的get/set方法 
    }

你可能感兴趣的:(Java web学习(五))