o Web Work o Web Work o Web
目录 o Web. Work入门 o Web. Work原理 o Web. Work标签库和EL o Web. Work实例 2
J 2 ee Web Framework之现状 o o o Web. Work: 最灵活、简单的Web框架 Spring Web Framework:最全面的Web框架 Struts: 资源最丰富的Web框架 Tapestry: 组件化最完美的Web框架 JSF: 最接近asp. net的Web框架 Portal: 最适合集成的Web框架 4
Web. Work概述 Web. Work 2 Web. Work 1 XWork 1 Non-web 5
Action o o o 请求的动作都对应于一个相应的Action 一个Action是一个独立的 作单元和控制命令 它必需要实现XWork里的Action接口 public interface Action extends Serializable { public public } static static final final String String SUCCESS = "success"; NONE = "none"; ERROR = "error"; INPUT = "input"; LOGIN = "login"; public String execute() throws Exception; 6
例子-用户注册 register. jsp register. action register. Success. jsp xwork. xml 7
Action. Support 提供Action常用功能的一个基类 p 错误消息的支持 action and field specific errors field errors are automatically supported by views p 国际化支持 1 resource bundle per action pervasive UI support for retrieving messages 8
Action. Context o o o 一次Action调用都会创建一个Action. Context 调用:Action. Context context = Action. Context. get. Context() 在Web. Work中,它通过包装提供了对Servlet的访问: Http. Session —— context. get. Session() Http. Servlet. Request parameters —— context. get. Parameters() p Servlet. Action. Context,继承Action. Context。可以 直接访问servlet相关的API:Page. Context, Http. Servlet. Request,Http. Servlet. Response, Servlet. Config,Servlet. Context 9
二、Web. Work原理 XWork的层次: Action. Proxy Action. Invocation Action. Proxy:管理Action的生命周期,它是设置和执行Action的 起始点。 Action. Invocation:在Action. Proxy层之下,它表示了Action的执 行状态。它持有Action实例和所有的Interceptor 10
Web. Work原理 11
Interceptors o o "Practical AOP" n very simple, no external dependencies n allows you to intercept action invocations Help decouple and componentize your code Interceptors are organized into 'stacks' n lists of interceptors applied in sequence. n applied to any action or package of actions Web. Work is mostly implemented as a series of XWork interceptors 12
例子- Timer. Interceptor public class Timer. Interceptor implements Interceptor {. . . public String intercept(Action. Invocation dispatcher). . . { long start. Time = System. current. Time. Millis(); String result = dispatcher. invoke(); long ex. Time = System. current. Time. Millis() - start. Time; log. info(dispatcher. get. Proxy(). get. Action. Name() + " ran in " + ex. Time + "ms. "); return result; } } xwork. xml <interceptors> <interceptor name="timer" class="com. opensymphony. xwork. interceptor. Timer. Interceptor"/> </interceptors> 13
Interceptor的执行顺序 p Interceptor截获Action的执行,并在它的之前或之后 调用相应的方 <interceptor-stack name="xa. Stack"> <interceptor-ref name="this. Will. Run. First. Interceptor"/> <interceptor-ref name="this. Will. Run. Next. Interceptor"/> <interceptor-ref name="this. Will. Run. Last. Interceptor"/> </interceptor-stack> this. Will. Run. First. Interceptor this. Will. Run. Next. Interceptor this. Will. Run. Last. Interceptor My. Action 1 My. Result (result) this. Will. Run. Last. Interceptor this. Will. Run. Next. Interceptor this. Will. Run. First. Interceptor 14
Result. Type p p Result 它是Action执行之后返回的一个字符串常量 它表示Action执行完成的状态。 Result. Type 它是一个类 它在Action执行,并返回result之后调用 它用来决定Web. Work使用什么方式展现界面 <result-type name="dispatcher" class="com. opensymphony. webwork. dispatcher. Servlet. Dispatcher. Result" default="true"/> <result name="success" type="dispatcher">/register. Success. jsp</result> 16
三、Web. Work标签库和EL o o o <ww: property value=“”/>取值输出 <ww: iterator value=“” status=“”/>迭代标签,可以输出 Collection, Iterator, Enumeration, Map, array, XML Node, or XML Node. List status: 用来取得迭代器的状态:get. Count(), get. Index(), is. First(), is. Last(), is. Even(), is. Odd() <ww: if test=“”> </ww: if> <ww: elseif test=“”></ww: eleseif> <ww: else></ww: else> 17
Expression Language 例子-员 登记 OGNL Expression Result employee. name get. Employee(). get. Name() employee. to. String get. Employee(). to. String() employee. relations[0] First element of the Relations collection name in {null, "Rick"} True is name is null or Rick employee. relations. {name} Calls get. Name() on each relations in the collection returning a new collection 18
已提供的验证类 Validator Result Required. Field field != null Required. String field != null & string. length() > 0 Int. Range Integer is in a given range Date. Range Date is in a given range Email Valid email field URL Valid URL field Expression/Field. Expression Any OGNL expression evaluates to true eg. pet. name != "dog" Allows you to create very powerful validations using just XML and your existing model 21
例子-注册验证 register. jsp register. Success. jsp register. action xwork. xml 验证出错 register. jsp Register. Action-validation. xml 22
多模块 o o o Include: 使用多个XWork配置文件 Package: package之间可以继承 Namespace:用来区分不同package中的action 23
一个Action类多方法 o 方法要求:无参数,返回一个字符串类型,抛出 Exception,例如: public String do. Default() throws Excetpion{ return INPUT; } p 定义方式 1、直接访问,action. Name!method. Name. action。例如: register!do. Default. action 2、在XWork中定义,使用method属性。例如: <action name="register. Default" class="com. skyon. demo. register. Register. Action" method=“do. Default”> ………… 24
文件上传 file. Upload. jsp file. Upload. action upload. Success. jsp xwork. xml 25
防止重复提交(double click ) o 在页面中设置<ww: token /> <input type="hidden" name="webwork. token. name" value="webwork. token"/> <input type="hidden" name="webwork. token" value="5 J 573 PYGWC 131 FIM 39 Y 03 PYZX 5 P 2 Z 0 JC"/> session. set. Attribute(token. Name, token); o o o 配置拦截器 Token. Interceptor Token. Session. Store. Interceptor:保存了上次操作 的Invocation 26
进度条显示 wait. Input wait. jsp wait. action xwork. xml wait. Success. jsp 27
- Slides: 29