Struts2.x教程(一) Struts2介绍

一、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应用。启动Web服务器,访问:

http://localhost:8080/struts2_helloworld/hello

就可以看到我们创建的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://主机地址/工程名/system/user

namespace寻址机制:

对于我们的一个URL请求,例如http://主机地址/工程名/path1/path2/path3/user

Struts2会自动将URL中的后缀,以及Host和工程名去掉,将/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(50);

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使用对应名称的控件

用户名<input type="text" name="name"><br>

密码<input type="password" name="password"><br>

这样就可以把提交的参数值传给UserAction的属性。

也可以通过URL将参数值传递给Action,如:

http://localhost:8080/struts2-helloworld/user!save?name=admin&password=123456

b、使用DomainModel接收参数

例如,在UserAction中添加实体Bean类型的属性,同样需要添加getter、setter方法

private User user;

jsp的控件名称使用“对象.属性”形式,如

用户名<input type="text" name="user.name"><br>

密码<input type="password" name="user.password"><br>

这样,提交的参数会自动封装如user对象中。在Action方法中,使用user.getName()就可以获取提交的用户名

使用URL传递参数就是这样的形式:

http://localhost:8080/struts2-helloworld/user!save?user.name=admin&user.password=123456

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 Json示例:http://download.csdn.net/detail/boyazuo/7689925

Struts2.x教程(一) Struts2介绍

时间: 2024-10-06 20:27:47

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

Struts2.x教程(三) Struts2拦截器

一.Struts2拦截器介绍 Struts2拦截器是使用AOP实现的,主要是针对action对象进行拦截,可以在访问action的某个方法.字段之前或之后实施拦截. 可以为action配置多个拦截器,Struts2会将这一组拦截器按照一定顺序组织成一个拦截器栈.action可以直接引用某个拦截器栈来实现配置多个拦截器的目的. 对于继承struts_default的package中的action,都会默认引用name=defaultStack的拦截器栈(在struts_default中定义了Str

Struts2.x教程(二) OGNL和值栈

一.OGNL是什么 OGNL(Object Graph Nvigation Language,对象图导航语言)是一个开源的表达式引擎.通过使用OGNL的表达式语法可以存取Java对象树的任意属性和调用Java对象树的方法等. 我们通过一个示例来了解OGNL. 分别创建三个实体类(全部省略了getter.setter方法): //学生类 public class Student { private String name; private Integer age; private Grade gr

深入struts2 (一)---Xwork介绍

1      基本知识 由于struts2是在webwrok的技术基础上开发的,采用拦截器的机制来处理用户请求的全新MVC框架.而webwork是建立在成为xwork的command模式框架之上的强大的基于web的MVC框架.所以总而言之,无论是struts2还是webwork底层都是xwork.如果看过struts源码的朋友肯定会发现struts中导入好多xwork2类.下面就xwork做一个介绍: 关于webwork的详细介绍请参照百度百科: http://baike.baidu.com/v

java资料免费分享 Struts2框架教程

用sitemesh框架解决项目统一布局的解决方案http://edu.ibeifeng.com/view-index-id-80.html 实现java程序调用oracle的存储过程解决方案http://edu.ibeifeng.com/view-index-id-78.html 命令模式在java web中的应用解决方案http://edu.ibeifeng.com/view-index-id-77.html web项目中中文乱码解决方案http://edu.ibeifeng.com/view

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

5.struts2的基本配置 5.1 struts2的访问连接url 在struts1中,通过<action path=“/primer/helloWorldAction.action”>节点的path属性指定访问该action的URL路径. 在struts2中,访问struts2中action的URL路径由两部份组成:包的命名空间+action的名称 例如: 访问本例子HelloWorldAction的URL路径为: /primer/helloWorldAction.action (注意:完

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

struts2框架 什么是框架,框架有什么用? 框架 是 实现部分功能的代码 (半成品),使用框架简化企业级软件开发 ,提高开发效率. 学习框架 ,清楚的知道框架能做什么? 还有哪些工作需要自己编码实现 ? 什么是struts2框架,它有什么用? Struts 2是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架. 其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大.Struts 2以WebWork为核心 struts2=struts1+

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

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

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

工具: K8 Struts2 Exploit组织: K8搞基大队[K8team]作者: K8拉登哥哥博客: http://qqhack8.blog.163.com发布: 2014/7/31 10:24:56 简介: K8 Struts2 综合漏洞利用工具 (Apache Struts Remote Code Execution Exploit)Struts2漏洞检测工具   Struts2漏洞测试工具  K8 struts2 exploit Test  Struts2 GetShell支持漏洞

struts2实战教程

Struts2.0已经成为了一个高度成熟的框架,不管是稳定性还是可靠性都得到了广泛的证明. 拥有丰富的开发人群,几乎已经成为了事实上的工业标准.因此,学习MVC框架,struts2.0几乎是必须熟悉的.       本课程从基本的struts2.0使用开始,深入原理讲解,授人以渔!同时,将工作中容易出现的细节问题讲透,让大家少走弯路. 主讲 :邹波类型:SSH 适合对象:学习完javase.数据库技术.jdbc者 课程目录:01_框架开始02_框架由来03_框架介绍04_struts2入门04_