servlet和jsp核心编程(第2版)第四章客户请求的处理,表单数据学习笔记

本文介绍了Servlet中处理表单数据的最佳实践,包括参数获取、默认值应用、特殊字符过滤及表单自动填充等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[size=x-large]第四章学习笔记[/size] 客户请求的处理,表单数据
[size=x-large]警告[/size]:
[size=medium]1[/size].提供给getParameter和getParameterValues的值是大小写敏感的。也就是说我们在前端表单中的参数值和后台使用getParameter()以及后台的bean类的属性值一定要大小写相同。
[size=medium]2[/size].不要指望getParameterNames会以任何特定的次序返回参数名。
[size=x-large]核心方法[/size]:
[size=medium]1[/size].在表单中一定要使用相对的Action URL(不是不加斜杠的Action URL,而是不含主机名的URL),不要使用包含主机名的绝对Action URL。这样可以增加可移植性。或者我们说不要把主机名加在url中。
[size=medium]2[/size].在设计servlet要使之能够优雅的处理参数缺失(null或空字符串)或格式不正确等情况,在测试servlet时,既要用预期格式的数据,也要使用缺失或异常数据。
[size=medium]3[/size].如果您需要读取请求参数,并将他们的值显示在生成的页面中,则必须过滤出那些特殊的HTML字符,不这样做可能会缺失一部分东西。或者某些格式错误。
[size=medium]4[/size].如果您在循环中执行字符串的拼接操作,不要使用String,而要使用StringBuffer。
[size=x-large]心得笔记[/size]:
[size=large]一[/size].如何在servlet获得表单数据。获得参数getParameter(参数名)、getParameterValues。获得表单参数名:getParameterNames、getParameterMap。获得原始表单数据,getReader、getInputStream
[size=medium]1[/size].getParameterNames以Enumeration的形式返回这种列表,因此,您不应该指望,getParameterNames返回的参数会按照HTML表单中的次序。getParameterNames的替代方案是getParameterMap。
[size=medium]2[/size].但当我们数据不是由HTML表单提交,a.而是来自于定制的客户程序,b.由表单提交,但是通过<input type ="FILE">将文件上传到服务器,这两种方式需要获取原始的输入。
[size=medium]3[/size].默认情况下,request.getParameter使用服务器的当前字符集解释输入。要改变默认行为,需要使用ServletRequest的setCharacterEncoding方法。但如果我们在输入中使用了多种字符集,我们不能用普通的字符集名调用setCharacterEncoding。是因为setCharacterEncoding必须在访问任何请求参数之前调用。所以我们必须首先按照某个字符集读取参数,然后将它转换到另外的字符集或者使用某些字符集提供的自动检测特性。
如:
String firstNameWrongEncoding = request.getParameter("firstName");
String firstName = new String(firstNameWrongEncoding.getBytes(),"Shift_JIS");

再如:
request.setCharacterEncoding("JISAutoDetect");//需要使用一种支持从默认字符集进行检测和转换的字符集。其他的字符集可在[url]http://java.sun.com/j2se/1.4.1/docs/guide/intl/encoding.doc.html[/url]中找到。
String firstName = request.getParameter("firstName");

[size=large]二[/size].参数缺失或异常是默认值的应用:[size=medium]1[/size].我们在分析请求参数时,需要检查下面这三种情况:[size=small]a[/size].参数的值是否为null,这可能是由于参数名发生了变化或者根本就没有这个参数。[size=small]b[/size].参数的值为空字符串,所以一般在我们具体使用一个参数前,我们应该先进行判断:
String param = request.getParameter("someName");
if((param==null)||(param.trim().equals(""))){
doSomethingForMissingValues(...);
}else{
doSomethingWithParameter(param);
}
注意这里如果input 标签的value属性如果存在,那也要判断参数是否为param.equals("default"); 这个default代表input 标签的value属性为default。也就是我们就没有修改,它在页面初始时就显示default。而字符串为空就代表用户更改了其原来显示的默认值,但是又没有填入自己的值。
[size=small]c[/size].参数的格式出现了错误,尽快我们可以使用javascript,但是我们必须保证在服务器上也进行这类检查,因为我们可能会禁用Javascript。比如,我们要求用户名长度最少为多少位。但可能用户禁用了javascript,所以我们必须在服务器端增加这类的检查。

[size=medium]2[/size].那我们如何处理参数缺失的情况呢:我们首先根据参数名取得参数,然后调用相应的函数判断这个参数值是否存在,不存在或为空字符串或者为default的话就把它替换为我们事先规定的值,如下:
private String replaceIfMissingOrDefault(String orig,String replacement){
if((orig == null)||(orig.trim().equals("")||orig.equals("default")){
return replacement;
}
else{
return (orig+",")
}
}

[size=large]三[/size]、过滤字符串中的HTML特殊字符:
[size=medium]1[/size].这里的字符串指的是两方面的字符串,一种是请求参数中的字符串,不能轻易的包含这些危险的字符串,比如<script>。或者用户输入了html标签,那么生成的web页面就会包含虚假的html标签。另一种是应答的字符串,也就是显示给前端页面的字符串,我们不能把会造成错误的字符串传给前端。
[size=medium]2[/size].HTML的特殊字符:<,>,",& 首先<>在我们传给前端时,我们要把它替换为<和>类似的,如果我们要在html标签的属性值中使用双引号和&,这里属性值明确不能使用&,所以我们也要替换它为"和&amp
[size=large]四[/size]、根据请求参数自动填充java对象:表单bean
当前,在jsp中,使用javabean组件构架可以极大地简化读取请求参数、提取相应的值,并将结果存储在java对象中的过程。如果我们使用getParameter方法,那么我们要使用多个getParameter方法。
[size=medium]1[/size].我们可以在jsp中,使用特殊的用法jsp:setProperty调用中的property ="*"一举完成bean的填写工作。
[size=medium]2[/size].我们在复杂的情况下,最好组合使用servlet和jsp,由servlet完成编程任务二jsp页面负责表示任务,因而,在servlet中能够比jsp页面更容易读取请求参数十分重要,但servlet规范中却没有提供这种功能,但我们可以使用一个工具类,它使用Jakarta通用库中的使用工具类,依据输入的请求参数自动填充bean,要使用它,只需要将bean和请求对象一同传递给BeanUtilities.populateBean.这样我们就可以轻松的从bean中获得参数。
[quote]import org.apache.commons.beanutils.BeanUtils;
public class BeanUtilites{
public static void populateBean(Object formBean,HttpServletRequest request){
populateBean(formBean,request.getParameterMap());
}
public static void populateBean(Object bean,Map propertyMap){

try{
BeanUtils.populate(bean,propertyMap);
}catch(Exception e){

}
}
}[/quote]
真正我们使用时也可以不用编写类直接使用下面的方法:
BidInfo info  = new BidInfo();
try{
BeanUtils.populate(info, request.getParameterMap());
}
catch(Exception e){

}

[size=large]五[/size]、当参数缺失或异常时重新显示输入表单。
当用户没有填写某些表单域是,有时需要使用默认值,而有时没有合理的默认值可用,则应该将表单重新显示给用户,用户不应该需要再次输入已经提供的值,缺失的表单域应该突出标示出来。
[size=medium]1[/size].四种方法:[size=small]a[/size].由同一个servlet提供表单、处理数据并提供最后的结果。[size=small]b[/size].由一个servlet提供表单,由第二个servlet处理数据并提供结果。[size=small]c[/size].由一个jsp页面“手动地”提供表单,由一个servlet或jsp页面处理数据并提供结果。[size=small]d[/size].由一个jsp页面提供表单,用从数据对象获取的值自动填写表单中相应的字段,由一个servlet或jsp页面处理这些数据并提供最终的结果。


[size=x-large]总结[/size]:编写servlet的步骤,[size=medium]1[/size].编写init,用来放置一次性的代码。[size=medium]2[/size].覆盖service(),或是根据用户请求类型编写doXxx()方法。[size=medium]3[/size].使用HTML验证器检查由您servlet所生成的页面的语法。HTML文档中包括<!DOCTYPE...>,简单的实用工具类,来简化这些构造。
[size=medium]4[/size].必须在传送实际的文档之前设定内容的类型。
response.setContentType("text/html");
当然也要设置响应代码[size=medium]5[/size].使用哪种字符解释输入,默认情况下,request.getParameter使用服务器的当前字符集解释输入。要改变默认行为,需要使用ServletRequest的setCharacterEncoding。[size=medium]6[/size].检查参数是否缺失或是异常。缺失就替换为默认值,异常也要检查,因为不保证客户端的javascript检查不被用户禁用。如果参数缺失则要重新返回给用户表单,并填写好用户已经填写的东西。[size=medium]7[/size].过滤字符串中的HTML特殊字符,用户可能会输入html标签,所以我们不能直接输出,要把它替换为转义字符。当然我们也要检查输入,不能包含可能危险内容的东西。[size=medium]8[/size].根据请求参数自动填充java对象:表单bean,在jsp中通过特殊的用法jsp:setProperty调用中的property ="*"一举完成bean的填写工作。在servlet使用Jakarta通用库中的使用工具类,依据输入的请求参数自动填充bean。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值