Servlet中使用表单隐藏域

表单隐藏域也是一种会话跟踪技术。

如果使用了“表单隐藏域”,将使用一个隐藏(不可见)文本域来维护用户的状态。

在这种情况下,我们将信息存储在表单的隐藏域中,并从另一个Servlet获取该隐藏域信息。如果我们必须在所有页面中都需要提交表单,并且我们不想依赖浏览器(如Cookie),那么可以使用这种方式。

以下代码是表单隐藏域示例。

<input type="hidden" name="uname" value="yiidian">  

以上示例中,uname是隐藏域的名称,而yiidian是隐藏域的值。

1 表单隐藏域的应用

这种方式在网站的评论功能中广泛被使用。在评论功能中,我们可以将页面ID或页面名称存储在隐藏字段中,以便可以唯一地标识每个评论页面。

2 表单隐藏域的优势

无论浏览器是否禁用Cookie,表单隐藏域都可以使用。

3 表单隐藏域的缺点

  1. 它在服务器端维护。
  2. 每页都需要提交额外的表单。
  3. 只能使用文字(字符串)信息。

4 表单隐藏域的案例

在下面示例中,我们将用户名存储在一个表单的隐藏域的文本字段中,并从另一个Servlet获取该值。

4.1 编写页面

index.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>一点教程网-表单隐藏域的使用</title>
</head>
<body>
<form action="servlet1" method="post">
    用户名:<input type="text" name="userName"/><br/>
    <input type="submit" value="提交"/>
</form>
</body>
</html>

4.2 编写FirstServlet

FirstServlet:

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

/**
 * 一点教程网 - http://www.yiidian.com
 */
public class FirstServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        try{

            response.setContentType("text/html;charset=utf-8");
            PrintWriter out = response.getWriter();

            String n=request.getParameter("userName");
            out.print("欢迎 "+n);

            //creating form that have invisible textfield
            out.print("<form action='servlet2'>");
            out.print("<input type='hidden' name='uname' value='"+n+"'>");
            out.print("<input type='submit' value='提交'>");
            out.print("</form>");
            out.close();

        }catch(Exception e){
            System.out.println(e);
        }
    }
}

4.3 编写SecondServlet

SecondServlet:

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * 一点教程网 - http://www.yiidian.com
 */
public class SecondServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        try{
            response.setContentType("text/html;charset=utf-8");
            PrintWriter out = response.getWriter();

            //获取表单隐藏域数据
            String n=request.getParameter("uname");
            out.print("你好 "+n);

            out.close();
        }catch(Exception e){
            System.out.println(e);
        }
    }
}

4.4 配置web.xml

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <servlet>
        <servlet-name>FirstServlet</servlet-name>
        <servlet-class>FirstServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>FirstServlet</servlet-name>
        <url-pattern>/servlet1</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>SecondServlet</servlet-name>
        <servlet-class>SecondServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>SecondServlet</servlet-name>
        <url-pattern>/servlet2</url-pattern>
    </servlet-mapping>

</web-app>

4.5 运行测试

提交后,效果如下:

一点教程,一个分享编程知识的公众号。跟着站长一起学习和进步。

通俗易懂,深入浅出,一篇文章只讲一个知识点。

在公交、在地铁、在厕所都可以阅读,随时随地涨姿势。

文章不涉及代码,不烧脑细胞,人人都可以学习。

当你决定关注「一点教程」,你已然超越了90%的程序员!

一点教程二维码