导言

你应该用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将文件上传到服务器?

java doget 和dopost_Servlet中的doGet和doPost相关推荐

  1. 使用tinylog 1.1改进您在Java EE应用程序中的登录

    tinylog是Java的轻量级日志记录框架. 与Apache Log4j和Logback相反,tinylog由仅80KB的单个JAR文件组成,没有任何依赖性,并且具有静态logger类. 这意味着您 ...

  2. 教你如何使用Java代码从网页中爬取数据到数据库中——网络爬虫精华篇

    文章目录 1:网络爬虫介绍 2:HttpClients类介绍 2.1 HttpGet参数问题 2.2 HttpPost参数问题 2.3 连接池技术问题 3:Jsoup介绍 4:动手实践如何抓取网页上数 ...

  3. 工作系列Java开发之利用Java实现ERP系统中Excel表格的导出

    工欲善其事必先利其器 前言: 最好的学习方式就是分享,喜欢就三连一下吧(关注,转发,点赞). 今天的内容开始之前,我先申明一下,今天的知识很重要! 很重要! 很重要 ,Excel表格的导出在正式步入公 ...

  4. 【转载】JAVA知识点集锦(中)

    这部分主要是与Java Web和Web Service相关的面试题. 96.阐述Servlet和CGI的区别?  答:Servlet与CGI的区别在于Servlet处于服务器进程中,它通过多线程方式运 ...

  5. java string 占位符_驳《阿里「Java开发手册」中的1个bug》?

    前两天写了一篇关于<阿里Java开发手册中的 1 个bug>的文章,评论区有点炸锅了,基本分为两派,支持老王的和质疑老王的. 首先来说,无论是那一方,我都真诚的感谢你们.特别是「二师兄」, ...

  6. java mod %区别_Java中 % 与Math.floorMod() 区别详解

    %为取余(rem),Math.floorMod()为取模(mod) 取余取模有什么区别呢? 对于整型数a,b来说,取模运算或者取余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余 ...

  7. java string与integer_Java中Integer和String浅谈

    http://qxzxcjq-126-com.iteye.com/blog/883283 Java中的基本数据类型有八种:int.char.boolean.byte.long.double.float ...

  8. maven只打包java目录_ssm项目中maven对resources目录打包的路径_默认路径,自定义路径...

    博客引用处(以下内容在原有博客基础上进行补充或更改,谢谢这些大牛的博客指导): ssm项目打包后mybatis的mapper.xml文件没有放进去 问题出现的原因: ssm项目打包后mybatis的m ...

  9. JAVA坏境变量中的JAVA_HOME path classpath 的设置与作用。

    JAVA坏境变量中的JAVA_HOME path classpath 的设置与作用. 今天再次设置java的环境变量,突然发现每次设置都只是按照步骤一步步将其设置完,并不了解为啥要设置,于是上网找了找 ...

最新文章

  1. rlwrap 让Linux下的sqlplus变得好用
  2. UICollectionView的headerView、footerView使用以及与UITableView加载headerView、footerView的区别...
  3. 网站SEO优化中几个不为人知的小细节分享!
  4. python指定版本 安装模块包
  5. mysql 联合主键_Mysql 创建联合主键
  6. HPE 发布严重的 RCE 0day 漏洞,影响服务器管理软件 SIM,无补丁
  7. C Tricks(七)—— 有序向量的去重
  8. mysql查询每十分钟的数据_sql查询语句查询每10分钟的数据
  9. 数学与计算机相关的题目,数学与计算机毕业论文题目大全 数学与计算机毕业论文题目怎么定...
  10. Spring核心框架体系结构
  11. 产品思维训练 | 卖菜的店同时也卖水果,卖水果的店为什么不卖菜?
  12. 宇视摄像机密码忘记找回方式(详细找回步骤)
  13. 从国内跳槽至新加坡工作的经验分享
  14. 基于SpringBoot的个人博客系统设计与实现
  15. php 抽奖活动_PHP实现活动人选抽奖功能的方法
  16. 弹性云服务器有什么用
  17. iphone4s拒接电话
  18. 基础知识——排列与组合
  19. CAJ转PDF,仅需5秒还免费,PDF文字还能复制
  20. nvidia nx平台GStreamer pipeline异常问题调试记录2

热门文章

  1. 保存会话数据——session学习
  2. android 距离感应器控制屏幕熄灭_书房大变身!有格调的屏幕挂灯,加了它桌面秒变神仙颜值...
  3. html 日期判断周几,javascript怎么根据日期判断星期几?
  4. 我的成长笔记20210330(测试空闲期)
  5. 施工工期计算器在线_办公室装修工期要多久时间,办公室快速装修怎么做?
  6. idea运行maven出现o.s.boot.SpringApplication : Application run failed
  7. spring实战(第4版读书笔记)
  8. linux使用gcc编译报错“undefined reference to `pthread_create'”
  9. 实战案例:场景测试之ATM机取款业务测试
  10. 测试上路2年,你处于什么阶段了?不醒着拼,你连应届生都比不过...