ITEEDU

JSP/Servlet: 关于表单(Form)

HTTP协议基本的两个请求方式为GET与POST,GET请求方式为直接在请求的网址上发送请求的相关信息,例如:

GET /login.jsp?user=justin

GET请求方式由于是直接在网址上发送请求的相关信息,所以会在网址列上出现相关的请求信息,例如:

http://localhost:8080/myjsp/login.jsp?user=justin 

使用GET来发送请求会曝露一些请求的相关信息,使用GET的时机之一是用在可bookmark的网址信息上,然而对于大量的信息传送而言,会在网址列上出现一长串内容,而且GET请求有最长数据长度 255个字符的限制,所以对于需要保密的信息而言,例如使用者登入,或是对于大量信息传送而言,例如留言讯息,通常会采用POST来发送请求,POST请求主要是在HTTP协议之后,将数据附加在请求的后端,有些类似SMTP的邮件发送,例如:

POST /upload.jsp

一些表头

POST资料本体

在设计窗体的时候,可以指定发送请求的方式为GET或POST,窗体的卷标设定一开始是这样的:

< form name="info" method="GET" action="somepage.jsp"> 
< input type="控件型态">

其中method用来指定发送请求的方式为GET或POST,而action用来指定请求的目标,请求的目标可以是JSP、ASP、PHP、CGI程序等等,窗体控件将在以下介绍几个常用的。 首先是送出按钮submit与重清按钮reset,要将窗体的内容发送出去,至少一定要使用submit按钮,按钮的value值可以设定按钮上的文字,例如:

<form name="info" method="GET" action="somepage.jsp"> 
<!-- 送出与重清 --> 
<input type="submit" value="送出"> 
<input type="reset" value="清除"> 
< /form>

本文框text与密码输入框password的外观是差不多的,差别在于密码输入框会使用字符屏蔽来隐藏输入的字符,设定的例子如下:

<form name="info" method="GET" action="somepage.jsp"> 
<!-- 本文框与密码输入 --> 
Login ID: <input="text" name="id"> 
Password: <input="password" name="pwd">
<!-- 送出与重清 --> 
<input type="submit" value="送出"> 
<input type="reset" value="清除"> 
</form>

name属性即在JSP网页中可以用来取得请求参数的名称,另外还可以使用maxlength设定字段最大输入字符,size可以设定框的大小,而value可以用来设定预设输入内容,可以设计一个JSP网页来测试这个窗体的运作:

<% 
// id 即 text 中设定的name属性 
String name = request.getParameter("id");
// pwd 即 password 中设定的 name 属性 
String password = request.getParameter("pwd"); 
out.println("接收参数:" + name + ", " + password); 
%>

当然要记得,窗体是必须在HTML网页中才能运作的,记得使用标签:

<html> 
<body> 
<form name="login" method="GET" action="login.jsp"> 
<!-- 本文框与密码输入 --> 
Login ID: <input="text" name="id"> 
Password: <input="password" name="pwd">
<!-- 送出与重清 --> 
<input type="submit" value="送出"> 
<input type="reset" value="清除"> 
</form> 
</body> 
</html>

输入内容并按下送出键之后,由于是使用GET方法,您可以在网址看到相关的信息:

http://localhost:8080/myjsp/login.jsp?id=justin&pwd=1234

可以看到的多个参数同时发送时,使用&符号来联结。 单选钮radio与复选框checkbox常用于提供固定的选项给使用者点选,它们都拥有checked属性表示选取,name属性表示按钮名称, value发送出去的值,即request.getParameterValues("name")所取得的值,例如:

<html> 
<body>
<form name="info" method="POST" action="info.jsp"> 
<!-- 单选钮 --> 
<input type="radio" name="sex" value="male" checked>男 
<input type="radio" name="sex" value="female">女
<!-- 复选框 --> 
<input type="checkbox" name="skills" value="c++">C++ 
<input type="checkbox" name="skills" value="java">
Java 
<input type="checkbox" name="skills" value="c#">C#
<!-- 送出与重清 --> 
<input type="submit" value="送出"> 
<input type="reset" value="清除"> 
</form> 
</body> 
</html>

窗体发送方式设定为POST,如此发送的信息就不会出现在网址列上;单选钮的name设定为相同的话,表示属于同一个群组,一次只能选择一个项目,而核取 方块的name设定,其值可以使用request.getParameters()取得,例如设计下面的程序来取得信息:

<% 
String sex = request.getParameter("sex"); 
String[] skills = request.getParameterValues("skills"); 
out.println("性别:" + sex); 
out.println("技能:"); 
for(int i = 0; i < skills.length; i++) { 
out.println(skills[i] + ", "); 
} 
%>

下拉式选单也是一个常用的输入型态,由于将选项以下拉式选单来表现,可以节省网页排版的空间,适用于大量选项可以选择的场合,一个例子如下:

<form name="info" method="POST" action="info.jsp"> 
<!-- 下拉选单 --> 
<select name="salary" multiple> 
<option value="L1">20000以下</option> 
<option value="L2">20000 ~ 30000</option> 
<option value="L3">30000 ~ 40000</option> 
</select>
<!-- 送出与重清 --> 
<input type="submit" value="送出"> 
<input type="reset" value="清除"> 
</form>

取得下拉式选单设定值的方法,同样是使用getParameterValues(),另外下拉式选单也可以使用multiple设定为可复选,而 size 属性可以用于设定字段的大小。 最后,输入型态中还有一个hidden型态,它不会在浏览器上显示任何组件,但可以设定name与value,主要是用来隐藏一些信息,在下一次发送请求时,一并将隐藏的信息发送给服务器。