关于一个小设计帮忙求证
本人在工作中设计了自己的一个算是小框架的东西,但不能取得经理跟同事的认同,所以想拿到网上,希望能够得到更多的意见,因为俺目前还是觉得自己的这套东西在所在项目开发过程中还比以前要简单些,并且维护性要好些.
基本思想是以映射实现的多控制器+命令模式来实现(个人看法是模块内的流集中放在控制器中要比放在命令类[如Action]中更方便,且容易调整和控制)
以BBS为例,前端有一个提交+显示的/bbs/index.jsp,页面提交至一个核心servlet映射后的地址/bbs/servlet。servlet调用模块事件bean,提交的命令参数cmd=add,调用BbsEvent中的add方法。整个应用程序中的控制器servlet只有一个,他会根据每个模块的不同请求而调用不同的事件bean,以下是模块bbs的几个关键文件。虽然每次执行命令都要通过servlet去解析xml配置文件,但同struts和其他框架相比,配置文件的数量以及其他方面的性能消耗要小的很多,struts俺没实际用过,只是简单看看,感觉如果要做相对复杂的项目恐怕会很麻烦。而且它也是单命令模式,每个命令都要专门制作一个action类,估计数据流表现的不会太清晰,当然这些都是咱不了解的情况下的表面看法,或许用熟的朋友会觉得方便。总的是希望有朋友先针对以下的几个文件给些意见,不胜感激,共同学习!
执行顺序:
cmd=add 解析xml 处理事件,添加记录
index.jsp ---> servlet --> BbsEvent.java
JSP页面表单index.jsp
<form name="form1" method="post" action="servlet?cmd=add">
<table width="400" border="0">
<tr>
<td>用户</td>
<td><input type="text" name="bbs_name"></td>
</tr>
<tr>
<td>性别</td>
<td><input name="bbs_sex" type="radio" value="1" checked>
先生
<input type="radio" name="bbs_sex" value="0">
女士</td>
</tr>
<tr>
<td>内容</td>
<td><textarea name="bbs_body" wrap="VIRTUAL"></textarea></td>
</tr>
<tr>
<td> </td>
<td> </td>
</tr>
<tr>
<td colspan="2"><input type="submit" name="Submit" value="添加"></td>
</tr>
</table>
</form>
核心控制器,映射/bbs/servelt
---Servlet----
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
/* 获得模块的描述影射文件路径 sample:/bbs/path */
String sXmlMapping = req.getServletPath();
//获取模块名称,注:适用于一级模块
sXmlMapping = getModulePath(sXmlMapping);
/* 获取调用事件的名称 */
String sEventName = req.getParameter("cmd");
/* 获取默认页面的地址 */
String sDefaultPath = null;
/* 准备解析XML配置文件 */
SAXBuilder saxBuilder = new SAXBuilder(false);
InputStream oInput =
getServletContext().getResourceAsStream(
"/WEB-INF/" + sXmlMapping + "-mapping.xml");
//测试是否有XML的输入流,如果没有则返回
try
{
oInput.markSupported();
}
catch (Exception e)
{
System.out.println("未找到模块的影射文件!");
System.err.println(e.toString());
return;
}
try
{
//根据URL获取XML文档
//Document oDocument = saxBuilder.build(oUrl);
Document oDocument = saxBuilder.build(oInput);
//获取根节点
Element oRoot = oDocument.getRootElement();
//调用控制方法的对象,指定为模块事件类
//oRoot.AttributeValue("class")表示事件类的完整名称
HandleMethod oMethod =
new HandleMethod(oRoot.getAttributeValue("class"));
//获取根节点下面的一级子节点
List oChildren = oRoot.getChildren();
//遍历子节点
for (int i = 0; i < oChildren.size(); i++)
{
//获得子节点
Element oElement = (Element) oChildren.get(i);
//如果该子节点无name属性,则说明该节点为表示默认页面的节点
if (oElement.getAttributeValue("name") == null)
{
//获得默认页面
sDefaultPath = oElement.getText();
}
else
{
//该节点为表示事件的节点
//如果该节点的事件不是客户端提交的事件,则跳过
if (!sEventName.equals(oElement.getAttributeValue("name")))
{
continue;
}
//该节点描述的事件是客户提交的事件
String sSuccessCode = null; //成功事件
String sFaileCode = null; //失败事件
String sSuccessType = null; //成功类别
String sFaileType = null; //失败类别
//获得节点的具体事件描述
List oResult = oElement.getChildren();
for (int j = 0; j < oResult.size(); j++)
{
oElement = (Element) oResult.get(j);
//对成功事件的描述
if (oElement.getName().equals("success"))
{
sSuccessCode = oElement.getChildText("write-js");
sSuccessType = "javascript";
if (sSuccessCode == null)
{
sSuccessCode =
oElement.getChildText("location");
sSuccessType = "location";
}
}
//对失败事件的描述
else if (oElement.getName().equals("faile"))
{
sFaileCode = oElement.getChildText("write-js");
sFaileType = "javascript";
if (sFaileCode == null)
{
sFaileCode = oElement.getChildText("location");
sFaileType = "location";
}
}
//是否需要重新指定方法名[默认调用的方法名与提交的cmd参数一致]
else if (oElement.getName().equals("method-mapping"))
{
sEventName = oElement.getText();
}
}
//调用事件类的具体方法
if (oMethod.invoke(sEventName, req))
{
if (sSuccessType.equals("javascript"))
{
Write.printJavaScript(
resp,
this.parseLocate(req, sSuccessCode));
}
else
{
resp.sendRedirect(
this.parseLocate(req, sSuccessCode));
}
return;
}
else
{
if (sFaileType.equals("javascript"))
{
Write.printJavaScript(
resp,
this.parseLocate(req, sFaileCode));
}
else
{
resp.sendRedirect(
this.parseLocate(req, sFaileCode));
}
return;
}
}
}
}
catch (Exception e)
{
System.err.println(e);
}
//如果无符合条件的记录,则返回默认页面
resp.sendRedirect(sDefaultPath);
}
事件描述文件
---bbs-mapping.xml---
<?xml version="1.0" encoding="gb2312"?>
<event-bean class="com.phuan.jtwf.bbs.BbsEvent">
<event-type name="add">
<method-mapping>addBbs</method-mapping>
<success>
<write-js>alert('添加成功!');window.location='index.jsp;</write-js>
</success>
<faile>
<location>index.jsp</location>
</faile>
</event-type>
<event-type name="mod">
<success>
<write-js>alert('修改成功!');window.location='index.jsp';</write-js>
</success>
<faile>
<write-js>alert('修改失败!');window.location='index.jsp';</write-js>
</faile>
</event-type>
<event-type name="del">
<success>
<write-js>alert('删除成功!');window.location='index.jsp';</write-js>
</success>
<faile>
<write-js>alert('删除失败!');window.location='index.jsp';</write-js>
</faile>
</event-type>
<default-page>index.jsp</default-page>
</event-bean>
事件bean
---BbsEvent
public class BbsEvent
{
OperateSQL oSql = new OperateSQL();
SelectObject selectObject = null;
public boolean addBbs(HttpServletRequest request)
{
selectObject = new SelectObject("test_bbs");
selectObject.setValue("bbs_id", "test_bbs_id.NEXTVAL");
selectObject.setValue("bbs_usr", request.getParameter("bbs_name"));
selectObject.setValue("bbs_date", "sysdate");
selectObject.setValue("bbs_sex", request.getParameter("bbs_sex"));
selectObject.setValue("bbs_body",request.getParameter("bbs_body"));
return oSql.execute(selectObject.getInsertString());
}
}