
任务三 Servlet读取表单数据
任务描述
网站用户注册,在登录表单中输入用户各种信息,提交到服务器,服务器端程序获取登录数据,展示到页面上,并解决提交中文数据时产生乱码的问题。
必备知识
1.HTML表单
HTML表单用于接收不同类型的用户输入,用户提交表单时向服务器传输数据,从而实现用户与Web服务器的交互。HTML表单是一个包含表单元素的区域,表单使用<form>标签创建,包含如文本字段、复选框、单选按钮、提交按钮等元素,表单的工作机制如图2-13所示。

图2-13 表单工作机制
一个典型的HTML表单如下:

表单常见的属性如表2-3所示。
表2-3 表单常见属性

2.客户端向服务器提交请求的两种方式
HTTP定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET、POST、PUT、DELETE。其中GET和POST是最为常见的请求方式。
GET和POST的区别如下:
①GET请求的参数将显示到地址栏上,附在URL之后,以?分隔URL和传输数据,参数之间以&相连,例如:

如果数据是英文字母/数字,原样发送;如果是空格,转换为+;如果是中文/其他字符,则直接把字符串用BASE64加密,访问结束后会被浏览器缓存起来。
POST把提交的数据放置在HTTP包的包体中,不会在浏览器中显示。因此,当数据是中文或者不敏感的数据时,可以用GET方法,否则用POST方法提交请求。
②提交的数据大小不同。GET通过URL提交数据,那么GET可提交的数据量就跟URL的长度有直接关系,虽然HTTP协议规范没有对URL长度进行限制,但每个特定的浏览器及服务器对URL的长度可能有所限制。POST把提交的数据放置在HTTP包主体中,理论上没有长度限制,依据服务器的处理能力不同,才对数据包的大小有所限制。
因此,需要提交的数据包较大,如文件的上传,需要将请求方法设置为POST。
3.从请求对象中获得请求参数值
javax.servlet.ServletRequest类中提供了获得请求参数的相关方法,如表2-4所示。
表2-4 ServletRequest类中获得请求参数的方法

续表

4.用Servlet接收客户端参数中文乱码问题的解决
表单提交中文数据时,无论是控制台还是页面输出都可能出现乱码问题,这是因为在网络数据传输过程中,请求数据将以ISO8859-1进行编码,无法直接将中文正确显示。
解决方法有以下几种(本单元选择第一种):
方法一:获得表单数据后,用ISO8859-1进行解码,再用UTF-8进行编码。程序代码如下:

方法二:修改Tomcat的默认URIEncoding字符编码方式,只对Get请求有效。
打开\apache-tomcat-7.0.70\conf\server.xml,在Connector元素中加入URIEncoding属性:URIEncoding="UTF-8",代码如下:

方法三:若仅针对Post请求中的中文乱码问题,可以在Post()方法中设置request.setCharacterEncoding("utf-8"),代码如下:

如果采用方法一和三,需要在每个Servlet中都添加编码设置相关代码,这样会造成程序冗余,很容易出现代码不一致的问题,为避免这个问题,应该将这个工作交由整个工程的过滤器完成,请读者参考本书单元五任务一。
任务透析
用户注册,提交表单到RegisterServlet,读取相关的表单数据,将提交信息以页面的形式显示出来(PrintWriter打印到客户端)。
步骤1:编写注册register.jsp页面,含有Form表单(含文本框、密码框、多选框等),如图2-14所示。

图2-14 注册页面


步骤2:编写并配置Servlet,读取相关的表单数据,将提交信息以页面的形式显示出来(PrintWriter打印到客户端),注意中文信息的编码转换。


步骤3:在Form表单的action属性中输入Servlet的URL地址。

步骤4:运行register.jsp,填写注册信息,测试提交,在Servlet中输出表单提交的内容,如图2-15所示。

图2-15 测试提交
课堂提问
1.一个Form表单有哪些元素和属性,各自有什么意义。
2.简述表单提交时出现乱码问题的可能原因及解决方法。
3.doPost方法和doGet方法有何区别?何时选用doPost或者doGet方法?
4.获得请求参数有哪两个方法,分别用在什么情况下?