转载地址:http://book.51cto.com/art/200811/96235.htm
2.2.4 HTML各种组件和Servlet的处理方法
本节的代码在HtmlTags目录中,它包括form1.html和ProcessForm1.java两个文件,其他文件是后面章节的代码。
运行本节例子的网址如下:
http://localhost:8080/HtmlTags/form1.html
在前面的章节中,已经演示了Servlet处理简单HTML组件(即单行输入框)的情况,HTML组件还包括诸如单选按钮、多选框(复选框)、单选菜单、多选菜单的情况,Servlet如何读取这些组件的数据,是本节的讨论主题。
form1.html是一个包含HTML组件的HTML文件,ProcessForm1.java是显示这些组件数据的Servlet。
(1) 单行输入框(含密码输入框)
对于下面这个HTML组件,读者已经知道Servlet读取其中输入数据的方法:
Input your Name:
<INPUT TYPE="TEXT" NAME="name"><br/>
下面是Servlet读取数据的代码:
String name = request.getParameter("name");
(2) 单选按钮
下面是单选按钮的HTML代码:
Select your Gender:
<input type="radio" name="sex" value="male" checked="checked"> Male
<input type="radio" name="sex" value="female"> Female
它在浏览器中的样子如图2.4所示。
图2.4 单选按钮 |
在单选按钮中,只能在一组按钮中选择一项,其特点是单选按钮的name都相同。
下面是读取单选按钮的选择值的代码:
String sex = request.getParameter("sex");
其值是male或者female,即HTML标记中value属性的值,不是提示信息Male或者Female。
可见,对于单选按钮,读取其选择的代码与单行输入框相同。
(3) 不同名多选框
下面是多选框的HTML代码:
Select Your Transport1:
<input type="checkbox" name="bike" checked="checked">
I have a bike
<input type="checkbox" name="car" value="auto">
I have a car
<input type="checkbox" name="plane">
I have a plane
<br/>
在浏览器的样子如图2.5所示。
图2.5 不同名多选框 |
这个多选框可以选择多种交通工具,只有name,没有value的值。要知道选择了哪个工具,由于每个选择框有自己的name,那么可以用下面的代码显示其是否被选择:
String bike = request.getParameter("bike");
如果选择了bike,那么返回值是on(不是true和bike),如果没有选择,返回值是null。
(4) 同名多选框
上面多选框中各个选择框的name不同,如果它们相同,即下面的HTML代码:
Select Your Transport2:
<input type="checkbox" name="transport" value="bike" >
I have a bike
<input type="checkbox" name="transport" value="car" checked="checked">
I have a car
<input type="checkbox" name="transport" value="plane" checked="checked">
I have a plane
<br/>
其在浏览器中的样子看起来与上一个多选框相同,如图2.6所示。
图2.6 同名多选框 |
但其各个选择框的name都是transport,如果用request.getParameter(“transport”),由于该方法仅返回String类型,因此最多得到其中一个选择框的值,其他选择框的值无法知道。所幸Java考虑到了这种情况,认为上面的多选框返回的是一个数组,用下面的代码得到多选框中的值:
String[] transport = request.getParameterValues("transport");
if (transport != null) {
for (int i = 0; i < transport.length; i++) {
out.println("transport:" + transport[i] + ", ");
}
out.println("<br/> ");
}
就是说,不用request.getParameter方法,而是用request.getParameterValues,它返回用同样name的HTML组件值的数组。如果选择了car和plane,那么浏览器的输出为:
transport:car, transport:plane,
即没有选择的组件值不会出现在数组中。
(5) 无默认值单选菜单
下面是一个单选菜单的HTML代码:
Select only one car you like most:
<select name="cars1">
<option value="volvo">Volvo</option>
<option value="saab">Saab</option>
<option value="fiat">Fiat</option>
<option value="audi">Audi</option>
</select>
其在浏览器中的样子如图2.7所示。
图2.7 无默认值单选菜单 |
由于因此只能选择一个,name为car1的值就只有一个,所以可以用下面的代码来得到选择的值:
String cars1 = request.getParameter("cars1");
注意: 它返回的是value属性的值,即小写的汽车名,不是菜单上的大写汽车名。
(6) 有默认值的单选菜单
下面是有默认值单选菜单的HTML代码:
Select only one car you like most, with fiat as default:
<select name="cars2">
<option value="volvo">Volvo</option>
<option value="saab">Saab</option>
<!-- selected -->
<option value="fiat" selected="selected">Fiat</option>
<option value="audi">Audi</option>
</select>
<br/>
其在浏览器中的样子如图2.8所示。
硕大的Tech?Ed徽标 |
可以猜到,得到菜单选择值的代码和多选框一样:
String cars2 = request.getParameter("cars2");
(7) 有默认值多选菜单
下面是有默认值的多选菜单:
Select multiple cars you like,with Saab and audi as default:<br/>
<select size="6" name="cars3" multiple="multiple">
<option value="volvo">Volvo</option>
<option value="saab" selected="selected">Saab</option>
<option value="fiat" >Fiat</option>
<option value="audi" selected="selected">Audi</option>
</select>
默认选择值是Saab和Audi,其在浏览器中的样子如图2.9所示。
图2.9 有默认值的多选菜单 |
与多选框的情况类似,得到菜单上的选择值的代码如下:
String[] cars3 = request.getParameterValues("cars3");
if (cars3 != null) {
for (int i = 0; i < cars3.length; i++) {
out.println("cars3:" + cars3[i] + ", ");
}
out.println("<br/> ");
}
(8) 菜单组
下面是菜单组的HTML代码:
<select name="books" size="10" multiple="multiple">
<optgroup label="Programming Languages">
<option value="Java" label="Java">Java</option>
<option value="C++" label="C++">C++</option>
<option value="C#" label="C#">C#</option>
</optgroup>
<optgroup label="Programming Tools">
<option value="JBuilder" label="JBuilder">JBuilder</option>
<option value="Visual Studio" label="Visual Studio">Visual Studio</option>
<option value="Eclipse" label="Eclipse">Eclipse</option>
</optgroup>
</select>
它把菜单分为Programming Languages和Programming Tools两组,其在浏览器中的样子如图2.10所示。
图2.10 菜单组 |
现在你应该肯定,得到菜单的选择值的代码如下:
String[] books = request.getParameterValues("books");
(9) 多行文本区
多行文本区的HTML代码如下:
<textarea name="comment" rows="10" cols="30">
Put some comment here.
</textarea>
其在浏览器中的样子如图2.11所示。
图2.11 多行文本区 |
得到其输入值的方法与单行输入框相同,即用request.getParameter方法。
从上面的代码中可以得到结论:如果HTML仅返回一个值,用request.getParameter方法,它返回字符串;如果返回几个值,用 request.getParameterValues方法,它返回这些值的数组。
读者可以还记得,用下面的代码能得到表单中所有组件的值:
Enumeration paramNames = request.getParameterNames();
out.print("<h3>Your form contained:</h3>");
while (paramNames.hasMoreElements()) {
String field = (String) paramNames.nextElement();
String value = request.getParameter(field);
out.print(field + " = " + value + "<br>");
}
但是,如果组件的输入可能包含几个值,就像多选框那样,那么上面的代码就不会显示全部的值。如何改进上面的代码,就交给读者自己研究。