博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java Servlet和JSP教程(4)(转)
阅读量:2454 次
发布时间:2019-05-10

本文共 2568 字,大约阅读时间需要 8 分钟。

Java Servlet和JSP教程(4)(转)[@more@]

4 表单

4.1 表单数据概述

如果你曾经使用过Web搜索引擎,或者浏览过在线书店、股票价格、机票信息,或许会留意到一些古怪的URL,比如“http://host/path? user=Marty+Hall&origin=bwi&dest=lax”。这个URL中位于问号后面的部分,即“user= Marty+Hall&origin=bwi&dest=lax”,就是表单数据,这是将Web页面数据发送给服务器程序的最常用方法。对于GET请求,表单数据附加到URL的问号后面(如上例所示);对于POST请求,表单数据用一个单独的行发送给服务器。

以前,从这种形式的数据提取出所需要的表单变量是CGI编程中最麻烦的事情之一。首先,GET请求和POST请求的数据提取方法不同:对于GET请求,通常要通过QUERY_STRING环境变量提取数据;对于POST请求,则一般通过标准输入提取数据。第二,程序员必须负责在“&”符号处截断变量名字-变量值对,再分离出变量名字(等号左边)和变量值(等号右边)。第三,必须对变量值进行URL反编码操作。因为发送数据的时候,字母和数字以原来的形式发送,但空格被转换成加号,其他字符被转换成“%XX”形式,其中XX是十六进制表示的字符ASCII(或者ISO Latin-1)编码值。例如,如果HTML表单中名为“users”的域值为“~hall, ~gates, and ~mcnealy”,则实际向服务器发送的数据为 “users=%7Ehall%2C+%7Egates%2C+and+%7Emcnealy”。最后,即第四个导致解析表单数据非常困难的原因在于,变量值既可能被省略(如“param1=val1&param2=&param3=val3”),也有可能一个变量拥有一个以上的值,即同一个变量可能出现一次以上(如“param1=val1&param2=val2&param1=val3”)。

Java Servlet的好处之一就在于所有上述解析操作都能够自动完成。只需要简单地调用一下HttpServletRequest的getParameter方法、在调用参数中提供表单变量的名字(大小写敏感)即可,而且GET请求和POST请求的处理方法完全相同。

getParameter方法的返回值是一个字符串,它是参数中指定的变量名字第一次出现所对应的值经反编码得到得字符串(可以直接使用)。如果指定的表单变量存在,但没有值, getParameter返回空字符串;如果指定的表单变量不存在,则返回null。如果表单变量可能对应多个值,可以用 getParameterValues来取代getParameter。getParameterValues能够返回一个字符串数组。

最后,虽然在实际应用中Servlet很可能只会用到那些已知名字的表单变量,但在调试环境中,获得完整的表单变量名字列表往往是很有用的,利用 getParamerterNames方法可以方便地实现这一点。getParamerterNames返回的是一个Enumeration,其中的每一项都可以转换为调用getParameter的字符串。

4.2 实例:读取三个表单变量

下面是一个简单的例子,它读取三个表单变量param1、param2和param3,并以HTML列表的形式列出它们的值。请注意,虽然在发送应答内容之前必须指定应答类型(包括内容类型、状态以及其他HTTP头信息),但Servlet对何时读取请求内容却没有什么要求。

另外,我们也可以很容易地把Servlet做成既能处理GET请求,也能够处理POST请求,这只需要在doPost方法中调用doGet方法,或者覆盖 service方法(service方法调用doGet、doPost、doHead等方法)。在实际编程中这是一种标准的方法,因为它只需要很少的额外工作,却能够增加客户端编码的灵活性。

如果你习惯用传统的CGI方法,通过标准输入读取POST数据,那么在Servlet 中也有类似的方法,即在HttpServletRequest上调用getReader或者getInputStream,但这种方法对普通的表单变量来说太麻烦。然而,如果是要上载文件,或者POST数据是通过专门的客户程序而不是HTML表单发送,那么就要用到这种方法。

注意用第二种方法读取POST数据时,不能再用getParameter来读取这些数据。

ThreeParams.java

package hall;

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

import java.util.*;

public class ThreeParams extends HttpServlet {

public void doGet(HttpServletRequest request,

HttpServletResponse response)

throws ServletException, IOException {

response.setContentType("text/html");

PrintWriter out = response.getWriter();

String title = "读取三个请求参数";

out.println(ServletUtilities.headWithTitle(title) +

"

" +

"

" + title + "

" +

"

" +

" param1: "

+ request.getParameter("param1") + "

" +

" param2: "

+ request.getParameter("param2") + "

" +

" param3: "

+ request.getParameter("param3") + "

" +

"

" +

"

转载于:http://blog.itpub.net/8225414/viewspace-946036/

你可能感兴趣的文章
css指针悬停_CSS指针事件
查看>>
目标检测 多分辨率检测_检测视频分辨率
查看>>
ip校验和 tcp校验和_如何校验和
查看>>
pandora nohup_如何更好地训练您的Pandora广播电台
查看>>
显示器选三星还是飞利浦_如何为飞利浦色相灯设置计时器
查看>>
vm macos 启用3d_如何在macOS中启用夜班以减轻眼睛疲劳
查看>>
白色裤子为什么会沾上蓝色_什么是蓝色的,为什么它可以在Mac上运行?
查看>>
apple默认备份位置_如何将Apple Maps默认设置为步行路线
查看>>
固件中启用的虚拟化否_哪些固件或硬件机制可启用强制关机?
查看>>
如何还原桌面图标_如何为Windows 10桌面图标还原或更改文本的默认外观?
查看>>
ios numlock_从“提示”框:默认情况下启用NumLock,无广告的iOS应用和立体声供电的派对灯...
查看>>
询问HTG:白噪声屏幕保护程序,有效的文件命名以及从密码泄露中恢复
查看>>
dropbox文件_Dropbox即将发布的扩展程序更新将添加更多文件编辑支持,包括Pixlr照片...
查看>>
google hdr+_更好的隐私权控制使Google+死了
查看>>
网络串流_串流NBA篮球的最便宜方式(无需电缆)
查看>>
reddit_如何将多个子Reddit与多个Reddit合并
查看>>
如何在iPhone或iPad上使用Safari下载文件
查看>>
kindle导出电子书pc_使用Kindle for PC在计算机上阅读Kindle电子书
查看>>
互联网应急处理方案_什么是互联网巨魔? (以及如何处理巨魔)
查看>>
chrome 默认隐身_将隐身模式上司按钮添加到Google Chrome
查看>>