第七章: 使用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>
分享到:
相关推荐
- **结果的使用**:第七章讨论了如何使用不同的结果类型来呈现数据,如转发、重定向、JSON/XML数据等。 - **表达式语言获取数据**:第八章介绍了WebWork的表达式语言,以及如何利用它来从模型中获取数据并展示在视图...
WebWork in Action(WebWork 在行动)中文版 很值得下载。 清晰版有点大,共7个部分,此为第一分卷,收点象征分 1分吧。找得挺费劲的。
WebWork in Action(WebWork 在行动)中文版 很值得下载。 清晰版有点大,共7个部分,此为第三分卷,收点象征分 1分吧。找得挺费劲的。
WebWork in Action(WebWork 在行动)中文版 很值得下载。 清晰版有点大,共7个部分,此为第一分卷,收点象征分 1分吧。找得挺费劲的。
WebWork in Action(WebWork 在行动)中文版 很值得下载。 清晰版有点大,共7个部分,此为第五分卷,收点象征分 1分吧。找得挺费劲的。
WebWork in Action(WebWork 在行动)中文版 很值得下载。 清晰版有点大,共7个部分,此为第六分卷,收点象征分 1分吧。找得挺费劲的。
WebWork in Action(WebWork 在行动)中文版 很值得下载。 清晰版有点大,共7个部分,此为第四分卷,收点象征分 1分吧。找得挺费劲的。
WebWork in Action(WebWork 在行动)中文版 很值得下载。 清晰版有点大,共7个部分,此为第二分卷,收点象征分 1分吧。找得挺费劲的。
根据提供的文件信息,我们可以提取并总结出关于《WebWork In Action》这本书的关键知识点。这些知识点主要围绕WebWork框架的核心概念、实现方式以及高级主题展开。 ### WebWork框架概述 **WebWork**是一款开源的...
Spring是掠过Java大地的一阵清风。Spring是以反向控制设计原理为基础,无需EJB而功能依然强大的轻量级J2EE开发框架。Spring大大简化了使用接口开发的... 中文版.part7.rar Spring in Action. 中文版.part8.rar
Spring是掠过Java大地的一阵清风。Spring是以反向控制设计原理为基础,无需EJB而功能依然强大的轻量级J2EE开发框架。Spring大大简化了使用接口开发的... 中文版.part7.rar Spring in Action. 中文版.part8.rar
Spring是掠过Java大地的一阵清风。Spring是以反向控制设计原理为基础,无需EJB而功能依然强大的轻量级J2EE开发框架。Spring大大简化了使用接口开发的... 中文版.part7.rar Spring in Action. 中文版.part8.rar
Spring是掠过Java大地的一阵清风。Spring是以反向控制设计原理为基础,无需EJB而功能依然强大的轻量级J2EE开发框架。Spring大大简化了使用接口开发的... 中文版.part7.rar Spring in Action. 中文版.part8.rar
第7章保护spring 7.1springsecurity介绍 7.2验证用户身份 7.2.1配置providermanager 7.2.2根据数据库验证身份 7.2.3根据ldap仓库进行身份验证 7.3控制访问 7.3.1访问决策投票 7.3.2决定如何投票 7.3.3处理...
Spring in Action. 中文版.part1.rar Spring in Action. 中文版.part2.rar Spring in Action. 中文版.part3.rar Spring in Action. 中文版.part4.rar Spring in Action. 中文版.part5.rar Spring in Action. 中文版....
Spring in Action. 中文版.part1.rar Spring in Action. 中文版.part2.rar Spring in Action. 中文版.part3.rar Spring in Action. 中文版.part4.rar Spring in Action. 中文版.part5.rar ...
Spring in Action. 中文版.part1.rar Spring in Action. 中文版.part2.rar Spring in Action. 中文版.part3.rar Spring in Action. 中文版.part4.rar Spring in Action. 中文版.part5.rar ...