在前面介绍的例子中,我们都是用Jsp作为Java代码的载体,这种方式很简单,但让人觉得有点别扭。Jsp本来就是一块显示HTML代码和Java代码的,而现在只有Java代码而没有HTML代码了,那么是否可以把全是Java代码的Jsp用纯Java类来实现呢?这就用到了Websharp Framework。这是一个简单的框架,其原理图如下:
当客户端的浏览器发起符合Websharp Framework规范的请求后,服务器端会调用Websharp Framework的核心分发对象websharp.web.DispatchServlet来处理客户端的请求,根据请求的不同,把请求发送到相应的Action对象,而Action对象则处理业务逻辑(可以与模板结合),最后把处理的结果返回客户端。
配置web.xml
在Websharp开发过程中,你会发现基本上没有配置文件,和Spring、struts迥然不同,这是为了最大程度减少程序开发的繁琐性。但是为了使Websharp Framework工作,还是需要做少量的配置—— 需要配置web.xml 。在下载的Webshapr包中,已经有一个配置好的web.xml了,如果没有必要,可以不做修改。我们来看看web.xml的内容:
1) 首先需要配置一个servlet,servlet-class必须是websharp.web.DispatchServlet这个分发对象。servlet的参数可以指定了编码和错误页面。这个编码指的是模板文件的编码,一般建议用UTF-8。设置load-on-startup为1,表示在启动时就运行这个servlet。必须为servlet指定url-pattern,例如指定*.ws,则此servlet会处理浏览器发送过来的以.ws结尾的链接。
2)如果是非纯英文的系统,在java中获取表单提交的参数可能需要转码,否则乱码,这时使用EncodingFilter则可以避免手工地去转码。需要给EncodingFilter指定编码,一般和Jsp页面的编码一致。
<?xml version="1.0" encoding="UTF-8"?> <display-name>Websharp</display-name> <servlet><servlet-name>DispatchServlet</servlet-name> <servlet-class>websharp.web.DispatchServlet</servlet-class> <init-param> <param-name>charset</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>errorPage</param-name> <param-value>/error.jsp</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>DispatchServlet</servlet-name> <url-pattern>*.ws</url-pattern> </servlet-mapping> <welcome-file-list> |
链接分析
我们先看看符合其要求的链接的格式:“web路径/Action类名.ws”,例如“http://localhost:8080/admin/com.action.UserAction.ws”,在这个链接中admin是web路径,相关的图片、js资源与这个路径有关,而com.action.UserAction类就是业务处理的Action类了,DispatchServlet会把请求发给com.action.UserAction这个类,让其处理客户端的请求。所以,符合Websharp Framework的请求是以“处理类名+.ws”结尾的,而前面带的路径就是为了定位图片等资源文件用的,不管是admin/com.action.UserAction.ws 还是 manager/com.action.UserAction.ws ,最终都是转到com.action.UserAction这个类。
编程
就是继承websharp.web.WebAction或者websharp.web.WebsharpAction这两个虚拟类,实现自己的Action对象。WebAction类可以随意指定模板文件,操作比较灵活;WebsharpAction默认使用与类名同目录同命名的以.htm为扩展名的模板文件,例如com/A.class 对应的模板是com/A.htm,而且模板对象Websharp 自动创建和render的。
WebAction和WebsharpAction都包含了init、work和destroy三个虚拟的方法,实现自己的Action就要实现这三个方法。每一次请求都会执行init、work和destroy这三个方法,这和servlet不太一样,servlet中的init和destroy一般只执行一次。在init和work中不管是否抛出异常,最后都会执行destroy这个方法。所以一般在init中初始化对象,在work实现业务逻辑,而在destroy中释放对象。
1)WebAction例子。用到web目录下的模板/demo/hello.htm,调用链接参考: http://localhost:8080/demo.Action1.ws
package demo; import websharp.web.*; public class Action1 extends WebAction public void destroy() throws Exception } public void init() throws Exception } public void work() throws Exception } } |
2)WebsharpAction例子。默认调用了和demo/Action2.class同一目录的Action2.htm。Websharp 对象不用创建,也不用在最后的时候执行render()输出。work()方法里面只需要给模板变量赋值就可以了。如果需要用到资源文件,请在work()里面执行websharp.setResource(resource)方法即可。调用链接参考:http://localhost:8080/demo.Action2.ws
package demo; import websharp.web.WebsharpAction; public class Action2 extends WebsharpAction public void destroy() throws Exception } public void init() throws Exception } public void work() throws Exception } } |