Servlet中的doGet和doPost

我开发了一个将信息发送给Servlet的HTML页面。 在Servlet中,我使用了doGet()doPost()

public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException  {

     String id = req.getParameter("realname");
     String password = req.getParameter("mypassword");
}

public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {

    String id = req.getParameter("realname");
    String password = req.getParameter("mypassword");
}

在调用Servlet的html页面代码中:

<form action="identification" method="post" enctype="multipart/form-data">
    User Name: <input type="text" name="realname">
    Password: <input type="password" name="mypassword">
    <input type="submit" value="Identification">
</form> 

当我在Servlet中使用method = "get"时,我得到了id和password的值,但是当使用method = "post" ,id和password被设置为null 。 为什么我在这种情况下没有得到价值?

我想知道的另一件事是如何使用由Servlet生成或验证的数据。 例如,如果上面显示的Servlet认证用户,我想在我的HTML页面中打印用户标识。 我应该可以发送字符串'id'作为回应,并在我的HTML页面中使用这些信息。 可能吗?


介绍

当您想拦截HTTP GET请求时,您应该使用doGet() 。 当你想拦截HTTP POST请求时,你应该使用doPost() 。 就这样。 不要将一个移植到另一个,反之亦然(例如在Netbeans的不幸的自动生成的processRequest()方法中)。 这没有什么意义。

得到

通常,HTTP GET请求是幂等的。 也就是说,每次执行请求时都会得到完全相同的结果(留下授权/身份验证以及页面搜索结果,上一个消息等时间敏感的特性)。 我们可以谈论一个可收藏的请求。 点击一个链接,点击一个书签,在浏览器地址栏中输入原始URL等等都会触发一个HTTP GET请求。 如果一个Servlet正在监听有关的URL,那么它的doGet()方法将被调用。 它通常用于预处理请求。 即在展示来自JSP的HTML输出(例如收集数据以在表格中显示)之前做一些业务内容。

@WebServlet("/products")
public class ProductsServlet extends HttpServlet {

    @EJB
    private ProductService productService;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        List<Product> products = productService.list();
        request.setAttribute("products", products); // Will be available as ${products} in JSP
        request.getRequestDispatcher("/WEB-INF/products.jsp").forward(request, response);
    }

}
<table>
    <c:forEach items="${products}" var="product">
        <tr>
            <td>${product.name}</td>
            <td><a href="product?id=${product.id}">detail</a></td>
        </tr>
    </c:forEach>
</table>

同样查看/编辑上面最后一列中显示的详细链接通常是幂等的。

@WebServlet("/product")
public class ProductServlet extends HttpServlet {

    @EJB
    private ProductService productService;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Product product = productService.find(request.getParameter("id"));
        request.setAttribute("product", product); // Will be available as ${product} in JSP
        request.getRequestDispatcher("/WEB-INF/product.jsp").forward(request, response);
    }

}
<dl>
    <dt>ID</dt>
    <dd>${product.id}</dd>
    <dt>Name</dt>
    <dd>${product.name}</dd>
    <dt>Description</dt>
    <dd>${product.description}</dd>
    <dt>Price</dt>
    <dd>${product.price}</dd>
    <dt>Image</dt>
    <dd><img src="productImage?id=${product.id}" /></dd>
</dl>

POST

HTTP POST请求不是幂等的。 如果最终用户事先在URL上提交了一个POST表单,但未执行重定向,则URL不一定是可收藏的。 提交的表单数据不会反映在URL中。 将URL复制到新的浏览器窗口/选项卡中可能不一定产生与表单提交后完全相同的结果。 这样的URL不可收藏。 如果一个Servlet正在监听有关的URL,那么它的doPost()将被调用。 它通常用于后处理请求。 即收集提交的HTML表单中的数据并用它做一些业务内容(转换,验证,保存在数据库等等)。 最后,通常结果将以转发的JSP页面中的HTML形式呈现。

<form action="login" method="post">
    <input type="text" name="username">
    <input type="password" name="password">
    <input type="submit" value="login">
    <span class="error">${error}</span>
</form>

...可以与这段Servlet结合使用:

@WebServlet("/login")
public class LoginServlet extends HttpServlet {

    @EJB
    private UserService userService;

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        User user = userService.find(username, password);

        if (user != null) {
            request.getSession().setAttribute("user", user);
            response.sendRedirect("home");
        }
        else {
            request.setAttribute("error", "Unknown user, please try again");
            request.getRequestDispatcher("/login.jsp").forward(request, response);
        }
    }

}

你会发现,如果在数据库中找到User (即用户名和密码有效),那么User将被放入会话范围(即“登录”),并且该servlet将重定向到某个主页面(本示例转到http://example.com/contextname/home ),否则它会设置一条错误消息并将请求转发回同一个JSP页面,以便${error}显示消息。

如有必要,您还可以在/WEB-INF/login.jsp “隐藏” login.jsp ,以便用户只能通过servlet访问它。 这可以保持URL干净http://example.com/contextname/login 。 所有你需要做的就是像这样添加一个doGet()到servlet:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
}

(并相应地更新doPost()的同一行)

也就是说,我不确定它是否只是在黑暗中玩耍和拍摄,但是您发布的代码看起来不太好(比如使用compareTo()而不是equals()并在参数化中挖掘,而不仅仅是使用getParameter()idpassword似乎被声明为servlet实例变量 - 这不是线程安全)。 因此,我强烈建议使用Oracle教程(请参阅“Trails Covering the Basics”一章)以及如何使用这些教程正确使用JSP / Servlet来了解更多关于基本Java SE API的知识。

也可以看看:

  • 我们的servlets wiki页面
  • Java EE web开发,我从哪里开始,我需要什么技能?
  • Servlet返回“HTTP状态404请求的资源(/ servlet)不可用”
  • 使用MVC和DAO模式在JSP页面中的HTML中显示JDBC ResultSet

  • 更新 :根据你的问题的更新(这是非常重要的,你不应该删除你的原始问题的一部分,这将使答案毫无价值...而是添加信息在一个新的块),事实证明,你是不必要地将表单的编码类型设置为multipart/form-data 。 这将发送请求参数的组合不同于(缺省) application/x-www-form-urlencoded ,它将请求参数作为查询字符串发送(例如name1=value1&name2=value2&name3=value3 )。 只要multipart/form-data<input type="file">元素用于上载可能是非字符数据(二进制数据)的文件,则只需要multipart/form-data 。 您的情况并非如此,只需将其删除即可按预期工作。 如果您需要上传文件,那么您必须设置编码类型,然后自己分析请求主体。 通常你使用的是Apache Commons FileUpload,但是如果你已经使用了新的Servlet 3.0 API,那么你可以使用HttpServletRequest#getPart()开始的内置工具。 有关具体示例,另请参阅此答案:如何使用JSP / Servlet将文件上载到服务器?


    浏览器使用GET和POST从服务器请求单个资源。 每个资源都需要一个单独的GET或POST请求。

  • GET方法是浏览器用来从服务器检索信息的最常见(也是默认方法)。 使用GET方法时,请求数据包的第三部分(请求主体)保留为空。
  • GET方法有两种使用方法:当没有指定方法时,即当你或者浏览器正在请求一个简单的资源,比如HTML页面,图像等时。当表单被提交时,并且你选择方法= HTML标记上的GET。 如果GET方法与HTML表单一起使用,则通过附加“?”将通过表单收集的数据发送到服务器。 到URL的末尾,然后添加由“&”分隔的所有名称=值对(HTML表单字段的名称和在该字段中输入的值)例如:GET /sultans/shop//form1.jsp?name= Sam%20Sultan&iceCream =香草HTTP / 1.0可选的headeroptional标题<<空行>>>

    name = value表单数据将存储在名为QUERY_STRING的环境变量中。 这个变量将被发送到一个处理程序(比如JSP,Java servlet,PHP等)

  • 创建HTML表单时使用POST方法,并请求method = POST作为标记的一部分。 POST方法允许客户端将表单数据发送到请求的请求正文部分中的服务器(如前所述)。 数据编码和格式化类似于GET方法,除了数据通过标准输入发送到程序。
  • 示例:POST /sultans/shop//form1.jsp HTTP / 1.0可选的headeroptional标题<<空行>>> name = Sam%20Sultan&iceCream = vanilla

    使用post方法时,QUERY_STRING环境变量将为空。 GET与POST的优点/缺点

    GET方法的优点:稍微快一点参数可以通过表单输入,也可以在URL页面的参数加上书签之后添加

    GET方法的缺点:只能发送4K值的数据。 (在使用textarea字段时不应该使用它)参数在URL的末尾可见

    POST方法的优点:参数在URL的末尾不可见。 (用于敏感数据)可以向服务器发送更多的4K值的数据

    POST方法的缺点:不能将其数据加入书签


    servlet容器的HttpServlet.service()方法的实现将根据需要自动转发到doGet()或doPost(),因此您不需要重写该服务方法。

    链接地址: http://www.djcxy.com/p/76569.html

    上一篇: doGet and doPost in Servlets

    下一篇: Integerate JSF,servlet AND JSP