- 浏览: 172879 次
- 性别:
- 来自: 宁波
文章分类
- 全部博客 (113)
- EJB3.0 (1)
- Spring+Hibernate+Struts2 (7)
- 杂谈 (27)
- ExtJs2.2 (1)
- 设计模式 (1)
- JBoss Seam (0)
- 以前在学校里学习的笔记 (3)
- 我的智能手机研究文章 (2)
- DIV+CSS美化页面 (6)
- javascript (7)
- POI操作 (2)
- 数据库 (8)
- Tomcat服务器 (2)
- 测试 (3)
- 水区 (5)
- c++ (1)
- 工作流 (0)
- osg (0)
- JS技术 (2)
- ubuntu linux (3)
- svg (1)
- android (17)
- PHP (1)
- webservise (1)
- java (1)
- mongdb (0)
最新评论
-
flytosea:
如果LIB包建立在外面的话,maven不能把jar一起打包
maven 不建立仓库直接加入直接的jar -
javaAlpha:
楼主 总结的太全了。
CSS兼容IE6,IE7,FF的技巧
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
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
发表评论
-
解决HIbernate3运行出现No CurrentSessionContext configured!错误
2010-05-06 12:20 945解决HIbernate3运行出现No CurrentSessi ... -
Hibernate 参数设置一览表(强烈推荐)
2009-10-15 10:54 772Hibernate 参数设置一览表 属性名 用途 hi ... -
log4j.properities的配置
2009-07-01 19:56 914log4j.properities的配置: #设置根记录器的 ... -
hibernate
2009-06-27 09:38 757Data Accessor Object(DAO)= Data ... -
Spring+Hibernate+Struts2整合文档
2009-06-12 17:18 1421一、Spring+Struts2整合: 1 ... -
struts2.1.6 s:datetimepicker标签不能使用的问题解决
2009-06-12 10:49 2058在以前的struts2版本中s:datetimepicker只 ...
相关推荐
Struts2笔记 本人工作中积累的,故做成笔记以供大家一起学习进步. 模块分的非常详细,各个细节都会关注到,只挑选其精华,工作中用得到的技术!!! 不要看资源小,起到的作用却非常大!!!
本笔记主要涵盖了Struts2的基础知识,包括但不限于配置、Action、拦截器、结果类型以及异常处理等内容。 1. **Struts2框架简介** Struts2是Apache软件基金会的一个开源项目,它是Struts1的升级版,弥补了Struts1在...
Struts2是一个流行的Java web框架,...以上就是"马士兵Struts2笔记2013"中涉及的主要知识点,这些内容涵盖了Struts2的基础配置、数据处理、验证、调试以及与视图层的交互等方面,对于理解和掌握Struts2框架非常有帮助。
### Struts2框架核心概念与工作原理 #### 一、框架概述 Struts2是Apache组织维护的一个开源项目,它是Struts1的升级版本,在设计理念和技术实现上都有较大的改进。Struts2是一个基于MVC(Model-View-Controller)...
8. ** strut2显示图笔记**:这个笔记可能包含了Struts2架构的可视化表示,帮助理解各个组件之间的关系和工作流程,包括Action、Interceptor、Value Stack等的交互过程。 通过阅读这个HTML版的Struts2笔记,开发者...
本笔记主要涵盖了圣思园张龙老师在教学过程中讲解的Struts2核心概念与实战技巧。 首先,我们来了解Struts2的基本架构。Struts2框架通过拦截器(Interceptor)机制实现了对HTTP请求的处理,这些拦截器可以实现如日志...
赵栋的Struts2笔记主要涵盖了2013年的相关知识,以下是根据笔记内容提炼出的一些关键知识点: 1. **URL与Action方法绑定**: 在Struts2中,通过URL直接调用Action类的方法是可能的。如果在URL中附加"!"后跟方法名...
**Struts2笔记** Struts2是MVC(模型-视图-控制器)设计模式的一个实现,它为Java Web开发提供了强大的控制层。Struts2的核心是Action类,它处理用户请求并调用业务逻辑。以下是一些关键知识点: 1. **...
在“Struts2笔记_初步修改版_”中,我们可能会涵盖以下关键知识点: 1. **Struts2架构**:Struts2的核心是Action类,它是处理用户请求的中心。Action类与业务逻辑层交互,并通过Result返回视图。Struts2使用拦截器...
Struts2是一个强大的Java web应用程序开发框架,它基于Model-View-Controller(MVC)设计模式,为开发者提供了...通过阅读"struts2笔记[初步修改版].doc",读者将能够更深入地了解这个框架,并在实际项目中灵活运用。
总的来说,"struts2笔记和代码"涵盖了Struts2框架的基本原理、配置、拦截器、Action实现、视图展现以及实践应用等多个方面,对于学习和掌握Struts2具有很高的价值。通过深入研究这些笔记和代码,开发者不仅可以理解...
在这个"Struts2笔记代码"压缩包中,很可能是包含了一系列与Struts2相关的示例代码和学习资料。 Struts2的核心特性包括: 1. **Action类和结果类型**:Action类是业务逻辑的载体,负责处理用户的请求。每个Action...
### servlet和struts2笔记 #### 一、Servlet 基础 **Servlet** 是 Java Web 开发中的一种核心技术,它被设计用于处理客户端发送到服务器的 HTTP 请求,并且能够生成响应。Servlet 可以看作是服务器端的小程序,...
### Struts2 学习重点知识点总结 #### 一、Struts2 概念与架构 **1.1 Struts2 简介** - **定义**:Struts2 是 Apache 组织提供的一个基于 MVC 架构模式的开源 Web 应用框架。 - **核心**:Struts2 的核心其实是 ...
Struts2是一个强大的Java web应用程序开发框架,它遵循Model-View-Controller (MVC)设计模式,用于构建可维护性和可扩展性高的企业级应用。本文将深入探讨Struts2的核心概念,包括Action、Result、配置文件、OGNL与...
Struts2笔记PDF文件可能包含了对这个框架的深入理解和实践指导。 在Struts2中,核心概念包括Action、Result、Interceptor(拦截器)和Value Stack。Action是业务逻辑的载体,它处理用户请求并执行相应的业务操作。...
Servlet、JSP、Struts2笔记 Servlet基础 Servlet是运行在服务器上的程序,使用Java语言编译,并且使用Servlet接口来实现动态界面。Servlet需要接受客户端发送的请求,并将处理结果以响应的形式响应给客户端。 ...