运用类反射机制简化Struts应用程序的开发

本文讲述了如何利用Java的反射的机制来简化Structs应用程序的开发。

Struts中引入ActionForm类的意义与缺陷:

在Struts应用程序中,ActionForm是一个很重要的概念,它的主要功能就是为Action的操作提供与客户表单相映射的数据(如果在客户指定的情况下,还包括对数据进行校验)。Action根据业务逻辑的需要,对数据状态进行修改,在改变系统状态后,ActionForm则自动的回写新的数据状态并保持。程序员对JSP与ActionForm Bean的对应关系,通常感到很迷惑,JSP与ActionForm到底是1:1,还是N:1,对此,Struts本身对此并没有提出自己的观点。无论是一对一,还是多对一,Struts本身并不关心,它都能很好得工作。Struts在它的开发文档中指出,对于较小规模的开发,开发人员可以根据自己的需要,每个模块只写一个ActionForm Bean,甚至整个应用程序只写一个ActionForm Bean.当然,Struts也不反对每个ActionForm Bean只对应一个JSP,他们之间的对应关系,由开发人员自己决定。

在我看来,正如Entity EJB对J2EE的重大贡献一样,Entity EJB使得程序员对二维关系数据库的存取对象化了,程序员可以使用Set 或者Get等面向对象的方法来操纵关系数据库的数据,而ActionForm也使得程序员对网页的数据存取奇迹般的对象化了,程序员同样也可以使用Set 或者Get等面向对象的方法存取网页上的数据,这是一个开发模式方式上的重大转变。基于此,我个人认为ActionForm与JSP即VIEW层的关系最好是一对一的关系,这样,在理解上会更清晰一些。但是,这样也会带来一个很现实的问题,在一个应用程序中,也许有非常多得JSP页面,如果每个ActionForm 都只对应一个JSP页面,那么系统的Java代码就会急剧膨胀起来,而且,每个ActionForm都是只有很简单的Set或者Get方法存取数据,那么,如何简化Struts应用程序的开发呢?

在Struts1.1 中,Struts引入了DynaActionForm和Dyna Bean,试图解决这个问题,在我看来,DynaActionForm的引入,破坏了对网页存取对象化的概念,使开发人员重新回到了使用HashTable、Map、Collection、ArrayList等集合对象来实现对数据进行存取的老路上来。虽然应用程序的灵活性大大增加了,但是代码的可读性也大大降低了,开发人员之间的交流难度也增加了。

在传统的应用程序对ActionForm Bean的访问中,我们通常都写成如下的形式:


Connection conn=DriverManager.getConnection("JDBC URL ");
sql=" select * from some tables ";
PreparedStatement stmt = conn.prepareStatement(sql);
ResultSet rs = stmt.executeQuery();
ArrayList array=new ArrayList();
while (rs.next()) {
AActionForm actionForm =new AActionForm ();
actionForm.setId(rs.getString("Id"));
actionForm.setName(rs.getString("Name"));
array.add(actionForm);
}

在Action 的Execute方法中,我们 把这个集合用request.setAttribute("array", array)存储起来,然后在JSP页面中,我们用iterate Tag把数据循环现实出来。代码通常都是这个样子:


<logic:present name=" array " scope="request">
<logic:iterate name=" array " id=" array "
type="com.bhsky.webis.Goods">
<tr align="center">
<td class="table2">
<bean:write name=" array " property="goodsid"/>
</td>
<td class="table2">
<bean:write name=" array " property="goodsname"/>
</td>
</tr>
</logic:iterate>
</logic:present>

在Struts中,对数据的访问和显示的写法通常都是很固定的,在VIEW层,我们是没有办法简化自己的代码的,在Action层,其写法通常也很固定,只是做一个页面的跳转,商业逻辑和对数据得访问,通常都是放在JavaBean中。那么,在此,我提出一种运用类反射的机制,使应用程序对ActionForm Bean的赋值自动化,即应用程序通过一个简单的接口,使用一个通用的方法,就可以完成对ActionForm Bean的赋值,而不必在每个使用ActionFormBean的地方,都把数据库中的值手动赋值给ActionForm Bean,然后再在JSP页面中显示出来。虽然它不能减少ActionForm Bean的数量,但是,它至少使应用程序对ActionForm Bean的赋值自动化了,从而减少了程序出错概率,提高了程软件开发效率。




类反射的概念:

关于类反射的概念,在此我就不详细介绍了,它不是本文的重点,IBM developerWorks网站上有大量介绍类反射概念的文章,大家可以找出来参考一下。其实,Struts本身就大量利用了类反射的机制。



如何应用类反射机制简化Struts应用程序的开发:

1、 先定义Action FormBean:


package com.bhsky.webis.system;
import org.apache.struts.action.*;
import javax.servlet.http.*;

public class UsersActionForm extends ActionForm {
private String usr_id;
private String usr_name;
public void setUsr_id(String usr_id) {
this.usr_id = usr_id;
}
public String getUsr_id() {
return usr_id;
}
public String getUsr_memo() {
return usr_memo;
}
public void setUsr_name(String usr_name) {
this.usr_name = usr_name;
}
}

2、 编写通用的为ActionFormBean赋值的方法:


/////////////////////////////////////////////////////////////////////////////
//Function: 完成ResultSet对象向ArrayList对象为集合的对象的转化
//Para:sql,指定的查询Sql
//Para:className,Sql相对应得JavaBean/FormBean类的名字
//Return:以类className为一条记录的结果集,完成ResultSet对象向ArrayList对象为集//合的className对象的转化
//////////////////////////////////////////////////////////////////////////////
public ArrayList Select(String sql,String className){
ArrayList paraList=new ArrayList();
try{
if (conn == null){
Connection();
}
PreparedStatement stmt = conn.prepareStatement(sql);
ResultSet rs = stmt.executeQuery();
String recordValue="";
Object c1=null;
paraList=new ArrayList();
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
while (rs.next()){
c1=Class.forName(className).newInstance();
for (int i=1; i<=columnCount; i++) {
if(rs.getString(rsmd.getColumnName(i))!=null){
recordValue=rs.getString(rsmd.getColumnName(i));
}else{
recordValue="";
}
Method
m=c1.getClass().getMethod(getSetMethodName(rsmd.getColumnName(i)),
new Class[]{recordValue.getClass()});
m.invoke (c1, new Object[]{recordValue});
}
paraList.add(c1);
}
}catch(SQLException ex){

}catch(ClassNotFoundException e){

}catch(NoSuchMethodException e) {

}catch(InvocationTargetException e){

}catch (IllegalAccessException e){

}catch(InstantiationException e){

} finaly{
closeConnection();
return paraList;
}
}

3、 在JavaBean封装的商业逻辑中调用Select 方法,然后在JSP页面上显示出来:


//Function:取得用户列表
//Para:
//Return:返回用户列表
/////////////////////////////////////////////////////////////////////////////
public ArrayList getUsers(){
ArrayList ret=null;
DatabaseManage db=new DatabaseManage();
String sql=" select usr_id,usr_name "
+" from users " ;
ret=db.Select(sql," com.bhsky. webis.system.UsersActionForm");
return ret;
}

4、 在Action的execute方法中调用getUsers()方法:


public ActionForward execute(ActionMapping actionMapping, ActionForm actionForm,
HttpServletRequest request, HttpServletResponse httpServletResponse)
{
/**@todo: complete the business logic here, this is just a skeleton.*/
UsersActionForm uaf=(UsersActionForm)actionForm;
SystemService ubb=new SystemService();
ArrayList userList=ubb.getUsers();
request.setAttribute("userList",userList);
ActionForward actionForward=actionMapping.findForward(url);
return actionForward;
}

5、 在JSP中显示:


<table width="700" class="1" border="1" cellspacing="1" align="center">
<tr>
<td class="list" >用户ID</td>
<td class="list" >姓&#160&#160名</td>
</tr>
<logic:present name="userList" scope="request">
<logic:iterate name="userList" id="userList"
type="com.bhsky.webis.system.UsersActionForm">
<tr>
<td class="cell1" height="22"><bean:write name="userList"
property="usr_id"/></td>
<td class="cell1" height="22"><bean:write name="userList"
property="usr_name"/></td>
</tr>
</logic:iterate>
</logic:present>
</table>

我们通过运用类反射机制,在一个Struts应用开发中,完成了一个通用查询方法的实现。它使得程序员摆脱了在每个应用程序中都要编写枯燥的set、get等方法来访问ActionForm Bean,从而简化了Struts应用程序的开发。

struts简化开发--使用动态Form简化开发???????

08-19

首先在struts-config.xml里面配置rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn ……rnActionrn编码:public ActionForward execute(ActionMapping mapping, ActionForm form,rn HttpServletRequest request, HttpServletResponse response) rn // TODO Auto-generated method stubrn //如果没有登录到登陆页面rn HttpSession session=request.getSession(false);rn USER user=null;rn //如果session存在rn if(session!=null)rn //取出来赋给userrn user=(USER)session.getAttribute("user");rn rn rn if(user==null)rn //如果user不存在就返回到登陆页面rn return mapping.findForward("login");rn rn rn //如果没有确认就到确认页面rn String confirm=request.getParameter("confirm");rn if(null==confirm || !"yes".equals(confirm))rn return mapping.findForward("confirm");rn rn //调用业务逻辑方法,插入数据到数据库rn try rn //第二章使用的rn //使用动态的form简化开发rn DynaActionForm fwxxForm=(DynaActionForm)form;rn FWXX fwxx=new FWXX();rn fwxx.setTitle(fwxxForm.getString("title"));rn fwxx.setTelephone(fwxxForm.getString("telephone"));rn fwxx.setTing((Integer)fwxxForm.get("ting"));rn fwxx.setShi((Integer)fwxxForm.get("shi"));rn fwxx.setZj((Integer)fwxxForm.get("zj"));rn fwxx.setUid((Integer)user.getUid());rn fwxx.setJdid((Integer)fwxxForm.get("jdid"));rn fwxx.setLxid((Integer)fwxxForm.get("lxid"));rn fwxx.setFwxx(fwxxForm.getString("fwxx"));rn fwxx.setLxr(fwxxForm.getString("lxr"));rn fwxx.setDate(df.format(new Date()));rn //biz.post(fwxx);*/rn //使用实体类简化开发rn //FwxxForm fxxForm=(FwxxForm)form;rn //FWXX fwxx=fxxForm.getItem();rn s=post.add(fwxx);rn if(s>0)rn request.setAttribute("msg","发布成功");rn return mapping.findForward("index");rn elsern request.setAttribute("msg","发布失败");rn return mapping.findForward("error");rn rn catch (RuntimeException e) rn // TODO Auto-generated catch blockrn request.setAttribute("msg", "出错了:"+e.getMessage());rn return mapping.findForward("error");rn rn rn rnrn之前有一个注册jsp页面,后面还有一个取出注册页面所填写的值,可是就是取不到值是怎么回事?我是struts初学者请各位高手指点,最好详细点,小弟在此先谢了,rn显示值的页面rn$fwxxForm.title rn rn 电话/手机:$fwxxForm.telephone rn rn rn 联系人:$fwxxForm.lxr rn rn rn 户型:$fwxxForm.shi 室$fwxxForm.ting 厅rn rn rn 价格:$fwxxForm.zj rn rn rn 发布时间:$fwxxForm.date rn rn rn $fwxxForm.fwxx rn rn rn rn rn rn rn rn rn rn rn rn

运用 ArcGIS Engine 开发应用程序

01-21

rnrn运用 ArcGIS Engine 开发应用程序 rnrn开发者可以在他们自己选择的集成开发环境下,开发ArcGIS Engine应用程序,例如: rnrn对Windows开发者来说有Microsoft Visual Studio或Delphi rnrn对Java开发者来说有ECLIPSE,Sun ONE Studio或Borland’s JBuilder rn开发者使用集成开发环境注册ArcGIS Engine开发组件,然后建立一个基于窗体的应用,添加ArcGIS Engine组件并编写程序代码构建自己的应用。rnrn例如,一个Java开发者,通过添加一个地图控件、一个内容表和一些选择工具条,建立一个面向GIS的地图应用。开发者可以将ArcMap MXD文件与地图控件关联,并为特定任务编写按钮和其他功能。最终的应用程序可能会分发给许多用户。rnrn部署 ArcGIS Engine 应用程序 rnrn一旦开发完成,ArcGIS Engine应用可以安装在以下两种类型的ArcGIS许可环境下: rnrnArcGIS Engine运行时许可可以用来运行ArcGIS Engine应用 rnrn现有的ArcGIS桌面许可(也就是ArcView,ArcEditor和ArcInfo运行许可)可用来配置运行ArcGIS Engine应用 rnArcGIS Engine运行时安装光盘包括在ArcGIS Engine介质包中并可以被安装和配置在多台计算机上。每个运行ArcGIS Engine的应用需要一个单独的授权文件。授权文件需要单独的选项许可来运行包含ArcGIS Engine选项的应用。 rnrnrnrn怎样应用 ArcGIS Engine ? rnrnArcGIS Engine可用来建立广泛的GIS应用,并在任何应用中嵌入GIS功能。一些GIS部门想为他们的终端用户创建特定的附带工具的GIS浏览窗口。在其它情况下,一部分GIS功能与其它工具结合,去完成一些重要的任务和工作流程。 rnrn例如:一个城市的政府部门可能想建立一系列特定的地块浏览应用,访问GIS数据库信息,并与关键的企业工作流程,如申请许可,税务管理,规划等相结合。rnrnrnrnArcGIS Engine 开发环境 rnrnArcGIS Engine 城市宗地应用 rnrn rnrn通过 ArcGIS Engine 3D 扩展定制的交互式全球浏览应用rnrnArcGIS Engine 组件可以嵌入到微软 Word 文档和 Excel 电子表中 rnrn为什么使用 ArcGIS Engine ?rnrn许多用户要求有特定的、轻量级的GIS应用,可以是独立的应用程序或嵌入到其他应用中。例如,用户也许需要的功能比ArcView弱,但仍需要在应用中实现复杂的GIS逻辑。在这种情况下,用户需要有特定的、定制的GIS应用,ArcGIS Engine为此提供了一个低成本的、轻量级的选择。 rnrnArcGIS Engine被用来: rnrn在定制的应用程序中嵌入GIS逻辑 rnrn有效地构建和配置GIS应用程序 rnrn在简单的应用中实现高级的GIS逻辑 rnrn在其它的应用程序中嵌入GIS和地图 rnrn用C++或Java建立跨平台的应用

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试