一、Struts2简介
Struts2是根据struts1项目升级而来,但是struts2的核心是webwork.就是说它只是使用了struts1的名字,而核心实现方式确是webwork。
WebWork建立在XWork 之上,MVC模式的开源java EE WEB开发框架。
WebWork 是由OpenSymphony 组织(www.opensymphony.com)开发。目前WebWork 2.x 已经被拆分成了XWork和WebWork 两个项目。
XWork简洁、灵活、功能强大,它是一个标准的Command模式实现,并且完全从Web 层脱离出来。XWork 提供了很多核心功能:前端拦截器(interceptor)、运行时表单属性验证、类型转换、强大的表达式语言OGNL(Object Graph Navigation Language) 等。
二、Struts2下载与安装
1、下载
apache 官方网站下载 Struts2 包http://struts.apache.org 目前版本为2.3.16
下载Struts2,我们会看见有很多可供下载的压缩包,每个压缩包作用如下:
Full:包含源码,类库、文档、示例等其它下载源。建议下载此包
Example:示例应用版。
Essential:类库
Document:相关文档
Source:源码
2、安装
无需安装,如果项目需要使用struts2只需要将需要的包导入到工程即可。
建议解压下载的struts2的zip文件中找到app\ struts2-blank.war 并解压然后copy web-info\lib 目录下的所有的jar并导入项目。App目录是struts2的一些示例程序,struts2-blank是一个helloworld级别的项目,所以它使用的jar可以说是struts2框架需要用到的最少的jar文件。
3、常用jar文件介绍
l 文件上传相关包
commons-fileupload-1.2.2.jar
FileUpload 使你可以在应用和Servlet中容易的加入强大和高性能的文件上传能力struts中上传文件要用到。
commons-io-2.0.1.jar
l 日志处理包
commons-logging-1.1.1.jar
Apache Commons包中的一个,包含了日志功能。这个包本身包含了一个Simple Logger,但是功能很弱。在运行的时候它会先在CLASSPATH找log4j,如果有,就使用log4j,如果没有,就找JDK1.4带的java.util.logging,如果也找不到就用Simple Logger。
commons-logging.jar的出现是一个历史的的遗留的遗憾,当初Apache极力游说Sun把log4j加入JDK1.4,然而JDK1.4项目小组已经接近发布JDK1.4产品的时间了,因此拒绝了Apache的要求,使用自己的java.util.logging,这个包的功能比log4j差的很远,性能也一般。
后来Apache就开发出来了commons-logging.jar用来兼容两个logger。因此用commons-logging.jar写的log程序,底层的Logger是可以切换的,你可以选择log4j,java.util.logging或者它自带的Simple Logger。不过我仍然强烈建议使用log4j,因为log4j性能很高,log输出信息时间几乎等于System.out,而处理一条log平均只需要5us。你可以在Hibernate的src目录下找到Hibernate已经为你准备好了的log4j的配置文件,你只需要到Apache网站去下载log4j就可以了。commons-logging.jar也是必须的jar包。
l 对java.lang.*的扩展,里面有些工具类
commons-lang-2.5.jar
l 动态的获取/设值Java Bean的属性
commons-beanutils-1.7.0.jar
Commons-Beanutils 这个是jakarta commons项目中的一个子项目。这个项目开发的目的是帮助开发者动态的获取/设值Java Bean的属性,同时解决每次都要写getXXX和setXXX的麻烦。
l 模板相关操作包 struts2的UI标签的模版使用freemarker
freemarker-2.3.16.jar
l 生成java字节码的代码生成工具
javassist-3.11.0.GA.jar
l 表达式包
ognl-3.0.1.jar
l commons-collections.jar
扩展了标准的Java Collection框架,提供了额外的Map、List和Set实现以及多个有用的工具类库。功能比java.util.*强大。
l strust2核心包
struts2-core-2.2.3.jar
l WebWork核心jar
xwork-core-2.2.3.jar
2.3以后会有asm.jar相关的包,ASM是小巧轻便的Java字节码操控框架 ,它能方便地生成和改造Java代码
三、Struts2体系结构
Struts2的体系与Struts1体系的差别非常大,因为Struts2使用了WebWork的设计核心,而不是Struts1的设计核心。Struts2中大量使用拦截器来处理用户的请求,从而允许用户的业务逻辑控制器与Servlet API分离。
1、Struts2的处理流程
Struts2框架的大概处理流程如下:
1、加载类(org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter)
2、读取配置(struts配置文件中的Action) struts.xml/struts.properties
3、派发请求(客户端发送请求) url
4、调用Action(FilterDispatcher从struts配置文件中读取与之相对应的Action )
5、启用拦截器(WebWork拦截器链自动对请求应用通用功能,如验证)
6、处理业务(回调Action的execute()方法)
7、返回响应(通过execute方法将信息返回到StrutsPrepareAndExecuteFilter)
8、查找响应(FilterDispatcher根据配置查找响应的是什么信息如:SUCCESS、ERROR,将跳转到哪个jsp页面/另一个action)
9、响应用户(jsp--->客户浏览器端显示)
10、struts2标签库(相比struts1的标签库,struts2是大大加强了,对数据的操作功能很强大,但是struts2的标签库非常庞大占有用系统资源中小项目不建议使用。) 对jstl标签的扩展 c:foreach
流程图:
2、Struts2的核心组件:
实现以下五个核心部件:
· Actions 用于处理界面的请求,处理器.action可以是一个简单的java类,不需要实现任何接口,也不用继承某个类 耦合
· Interceptors 用于对请求进行拦截,类似于filter但是他只能拦截struts中的action,struts2的所有的功能都是由拦截器实现的。组件式的,可以随时抽出来
· Value Stack / OGNL 值栈,类似于servlet中的作用域,在struts2的标签中使用比较多
· Results / Result types 返回结果,包含返回的视图的name和响应的数据等其它一些返回的信息 <result name=“success”>index.jsp</result>
· View 响应视图,jsp/jsf或者其它的视图技术
四、Struts2配置说明
Struts2的配置可以分成三个单独的文件
1、Web.xml配置
FilterDispatcher是一个servlet过滤器,它是整个Web应用的配置项,需要在”web.xml”中进行配置:
<filter>
<filter-name>action2</filter-name>
<filter-class>org.apache.Struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>action2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
如果是配置一个最基本的Web应用的话,这样就足够了。剩下的就是自定义一些Web应用的执行环境和配置应用中的组件。其中前者主要通过”struts.properties”来完成,而后者是在”struts.xml”中进行配置的。我们下面来看一下这两个配置文件的细节
2、struts.properties文件
l 文件说明
这个文件提供了一种更改框架默认行为方式的机制,类似于一些系统常量。在一般情况下,如果不是打算让调试更加方便的话,你根本无须更改这个文件。在”struts.properties”文件中定义的属性都可以在”web.xml”文件的”init-param”标签中进行配置,或者通过”struts.xml”文件中的”constant”标签来修改。
我们可以更改其中的一些属性来改变Freemarker的选项——改变Action映射类,判断是否要重新载入XML配置文件,以及默认的UI主题等等。在Struts2 的wiki上有这些属性的最新信息,地址为http://struts.apache.org/2.x/docs/strutsproperties.html.
在Struts2-Core的jar发行版中,有一个默认的属性文件,名为”default.properties”。如果要对属性进行修改的话,只需要在项目的源代码目录下,创建一个叫做”struts.properties”的文件,然后把想要修改的属性添加到文件中,新的属性就会把默认的覆盖掉了。
l 在开发环境中,以下几个属性是可能会被修改的:
3、struts.xml文件
l Struts标签
“struts.xml”文件中包含的是开发Action时所需要修改的配置信息。我们先来看一下文件的固定结构。
在”struts.xml”中进行配置全局结果、异常处理和自定义的拦截器堆栈。
因为这是一个XML文件,所以最开始的元素就是XML版本和编码信息。接下来则是XML的文档类型定义(DTD)。DTD提供了XML文件中各个元素所应使用结构信息,而这些最终会被XML解析器或者编辑器使用。
我们现在看到了<struts>标签,它位于Struts2配置的最外层,其他标签都是包含在它里面的。
l Include标签:
<include … /> 是<struts>标签的一个子标签,它可以把其他配置文件导入进来,从而实现Struts2的模块化。它的”file”属性定义了要导入的文件的名称——该文件要和”struts.xml”一样有着相同的结构。比如说,如果要把一个记账系统的配置分解的话,你可能会把记账、管理和报表的功能各自组织到不同的文件中:
<struts>
<include file=“billing-config.xml” />
<include file=“admin-config.xml” />
<include file=“reports-config.xml” />
…
</struts>
当我们导入文件时,一定要注意导入的顺序。因为从文件被导入的那个点开始,该文件中的信息才能被访问到,也就是说,如果要使用另外一个文件中所定义的标签,那么该文件就必须要在被引用之前就配置好。
有些文件需要显式导入,有些则会被自动导入。”struts-default.xml”和”struts-plugin.xml”就属于后者。它们都包括有结果类型、拦截器、拦截器堆栈、包(package)以及Web应用执行环境(也可以在”struts.properties”中配置)的配置信息。二者的区别在于,”struts-default.xml”提供的是Struts2的核心配置信息,而”struts-plugin.xml”则描述了特定插件的配置信息。每个插件的JAR中都要有一个”struts-plugin.xml”文件,该文件会在系统启动时被装载。
l Package标签:
<package name=”struts-default” … />
标签是用来把那些需要共享的通用信息——例如拦截器堆栈或URL命名空间——的配置组织在一起的。它通常由Action的配置组成,但也可以包括任何类型的配置信息。它还可以用来组织管理各自独立的功能——它们也可以被进一步拆分到不同的配置文件中。
这个标签的属性包括有:
name=“default”:package的名称用于区分不同的packge
namespace=“/” :表示页面请求的路径。
extends=“struts-default”:表示继承自struts-deault这个包
abstract=“false”:是否是抽象包。如果设置成true那这个package里面不能包含action的定义
l Constant标签
常量标签可以用来修改struts.properties中定义的常量
<!-- 指定Web应用的默认编码集,相当于调用 HttpServletRequest的setCharacterEncoding方法 -->
<constant name=“struts.i18n.encoding” value=“UTF-8” />
<!-- 该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即 所有匹配*.action的请求都由Struts 2处理。如 果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开 -->
<constant name=“struts.action.extension” value=“do” />
<!-- 设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好 关闭 -->
<constant name=“struts.serve.static.browserCache “ value=“false” />
<!-- 当 struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生 产环境下使用),开发阶段最好打开 -->
<constant name=“struts.configuration.xml.reload” value=“true” />
<!-- 开发模式下使用,这样可以打印出更详细的错误信息 -->
<constant name=“struts.devMode” value=“true” />
<!-- 默 认的视图主题 -->
<constant name=“struts.ui.theme” value=“simple” />
<!-- 该属性指定Struts 2中的action由Spring容器创 建 与spring整合时使用-->
<constant name=“struts.objectFactory” value=“spring” />
l Action 标签
用户自定义action的标签,类似于servlet的配置。该标签包含的属性有:
<action name=“login” class=“com.itjob.action.LoginAction” method=“login”>
<result name=“success”>index.jsp</result>
<result name=“error”>error.jsp</result>
<result name=“input”>index.jsp</result>
</action>
Name:表示页面请求的url必须的。
Class:action的处理类,全限定类名 必须配置
Method:处理请求的方法,如果说不配置method execute()
l Result 标签:
<result name=“success”>index.jsp</result>
action处理结果的配置 属性包括
name:返回结果的名称 name的值默认可以设置为success input error
type:json jsp等
五、第一个struts2项目
public class MyActionDemo extends ActionSupport {
private String name=““;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String execute() throws Exception {
this.name = “itjob”;
return SUCCESS;
}
}