webwork学习笔记------------------------------作者: kingfish(vc--@sohu.com)关键字: webwork1.4, tomcat5--------------------------------------本人最近学习webwork,发现资料很少(如果您有,请发一份给我,先谢啦),由于是开源项目,就粗略的看了看源码. 以下是我看后整理的一份笔记,比较简单, 希望能给用得到的网友带来一点帮助.
水平有限,错误难免,请见谅+指正!
环境说明: 使用Tomcat5.0+webwork1.4 将下载的webwork中的webwork.war在tomcat的webapps下解开为webwork目录.
一. 一个servlet :webwork.dispatcher.ServletDispatcher 1.简介 webwork1.4所有自带例子中的action都提交到此servlet进行处理,重要性当然不言而喻. 打开webwork/WEB-INF下web.xml,可以看到以下配置
... <servlet> <servlet-name>action</servlet-name> <servlet-class>webwork.dispatcher.ServletDispatcher</servlet-class> <load-on-startup>1</load-on-startup> </servlet> ... <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping> ... 2 功能: 1. 处理action请求 2. 查找相应action类,产生实例. 3. 执行doValidation()校验输入参数; 4. 如果3校验结果为合法, 执行doExecute(); 5. 根据执行结果字符串("success","input","error")查找views配置转到相应view.
二. 动手写一个简单例子
1. HelloAction.java 源代码
import webwork.action.ActionSupport;import webwork.action.Action;
public class HelloAction extends ActionSupport { private String name ; public HelloAction() { }
public void setName(String name) { this.name = name; }
public String getName() { return this.name; }
public void doValidation() { else if(name==null||name.length()<1){ addError("Name","can't be null or empty!"); } }
//如果不做其它处理,也可以不override此方法.缺省返回success public String doExecute() { return SUCCESS; }}编译完的class文件拷入webwork/WEB-INF/classes下.
2.配置有两种配置方法可选:(1) 配置views.properties(在webwork/WEB-INF/classes下)hello.action=HelloActionhello.input=helloinput.jsphello.success=hellosuccess.jsphello.error=helloerror.jsp
(2) 配置actions.xml(在webwork/WEB-INF/classes下)在原有基础上增加下面一个action <action name="HelloAction" alias="hello"> <view name="success">hellosuccess.jsp</view> <view name="error">helloerror.jsp</view> <view name="input">helloinput.jsp</view> </action>
3.相关jsp文件 建立以下四个jsp文件,存放目录为:webwork下.(1)index.jsp <html> <head> <title>test webwork</title> </head> <body> <A href="helloinput.jsp">example</a> </body></html>(2)helloinput.jsp<html> <head> <title>test webwork</title> </head> <body> <form action="hello.action" method="post"> <input type="text" name="name" value=""/> <input type="submit" value="Submit"/> </form> </body></html>(3)hellosuccess.jsp<HTML><HEAD><TITLE>Test</TITLE></HEAD><BODY>Hello world!</BODY></HTML>(4)helloerror.jsp 同上,将字符串改掉即可. 本例子中只是配置中用到,运行过程未用此页面.
4.运行 (1)启动Tomcat (2)IE中输入:http://localhost:8080/webwork/index.jsp (3)不输入任何字符,提交,页面仍然在helloinput.jsp 输入字符后提交,页面转至hellosuccess.jsp
5.流程说明 (1) 启动Tomcat后, 初始化servlet(ServletDispatcher) (2) 在输入页面(helloinput.jsp), 输入字符提交(提交到hello.action) (3) 根据web.xml中配置,此请求由ServletDispather处理. (4) servlet根据actionName("hello")查找配置(配置内容:hello.action=HelloAction) (5) 产生HelloAction实例 (6) servlet调用HelloAction的doValidation()校验输入参数. (7) 校验通过, servlet调用HelloAction的doExecute(),返回成功("success"). (8) 根据views配置查找到:hello.success=hellosuccess.jsp (actionaliasName.viewName=pagename) (9) servlet中forward到hellosuccess.jsp (10)输出hello world!, 完成.
如果不输入直接提交,以下几步略有不同 (7) 校验未通过,产生错误信息. 其它方法中检测到有错误信息,默认返回"input" (8) 根据views配置查找到:hello.input=helloinput.jsp (9) servlet中forward到helloinput.jsp (10)完成.
6.补充 HelloAction的调用步骤其实是: ServletDispatcher->GenericDispatcher->调用executeaction()->ActionSupport的execute()->调用HelloAction的相应方法. 5中的说明只是为了简单而这样描述的. 如果你对这些有兴趣,可以看看ServletDispatcher,GenericDispatcher,ActionSupport,Action等源码.
三. webwork自带例子Bank app的简单介绍 1.环境 http://localhost:8080/webwork 中JSP下面的Bank app 相关class:webapps/webwork/WEB-INF/lib/webwork-examples.jar中的webwork.examples.bank.Transfer 相关jsp: webapps/webwork/examples/bank/index.jsp,transfer.jsp,confirm.jsp 相关配置: webapps/webwork/-WEB-INF/classes/views.properties # Bank example (Struts example adaptation) bank.transfer.action=bank.Transfer (即webwork.examples.bank.Transfer) bank.transfer.input=transfer.jsp bank.transfer.success=confirm.jsp bank.transfer.error=transfer.jsp 由于webwork.properties配有 webwork.action.packages=webwork.examples, webwork.examples.vxml 因此上面配置bank.transfer.action=bank.Transfer省略了webwork.examples.
2.index.jsp <jsp:forward page="bank.transfer!default.action"/> 相当与 <form action="bank.transfer!default.action" method="post"> <input type="submit" /> </form> 自动提交. (1)提交到servlet, servlet处理bank.transfer!default.action(构成:actionAliasName+!commandName+.action) 由于action中有command(command为:default), 通过reflect查找doCommand即(doDefault), 执行doDefault()返回"input" (2)input对应的view为transfer.jsp,转到此页面. (3)输入参数后提交,执行bank.transfer.action, 其它流程与上面第二部分第5结类似.
===================================================================================kingfish 2004.3如转帖请保持文档完整.
欢迎交流!