【问题标题】:How does <input type="hidden" name.../> work with JSP Servlets<input type="hidden" name.../> 如何与 JSP Servlet 一起工作
【发布时间】:2016-11-01 15:10:35
【问题描述】:

我正在通过阅读一本书和一些在线教程来学习 JSP 和 Servlet。我对使用 JSP 和 Servlet 的 Web 编程完全陌生。

我遇到了一个我想理解的例子。

index.html

<form action="emailList" method="post">

    <input type="hidden" name="action" value="add" />

    <label>Email: </label>
    <input type="email" name="email" required /> <br />
    <label>First Name:</label>
    <input type="text" name="firstName" required /> <br/>
    <label>Last Name:</label>
    <input type="text" name="lastName" required /> <br />

    <label>&nbsp;</label>
    <input type="submit" value="Join Now" id="submit" />

</form>

EmailServlet.java

public class EmailListServlet extends HttpServlet{

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String url = "/index.html";

        //get the current action
        String action = req.getParameter("action");

        if(action == null){
            action = "join"; //default action
        }

        //perform action and set URL to appropriate page
        if(action.equals("join")){
            url = "/index.html"; //the join page
        }
        else if(action.equals("add")){
            //get parameters from the request
            String firstName = req.getParameter("firstName");
            String lastName = req.getParameter("lastName");
            String email = req.getParameter("email");

            //store data in User object and save User object in database
            User user = new User(firstName, lastName, email);
            UserDB.insert(user);

            //set User object in request object and set URL
            req.setAttribute("user", user);
            url = "/thanks.jsp"; //the thanks page
        }

        //forward request and response objects to specified url
        getServletContext().getRequestDispatcher(url).forward(req, resp);
    }

我不明白的是IF-ELSE 部分。

我在某处读到,使用隐藏&lt;input&gt; 的主要目的是确定表单的状态。我的理解是,一种检查表单字段(或参数)是否为空的方法

如果是这样,那么value="add" 属性的用途是什么?

因为在 else if(action.equals("add")) 上使用了 add

req.getParameter() 会返回什么?

//get the current action
    String action = req.getParameter("action");

我问是因为过去我在 PHP 上做过一些 CRUD 项目,它使用 ff 检查表单是否没有空参数。

if(isset($_POST['btnSave'])){

}

<form method ="POST" action="index.php">
        <label>First Name<input type="text" name="firstname" required></label>
        <br /><br />
        <label>Last  Name<input type="text" name="lastname" required></label>
        <br /><br />
        <input type = "submit" name="btnSave" value="Save" />
        <input type = "submit" name="btnSearch" value="Search" />
    </form>

相反,在最后一个表单示例中,它使用了btnSave(表单按钮)而不是hidden input

我只是不明白使用value="add" 的意义以及req.getParameter("action") 可以返回什么。因为用在IF-ELSE

我会很感激任何解释。

谢谢。

【问题讨论】:

  • req.getParameter("action") 返回action的值,即add
  • 隐藏字段就像任何输入字段一样。不同的是它不会出现在屏幕上,用户也不能修改它的值。除此之外,它允许像任何其他字段一样提交请求参数。在这种情况下,它用于告诉服务器要做什么(添加或加入)。

标签: java forms jsp servlets


【解决方案1】:

以相反的顺序回答您的问题:

req.getParameter() 会返回什么?

它可以返回任何东西。您发布的&lt;form&gt; 将向服务器生成一个请求,如下所示:

POST /emailList HTTP/1.1
Host: example.com
Cache-Control: no-cache

action=add&email=MyEmail&firstName=MyFirstName&lastName=MyLastName&submit=Join Now

现在,考虑有人提交以下请求的情况:

POST /emailList HTTP/1.1
Host: example.com
Cache-Control: no-cache

action=edit&id=1&email=NewEmail&firstName=TypoFreeName&lastName=TypoFreeLastName&submit=Update Details

由于您的 servlet 中没有“编辑”案例,但您确实有 if 检查,因此您的 servlet 将仅重定向到 /index.html,而不是更改用户的详细信息或插入新用户。

像这样的代码合乎逻辑的下一步是向您的 servlet 添加新部分:

if(action.equals("join")){
    url = "/index.html"; //the join page
}
else if (action.equals("delete") {
    //Call UserDB.delete()
}
else if (action.equals("edit") {
    //Call UserDB.update()
}
else if(action.equals("add")){
    ...
}

value="add" 属性的用途是什么?

它部分是为了控制您的 servlet 的流量,部分是作为一种错误预防措施;如果请求包含 action=add,则继续假设您将拥有其他表单元素(更好的做法是在调用 UserDB 之前检查以确保在请求中设置了 firstName、lastName 和 email)。

【讨论】:

  • 谢谢。很好的解释,我很欣赏这个例子。它帮助我更好地理解它。不过我有一个问题,当您说更好的做法是检查请求中是否设置了参数时,这是否意味着我必须在 EmailServlet.java 文件上执行此操作?你能举个简单的例子吗?谢谢。
【解决方案2】:

坦率地说,代码有点奇怪。它似乎旨在处理 不同 表单(没有 action 字段)被 POST 到 servlet 的情况,并通过呈现 index.html 页面来处理它。也许本章其他地方还有另一种形式可以做到这一点?

如果问题中的表单被发送到服务器,servlet 收到action 参数。 (好吧,除非 JavaScript 代码首先主动从表单中删除input。)所以getParameter("action") 不会返回null。它可能(如果 JavaScript 代码更改了 input 的值)得到不同的字符串,甚至是 "" 字符串,但不是 null

可能值得注意的是,它处理不同的表单 with action=add 字段被发布到服务器的可能性,并愉快地使用另一个参数而不在服务器端检查它们,这是不好的做法。验证必须在服务器端完成。

【讨论】:

  • 感谢您的信息。我还没有尝试做一些验证,但我明白你的意思是它需要在服务器端进行验证。顺便说一句,当您说“必须在服务器端进行验证”时,您的意思是我需要在我的 EmailServlet.java 上添加一些 IF-Else 分支来检查参数吗?
  • @p3ace:是的,您需要在使用之前检查其他参数以确保它们有效。
猜你喜欢
  • 2011-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多