实现struts的前台参数到后台的自动转换

    在使用struts的时候,感觉struts的前后台参数传输挺有用的,但又不希望把struts都放到项目内,而且也不可能(某些项目已经完成了,再修改不方便)。所以尝试做了一下struts中的实现。
    主要实现功能:在前台的html或者jsp提交的form中,有许多参数,把这些参数都放到某个bean内,只要后台提交后,调用相应的处理模块,就能直接处理那个参数bean,而不需要再做一些前台的参数获取,比如req.getParameter等这些语句,做到数据隔离的方式。

以下为实现的处理模块的类:
package com.XXXX.common;

import java.lang.reflect.Field;

import javax.servlet.http.HttpServletRequest;


public class ParaPro {

 public Object fillBean(HttpServletRequest req) {
  Object retObj = null;
  String BeanName = (String) req.getParameter("ParaClass");
  System.out.println("bn is " + BeanName);
  try {
   retObj = Class.forName(BeanName).newInstance();
  } catch (InstantiationException e) {
   // TODO 自动生成 catch 块
   e.printStackTrace();
  } catch (IllegalAccessException e) {
   // TODO 自动生成 catch 块
   e.printStackTrace();
  } catch (ClassNotFoundException e) {
   // TODO 自动生成 catch 块
   e.printStackTrace();
  }

  Field fields[] = retObj.getClass().getDeclaredFields();
  String fieldName;
  String fieldType;
  String strGetParameter;
  for (int i = fields.length - 1; i > -1; i--) {
   fields[i].setAccessible(true);
   fieldName = fields[i].getName();
   fieldType = fields[i].getType().toString();
   try {
    if (req.getParameter(fieldName) != null) {
     System.out.println(fieldType.toString());
     if (fieldType.equals("class java.lang.Integer")) {
      fields[i].set(
       retObj,
       new Integer(req.getParameter(fieldName)));
      System.out.println(
       "fieldName is "
        + fieldName
        + " type is "
        + fieldType);
     }

     if (fieldType.equals("class java.lang.String")) {
      fields[i].set(retObj, req.getParameter(fieldName));
      System.out.println(
       "fieldName is "
        + fieldName
        + " type is "
        + fieldType);
     }

    }

   } catch (IllegalArgumentException e1) {
    // TODO 自动生成 catch 块
    e1.printStackTrace();
   } catch (IllegalAccessException e1) {
    // TODO 自动生成 catch 块
    e1.printStackTrace();
   }

  }

  return retObj;
 }

}

以下为提交后的servlet的处理:
package com.XXXX.common;

import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @version  1.0
 * @author
 */
public class argProcess extends HttpServlet implements Servlet {

 /**
 * @see javax.servlet.http.HttpServlet#void (javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
 */
 public void doPost(HttpServletRequest req, HttpServletResponse resp)
  throws ServletException, IOException {
 Object obj_tmp=null;
 ParaPro paraPro=new ParaPro();
 System.out.println("begin"+(String)req.getParameter("ParaClass"));
 obj_tmp=paraPro.fillBean(req); 
 
 ParaBean pb=(ParaBean)obj_tmp;
 
 System.out.println("get is "+pb.BeginDate+" rate is "+pb.Rate); 

 }

}
以下为所用的参数bean:
public class ParaBean {
 
 String BeginDate;
 String EndDate;
 String SalesCode;
 Integer Rate;

}

以下为调用提交的html:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0012)http://amis/ -->
<HTML><HEAD><TITLE></TITLE>
<META content="text/html; charset=gb2312">

 


<META content="MSHTML 5.00.3315.2870" name=GENERATOR></HEAD>
<BODY bgColor=#ffffff leftMargin=0 >

  <FORM action="/argProcess" method=post name=login >
<INPUT type="text" name="BeginDate" size="20" value="20041201">
<INPUT type="text" name="EndDate" size="20" value="20041231">
<INPUT type="text" name="Rate" size="20" value="3">
    <INPUT type="submit" name="submit" value="确认">
 <INPUT type="text" name="ParaClass" size="50" value="com.XXXX.ParaBean">  
  </FORM>

 

</BODY>
<HEAD>
<META http-equiv=Expired content="Fri,21 Dec 2002 00:00:00 GMT">
<META http-equiv=PRAGMA content="no-cache">
<META http-equiv=CACHE-CONTROL content="MAX-AGE=1">
</HEAD>
</HTML>

以上程序做的东西,其实就是在HTML文件中,把要处理的bean的名字以及bean内的参数都作为参数传输到servlet里面,然后调用后台处理类,根据bean的名字来获取相应的bean的结构并且把前台参数分别对应的内容填写到这个新生产的bean里面,然后再由后台做处理。

至于相关的技术,我是看struts的文档,内部连接到sun的文档的:
http://java.sun.com/docs/books/tutorial/reflect/
以上例子在websphere的wsad5.1中运行通过
其实我的处理还没有完成,只处理了String 和Integer,不过其他类型可以继续加上去。
而且中文的传输也是要考虑的,错误处理也没有完成,等等
希望有高手能看完以上的代码,做点意见啦,谢谢!

用了这个处理类后,假设1个查询有3个参数,如果系统有10个查询,就能省略30行代码。
而且最重要的是这些参数的传输都主动化了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值