通过之前的文章,已经知道,浏览器的表单如果将HTTP请求发往服务器上的某个Servlet,那么表单的action属性值可以是:
<form action="XXX...Servlet" method="post">
服务器上的Servlet,其中的doGet(request , response ) 或 doPost方法,内部会涉及到一些重要的HttpRequest对象方法,和重要的第三方包的用法,这里予以总结。
先总结Servlet如何获取HTML页面发来的请求数据,与之相关的方法。
向request域中存放对象数据的方法,第一参数是名字,第二参数是对象。其他的session域等也有这种方法。
javax.servlet
Interface ServletRequest
void | setAttribute(java.lang.String name , java.lang.Object o) Stores an attribute in this request. |
对应的取出request域对象的方法:
java.lang.Object | getAttribute(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:
java.lang.String | getParameter(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"/>   
<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 void | populate(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层时的参数。