一、Struts2是什么
Struts2是在WebWork2基础发展而来的。和Struts1一样, Struts2也是基于MVC的web层框架。
那么既然有了Struts1,为何还要Struts2?
Struts2和Struts1尽管都是基于MVC的Web框架,可是它们的实现机制全然不同。

Struts1是基于Servlet的实现,而且Struts1的API过分依赖容器。导致了Action开发、測试都非常繁琐,而Struts2是基于过滤器的实现,API不再依赖容器,測试过程中不必再模拟Web容器环境,开发、測试较Struts1都有非常大的进步。
Struts1的Action是单例模式全部请求共享一个ActionServlet。所以线程必须是安全的,而Struts2每一个请求都会绑定一个Action,不再有线程安全问题。
Struts2開始支持注解并提供了更为强大的OGNL标签库以及值栈。从类到页面的开发都更加简洁高效。

 
Struts2和Struts1都是基于MVC的Web层框架。所以,他们工作原理还是一样的。都是对请求进行拦截、分发、处理,之后返回页面。仅仅只是他们的实现机制不同罢了。
因此。Struts2的工作原理就不再过多介绍。以下我们来看怎样使用Sturts2搭建一个Web开发环境。

 
二、Struts2的使用
让我们先用Sturts2 展示一个Helloworld。
1、创建web项目struts2_helloworld,加入Struts2的依赖支持
struts2-core-2.3.8.jar
xwork-core-2.3.8.jar
commons-lang3-3.1.jar
ognl-3.0.6.jar
javassist-3.11.0.GA.jar
asm-3.3.jar
asm-commons-3.3.jar
asm-tree-3.3.jar
freemarker-2.3.19.jar
commons-fileupload-1.2.2.jar
commons-io-2.3.jar
2、在web.xml中配置struts2

  <filter>

      <filter-name>struts2</filter-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-mapping>
3、创建Struts2配置文件struts.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC

    "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"

    "http://struts.apache.org/dtds/struts-2.1.dtd">

<struts>

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

        <action name="hello" class="com.boya.struts2.web.HelloAction">

            <result>

                /helloWorld.jsp

            </result>

        </action>

    </package>

</struts>
注意,与Struts1不同。Struts2的配置文件并不放在WEB-INF文件夹下。而须要放置在src源代码根文件夹下
4、创建Action类

public class HelloAction {

    public String execute() {

        return "success";

    }

}
5、创建返回页面helloWorld.jsp
 
如今就完毕了一个简单的Struts2应用。启动Webserver,訪问:
就能够看到我们创建的helloWorld.jsp页面了。
 
三、Sturts2的配置介绍
1、在web.xml配置Strut2过滤器拦截
Sturts1是通过servlet映射实现的对请求的拦截,Struts2是通过Filter完毕的对请求拦截。前者会在ActionSerlvet中载入核心配置文件,后者会在StrutsPrepareAndExecuteFilter过滤器中载入。

因此,与Struts1不同的是,我们要在web.xml里面配置Struts2的Filter来拦截请求。

配置方式见上文。

        
2、Strtus2核心配置文件
Struts2的默认配置文件是struts.xml,须要放置在源代码根文件夹下。
struts.xml中的action标签和Struts1中的作用一样,都是定义了一种映射关系。

package标签则表明以包的形式来管理action和拦截器。通常情况下,按将逻辑相关一组业务Action作为一个模块放在同一个package下管理。

 
package有下面属性;
name:包名称。其它包使用name继承当前包,不能反复
namespace:定义当前包的命名空间,匹配请求URL的路径部分。不同的命名空间下能够有重名的action
extends:当前包继承的父包,继承之后,当前包拥有父包中所定义的随意类、拦截器等
abstract:定义当前包为一个抽象的包,也就是说不能有action元素在当前包中
 
action属性:
name:action名称,用来匹配请求URL
class:相应的详细Action实现类。默觉得ActionSupport
method:运行action时调用的方法,默认运行execute()。也能够在URL中动态指定,比如:
    <a href="${ctx}/system/user!add">加入用户</a>
 
result标签:定义action的返回跳转页面
name:定义页面跳转名称,默觉得success。

在action中返回一个相应name的字符串,就会返回到相应的jsp页面

type:设置返回结果类型,默觉得dispatcher。用于返回jsp页面
 
3、URL映射机制
Struts1中,我们是使用path来映射URL请求的。在Struts2中是使用namespace + action的name来映射URL的。
比如:
    namespace="/system" ,
    action设置name为"/user"
    那么这个action相应的URL就是 http://主机地址/project名/system/user
 
namespace寻址机制:
对于我们的一个URL请求。比如http://主机地址/project名/path1/path2/path3/user
Struts2会自己主动将URL中的后缀。以及Host和project名去掉,将/path1/path2/path3这部分觉得是namespace,首先会查找namespace="/path1/path2/path3",假设这个命名空间查找不到,会继续查找namespace="/path1/path2",仍然没有的话。会继续查找上一级命名空间。直到查找到namespace="/"为止。
查找到命名空间,会在该命名空间的package下查找name="/user"的action。最后将这个请求交给action相应的业务处理类处理。

namespace默觉得"",当在其它namespace中映射不到的时候,都在这个namespace中寻找。

 
Struts2是用namespace和actionName来唯一差别一个Action。因此,在同一个namespace下不能配置同名的action,在不同的namespace下,能够有重名action。

 
4、映射方式配置
在web.xml的过滤器映射中除了这样配置:
<filter-mapping>

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

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

</filter-mapping>
也能够使用扩展名配置:
<filter-mapping>

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

    <url-pattern>*.action</url-pattern>

</filter-mapping>
action是struts2默认支持的扩展名。/*在完毕*.action的基础映射功能下。提供了额外的支持

    a、用于訪问classpath中特定的静态资源(假设是/struts、或者/static開始的资源,则在classpath下查找特定的包以下的匹配资源;)
    b、支持无后缀的action请求
 
使用/*方式映射时:
    訪问/struts或/static文件夹。不希望载入strtus的静态资源的配置方式
    <constant name="struts.serve.static" value="false" />
    希望强制使用扩展名映射的配置方式
    <constant name="struts.action.extension" value="action" />
    相同能够使用上面的配置改动struts2的默认扩展名
    <constant name="struts.action.extension" value="do" />
    不希望映射某个文件夹时(文件夹须要是一个正則表達式,因此须要使用.*的方式表示)
    <constant name="struts.action.excludePattern" value="/dwr/.*,/noaction/.*" />
 
5、Action的方法映射
    a、Action的方法映射能够通过method指定,未指定method方法时,默认运行execute()方法
    b、映射方法还能够在URL中动态指定(动态方法调用DMI)
        比如訪问 http://localhost:8080/struts2_helloworld/hello!print 会调用hello相应的Action中的print()方法
        注:能够使用struts.enable.DynamicMethodInvocation參数配置DMI的开启关闭,默觉得开启
        <constant name="struts.enable.DynamicMethodInvocation" value="false" />  
    c、使用通配符映射
        <action name="*_*" class="com.boya.struts2.web.{1}Action" method="{2}">
            <result>
                /{0}.jsp
               </result>

</action>

        使用{1}{2}{3}...{9}的顺序来匹配*。{0}匹配总体
        注:Struts2的通配符配置方式,极不灵活,不推荐使用
 
6、设置返回结果类型
    返回结果类型能够通过result标签的type属性配置,默认类型为dispatcher。用于返回jsp页面。经常使用的返回结果类型有redirect、chain、json等
 
    redirect类型配置(重定向到一个新的URL请求):
        <result name="success" type="redirect">/hello.jsp?name=${name}</result> <!--重定向到一个jsp页面-->

        <result name="success" type="redirect">/hello.action</result> <!--重定向到一个acton请求-->
    redirectAction类型配置(重定向到其它action):
            <result type="redirectAction">
                <param name="namespace">/</param>    <!--重定向Action所在的命名空间,默觉得当前命名空间-->

<param name="actionName">user</param> <!--重定向的Action名称-->

<param name="method">login</param>    <!--重定向Action的方法名称-->

                <param name="name">boya</param>        <!--重定向传參-->
                <param name="password">123456</param> <!--重定向传參-->
            </result>
    chain类型配置。配置类似redirectAction(链到其它action,也就是转发操作):
        <result type="chain">
            <param name="namespace">/</param> <!--Action所在的命名空间,默觉得当前命名空间-->

<param name="actionName">user</param> <!--Action名称-->

<param name="method">login</param> <!--Action的方法名称-->

        </result>
 
    json类型配置
    a、加入struts2-json-plugin-2.3.8.jar
    b、Action代码(省略getter、setter方法,省略User实体类):

public class JsonAction extends ActionSupport {

    private Map<String,Object> dataMap;

    

    public String json() {

        dataMap = new HashMap<String, Object>();

        User user = new User();

        user.setName("张三");

        user.setAge();

        dataMap.put("user", user);

        return SUCCESS;

    }

}
    c、配置struts.xml

<package name="json" extends="struts-default,json-default" >

    <action name="json" class="com.boya.struts2.web.JsonAction">

        <result type="json">

            <param name="root">dataMap</param>

        </result>

    </action>

</package>
    package须要继承"json-default"
    result类型须要配置为json    
    result參数:
        root:指定返回属性。默认返回全部有返回值的getter方法的值
        excludeNullProperties:是否返回值为空的属性,值为boolean类型
        ignoreHierarchy:是否忽略父类属性,值为boolean类型
        includeProperties:指定返回root中的哪些属性。值为正則表達式。可使用逗号分隔设置多个
        excludeProperties:指定排除root中的哪些属性。值为正則表達式,可使用逗号分隔设置多个     
 
    d、返回内容:
        {"user":{"age":22,"name":"张三"}}
   
excludeProperties和includeProperties的验证差别:

首先。如果dataMap中返回结果为:{"users":[{"age":22,"name":"张三","password":"123456"},{"age":40,"name":"李四","password":"654321"}]}

设置了排除或包括的属性后,以上结果须要验证的元素有users、users[0]、users[0].age、users[0].name、users[0].password、users[1]、users[1].age、users[1].name、users[1].password
假设要排除password属性,须要设置<param name="excludeProperties">users.*\.password</param> ,excludeProperties是将正則表達式作为总体分别匹配以上各元素,这样就会把password排除掉。

假设要仅仅包括name属性,则不能设置为<param name="includeProperties">users.*\.name</param>,includeProperties会将正則表達式拆为users.*、users.*\.name(对分隔符,数组索引符合,对象属性间的点连接符等进行切割处理),这两个正则分别与上面各元素匹配。而users.*就会匹配所有元素。所以无法排除。
要精确包括name属性,须要设置为:<param name="includeProperties">users\[\d+\]\.name</param> ,而这时,正則表達式会被拆为users, users\[\d+\], users\[\d+\]\.name 。终于仅仅输出name属性。
 
四、Action处理
1、接收參数
    a、使用属性来接收參数
        比如。在UserAction中定义例如以下属性,并加入getter、setter方法
        private String name;

private String password;

        jsp使用相应名称的控件
        username<input type="text" name="name"><br>
        密码<input type="password" name="password"><br>
这样就能够把提交的參数值传给UserAction的属性。
 
也能够通过URL将參数值传递给Action,如:
    
    b、使用DomainModel接收參数
        比如。在UserAction中加入实体Bean类型的属性。相同须要加入getter、setter方法
            private User user;
        jsp的控件名称使用“对象.属性”形式。如
        username<input type="text" name="user.name"><br>
        密码<input type="password" name="user.password"><br>
        这样。提交的參数会自己主动封装如user对象中。在Action方法中,使用user.getName()就能够获取提交的username
        
        使用URL传递參数就是这种形式:
 
2、获取web容器的request和session
    Struts2不像Struts1那样依赖容器。默认情况下,request、session这些容器对象都是隐藏的,而且Struts2层分别使用RequestMap、SessionMap对request、session进行封装,是我们能够使用Map的key-value形式对request、session进行操作。我们能够获取RequestMap来作为request使用,也能够像传统web开发那样获取一个HttpServletRequest对象。
  
    a、非IoC方式
        这样的方式主要是利用了com.opensymphony.xwork2.ActionContext类以及org.apache.struts2.ServletActionContext类,分别用于获取RequestMap和HttpServletRequest对象。
        获取RequestMap、SessionMap对象
        Map request = (Map)ActionContext.getContext().get("request");
        Map session = ActionContext.getContext().getSession();
        获取HttpServletRequest、HttpSession对象        
        HttpServletRequest request = ServletActionContext.getRequest();
        HttpSession session = request.getSession();
    b、IoC方式
        这样的方式类似SpringIoc控制反转,是使用依赖注入的方式获得request和session对象的。
        获取RequestMap、SessionMap对象,Action须要实现RequestAware, SessionAware接口
    private Map request;
    private Map session;
    
    @Override
    public void setRequest(Map request) {
        this.request = request;
    }
    @Override
    public void setSession(Map session) {
        this.session = session;

}

        获取HttpServletRequest、HttpSession对象,Action须要实现ServletRequestAware接口    
    private HttpServletRequest request;
    private HttpSession session;
    @Override
    public void setServletRequest(HttpServletRequest request) {
        this.request = request;
        this.session = request.getSession();
    }
 
 演示样例代码下载:
Struts2 HelloWorld演示样例:http://download.csdn.net/detail/boyazuo/7689429

Struts2.x教程(一) Struts2介绍的更多相关文章

  1. Struts2详细教程

    Struts2详细教程:http://www.yiibai.com/struts_2/

  2. Struts2 第四讲 -- Struts2的基本配置

    5.struts2的基本配置 5.1 struts2的访问连接url 在struts1中,通过<action path=“/primer/helloWorldAction.action”> ...

  3. [原创]java WEB学习笔记71:Struts2 学习之路-- struts2常见的内建验证程序及注意点,短路验证,非字段验证,错误消息的重用

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  4. VB6 GDI+ 入门教程[1] GDI+介绍

    http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[1] GDI+介绍 2009 年 6 月 18 日 17 ...

  5. 第3章 Struts2框架--1、Struts2环境搭建

    第3章 Struts2框架--1.Struts2环境搭建 搭建步骤: 1.从下载http://struts.apache.org 没找到Struts2.3.16版,就下载了2.3.29 2.拷贝后解压 ...

  6. matlab中文论坛视频谷普教程MATLAB压缩包介绍

    matlab中文论坛视频谷普教程MATLAB压缩包介绍 我也正在学习这个软件 ,看到这个教程就在这里分享了,希望大家喜欢!Matlab 初学者视频教学1. Matlab视频:Matlab中文论坛为新手 ...

  7. struts2讲义----建立一个struts2工程

    建立一个Struts2 工程 Ø 1在MyEclipse中新建web工程 Ø 2在struts-2.2.1.1-all\struts-2.2.1.1解压struts2-blank.war( 最基础的示 ...

  8. Struts2学习第一天——struts2基本流程与配置

    struts2框架 什么是框架,框架有什么用? 框架 是 实现部分功能的代码 (半成品),使用框架简化企业级软件开发 ,提高开发效率. 学习框架 ,清楚的知道框架能做什么? 还有哪些工作需要自己编码实 ...

  9. [原创]K8 Struts2 Exp 20170310 S2-045(Struts2综合漏洞利用工具)

    工具: K8 Struts2 Exploit组织: K8搞基大队[K8team]作者: K8拉登哥哥博客: http://qqhack8.blog.163.com发布: 2014/7/31 10:24 ...

随机推荐

  1. 目前常用AD/DA芯片简介

    目前生产AD/DA的主要厂家有ADI.TI.BB.PHILIP.MOTOROLA等,武汉力源公司拥有多年从事电子产品的经验和雄厚的技术力量支持,已取得排名世界前列的模拟IC生产厂家ADI.TI公司代理 ...

  2. Android Studio下载安装及配置图文教程

    原文 http://jingyan.baidu.com/article/9c69d48f56835e13c9024e95.html AndroidStudio下载地址:https://develope ...

  3. Gradle DSL method not found: 'android()

    原文错误提示: Error:(16, 0) Gradle DSL method not found: 'android()'Possible causes:<ul><li>Th ...

  4. service:jmx:rmi:///jndi/rmi

    service:jmx:rmi:///jndi/rmi://ip:9889/jmxrmi http://stackoverflow.com/questions/2768087/explain-jmx- ...

  5. chrome浏览器debugger 调试,有意思。

    JavaScript代码中加入一句debugger;来手工造成一个断点效果. 例子: ajax看看返回的数据内容,或者想知道js变量获取值是什么的时候. $.ajax({ type:"pos ...

  6. Windows Azure 社区新闻综述(#69 版)

    欢迎查看最新版本的每周综述,其中包含有关云计算和 WindowsAzure 的社区推动新闻.内容和对话. 以下是过去一周基于您的反馈汇集在一起的内容: 文章.视频和博客文章 ·     使用 Azur ...

  7. 在win7下php查询数据库, 连接被重置

    解决方法一 将 php5 目录下的libmysql.dll拷贝至 windows/system32和apache/bin下 解决方法二 在apache/conf/httpd.conf文件中添加 Loa ...

  8. SQL Server DBA三十问【转】

    http://database.51cto.com/art/201110/298926.htm 很多开发人员都想成为一名DBA,也有很多人一开始就把自己定位成为一名DBA,DBA究竟需要掌握些什么知识 ...

  9. BZOJ 1024 SCOI 2009 生日快乐 深搜

    题目大意:有一块蛋糕,长为X,宽为Y.如今有n个人来分这块蛋糕,还要保证每一个人分的蛋糕的面积相等.求一种分法,使得全部的蛋糕的长边与短边的比值的最大值最小. 思路:刚拿到这个题并没有什么思路.可是定 ...

  10. hdu 1520Anniversary party(简单树形dp)

    Anniversary party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...