Websharp 10 - Websharp Framework

在前面介绍的例子中,我们都是用Jsp作为Java代码的载体,这种方式很简单,但让人觉得有点别扭。Jsp本来就是一块显示HTML代码和Java代码的,而现在只有Java代码而没有HTML代码了,那么是否可以把全是Java代码的Jsp用纯Java类来实现呢?这就用到了Websharp Framework。这是一个简单的框架,其原理图如下:

 

image

当客户端的浏览器发起符合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"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <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>


    <filter>
        <filter-name>EncodingFilter</filter-name>
        <filter-class>
            websharp.web.EncodingFilter
        </filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>EncodingFilter</filter-name>
        <url-pattern>*.jsp</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>EncodingFilter</filter-name>
        <url-pattern>*.ws</url-pattern>
    </filter-mapping>

        <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

 

链接分析

我们先看看符合其要求的链接的格式:“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
    {
        Websharp websharp = new Websharp("/demo/hello.htm", "", request, response);
        websharp.setValue("Var", "Hello world Action!");
        websharp.render(null);

    }

}

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
    {
         websharp.setValue("Var", "Hello world ! Websharp Action");

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值