|
1. 静态HTML文本:ourform.html
<html>
<head>
<title>Our Form</title>
</head>
<body>
<h3>Our Form</h3>
<form name="ourform" method="GET" action="FormDemo">
<table>
<tr>
<td>姓名:</td>
<td><input type=text name="Name"></td>
</tr>
<tr>
<td>性别:</td>
<td><select name="Sex">
<option value="1" selected>男</option>
<option value="2">女</option>
</select></td>
</tr>
</table>
</form>
</body>
</html>
在IE下显示效果如图所示:
不熟悉HTML的读者可以参考有关HTML的书籍,尤其要注意的form的两个属性method和action
2. FormDemo.java
//FormDemo.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class FormDemo extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse
response)
throws IOException, ServletException //处理GET请求的方法
{
response.setContentType("text/html");
//先设置Header,在这里只设置ContentType一项
PrintWriter out = response.getWriter();
//得到文本输出Writer
String name = request.getParameter("Name");
//得到表单值Name
String sex = request.getParameter("Sex");
//得到表单值Sex
name = new String(name.getBytes(),"ISO-8859-1");
//转换到正确的编码
//打印得到的表单值
out.println("<html>");
out.println("<head>");
out.println("<meta http-equiv=\"Content-Type\"
content=\"text/html; charset=gb2312\">");
out.println("<title>Your Info</title>");
out.println("</head>");
out.println("<body>");
out.println("<h3>Data You Posted</h3>");
out.println("<table>");
out.println("<tr>");
out.println(new String(new String("<td>你的姓名:</td>").getBytes(),"ISO-8859-1"));
out.println("<td>"+name+"</td>");
out.println("</tr>");
out.println("<tr>");
out.println(new String(new String("<td>你的性别:</td>").getBytes(),"ISO-8859-1"));
out.print("<td>");
if(sex.equals("1")) out.println(new String(new String("男</td>").getBytes(),"ISO-8859-1"));
else out.println(new String(new String("女</td>").getBytes(),"ISO-8859-1"));
out.println("</tr>");
out.println("</table>");
out.println("</body>");
out.println("</html>");
out.close(); //关闭Writer
}
}
这个Servlet也是比较简单的,首先从提交的表单中得到需要的两个值,然后用HTML向客户端打印这些信息。
值得注意的是,在这个例子中,所有出现打印中文的地方,我们都使用了字符编码的转换来正确打印中文。前面的例子我们都没有涉及中文,在这里我们有必要提一下Servlet的中文问题。我们知道在同一台机器上,所有的编码方式都是一样的,一般中文平台是gb2312,英文平台是ISO-8859-1,但是网络上的两台机器并不能保证他们的编码方式都是一样的,这时候就有可能出现乱码的问题。在进行HTTP网络传输的时候,统一采用的编码方式是ISO-8859-1,这时候如果还是按照本地编码来传输就会出现问题,这也是Servlet在实现网络传输的时候一个不完美的地方,它不会自动进行本地编码到ISO-8859-1的转换,所以直接打印的话就会出现乱码。原理上讲任何出现打印字符串的地方,都是需要进行编码转换的,但是西文字符在不同字符集下对应相同的编码,以在打印西文字符的时候就不需要转换了。在Servlet后继的规范中可能会改变这种麻烦的状况。不同的是,从网络提交的表单数据,Servlet是自动把它转换成本地编码的,所以程序中得到的name字符串变量是gb2312编码的,同样需要进行转换后才能在客户端正确打印。
字符编码转换常用的方法是
String native_encoded = "中文字符串";
//本地编码的字符串
Byte[] byte_array = native_encoded.getBytes();
//得到本地编码的字节数组
String net_encoded = new String(native_encoded, "ISO-8859-1");
//生成ISO-8859-1编码的字符串
这样得到的net_encoded字符串就可以用来向客户端打印而不出错了。
还有一点要注意的是,为了在客户端正常显示中文,必须在HTML头部设置charset=gb2312。
当我们按下提交按钮后,我们得到的结果如下:
如果我们把ourform.html中的method由GET改成POST,会有什么样的结果呢?由于我们没有重写doPost方法,所以在Resin下,我们得到如下的结果:
有兴趣的读者可以修改FormDemo类来响应POST方法。
通过以上的几个例子,读者对Servlet如何响应HTTP请求,并从提交的表单中获取数据应该有了一个大概的了解,但是要构建Web应用程序,光有这几点是不够的,下面我们要讲解的Servlet的会话和生命周期对于构建Web应用是及其重要的两个特性。
|