使用ActionHandler进行WEB应用编程

1


 

技术手册系列

使用ActionHandler进行WEB应用编程


技术手册系列

使用ActionHandler进行WEB应用编程

ã xie ke

 


目录




 

第一章


 


第一章ActionHandler简介

介绍ActionHandler的目的、构成和实现

目的

web应用程序都包括客户端和服务器端,如下

 

客户端: 写一个form ,里面包括要处理的数据,formaction指向服务器端的某个servlet

 

服务器端:  写一个servlet,接受指定客户端的请求,取出传过来的客户数据,作相应处理,根据处理结果转到下一个页面

 

客户端,也就是jsp页面,主要是用于显示。主要的业务逻辑,以及流程控制,都在servlet里面。

在一个web应用中,客户的请求是非常多的,用户的每一次点击,几乎都对应了一此客户请求,我们可能会编写很多个servlet来处理这些不同的请求。但是很快就会发现,这些servlet所做的事情,有很多都是一样的,比如:权限控制,取客户端数据,页面转发...,另外还有很多类似的操作,比如分页查询,基本的增删改等等...,每次都写似曾相识的代码,这种感觉很不好,所以应该考虑extract出一个super class,让这个super class来做这些重复的工作,于是,我们就有了一个super Servlet,新增加的每个servlet都继承它,虽然我们的servlet数量并未减少,而且仍然需要为不断增加的servlet修改web app的配置文件,但工作显然要轻松多了。

但是事情还没完,因为客户端请求非常的多,我们不可能为每个请求写一个servlet,所以一个servlet处理多个请求变得不可避免,我们会发现,在servletdopost方法中,会出现一个庞大的条件判断代码,我们分析客户端请求,并调用不同的代码来处理它,大家都知道,冗长的方法,还有许许多多的if,或者是很多个caseswitch都是程序员的噩梦,或许你可以说dopost方法可以分解成许多个小方法,是的,你可以这样做,但是同时你还需要做的是在这些小方法之间传递许许多多的参数,不光是requestresponse,你不能把它们作为实例变量来避免方法间的参数传递,因为服务器端会生成一个servlet的新线程来处理一新请求, 我们都知道,线程之间是共享实例变量的,当你的实例变量在请求之间共享时,一些让人摸不着头脑的错误便出现了。

以上叙述了web开发的关于servlet的种种不爽的事情,但servlet其实是无辜的,它设计成这样必有它的道理,而我们要做的是,把它重新包装一下,让它能更好的适合我们的web 应用开发,其实,我们要做的并不多,下面让ActionHandler来解决这些问题。

 

ActionHandler的结构

ActionHandler的主要组成部分如下:

 

        通吃Servlet   GeneralHandleSvt.java

 

这个Servlet负责处理系统中一切请求,所以它叫统吃Servlet,这样做一个附加的好处是我们的web application 配置文件永远都不需要改了,因为永远都不会有新的servlet加入了。

GeneralHandlerSvt所做的事情非常简单:检查客户端传来的 reqType参数(这个 reqTypeActionHandler里面的保留字,当然你也可以用其它的来代替它,不过一定要在系统开始开发之前确定), reqType的值在客户端定义,格式是 aa.bb.cc.dd或者是 bb.cc.dd” ,其中cc 表示的是将处理这个请求的类,dd表示具体是cc类的哪个方法来处理请求,bb表示类的包名,aa表示bb外的包名(如果还有的话)   解析完 reqType后,把请求分发给指定类的指定方法。

 

类似GUI编程,每一个请求都被模拟成一个事件,reqType 指明这个事件的接收器对象cc,以及处理这个时间的方法 dd .

 

也就是说,我们再不用理会那些dopost方法了(甚至不用理会 requestresponse对象)

 

        Action处理父类对象 ActionHandler.java

 

所有客户请求处理类的父类,

这是一个抽象类

每个ActionHandler都隶属于一个模块(参见权限系统)

由于对于每个客户请求,GeneralHandleSvt都会生成一个新的ActionHandler对象来处理,所以ActionHandler的实例变量是安全的.

当一个新的ActionHandler生成之后,它会调用run方法,

 

run方法首先从session中取出调用者_employee,判断这个调用者是否具有访问这个模块的权限(参见权限系统)

生成一个jdo对象(参见JDO手册),以备客户调用

 

从客户端取出数据,组装成BizObject对象(参见JDO手册),放在参数表里面,以备客户调用

 

根据客户的请求调用相应的方法 进行进一步处理

 

以上各步骤如果出错的话,相应的错误处理机制将对其进行处理,根据Exception的类型(可控错误、可控提示、不可控异常),分别转到相应的处理页面,另外对jdo对象进行回滚(如果已经开始事务处理的话)

 

如果没有错误,jdo对象提交事务,关闭数据库连接,转页控制机制将转到相应的页面,并设置相应得页面提示信息

 

ActionHandler还内置了许多工具方法:

 

可以取得当前使用者

判断当前使用者对某个功能是否有权限

设置分页size

设置排序字段

分页显示对某个数据对象的查询结果

显示某个BizObject数据对象

根据特定的sql分页列表显示

从参数表中取得某个BizObject

...

 

还有很多就不再一一赘述,具体参看API

其中许多功能如分页显示查询结果,需与客户端显示页面配合使用,客户端用JSTL即可方便简洁地显示数据

 

子类继承ActionHandler后,只需编写特定的请求处理方法,详情可见下面的示例

 



第二章 ActionHandler 的使用

介绍ActionHandler的调用方法

客户端的action统一为GeneralHandleSvt,

必须拥有合法的reqType

客户端的要求form使用特定的书写格式 表名$字段名,以便ActionHandler能读懂并提取出BizObject数据至参数表,

 

下面是一个客户端form的例子

 

客户端jsp 调用 UserActionHandler.add实例:

 

<FORM action=GeneralHandleSvt method=post name=form1 >

 

<input type=hidden name="reqType"value="employee.UserActionHandler.add">

<input type=hidden name="user$uid" value=${obj.uid}>

<input type=hidden name="user$name" value=${obj.name}>

 

 

</FORM>

 

 

上面的客户端FORM的事件接收对象是 UserActionHandler对象,处理方法是add方法,下面是相应的服务器端代码:

 

服务器端UserActionHandler示例代码

 

 

 

 

public void add() throws SQLException{

 

 

    this.validCanDo(“user.add”) //是否有user.add权限

 

    this._jdo.beginTrans();  //开始事务处理

BizObject obj = this.getBizObjectFromMap(“User”); //取出user

 

 

 

this._jdo.add(obj);

 

this._tipInfo=”操作成功!  //客户端显示信息

   this._nextUrl=”/user/userinfo.jsp”;  //转发页面

}

 

 

 

下面是UserActionHandler的查询示例,listObjActionHandler内置查询方法,它会将查出的User 对象 ArrayList 放到约定好的 requestobjList 属性中,类似的方法还有 showObj

 

 

UserActionHandler查询示例

 

 

 

 

 

public void listUser() throws SQLException{

 

 

    this.validCanDo(“user.list”) //是否有user.list权限

 

    this.listObj(“user”);  //开始查询

 

this._tipInfo=”查询结果!  //客户端显示信息

   this._nextUrl=”/user/userList.jsp”;  //转发页面

}

 

 

 

客户端接收查询结果示例,从request对象objList 属性中取列表:

 

 

客户端jsp 接收 UserActionHandler.listUser查询结果示例:

 

 

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

 

 

 

<c:ForEach var="obj" items="${objList}" varStatus="status">

 <TR>

   <td> ${obj.uid} </td>

   <td> ${obj.name} </td>

</TR>

</c:forEach>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


第三章


 

 

 

 

 

 

 

第三章 ActionHandler API 参考

ActionHandler API

Class ActionHandler

java.lang.Object
  |
  +--sand.depot.actionhandler.system.ActionHandler

public abstract class ActionHandler

extends java.lang.Object

Author:

Administrator To change the template for this generated type comment go to Window>Preferences>Java>Code Generation>Code and Comments


Constructor Summary

ActionHandler(javax.servlet.http.HttpServletRequest req, javax.servlet.http.HttpServletResponse res)
          
构造器

 

 

Method Summary

 void

addOrUpdate()
          
处理添加或修改,由 objId 的值来决定

 void

addOrUpdate(tool.dao.AbstractSysObj aso)
          
处理添加或修改,由 AbstractSysObj.getID 的值来决定

 void

deleteAll(java.lang.String objType)
           

 void

destroy()
          Clean up resources

 void

dispatch(java.lang.String url)
           

 tool.dao.BizObject

getBizObjectFromMap(java.lang.String bizName)
          
request中取出组装好的bizObject

 java.util.ArrayList

getBizObjectWithType(java.lang.String bizType)
          
根据 BizObject 类型从request中取出组装好的bizObject

 java.lang.String

getHardcoreFilter()
           

 java.lang.String

getOrderBy()
           

 int

getPageSize()
          
属性 _pageSize 的获取方法。

 void

listObjWithQueryFactory(tool.dao.QueryFactory queryFactory)
          
根据自定义 QueryFactory 查询, 支持多 BizObject 组合查询

 void

listObjWithQueryFactory(tool.dao.QueryFactory queryFactory, java.lang.String qryParam)
          
根据自定义 QueryFactory 查询, 支持多 BizObject 组合查询

 void

putBizObjectInMap(tool.dao.AbstractSysObj aso)
          
向存放组装好的bizObjectMap中放入BizObject

 void

removeBizObjectFromMap(java.lang.String bizName)
          
map中移除组装好的bizObject

 void

run(java.lang.String methodName)
          
处理post请求 每个request请求都会运行本方法, 本方法所作的工作: 权限判断,当前用户是否对此模块有基本访问权限 生成相应的对象类型的JDO对象 根据传入的 mehodName 调用相应的方法

 void

setAttribute(java.lang.String attr, java.lang.Object value)
           

 void

setHardcoreFilter(java.lang.String filter)
           

 void

setOrderBy(java.lang.String by)
           

 void

setPageSize(int _pageSize)
          
属性 _pageSize 的设置方法。

 

Methods inherited from class java.lang.Object

equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

 

Constructor Detail

ActionHandler

public ActionHandler(javax.servlet.http.HttpServletRequest req,
                     javax.servlet.http.HttpServletResponse res)

构造器

Method Detail

getBizObjectFromMap

public tool.dao.BizObject getBizObjectFromMap(java.lang.String bizName)

request中取出组装好的bizObject

Parameters:

bizName -

Returns:


getBizObjectWithType

public java.util.ArrayList getBizObjectWithType(java.lang.String bizType)

根据 BizObject 类型从request中取出组装好的bizObject

Returns:


removeBizObjectFromMap

public void removeBizObjectFromMap(java.lang.String bizName)

map中移除组装好的bizObject

Parameters:

bizName -

Returns:


putBizObjectInMap

public void putBizObjectInMap(tool.dao.AbstractSysObj aso)

向存放组装好的bizObjectMap中放入BizObject

Returns:


listObjWithQueryFactory

public void listObjWithQueryFactory(tool.dao.QueryFactory queryFactory,
                                    java.lang.String qryParam)
                             throws javax.servlet.ServletException,
                                    java.sql.SQLException

根据自定义 QueryFactory 查询, 支持多 BizObject 组合查询

Parameters:

queryFactory - 自定义QueryFactory

qryParam - 指定的查询对象类型,如果为空,则把传来的所有BizObject都作为查询对象

Throws:

javax.servlet.ServletException

java.sql.SQLException


listObjWithQueryFactory

public void listObjWithQueryFactory(tool.dao.QueryFactory queryFactory)
                             throws javax.servlet.ServletException,
                                    java.sql.SQLException

根据自定义 QueryFactory 查询, 支持多 BizObject 组合查询

Throws:

javax.servlet.ServletException

java.sql.SQLException


addOrUpdate

public void addOrUpdate(tool.dao.AbstractSysObj aso)
                 throws javax.servlet.ServletException,
                        java.sql.SQLException

处理添加或修改,由 AbstractSysObj.getID 的值来决定

Parameters:

aso -

javax.servlet.ServletException

java.sql.SQLException


addOrUpdate

public void addOrUpdate()
                 throws javax.servlet.ServletException,
                        java.sql.SQLException

处理添加或修改,由 objId 的值来决定

javax.servlet.ServletException

java.sql.SQLException


setAttribute

public void setAttribute(java.lang.String attr,
                         java.lang.Object value)

deleteAll

public void deleteAll(java.lang.String objType)
               throws javax.servlet.ServletException,
                      java.sql.SQLException

javax.servlet.ServletException

java.sql.SQLException


destroy

public void destroy()

Clean up resources


run

public void run(java.lang.String methodName)
         throws javax.servlet.ServletException,
                java.io.IOException

处理post请求 每个request请求都会运行本方法, 本方法所作的工作: 权限判断,当前用户是否对此模块有基本访问权限 生成相应的对象类型的JDO对象 根据传入的 mehodName 调用相应的方法

Parameters:

methodName - 要处理的对象类型

Throws:

javax.servlet.ServletException

java.io.IOException


dispatch

public void dispatch(java.lang.String url)
              throws javax.servlet.ServletException,
                     java.io.IOException

javax.servlet.ServletException

java.io.IOException


getHardcoreFilter

public java.lang.String getHardcoreFilter()

Returns:

Returns the _hardcoreFilter.


setHardcoreFilter

public void setHardcoreFilter(java.lang.String filter)

Parameters:

filter - The _hardcoreFilter to set.


getOrderBy

public java.lang.String getOrderBy()

Returns:

Returns the _orderBy.


setOrderBy

public void setOrderBy(java.lang.String by)

Parameters:

by - The _orderBy to set.


getPageSize

public int getPageSize()

属性 _pageSize 的获取方法。

Returns:

属性 _pageSize 的值。


setPageSize

public void setPageSize(int _pageSize)

属性 _pageSize 的设置方法。

Parameters:

_pageSize - 属性 _pageSize 的新值。

 

 

 

 

 

 

Class GeneralHandleSvt

java.lang.Object
  |
  +--javax.servlet.GenericServlet
        |
        +--javax.servlet.http.HttpServlet
              |
              +--sand.depot.servlet.system.GeneralHandleSvt

All Implemented Interfaces:

java.io.Serializable, javax.servlet.Servlet, javax.servlet.ServletConfig


public class GeneralHandleSvt

extends javax.servlet.http.HttpServlet

通吃Servlet,处理系统一切请求

Author:

Administrator To change the template for this generated type comment go to Window>Preferences>Java>Code Generation>Code and Comments

See Also:

Serialized Form


Constructor Summary

GeneralHandleSvt()
           

 

 

Method Summary

 void

destroy()
          Clean up resources

 void

doGet(javax.servlet.http.HttpServletRequest req, javax.servlet.http.HttpServletResponse res)
          Process the HTTP Get request

 void

doPost(javax.servlet.http.HttpServletRequest req, javax.servlet.http.HttpServletResponse res)
          
处理post请求

 

Methods inherited from class javax.servlet.http.HttpServlet

service

 

Methods inherited from class javax.servlet.GenericServlet

getInitParameter, getInitParameterNames, getServletConfig, getServletContext, getServletInfo, getServletName, init, init, log, log

 

Methods inherited from class java.lang.Object

equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

 

Constructor Detail

GeneralHandleSvt

public GeneralHandleSvt()

Method Detail

destroy

public void destroy()

Clean up resources

Specified by:

destroy in interface javax.servlet.Servlet

Overrides:

destroy in class javax.servlet.GenericServlet


doGet

public void doGet(javax.servlet.http.HttpServletRequest req,
                  javax.servlet.http.HttpServletResponse res)
           throws javax.servlet.ServletException,
                  java.io.IOException

Process the HTTP Get request

Overrides:

doGet in class javax.servlet.http.HttpServlet

Parameters:

req - http请求

res - http响应

Throws:

javax.servlet.ServletException

java.io.IOException


doPost

public void doPost(javax.servlet.http.HttpServletRequest req,
                   javax.servlet.http.HttpServletResponse res)
            throws javax.servlet.ServletException,
                   java.io.IOException

处理post请求

Overrides:

doPost in class javax.servlet.http.HttpServlet

Throws:

javax.servlet.ServletException

java.io.IOException


第四章


第四章 Tomcat中配置ActionHandler

本章描述如何在Tomcat中配置ActionHandlerJakarta实现版本

下载

 

 

 

安装

 

 

 

示例和应用

 

### 回答1: fabric.Control 是 Fabric.js 中的一个控件类。使用方法是创建一个新的 fabric.Control 对象,然后将它添加到 canvas 上。 例如: ``` var canvas = new fabric.Canvas('canvas'); var control = new fabric.Control({ left: 100, top: 100, visible: true }); canvas.add(control); ``` 在创建 fabric.Control 对象时,可以通过传递选项对象来指定控件的位置(left 和 top 属性)以及是否可见(visible 属性)。还有其他的选项可以设置,详情可以参考 Fabric.js 的文档。 然后,使用 canvas.add 方法将控件添加到 canvas 中。这样就可以在 canvas 上显示控件了。 希望这个答案对你有帮助! ### 回答2: new fabric.Control 是Fabric.js中的一个类,用于创建自定义控件。 使用 new fabric.Control 创建一个控件实例时,可以通过传入一个对象作为参数来配置控件的一些属性和方法。其中一些常用的配置属性如下: 1. x、y、width、height:控制控件的位置和尺寸。 2. actionHandler:一个函数,用于定义控件的交互行为,例如控件被拖动或缩放时的处理逻辑。 3. actionName:一个字符串,用于指定控件的名字。 4. cursorStyle:一个字符串,用于指定控件的鼠标样式(例如默认、拖拽等)。 创建完控件实例后,可以通过 canvas.addControl(control) 将控件添加到画布上。在画布上添加控件后,用户就可以与控件进行交互,例如拖拽、缩放等操作。当用户操作控件时,Fabric.js会自动调用控件中定义的 actionHandler 函数来处理用户的操作行为。 可以通过控件的一些方法来对其进行操作,例如: 1. setVisible(bool):设置控件的可见性。 2. setActionHandler(handler):重新指定控件的交互行为处理函数。 3. setActionName(name):重新设置控件的名字。 4. setCursorStyle(style):重新设置控件的鼠标样式。 使用 new fabric.Control 创建自定义控件时,可以根据具体需求来定制控件的外观、交互行为等。同时,可以结合其他的绘图操作和控件事件来实现更复杂的交互效果。 ### 回答3: Fabric.Control是一个用于UI界面控制的框架,其使用方法如下: 1. 首先,需要导入相应的库文件和依赖项。在项目文件中添加引用,并引入正确的命名空间。 2. 在需要使用Fabric.Control的页面中,将其添加到XAML代码中。可以通过编写XAML代码手动定义控件的外观和布局,也可以通过可视化设计工具进行添加和修改。 3. 在代码中,可以通过使用控件的属性进行设置和配置。Fabric.Control提供了许多属性,例如颜色、大小、字体、样式等,可以根据需要进行设置。 4. 可以通过事件处理程序来响应控件的交互行为。Fabric.Control提供了一些常用的事件,如点击、拖动、滚动等,可以通过编写事件处理程序来实现相应的逻辑。 5. 在使用过程中,可以根据需要进行样式的自定义。可以使用XAML的Style或者通过代码设置控件的样式,以实现个性化的外观。 6. 可以使用数据绑定的方式,将控件与数据进行关联。通过绑定属性和数据源,可以实现动态显示和更新控件的内容。 7. 对于一些复杂的控件,可能需要使用布局容器进行包裹或者进行组合。可以使用StackPanel、Grid、List或者其他布局容器来实现更复杂的界面布局。 通过上述步骤,我们可以使用Fabric.Control框架来创建并使用各种UI界面控件,实现个性化的界面交互效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值