java doget 和dopost_Servlet中的doGet和doPost

导言

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

到达

通常,HTTPGET请求是幂等..即。每次执行请求时,都会得到完全相同的结果(保留授权/身份验证以及页面搜索结果的时间敏感性、最后消息等-外部考虑)。我们可以讨论一个可书签的请求。点击一个链接,点击一个书签,在浏览器地址栏中输入原始URL,等等,都会触发一个HTTPGET请求。如果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 products = productService.list();

request.setAttribute("products", products); // Will be available as ${products} in JSP

request.getRequestDispatcher("/WEB-INF/products.jsp").forward(request, response);

}}

${product.name}detail

另外,如上列所示,查看/编辑细节链接通常是幂等的。@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);

}}

ID
${product.id}
Name
${product.name}
Description
${product.description}
Price
${product.price}
Image

http POST请求不是幂等的。如果Enduser事先在URL上提交了一个POST表单,但还没有执行重定向,那么这个URL不一定是可书签的。提交的表单数据未反映在URL中。将URL复制到新的浏览器窗口/选项卡并不一定会产生与表单提交后完全相同的结果。这样的URL是不可书签的。如果servlet正在侦听所述URL,则其doPost()会被召唤。通常用来后处理一个请求。即。从提交的HTML表单中收集数据,并使用它做一些业务工作(转换、验证、数据库保存等)。最后,通常将结果显示为来自转发的JSP页面的HTML。

${error}

.它可以与这个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在DB中找到(即用户名和密码是有效的),则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()因此)

尽管如此,我不确定它是否只是在黑暗中玩耍和射击,但是你发布的代码看起来不太好(比如使用compareTo()而不是equals()并深入研究参数名称,而不是仅仅使用getParameter()而id和password似乎被声明为servlet实例变量-这不是线程安全)。因此,我强烈建议使用Oracle教程(查看“TrailsovertheBasics”一章),以及如何正确地使用JSP/Servlet那些教程.

另见:

更新:根据你的问题的更新(这是相当重要的,你不应该删除你原来问题的一部分,这将使答案变得毫无价值。)相反加(新块中的信息),结果是不必要地将表单的编码类型设置为multipart/form-data..这将在与(默认值)不同的组合中发送请求参数。application/x-www-form-urlencoded它将请求参数作为查询字符串发送(例如:name1=value1&name2=value2&name3=value3)。你只需要multipart/form-data每当你有一个元素来上载文件,这些文件可能是非字符数据(二进制数据)。这种情况在您的情况下不是这样的,所以只需删除它,它就会像预期的那样工作。如果您需要上传文件,那么您必须设置编码类型,然后自己解析请求体。通常使用ApacheCommonsFileUpload但是,如果您已经使用了新的Servlet3.0 API,那么您可以使用内置的工具,从HttpServletRequest#getPart()..另见这个具体例子的答案:如何使用JSP/Servlet将文件上传到服务器?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: doGet和doPostServlet两个常用的方法。 doGet方法用于处理HTTP GET请求,通常用于获取数据或页面的显示。在doGet方法,可以通过request对象获取请求参数,通过response对象向客户端发送响应数据。 doPost方法用于处理HTTP POST请求,通常用于提交数据或执行操作。在doPost方法,可以通过request对象获取请求参数,通过response对象向客户端发送响应数据。 在Servlet,通常会根据具体的业务需求选择使用doGet或doPost方法,或者同时使用两个方法。 ### 回答2: 在JavaServlet是用于处理Web请求和响应的Java类。其的doGet和doPostServlet两个常用的方法。 doGet是一个处理HTTP GET请求的方法。当浏览器发送一个GET请求给Servlet时,Servlet将自动调用doGet方法来处理该请求。通常,doGet方法用于从服务器获取数据,如从数据库获取信息并返回给浏览器显示。在doGet方法,可以通过HttpServletRequest对象获取请求参数,并通过HttpServletResponse对象向浏览器发送响应。 doPost是一个处理HTTP POST请求的方法。当浏览器发送一个POST请求给Servlet时,Servlet将自动调用doPost方法来处理该请求。通常,doPost方法用于向服务器提交数据,如通过一个表单向数据库插入新的数据。在doPost方法,同样可以通过HttpServletRequest对象获取请求参数,并通过HttpServletResponse对象向浏览器发送响应。 在Servlet,通常情况下我们会根据具体需求选择使用doGet或doPost方法来处理请求。如果我们只是需要获取一些数据,我们可以选择使用doGet方法,因为GET请求在URL会携带请求参数,可以直接从URL获取。而如果我们需要向服务器提交数据,我们可以选择使用doPost方法,因为POST请求的参数是放入请求体,相对安全。另外,对于一些特殊情况,我们也可以重写doGet和doPost方法,使用相同的业务逻辑处理GET和POST请求。 总之,doGet和doPostServlet用于处理GET和POST请求的两个方法,根据具体需求选择使用。 ### 回答3: 在Servlet,doGet()和doPost()都是用于处理HTTP请求的方法。 doGet()方法用于处理GET请求。GET请求是最常见的HTTP请求类型,通常用于获取服务器上的资源。当客户端发送一个GET请求时,Servlet容器会调用doGet()方法来处理该请求。在doGet()方法,可以获取请求参数、处理业务逻辑,并且可以通过HttpServletResponse对象将响应数据返回给客户端。 doPost()方法用于处理POST请求。POST请求也是常见的HTTP请求类型,与GET请求不同,POST请求通常用于向服务器提交数据。当客户端发送一个POST请求时,Servlet容器会调用doPost()方法来处理该请求。在doPost()方法,可以通过HttpServletRequest对象获取请求参数、处理业务逻辑,并且可以通过HttpServletResponse对象将响应数据返回给客户端。 在Servlet,doGet()和doPost()方法都是被重写的方法,需要在Servlet进行实现。当客户端发送一个HTTP请求时,Servlet容器会根据请求的类型自动调用对应的方法,从而完成请求的处理。 通常情况下,GET方法用于获取资源,而POST方法用于提交数据。在实际应用,可以根据具体的需求选择使用doGet()或者doPost()方法来处理不同类型的请求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值