服务器的Servlet层的数据封装 与 浏览器的表单的数据传送 ,并启发画出增、改的技术路线图。

通过之前的文章,已经知道,浏览器的表单如果将HTTP请求发往服务器上的某个Servlet,那么表单的action属性值可以是:

<form action="XXX...Servlet" method="post">

服务器上的Servlet,其中的doGet(request , response )  或 doPost方法,内部会涉及到一些重要的HttpRequest对象方法,和重要的第三方包的用法,这里予以总结。

先总结Servlet如何获取HTML页面发来的请求数据,与之相关的方法。

1、setAttribute    作用:多用于向reuquest对象中存放数据,以便在请求转发之后,在其他的Servlet中进行getAttribute获取;还可以存入request域之后,由jsp页面拿出展示。

向request域中存放对象数据的方法,第一参数是名字,第二参数是对象。其他的session域等也有这种方法。

javax.servlet
Interface ServletRequest

 voidsetAttribute(java.lang.String name  ,   java.lang.Object o)
          Stores an attribute in this request.

对应的取出request域对象的方法:

 

 java.lang.ObjectgetAttribute(java.lang.String name)
          Returns the value of the named attribute as an Object, or null if no attribute of the given name exists.

 

 

2、getParameter   作用:前端表单代码、Servlet的doPost代码见下方

 

javax.servlet
Interface ServletRequest

All Known Subinterfaces:

HttpServletRequest

 

 

 java.lang.StringgetParameter(java.lang.String name)
          Returns the value of a request parameter as a String, or null if the parameter does not exist.
<body>
    <font  size = "5" color ="blue">圆面积计算</font><br>
    <form action = "home/CCarea" method = "post">
    	请输入半径r:<input type="text" name = "radius" value = "0"size ="4"/> &nbsp&nbsp
    	<input type="submit"  value = "计算"/><br><br>
    	面积s为:<input type="text" name = "area"size ="7"/>
    
    </form>
  </body>
	//Servlet的doPost中的核心代码

            double r,s;
		String radi = request.getParameter("radius");
		if(radi==null)
			{s= 0.0;}
		else{
			r= Double.parseDouble(radi);
			s=3.14*r*r;
		}

String  getParameter(String str)作用是,取出表单中的input标签 中 的 name 属性值str,返回值是value类型也是String。

我相信,在学习过了XML之后,对HTML的标签、标签的属性、标签属性的属性值,都会有更深的理解,这些术语对于XML和HTML都是一样的。

 

注意,当一个标签的name属性值,对应的value属性值有多个时,需要使用下面的方法

 

 java.lang.String[]getParameterValues(java.lang.String name)
          Returns an array of String objects containing all of the values the given request parameter has, or null if the parameter does not exist.

它可以返回一个字符串数组,其中每个元素都是该标签的name值对应的一个value值。

 

 

3、getParameterMap()  作用类似于上面的getParameter ,只不过把请求看做一个map容器,请求中的每个标签就是一条map条目,每个条目的:key就是标签的name属性值,value就是 标签的value属性值。

java.util.Map<java.lang.String,java.lang.String[]>getParameterMap()
          Returns a java.util.Map of the parameters of this request.

 返回值使用泛型时应该是Map<String,String[]>形式,因为有时像checkbox这样的标签,会有一个name,多个value;

下面的代码,获取请求中的所有标签的name属性值和value属性值。每行一个标签。

    //在doPost中
     HttpServletRequest request = ServletActionContext.getRequest();  
          
     Map<String,String[]> map=request.getParameterMap();  
     //遍历  
      for(Iterator iter=map.entrySet().iterator();iter.hasNext();){  
            Map.Entry element=(Map.Entry)iter.next();  
            //key值  
            Object strKey = element.getKey();  
            //value,数组形式  
          String[] value=(String[])element.getValue();  
      
         System.out.print(strKey.toString() +"=");  
         for(int i=0;i<value.length;i++){  
             System.out.print(value[i]+",");  
             }             
    System.out.println();  
       }  

4、getParameterNames()  作用是返回所有的标签的name属性值形成的枚举,返回值是个字符串的枚举类型,其中每个字符串都是标签的name属性值,一般需要继续配合getParameter使用

 

java.util.Enumeration<java.lang.String>getParameterNames()
          Returns an Enumeration of String objects containing the names of the parameters contained in this request.

当传递的参数个数不固定且参数名(标签的name值)没有重复的,就可以使用。

//doPost中


Enumeration enum =this.getRequest().getParameterNames();  
 while (enum.hasMoreElements()) {  
  String paramName = (String) enum.nextElement();  
   
  String paramValue = this.getRequest().getParameter(paramName);  
   

//也可以继续形成键值对应的map  
  Map map = new HashMap();
  map.put(paramName, paramValue);  
  }  

 

 

接着,我们总结,一个Web工程在Servlet层的控制层面上,如何利用请求中获取到的数据,来封装形成(将来业务层、DAO层需要的)bean对象。

这里以一个第三方的Apache提供的工具类来说明:

首先要说明一些术语和手册的里的记号:

public static <T> T toBean(Map map, Class<T>     clazz)  {

 

}

该方法,三要素:

方法名是toBean

参数有两个;

返回值的类型<T>   T 

<T>    T返回值类型的含义是:参数是什么泛型,返回值就是什么泛型。

封装请求中的数据成目标类型的bean,Apache第三方主要使用的是:BeanUtils.populate( Object bean, Map properties )

BeanUtils位于org.apache.commons.beanutils.BeanUtils下面,其方法populate的作用解释如下:

完整方法:

static voidpopulate(Object bean, Map<String,? extends Object> properties)

Populate the JavaBeans properties of the specified bean, based on the specified name/value pairs.

这个方法会遍历map<key, value>中的key,如果目标类的bean中有这个属性,就把这个key对应的value值赋给bean的属性。

  http://commons.apache.org/proper/commons-beanutils/javadocs/v1.9.4/apidocs/index.html

所以简单的使用该方法如下:

/**
  * 把请求中的map转换成目标类的bean对象
  * @param map
  * @param clazz
  * @return
  *
  * 把Map转换成指定类型,该map一般来自于 request.getParakmeterMap()方法
  */
 @SuppressWarnings("rawtypes")
 public static <T> T toBean(Map map, Class<T> clazz) {
  try {
   /*
    * 1. 通过参数clazz创建实例
    * 2. 使用BeanUtils.populate把map的数据封闭到bean中
    */
   T bean = clazz.newInstance();
   ConvertUtils.register(new DateConverter(), java.util.Date.class);
   BeanUtils.populate(bean, map);
   return bean;
  } catch(Exception e) {
   throw new RuntimeException(e);
  }
 }
}

 

 

 

启发之下,画出增和改的技术路线图: 增和改,需要Servlet从用户浏览器获取全部的bean对象的属性信息。

 

如果是查,Servlet需要从浏览器获取的是 where子句对应的属性,一样层层作为  调用业务方法的参数、再作为业务方法调用DAO层时的参数。

如果是删,Servlet需要从浏览器获取的是要删除行的目标类对象主键属性,作为调用 删除业务方法的参数、再作为 删除业务方法调用DAO层时的参数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值