`
阅读更多
struts2的优点:
1.基于Action的框架
2.拥有由积极活跃的开发人员与用户组成的成熟社区
3.Annotation和XML配置选项
4.基于POJO并易于测试的Action
5.与Spring,SiteMesh 和Tiles的集成
6.与OGNL表达式语言的集成
7.基于主题的标签库与Ajax标签
8.多种视图选项 (JSP,Freemarker,Velocity和XSLT)
9.使用插件来扩展或修改框架特性。


JSP和Scriptlet开发

早期的jsp 的两种情况:

1.)剪切和粘贴的代码 —— Java代码从一个JSP中复制到第二个,第三个,等等。这种情况会导致在原始代码中存在的缺陷或者错误传播开来,并且大大增加了工作量,因此必须要对此做出改变。
2.)调用通用的Java格式化对象——通用的格式化代码或者是逻辑代码被组织到一个可重用的对象中,然后每一个JSP都会使用这个通用的对象。


<jsp:useBean.. />和<jsp:getProperty.. />就是JSP提供的标签,组装页面布局.


Struts2是一个pull(拉)类型的MVC(或者MVC2)框架

“pull”的动作由视图发起,它直接从Action里拉取所需的数据,而不是另外还需要一个单独的模型对象存在。

Struts2分发Servlet过滤器(也就是拦截器)



Mave2是一种管理项目整体构建过程的工具——包括编译,运行测试,生成报告以及管理构建的制品,其中对开发人员最有吸引力的一项就是对构建制品(artifact)进行管理。

应用程序的依赖库只需要在项目的“pom.xml”文件中通过groupId、artifactId和version进行定义.

<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.0.6</version>
</dependency>


FilterDispatcher是一个servlet过滤器
在“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>


struts.xml和struts.properties文件的配置

struts.properties文件属性

struts.i18n.reload = true
——激活重新载入国际化文件的功能
struts.devMode = true
——激活开发模式,以提供更全面的调试功能。
struts.configuration.xml.reload = true
——激活重新载入XML配置文件的功能(这是为Action准备的),当文件被修改以后,就不需要重新载入Servlet容器中的整个Web应用了。
struts.url.http.port = 8080
——配置服务器运行的端口号(所有生成的URL都会被正确创建)

struts.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package
name="struts2"
extends="struts-default"
namespace="/struts2">

</package>
</struts>


Include标签:
<include … /> 是<struts>标签的一个子标签,它可以把其他配置文件导入进来,从而实现Struts2的模块化。它的“file”属性定义了要导入的文件的名称——该文件要和“struts.xml”一样有着相同的结构。

<struts>
<include file="billing-config.xml" />
<include file="admin-config.xml" />
<include file="reports-config.xml" />

</struts>
当导入文件时,一定要注意导入的顺序。因为从文件被导入的那个点开始,该文件中的信息才能被访问到,也就是说,如果要使用另外一个文件中所定义的标签,那么该文件就必须要在被引用之前就配置好。


The Package Tag:
<package … />标签是用来把那些需要共享的通用信息——例如拦截器堆栈或URL命名空间——的配置组织在一起的。

这个标签的属性包括有:
name ——开发人员为这个Package指定的唯一的名字。
extends —— 当前这个Package所继承的Package的名字,被继承的Package中所有的配置信息(包括Action的配置)都可以在新的命名空间下,新的Package里面被使用。
namespace ——命名空间提供了从URL到Package的映射。也就是说,如果两个不同的Package,其命名空间分别为“package1”和“package2”,那么URL差不多就是“/myWebApp/package1/my.action” 和“/myWebApp/package2/my.action”这样的形式。
abstract ——如果这个属性的值为“true”,那么这个Package就只是一个配置信息的组合,也就无法通过Package的名字来访问其中配置的Action。


和<struts>标签一起使用的两个标签<bean … />和<constant … />。


struts2中的action

class MyAction {
public String execute() throws Exception {
return "success";
}
}是一个简单POJO的类

配置文件
<action name="随便取个名字" class="所在的类包.MyAction" >
<result>对应的jsp页面</result>
</action>

多个结果

class MyAction {
public String execute() throws Exception {
if( myLogicWorked() ) {
return "success";
} else {
return "error";
}
    }
}

配置文件
<action name="my" class="所在的类包.MyAction" >
<result>view.jsp</result>
<result name="error">error.jsp</result>
</action>


定义Action结果的最通用的四种方式:
1. Action方法返回一个字符串
——这个返回的字符串与“struts.xml”的一个action配置相匹配。

2. 使用Code behind插件
——当使用这个插件的时候,它会将Action的名字和Action返回的结果字符串进行连接来得到视图模板。
比如说,如果URL是“/adduser.action”,而Action返回了“success”,那么要渲染的页面就是
“/adduser-success.jsp” 。

3. 使用 @Result注解
—— action类可以用@Results 和@Result注解来标注多个不同的结果。
Action所返回的字符串需要与所注解的结果之一相匹配。

4. 方法返回一个Result类的实例——Action不必一定要返回一个字符串,它可以返回一个Result类的实例,
该实例应当是已经配置好可使用的。

实现方式的拦截器:
Spring 框架——ActionAutowiringInterceptor拦截器
请求字符串和表单值—— ParametersInterceptor拦截器
基于Servlet的对象——ServletConfigInterceptor拦截器


前两种拦截器可以独立工作,不需要Action的帮助,但是最后一种不同,它是在以下几种接口的辅助下工作的:
SessionAware
——通过Map来提供对所有session属性的访问
ServletRequestAware
——提供对HttpServletRequest对象的访问
RequestAware
——通过Map来提供对所有request属性的访问
ApplicationAware
——通过Map来提供对所有applicatin属性的访问
ServletResponseAware
——提供对HttpServletResponse对象的访问
ParameterAware
——通过Map来提供对所有request string和表单数据的访问
PrincipalAware
——提供对PrincipleProxy对象的访问;该对象实现了HttpServletRequest对象的有关principle 和role的方法,但是它提供了一个Proxy,因此所有的实现都是独立于Action的。


拦截器的定义:
<interceptors … />和<interceptor … />标签都要直接放到<package>标签里面。
<interceptors>

<interceptor name="autowiring"
class="…xwork2.spring.interceptor.ActionAutowiringInterceptor"/>
</interceptors>


第一种是把拦截器独立的分配给每一个Action:

<action name="my" class="com.fdar.infoq.MyAction" >
<result>view.jsp</result>
<interceptor-ref name="autowiring"/>
</action>
第二种方式是在当前的Package下面配置一个默认的拦截器:
<default-interceptor-ref name="autowiring"/>

拦截器栈(interceptor stack)来管理拦截器

<interceptor-stack name="basicStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="servlet-config"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="params"/>
<interceptor-ref name="conversionError"/>
</interceptor-stack>


在应用程序中使用自定义的拦截器是一种优雅的提供跨应用特性的方式。
我们只需要实现XWork框架中一个简单的接口,它只有三个方法:
public interface Interceptor extends Serializable {
void destroy();
void init();
String intercept(ActionInvocation invocation) throws Exception;
}



值栈与 OGNL

OGNL的全称是Object Graph Navigational Language(对象图导航语言),提供了访问值栈中对象的统一方式。

值栈中的对象构成及其排列顺序如下所示:
1. 临时对象——在执行过程中,临时对象被创建出来并放到了值栈中。举个例子来说,像JSP标签所遍历的对象容器中,当前访问到的值就是临时对象
2. 模型对象——如果模型对象正在使用,那么会放在值栈中action的上面
3. Action对象——正在被执行的action
4. 固定名称的对象(Named Objects)——这些对象包括有 #application, #session, #request, #attr 和 #parameters,以及相应的servlet作用域



结果类型
结果类型的配置项在<package … />标签内部,和拦截器的配置看上去很相似。
<result-types>
<result-type name="dispatcher" default="true"
class="org.apache.struts2.dispatcher.ServletDispatcherResult"/>
<result-type name="redirect"
class="org.apache.struts2.dispatcher.ServletRedirectResult"/>

</result-types>


实现结果类型

创建一个新的结果类型需要实现Result接口。
public interface Result extends Serializable {
public void execute(ActionInvocation invocation)
throws Exception;
}


如果没有“type”属性或者该属性的值是“dispatcher”的话
在Struts 2应用中,有其他三种技术可以用来替代JSP:
Velocity Templates
Freemarker Templates
XSLT Transformations

用Freemarker代替了JSP的返回结果:
<action name="my" class="com.fdar.infoq.MyAction" >
<result type="freemarker">view.ftl</result>
</action>


xslt
<result type="xslt">
<param name="stylesheetLocation">render.xslt</param>
<param name="exposedValue">model.address</param>
</result>

主题(themes)
目前共有3个主题:“simple”,“xhtml”和“css_xhtml”。

在“struts.properties”文件中,将“struts.ui.theme”属性的值配置为要使用的主题。

struts.ui.theme=“simple”,“xhtml”和“css_xhtml”3个类型。





将应用程序模块化的几种方法:
1.将配置信息拆分成多个文件
2.把自包含的应用模块创建为插件
3.创建新的框架特性

在插件中,替代的实现方式是分两步来配置的:
1. 使用 <bean … />标签来定义替换的接口实现,并用一个唯一的key来标识
2. 使用<constant … />标签来在多种可能的接口实现中进行选择

class ——类的全名
type ——类所实现的接口
name ——每个type的唯一简称
static ——是否把静态对象方法注入到类实例中
scope ——实例的作用域,可以是“default”,“request”,“session”,“singleton”或“thread”
optional—— 当值为“true”时,即使创建类实例的过程中发生错误,也会继续装载。


Struts 2中惯例重于配置
隐式的配置文件加载
——不需要显式配置“struts-default.xml”和“struts-plugin.xml”(对每一个插件而言)文件,它们会被自动加载。

Code Behind插件
——在使用code behind 插件时,它会混合使用action名和结果字符串在结果模板中进行自动搜索,所以“/user/add.action” 这个action的“success”结果会返回“/user/add-success.jsp”结果模板,“error”结果会返回“/user/add-error.jsp”结果模板。

默认的结果和结果类型
—— 在配置Action的时候,如果使用默认的“success”结果和JSP结果类型的话,就不需要对它们进行配置

织入(Wiring)Spring业务服务
——在安装了Spring框架插件以后,就不必为每个Action所需的Spring提供的业务服务进行配置,这些 业务服务会被自动织入到Action里。


HTTP方法和URL合并以后的结果:
GET: “/user” ——当action被单独使用时,“index”方法会被调用
GET: “/user/23” ——当action与参数名/值对一起使用时,“view”方法会被调用,在这里“id”属性的值被设为“23”
POST: “/user/23” ——这里HTTP方法是POST而非GET,于是“create”方法将会被调用,“id”或者其他用于标识的值会被包含在URL中,而包含更新信息的名-值对会放在POST数据中
PUT: “/user” ——“update”方法会被调用,与POST场景类似,包含信息的名-值对会放在POST数据中而不是URL里面
DELTE: “/user/23” ——“remove”方法会被调用,在URL里面提供了唯一的标识符(在这里是“id”,其值为“23”)
GET: “/user/23!edit”——“!”被用来描述方法名,所以这里会被调用的是“edit”方法
GET: “/user/new” ——“new”后缀表示“editNew”方法会被调用



了解拦截器的功能

拦截器名              描述
alias               将同一个参数在请求之间进行命名转换。
chain               使上一个action的属性对当前action可用。常与<result type="chain">结合使用(在上一个action中使用)。
conversionError     把ActionContext的转换错误添加到Action的字段错误中。
createSession       自动创建一个HttpSession,当某一个拦截器需要HttpSession协同工作时(如TokenInterceptor)是很有用的。
debugging           提供多个不同的调试场景,用来查看页面背后的数据结构信息。
execAndWait         在后台执行action,并发送给用户一个等候页面。
exception           把异常映射到对应的结果。
fileUpload          为便捷的文件上传提供支持。
I18n                记忆用户session所使用的locale。
logger              输出action名。
model-driven        如果action实现了ModelDriven,该拦截器会将getModel方法的结果放到值栈上面。
scoped-model-driven 如果action实现了 ScopedModelDriven,该拦截器会从scope中获取并存储模型,
                    然后通过setModel方法将其赋给action。
params              把请求参数赋给action。
static-params       把“struts.xml”定义的参数传给action,它们是<action … />标签下的<param … />子标签。
scope               提供了将action状态存储在session或application scope中的简单机制。
servlet-config      提供了对表示HttpServletRequest 和HttpServletResponse的Map的访问。
timer               输出action的执行时间(包括内嵌的拦截器和视图)。
token               验证action中的有效token,避免提交重复的表单。
token-session       和token拦截器一行,但是在处理无效的token时,将提交的信息保存在session中。
validation          使用在 action-validation.xml中定义的验证器来进行验证。
workflow            调用action中的validate方法。如果有异常的话,就会返回INPUT视图。
store               从session中获取和保存实现了ValidationAware的action的消息/异常/字段异常。
checkbox            添加checkbox的自动处理代码,可以检测没有被选中的checkbox,并给它一个默认值(通常是false),
                    然后作为参数添加。它使用了一个特定名称的隐藏字段来检查未提交的checkbox。未选中的默认值可以
                    被那些不是boolean值的checkbox重写。
profiling           激活对参数的性能监测
roles               只有当用户具有正确的JAAS角色时才能够执行action。
prepare             ction实现了Preparable,那么就调用它的prepare()方法。

--------------------------------------------
--------------------------------------------
栈的描述
栈                            Description
basicStack                Struts2提供的最常用的栈。提供了异常处理,将HTTP对象和
                          请求/表单参数注入action,和处理转换错误的功能。
validationWorkflowStack   向basic栈中添加验证和工作流的功能。
fileUploadStack           向basic栈中添加对自动文件上传的支持。
modelDrivenStack          向basic栈中添加对模型驱动action的支持。
chainStack                向basic栈中添加对action串连的支持。
i18nStack                 向basic栈中添加国际化的功能。
paramsPrepareParamsStack  这是Struts2提供的最复杂的一个栈。
                          它的应用场合是当action的prepare()方法被调用时,
                          用传入的请求参数载入数据(或者执行其他任务),
                          然后重新用请求参数来重写一些载入的数据。
                          它的一个典型应用是更新对象。用id来从数据库中读取对象,
                          然后用从请求中传入的参数重写一些读取的数据。
defaultStack              这是默认的栈。它为绝大多数的应用场景提供了所有的功能。
                          实际上,它包括了核心发布版中几乎所有的可用拦截器。
completeStack             这个栈提供了“defaultStack”的别名,用来向后兼容WebWork的应用。
executeAndWaitStack       向basic栈中添加异步支持action的功能。



-------------------------------------------
-------------------------------------------
利用返回类型
名称                           描述
chain             将一个action的执行与另外一个配置好的action串连起来。
                  用第一个action的getter方法和第二个action的setter方法来完成action之间属性的复制。
dispatcher        渲染JSP。这是默认的结果类型,如果在action配置中没有配置其他的结果类型,它就会被使用。
freemarker        渲染Freemarker模板。
httpheader        返回HTTP头和用户定义的值。
redirect          重定向到任意的URL。
redirect-action   重定向到配置好的action。可以用来提供post完成以后的重定向功能。
stream            将数据流返回给浏览器。可以用来把数据注入PDF,Microsoft Work,图像或其他数据中。
velocity          渲染 Velocity模板。
xslt              使用XSLT来转换已执行完毕的action的属性格式。


利用数据转换
内置的转换机制可以将String转化成下面的格式:

String
Boolean 或 boolean
Character或char
Integer或int
Float或float
Long或long
Double或double
Date ——使用与当前请求相关联的locale



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics