论坛首页 入门技术论坛

《WebWork in action》第七章

浏览 2354 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-09-26  
第七章: 使用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>
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics