文档章节

Java web学习(五)

kakayang2011
 kakayang2011
发布于 2016/03/10 21:13
字数 1550
阅读 79
收藏 4

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方法 
    }

© 著作权归作者所有

kakayang2011
粉丝 8
博文 22
码字总数 18886
作品 0
程序员
私信 提问
如果你想学习Java,那么就来看这篇文章

一、前言 我是从大二开始学习的Java,当时的目标是Java Web开发,当时并不想考研,所以当时的学习是以就业为主,现在我大三了,学习Java Web开发已经一年了,因为种种原因,决定要考研,所以...

Jivanmoon
2018/08/27
0
0
【Java学习路线】新手该如何一步步的学习 Java

新手该如何一步步的学习 Java? 如果真的想学Java,最好要循序渐进,有章有法的学习它! 今天小慕就不说一些学习方法和技巧了,直接来谈每个阶段要学习的内容。 首先,给大家分享一张以 企业...

Eddie_yang
2018/11/15
2.4K
0
急聘网页游戏研发人才

公司名:北京博为远景信息技术有限公司 联系方式:请将简历发送至zhaopin@djyou.cn并标明应聘职位及来源,谢谢合作。 网址:http://www.djyou.cn/ 工作地点:北京 朝阳门 待遇:薪资+五险+员...

bwhr
2011/05/13
558
0
《Java程序员由笨鸟到菜鸟》电子版书正式发布,欢迎大家下载

在众多朋友的支持和鼓励下,《Java程序员由菜鸟到笨鸟》电子版终于和大家见面了。本电子书涵盖了从java基础到javaweb开放框架的大部分内容。在编写的过程中,难免会出现一些错误,希望大家能...

长平狐
2012/11/12
266
0
《Java程序员由笨鸟到菜鸟》电子版书正式发布,欢迎大家下载

在众多朋友的支持和鼓励下,《Java程序员由菜鸟到笨鸟》电子版终于和大家见面了。本电子书涵盖了从java基础到javaweb开放框架的大部分内容。在编写的过程中,难免会出现一些错误,希望大家能...

长平狐
2012/11/12
154
0

没有更多内容

加载失败,请刷新页面

加载更多

Phpstorm2018 永久激活

1、安装phpstorm,安装包请自行官网下载 http://www.jetbrains.com/phpstorm/download/ 2、下载JetbrainsCrack.jar文件,存放至你的phpstorm执行文件同级目录下 下载JetbrainsCrack.jar 提取...

happyfish319
32分钟前
6
0
谈一谈Android进程间通信的几种方式

###来看一下Android中除了AIDL还有哪些进程间通信的方式: 1、Bundle Bundle实现了Parcelable,所以在Android中我们可以通过Intent在不同进程间传递Bundle数据。 但是在Intent 传输数据的过程...

二营长的意大利炮手
33分钟前
7
0
互联网薪资“高开低走”,你的能力是否真的可以匹配高薪?

对于国内外主流互联网大厂,技术出身似乎已经成为各大掌门人的必备标签。谷歌 CEO 桑达尔·皮查伊、马克·扎克伯格、李彦宏、马化腾、雷军等等皆为技术人出身,都曾参与了公司内部重要产品的...

Java技术剑
34分钟前
9
0
java 多线程

线程声明周期 线程的五个状态:新建,就绪,运行,阻塞,死亡。 其中就绪和运行两个状态客户互相转换,但运行到阻塞,阻塞到就绪,只能单向转换。 刚new出的线程就是【新建】状态,调用start...

雷开你的门
36分钟前
12
0
构造器Constructor是否可被overrid

构造器不能被重写,不能用static修饰构造器,只能用public private protected这三个权限修饰符,且不能有返回语句。

无名氏的程序员
40分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部