浏览 2354 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-09-26
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> 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |