2007-09-26
《WebWork in action》第七章
第七章: 使用result
result是指action已执行完毕并返回一个诸如success或者error的值之后执行的代码段。
一. 自定义result的配置
1. action
package ch7;
import java.util.Random;
import com.opensymphony.xwork.ActionSupport;
public class TestAction extends ActionSupport{
private String foo;
private String bar;
private String baz;
public String execute() {
int random = new Random().nextInt(100);
foo = "foo-" + random;
bar = "bar-" + random;
baz = "baz-" + random;
if(random <= 33)
return SUCCESS;
else if(random <= 66)
return ERROR;
else
return INPUT;
}
//属性的setXXX/getXXX方法;
}
2. result
package ch7;
import java.lang.reflect.Method;
import com.opensymphony.xwork.Action;
import com.opensymphony.xwork.ActionInvocation;
import com.opensymphony.xwork.Result;
public class DebugResult implements Result {
public static final String DEFAULT_PARAM = "property";
String property;
public String getProperty() {
return property;
}
public void setProperty(String property) {
this.property = property;
}
public void execute(ActionInvocation arg0) throws Exception {
String resultCode = arg0.getResultCode();
System.out.printf("Result code: %s%n", resultCode);
Action action = (Action)arg0.getAction();
String methodName = "get"+
property.substring(0,1).toUpperCase()+
property.substring(1);
Method method = action.getClass().getMethod(methodName, new Class[0]);
Object o = method.invoke(action, new Object[0]);
System.out.println(property+":"+o);
}
}
3. 配置result
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.1.1//EN" "http://www.opensymphony.com/xwork/xwork-1.1.1.dtd">
<xwork>
<include file="webwork-default.xml"/>
<include file="config-browser.xml"/>
<package name="default" extends="webwork-default">
<result-types>
<result-type name="debug" class="ch7.DebugResult" default="true"/>
</result-types>
<action name="resultTest" class="ch7.TestAction">
<result name="success" type="debug">
<param name="property">foo</param>
</result>
<result name="error">
<param name="property">bar</param>
</result>
<result name="input">bar</param>
</result>
</action>
</package>
</xwork>
说明:a. 在每一个映射当中,都有一个property的属性被定义,该值在result被实例化时,就会调用setProperty()方法注入
result实例;
b. success名称的result映射:指定类型并显式指明了property参数;
c. error 名称的result映射:没指定类型,显式指明了property参数。类型为默认类型:debug;
d. input 名称的result映射:没指定类型,没指明property参数。类型为默认类型:debug; 参数为 DebugResult.java
中DEFAULT_PARAM静态属性所指定的 property;所有包含于WebWork的result都定义了
DEFAULT_PARAM变量;
e. 在以前的配置中:<result name="success">/hello.jsp</result> 类型为默认类型:dispatcher; 参数为默认参数:
location;
二. 通用result
1. 将同一个HTTP请求中的内容分发至某一个页面 (dispatcher类型的result的使用)
只要配置文件包含了webwork-default.xml,而且package继承了webwork-default,那么使用dispatcher result并不需要其他
设置。示例:
<result name="success">/ok.jsp</result>
在跳转时,可对跳转路径中包含的变量替换成具体的参数值;例:/a.jsp?id=${id} 替换成 /a.jsp?id=1
dispatcher result执行时会遍历location变量对应的字符串,获得符合${...}样式的子串,接着将大括号内的OGNL表达式取出
来,然后根据值栈计算表达式的值,最后根据计算的结果替换整个${...}子串。
dispatcher result有二个变量:
. location:指定跳转的路径;
. parse :是否进行变量替换,默认值为true, 进行替换;
2. 将浏览器重定向到某一个页面 (redirect类型的result的使用)
只要配置文件包含了webwork-default.xml,而且package继承了webwork-default,那么使用redirect result并不需要其他
设置。示例:
<result name="success" type="redirect">/ok.jsp</result>
redirect类型result的默认变量和dispatcher是一样的:
. location:指定跳转的路径;
. parse :是否进行变量替换,默认值为true, 进行替换;
重定向工作原理:通过在HTTP头把一个302的HTTP返回码和新的位置一并发送至浏览器,然后浏览器将自动发出一个指向这个新
位置的HTTP请求;
分发 工作原理:发出一个内部的对资源的请求,只通过一个请求为浏览器生成最终的视图。
3. 直接链接到另外一个WebWork action (chain类型的result的使用)
类似于分发至另一个action,都在相同的线程/请求中执行,不同点:
. action 链在同一个action invocation中执行链接着的多个不同的action;
action 分发会引发多个invocation;
. action 链会复制第一个action的参数并设置到第二个action中;
action 分发不会复制前一个action的参数;
a. 配置action链
只要配置文件包含了webwork-default.xml,而且package继承了webwork-default,那么使用redirect result并不需要其他
设置。示例:
1) 在同一个namespace间实现action链接
<result name="success" type="chain">login</result>
2) 在不同namespace间实现action链接
<package name="default" extends="webwork-default">
<interceptors>
<interceptor-stack name="myDefaultStack">
<interceptor-ref name="chain"/>
<interceptor-ref name="defaultStack"/>
</interceptors>
<default-interceptor-ref name="myDefaultStack"/>
...
<result name="success" type="chain">
<param name="actionName" value="bar"/>
<param name="namespace" value="/barspace"/>
</result>
...
</package>
b. action链是如何工作的?
每一个执行的action都被压入堆栈中。chain interceptor通过把公共值从堆栈的每个对象复制到链中接下来要执行
的action来工作。
三. 其他result
1. velocity 类型的 result
velocity是WebWork的核心部分之一(所有表单标签都使用了Velocity模板构建).
使用velocity代替JSP的理由:
a. 速度:编译速度->无须像JSP一样转化成Java并编译,只要经过语法分析;
执行速度->将内容转换为字节流并直接作为响应输出,无须使用开销巨大的RequestDispatcher;
b. scriptless会引发代码维护困难;
c. 更易与工具结合;
只要配置文件包含了webwork-default.xml,而且package继承了webwork-default,那么使用redirect result并不需要其他
设置。示例:
<result name="success" type="velocity">/ok.jsp</result>
velocity类型result的默认变量和dispatcher是一样的:
. location:指定跳转的路径;
. parse :是否进行变量替换,默认值为true, 进行替换;
2. freemarker 类型的 result
freemarker类型的result webwork也提供了内置的支持,一切使用与之前其它result一样,只需将type换为freemarker。
freemarker类型result的默认变量和dispatcher是一样的, 此外还支持contentType类型参数,输出例CSV、纯文本或者
XML的格式形式。
需要说明的是: WebWork默认并不提供FreeMarker所需的库文件。
3. JasperReports 类型的 result
jasper类型的result webwork也提供了内置的支持,一切使用与之前其它result一样,只需将type换为jasper。
jasper类型result的默认变量和dispatcher是一样的, 此外还支持:
. dataSource:设定用于生成result的action属性;
. format: 指定报表以什么格式生成,可选值为:PDF, HTML, XML, CSV和XLS。
jasper类型result至少需location和dataSource属性. 还需要一个1*1像素的图片,名称叫做px(没有后缀), 置于/images目录下;
需要说明的是: WebWork默认并不提供FreeMarker所需的库文件。
示例:
a. action
package ch7;
import com.opensymphony.xwork.ActionSupport;
import java.util.*;
public class ListMembers extends ActionSupport {
private List<Member> members;
public String execute() throws Exception {
members = new ArrayList<Member>();
for(int i=0;i<10;i++) {
Member m = new Member();
m.setEmail("email"+i+"@briup.com");
m.setFirstName("firstName"+i);
m.setLastName("lastName"+i);
members.add(m);
}
return SUCCESS;
}
public class Member {
private String email;
private String firstName;
private String lastName;
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
public List<Member> getMembers() {
return members;
}
public void setMembers(List<Member> members) {
this.members = members;
}
}
b. JasperReports定义(member.xml,位于WebRoot目录下)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jasperReport PUBLIC "-//JasperReports//DTD Report Design//EN"
"http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
<jasperReport name="members">
<field name="email" class="java.lang.String">
<fieldDescription>email</fieldDescription>
</field>
<field name="firstName" class="java.lang.String">
<fieldDescription>firstName</fieldDescription>
</field>
<field name="lastName" class="java.lang.String">
<fieldDescription>lastName</fieldDescription>
</field>
<detail>
<band height="20">
<textField>
<reportElement x="0" y="3" width="100" height="15"/>
<textFieldExpression>$F{email}</textFieldExpression>
</textField>
<textField>
<reportElement x="100" y="3" width="100" height="15"/>
<textFieldExpression>$F{firstName}</textFieldExpression>
</textField>
<textField>
<reportElement x="200" y="3" width="100" height="15"/>
<textFieldExpression>$F{lastName}</textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
接下来需要编译报表,需要在classpath中放置webwork-2.0.jar和jasperreports.jar以及一些共用的辅助jar文件:
java com.opensymphony.webwork.views.jasperreports.CompileReport member.xml
c. result配置
<action name="list-members-pdf" class="ch7.ListMembers">
<result name="success" type="jasper">
<param name="location">members.jasper</param>
<param name="dataSource">members</param>
<param name="format">PDF</param>
</result>
</action>
<action name="list-members-html" class="ch7.ListMembers">
<result name="success" type="jasper">
<param name="location">members.jasper</param>
<param name="dataSource">members</param>
<param name="format">HTML</param>
</result>
</action>
result是指action已执行完毕并返回一个诸如success或者error的值之后执行的代码段。
一. 自定义result的配置
1. action
package ch7;
import java.util.Random;
import com.opensymphony.xwork.ActionSupport;
public class TestAction extends ActionSupport{
private String foo;
private String bar;
private String baz;
public String execute() {
int random = new Random().nextInt(100);
foo = "foo-" + random;
bar = "bar-" + random;
baz = "baz-" + random;
if(random <= 33)
return SUCCESS;
else if(random <= 66)
return ERROR;
else
return INPUT;
}
//属性的setXXX/getXXX方法;
}
2. result
package ch7;
import java.lang.reflect.Method;
import com.opensymphony.xwork.Action;
import com.opensymphony.xwork.ActionInvocation;
import com.opensymphony.xwork.Result;
public class DebugResult implements Result {
public static final String DEFAULT_PARAM = "property";
String property;
public String getProperty() {
return property;
}
public void setProperty(String property) {
this.property = property;
}
public void execute(ActionInvocation arg0) throws Exception {
String resultCode = arg0.getResultCode();
System.out.printf("Result code: %s%n", resultCode);
Action action = (Action)arg0.getAction();
String methodName = "get"+
property.substring(0,1).toUpperCase()+
property.substring(1);
Method method = action.getClass().getMethod(methodName, new Class[0]);
Object o = method.invoke(action, new Object[0]);
System.out.println(property+":"+o);
}
}
3. 配置result
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.1.1//EN" "http://www.opensymphony.com/xwork/xwork-1.1.1.dtd">
<xwork>
<include file="webwork-default.xml"/>
<include file="config-browser.xml"/>
<package name="default" extends="webwork-default">
<result-types>
<result-type name="debug" class="ch7.DebugResult" default="true"/>
</result-types>
<action name="resultTest" class="ch7.TestAction">
<result name="success" type="debug">
<param name="property">foo</param>
</result>
<result name="error">
<param name="property">bar</param>
</result>
<result name="input">bar</param>
</result>
</action>
</package>
</xwork>
说明:a. 在每一个映射当中,都有一个property的属性被定义,该值在result被实例化时,就会调用setProperty()方法注入
result实例;
b. success名称的result映射:指定类型并显式指明了property参数;
c. error 名称的result映射:没指定类型,显式指明了property参数。类型为默认类型:debug;
d. input 名称的result映射:没指定类型,没指明property参数。类型为默认类型:debug; 参数为 DebugResult.java
中DEFAULT_PARAM静态属性所指定的 property;所有包含于WebWork的result都定义了
DEFAULT_PARAM变量;
e. 在以前的配置中:<result name="success">/hello.jsp</result> 类型为默认类型:dispatcher; 参数为默认参数:
location;
二. 通用result
1. 将同一个HTTP请求中的内容分发至某一个页面 (dispatcher类型的result的使用)
只要配置文件包含了webwork-default.xml,而且package继承了webwork-default,那么使用dispatcher result并不需要其他
设置。示例:
<result name="success">/ok.jsp</result>
在跳转时,可对跳转路径中包含的变量替换成具体的参数值;例:/a.jsp?id=${id} 替换成 /a.jsp?id=1
dispatcher result执行时会遍历location变量对应的字符串,获得符合${...}样式的子串,接着将大括号内的OGNL表达式取出
来,然后根据值栈计算表达式的值,最后根据计算的结果替换整个${...}子串。
dispatcher result有二个变量:
. location:指定跳转的路径;
. parse :是否进行变量替换,默认值为true, 进行替换;
2. 将浏览器重定向到某一个页面 (redirect类型的result的使用)
只要配置文件包含了webwork-default.xml,而且package继承了webwork-default,那么使用redirect result并不需要其他
设置。示例:
<result name="success" type="redirect">/ok.jsp</result>
redirect类型result的默认变量和dispatcher是一样的:
. location:指定跳转的路径;
. parse :是否进行变量替换,默认值为true, 进行替换;
重定向工作原理:通过在HTTP头把一个302的HTTP返回码和新的位置一并发送至浏览器,然后浏览器将自动发出一个指向这个新
位置的HTTP请求;
分发 工作原理:发出一个内部的对资源的请求,只通过一个请求为浏览器生成最终的视图。
3. 直接链接到另外一个WebWork action (chain类型的result的使用)
类似于分发至另一个action,都在相同的线程/请求中执行,不同点:
. action 链在同一个action invocation中执行链接着的多个不同的action;
action 分发会引发多个invocation;
. action 链会复制第一个action的参数并设置到第二个action中;
action 分发不会复制前一个action的参数;
a. 配置action链
只要配置文件包含了webwork-default.xml,而且package继承了webwork-default,那么使用redirect result并不需要其他
设置。示例:
1) 在同一个namespace间实现action链接
<result name="success" type="chain">login</result>
2) 在不同namespace间实现action链接
<package name="default" extends="webwork-default">
<interceptors>
<interceptor-stack name="myDefaultStack">
<interceptor-ref name="chain"/>
<interceptor-ref name="defaultStack"/>
</interceptors>
<default-interceptor-ref name="myDefaultStack"/>
...
<result name="success" type="chain">
<param name="actionName" value="bar"/>
<param name="namespace" value="/barspace"/>
</result>
...
</package>
b. action链是如何工作的?
每一个执行的action都被压入堆栈中。chain interceptor通过把公共值从堆栈的每个对象复制到链中接下来要执行
的action来工作。
三. 其他result
1. velocity 类型的 result
velocity是WebWork的核心部分之一(所有表单标签都使用了Velocity模板构建).
使用velocity代替JSP的理由:
a. 速度:编译速度->无须像JSP一样转化成Java并编译,只要经过语法分析;
执行速度->将内容转换为字节流并直接作为响应输出,无须使用开销巨大的RequestDispatcher;
b. scriptless会引发代码维护困难;
c. 更易与工具结合;
只要配置文件包含了webwork-default.xml,而且package继承了webwork-default,那么使用redirect result并不需要其他
设置。示例:
<result name="success" type="velocity">/ok.jsp</result>
velocity类型result的默认变量和dispatcher是一样的:
. location:指定跳转的路径;
. parse :是否进行变量替换,默认值为true, 进行替换;
2. freemarker 类型的 result
freemarker类型的result webwork也提供了内置的支持,一切使用与之前其它result一样,只需将type换为freemarker。
freemarker类型result的默认变量和dispatcher是一样的, 此外还支持contentType类型参数,输出例CSV、纯文本或者
XML的格式形式。
需要说明的是: WebWork默认并不提供FreeMarker所需的库文件。
3. JasperReports 类型的 result
jasper类型的result webwork也提供了内置的支持,一切使用与之前其它result一样,只需将type换为jasper。
jasper类型result的默认变量和dispatcher是一样的, 此外还支持:
. dataSource:设定用于生成result的action属性;
. format: 指定报表以什么格式生成,可选值为:PDF, HTML, XML, CSV和XLS。
jasper类型result至少需location和dataSource属性. 还需要一个1*1像素的图片,名称叫做px(没有后缀), 置于/images目录下;
需要说明的是: WebWork默认并不提供FreeMarker所需的库文件。
示例:
a. action
package ch7;
import com.opensymphony.xwork.ActionSupport;
import java.util.*;
public class ListMembers extends ActionSupport {
private List<Member> members;
public String execute() throws Exception {
members = new ArrayList<Member>();
for(int i=0;i<10;i++) {
Member m = new Member();
m.setEmail("email"+i+"@briup.com");
m.setFirstName("firstName"+i);
m.setLastName("lastName"+i);
members.add(m);
}
return SUCCESS;
}
public class Member {
private String email;
private String firstName;
private String lastName;
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
public List<Member> getMembers() {
return members;
}
public void setMembers(List<Member> members) {
this.members = members;
}
}
b. JasperReports定义(member.xml,位于WebRoot目录下)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jasperReport PUBLIC "-//JasperReports//DTD Report Design//EN"
"http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
<jasperReport name="members">
<field name="email" class="java.lang.String">
<fieldDescription>email</fieldDescription>
</field>
<field name="firstName" class="java.lang.String">
<fieldDescription>firstName</fieldDescription>
</field>
<field name="lastName" class="java.lang.String">
<fieldDescription>lastName</fieldDescription>
</field>
<detail>
<band height="20">
<textField>
<reportElement x="0" y="3" width="100" height="15"/>
<textFieldExpression>$F{email}</textFieldExpression>
</textField>
<textField>
<reportElement x="100" y="3" width="100" height="15"/>
<textFieldExpression>$F{firstName}</textFieldExpression>
</textField>
<textField>
<reportElement x="200" y="3" width="100" height="15"/>
<textFieldExpression>$F{lastName}</textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
接下来需要编译报表,需要在classpath中放置webwork-2.0.jar和jasperreports.jar以及一些共用的辅助jar文件:
java com.opensymphony.webwork.views.jasperreports.CompileReport member.xml
c. result配置
<action name="list-members-pdf" class="ch7.ListMembers">
<result name="success" type="jasper">
<param name="location">members.jasper</param>
<param name="dataSource">members</param>
<param name="format">PDF</param>
</result>
</action>
<action name="list-members-html" class="ch7.ListMembers">
<result name="success" type="jasper">
<param name="location">members.jasper</param>
<param name="dataSource">members</param>
<param name="format">HTML</param>
</result>
</action>
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 4134 次
- 性别:

- 来自: 上海

- 详细资料
搜索本博客
我的相册
me
共 2 张
共 2 张
最近加入圈子
最新评论
-
在Eclipse中创建基于Axis ...
总是报错:invocationTargetException
-- by andy54321 -
《WebWork in action》第 ...
顶邓老师 顶邓老师
-- by wslxg -
在Eclipse中创建基于Axis ...
既然是新手贴,能否将图片传上来?
-- by flyingbob -
使用Axis2 Code Generator ...
[url][list=1] [*] [*][*]引用 [*] [/url] [ ...
-- by zhuliangsoft -
在Eclipse中创建基于Axis ...
不知道 services.xml 是怎么得到的
-- by snowme103






评论排行榜