关于一个小设计帮忙求证

05-07-05 mawencai
         

本人在工作中设计了自己的一个算是小框架的东西,但不能取得经理跟同事的认同,所以想拿到网上,希望能够得到更多的意见,因为俺目前还是觉得自己的这套东西在所在项目开发过程中还比以前要简单些,并且维护性要好些.

基本思想是以映射实现的多控制器+命令模式来实现(个人看法是模块内的流集中放在控制器中要比放在命令类[如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());

}

}

         

banq
2005-07-06 09:25

非常不错,至少很创新。

有时适合自己的就是好的。你使用发贴时Code按扭,可以很好贴出源码。

mawencai
2005-07-06 10:04

俺非常希望了解其他的公司一般是怎样来开发b/s结构的应用程序的:(。

尤其是那些大型软件公司的具体开发方法,俺学历不高,英语又烂,唉,只能在墙外胡乱猜想,网上比较具体的例子感觉很少。而书本上的又通常并不是那么实用,麻烦,希望请有大型项目开发经验的朋友指点迷津

鲁中正气
2005-07-06 13:20

你的这个思想很好,只不过处理xml时不太妙影响了你那优美灵感的表达,呵呵。建议你把解析xml部分再进一步封装一下。

鲁中正气
2005-07-06 13:39

另外你的展现粒度太细了,省却了一些内容,却用其他形式换来了更为琐碎的一些问题。不过这只是说明你处理的不是很巧妙而已。你的思想已经有境界了。

另外,我告诉你特大型软件,如oracle erp ebs,我正在搞的,功能业务部份有专门的实施顾问,技术上,有自己的技术构架体系的,form,reports,discover,workflow等。其他大公司也有自己的,可能比oracle erp这种大东西小点,他们已经在他们多年的基础上,积累了很多东西了,不会一切都重新写或做大的修改的,每家有每家的特点,当然,有些我们看着很烂,但是重写或大概设计思想,我们没有那么多人力物力的。不过,作为自己技术的提升,多思考思考,试验试验,还是很有好处的。

2Go 1 2 下一页