Servlet中的doGet和doPost

Servlet中的doGet和doPost,第1张

Servlet中的doGet和doPost

介绍

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

GET

通常,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="http://www.kaotop.com/skin/sinaskin/image/nopic.gif" /></dd></dl>

开机自检
HTTP POST请求不是幂等的。如果最终用户事先在URL上提交了POST表单,但尚未执行重定向,则该URL不一定是可书签的。提交的表单数据未反映在URL中。将URL复制粘贴到新的浏览器窗口/选项卡中不一定会产生与提交表单后完全相同的结果。这样,这样的URL就不能添加书签。如果Servlet正在侦听有问题的URL,则将doPost()调用它。通常用于对请求进行后处理。即从提交的HTML表单中收集数据并进行一些处理(转换,验证,保存到DB等)。最后,通常结果从转发的JSP页面以HTML形式呈现。

<form action="login" method="post">    <input type="text" name="username">    <input type="password" name="password">    <input type="submit" value="login">    <span >${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}。

如果需要,你也可以“隐藏”其中

login.jsp,/WEB-INF/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())



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4932880.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-12
下一篇 2022-11-13

发表评论

登录后才能评论

评论列表(0条)

保存