`
cui09
  • 浏览: 116580 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
最近访客 更多访客>>
社区版块
存档分类
最新评论

利用Java的反射的机制来简化Structs应用程序的开发(转)

阅读更多

本文讲述了如何利用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 id=" array " name=" array "></logic:iterate>type="com.bhsky.webis.Goods">
   
     
<bean:write name=" array " property="goodsid"></bean:write>

 
<bean:write name=" array " property="goodsname"></bean:write>

 
   
</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中显示:


  



     
用户ID 姓  名
<bean:write name="userList"></bean:write>property="usr_id"/> <bean:write name="userList"></bean:write>property="usr_name"/>

 


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

分享到:
评论

相关推荐

    Java Web Structs2开发

    通过学习和掌握以上这些核心概念,你可以有效地利用Struts2框架进行Java Web应用开发。在实际项目中,还需要结合其他技术,如Spring、Hibernate等,形成完整的Java EE解决方案。Struts2Demo项目可能包含了上述概念的...

    java学习(ssh) action structs spring hibernet

    在深入探讨Java学习过程中遇到的关于SSH(Struts、Spring、Hibernate)框架的问题之前,我们先来理解一下这三个框架的基本概念及其在企业级应用开发中的作用。 #### Struts框架 Struts是一个基于MVC(Model-View-...

    web开发实力 基于 structs2的开发

    Structs2是Golang社区为提高Web应用开发效率而设计的一个轻量级框架。它以简洁的API、高性能和易于学习的特点,受到了许多开发者的喜爱。Structs2基于Go的http.Handler接口,使得开发者可以快速构建RESTful API和...

    java 程序设计structs

    2. **开发 Web 应用程序发布配置描述器**:通常使用 web.xml 文件来定义应用的行为。 3. **编译 Web 应用程序及相关联的组件和类**:确保代码没有语法错误。 4. **将应用程序打包成一个部署单元**(可选):通常将...

    java版QQ空间日志 Structs框架

    Structs是一个强大的MVC(Model-View-Controller)框架,广泛应用于Java Web开发中,它简化了开发流程,提高了代码的可维护性和可扩展性。 首先,我们需要理解Structs框架的核心概念。Structs遵循MVC设计模式,将...

    Structs2开发中常用的jar包

    Structs2是一款基于Java的轻量级Web框架,它提供了强大的MVC模式支持,使得开发者可以更高效地构建Web应用程序。在Structs2的开发过程中,jar包是必不可少的组件,它们包含了运行和构建Structs2应用所需的类库。下面...

    java详解教程-structs 2

    Struts 2 框架作为Java Web开发中的明星框架,其数据传递模型的设计尤为关键,它不仅优化了传统的Servlet架构,还引入了一系列创新机制,如ValueStack和ActionContext,使得数据的处理更加灵活和高效。 **1.1 ...

    使用structs2快速开发

    Struts2 是一个流行的 Java Web 开发框架,它极大地简化了构建基于 MVC(Model-View-Controller)架构的Web应用程序的过程。使用Structs2进行快速开发可以提高开发效率,减少代码量,并提供丰富的功能和扩展性。以下...

    基于Structs开发的电子商务网站(java)

    在本项目中,Structs被用来构建一个功能全面的电子商务网站,这个网站包含了购物、支付、用户管理、商品展示等核心功能,对于学习和实践Java Web开发的学生或者开发者来说,是一个很好的参考实例。 1. MVC模式:...

    structs应用的一个小实例

    Struts 是一个开源的 Web 应用框架,它主要用于构建基于 Java 的企业级应用程序。这个小实例将带你深入了解如何在实际项目中应用 Struts 框架。在开始之前,让我们先了解一下 Struts 的核心概念。 1. **MVC模式**:...

    java软件开发工具structs2手册

    Struts2作为Java EE平台上的重要组件,其手册对于提升开发者的技术水平,理解和掌握企业级Web应用开发技术具有重要意义。 在压缩包中,"易网时代绿软基地.url"可能是一个链接到相关资源的快捷方式,而"NTsky新闻...

    structs框架

    Structs框架是一个基于Java的MVC(Model-View-Controller)设计模式的Web应用开发框架,它极大地简化了Java Web应用程序的开发流程。这个框架的主要目标是提高开发效率,提供可重用的组件,以及通过清晰的架构设计来...

    BBS.rar_bbs_java structs2_structs2 mysql

    总的来说,"BBS.rar_bbs_java structs2_structs2 mysql" 提示我们这是一个基于Java的论坛系统,采用Structs2框架进行开发,数据库层面选择了MySQL。这样的组合为开发人员提供了强大的工具集,便于构建功能丰富、性能...

    java structs框架

    Struts 是一个基于 Model-View-Controller(MVC)设计模式的Java Web应用程序框架,由Apache基金会的Jakarta项目开发。它的创始人是Craig R. McClanahan,Struts 1.0在2001年6月首次发布,为Java开发者提供了一个...

    java structs 科研成果管理系统

    Java 结构(Structs)是一种基于MVC(Model-View-Controller)设计模式的轻量级Web应用框架,主要用于简化企业级应用的开发工作。在"java structs 科研成果管理系统"中,我们可以看到Structs技术被应用于构建一个...

    利用JAVA开发的OA系统

    3. **Spring**:Spring框架是Java应用开发的核心框架,它提供了依赖注入(DI)和面向切面编程(AOP)等特性,支持事务管理、数据访问集成、Web应用等功能,为构建复杂的企业级应用提供了全面的支持。 4. **Ajax**...

    structs(三层结构).rar_java 3 tier example_java MVC_mvc_structs_子结构

    通过分析和研究这个例子,开发者可以更好地掌握如何组织和构建复杂的应用程序,以及如何利用三层架构来实现良好的代码结构和可维护性。同时,这也涉及到软件设计原则,如单一职责原则(SRP)和开闭原则(OCP),这些...

    structs2基本jar包

    总的来说,Structs2基本jar包是构建基于Structs2框架的Java Web应用的关键组件,它提供了丰富的功能和灵活性,帮助开发者快速、高效地开发高质量的Web应用。理解并掌握其核心概念和使用方法,对于提升Java Web开发...

    Java+structs快速学习指南

    - 示例:通过具体案例讲解如何更好地利用Struts框架的各项特性来提高开发效率。 3. **构建你的页面** - 内容:展示如何使用Struts来动态显示内容,介绍Tiles组件的使用方法,验证用户输入的方法,国际化支持,...

    Structs2 jar包

    Structs2是一个基于Java开发的轻量级框架,主要用于构建Web应用程序。这个jar包集合包含了Structs2框架的全部7个核心组件,适用于版本2.1。Structs2以其强大的MVC(Model-View-Controller)设计模式和丰富的插件支持...

Global site tag (gtag.js) - Google Analytics