在我的上一篇文章里面已经介绍了实现会话跟踪的几种方式http://blog.csdn.net/lvpin/archive/2007/06/09/1645778.aspx
现在用不同的代码例子来说明实现会话跟踪——隐藏表单域。
例子如下:第一个页面是登陆页面,第二个页面什么都不做,只负责提交到第三个页面,第三个页面负责显示来自于第一个页面的用户名。3个页面,2次不同的请求,但是也可以实现会话跟踪。
Login.jsp
<%@ page contentType="text/html; charset=GBK" %>
<html>
<head>
<title>
登陆页面
</title>
</head>
<body bgcolor="#536da5">
<h1>
登陆页面
</h1>
<form method="post" action="/HiddenModule/hiddenservlet"> --页面提交POST方法,由HiddenServlet处理表单
<br><br>
<table width="100%" align="center">
<tr>
<td>姓名</td>
<td><input type="text" name="userName"/></td> --姓名
</tr><tr>
<td>密码</td>
<td><input type="password" name="userPwd"/></td> --密码
</tr><tr>
<td><input type="submit" name="Submit" value="登陆"></td>
<td><input type="reset" value="重设"></td>
</tr>
</table>
</form>
</body>
</html>
HiddenServlet.java
package hiddendemo;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
public class HiddenServlet
extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
System.out.println("HiddenServlet 的doGet()已经被调用!");
response.setContentType("text/html; charset=GBK");
PrintWriter out = response.getWriter();
String userName = request.getParameter("userName"); //得到来自于请求页面中 叫userName参数的值
out.println("<html>");
out.println("<head><title>第二个页面</title></head>");
//回发给客户端的页面,如果这个页面提交的话,由POST方法处理请求,这个页面提交后由 InfoServlet 来处理
out.println("<form action=/"/HiddenModule/infoservlet/" method=/"post/">");
out.println("<body bgcolor=/"#ffffff/">");
out.println("<h1 align=/"center/">这个页面是HiddenServlet处理来自于Login.jsp的请求后回发的页面");
out.println("<table width=/"100%/" align=/"center/">");
out.println("<tr><td>");
out.println("<input type=/"hidden/" name=/"hiddenName/" value=/""); //隐藏表单域
out.println(userName); //隐藏的值,是来自第一个页面的用户名
out.println("/"");
out.println("<p>已经将来自于第一个页面的姓名放在了隐藏域里面,对于用户是透明的!");
out.println("</td></tr><tr><td>");
out.println("<input type=/"submit/" value=/"转向下一个页面看一看/" >");
out.println("</td></tr></table></body></html>");
out.close();
}
}
InfoServlet.java
package hiddendemo;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
public class InfoServlet
extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
response.setContentType("text/html; charset=gb2312");
PrintWriter out = response.getWriter();
String userName = request.getParameter("hiddenName"); --来自第二个页面的值 在第二个页面中是看不见的
out.println("<html>");
out.println("<body bgcolor=/"#ffffff/">");
out.println("<p>用户姓名是: " + userName + --打印出来
". 这是从HiddenServlet回发页面中隐藏域提交来的值.</p>");
out.println("</body></html>");
out.close();
}
}
Login.jsp
Login.jsp 提交到 HiddenServlet 处理
由 HiddenServelt 通过 out.println() 生成客户端回发的页面如上,再次点击“转向下一个页面看一看”时将由在 out.println("<form action=/"/HiddenModule/infoservlet/" method=/"post/">"); 里面的 InfoServlet 处理,结果如下:
··················································
这个例子就通过隐藏表单域实现了 从第一个页面提交的值在第三个页面显示,而在第二个页面中将其隐藏,在提交表单的时候,第三个页面就可以得到结果。
但是里面不能处理中文,如果在第一个页面输入的是中文,那么在第二个页面,和第三个页面得到的就是乱码。这是因为:表单的数据是存放在 request 对象中。请求的数据是以字节流的形式在网络上传输。当服务器接受到字节流形式的HTTP请求后,是按照 is0-8859-1 的方式解析数据。这样如果输出页面设置字符集为 gb2312 /gbk 的话,那么将无法正确显示表单中的中文数据。
关于如何正确处理中文乱码的文章下次有空再详细写一写!