1、HttpServletRequest的使用

 获取Request的参数的方法。

  • 方法getParameter将返回参数的单个值
  • 方法getParameterValues将返回参数的值的数组
  • 方法getParameterMap将返回包含了所有参数名值对的java.util.Map<String,String[]>
  • 方法getParameterNames方法将返回所有可用参数的名字的枚举

 确定与内容相关的信息

  • getContentType将返回请求的MIME内容类型,例如text/html、application/javascript等等
  • getContentLength和getContentLong都将返回请求正文的长度,区别是getContentLong用于内容超过2GB的
  • getCharacterEncoding将返回请求内容的字符编码

 读取请求的内容

  • getInputStream将返回一个javax.servlet.ServletInputStream,用于读取请求中的二进制内容
  • getReader将返回一个java.io.BufferedReader,用于读取字符编码

     要注意的是不能在统一请求上同时使用这两个方法,调用了其中一个方法之后,再调用另一个方法将触发异常

 读取请求特有的数据

  • getRequestURL,返回客户端同于创建请求的完整URL,包括协议、服务器名、端口号和服务器路径,不包括查询字符串,例如http://localhost:8080/hello-world/first?user=a%20user,该方法将返回http://localhost:8080/hello-world/first

  • getRequestURI,只返回URL的服务器路径部分,对于上面的例子来说,该方法将返回/hello-world/first
  • getServletPath,只返回Servlet映射的URL部分/first
  • getHeader,返回指定名字的头数据,传入参数的大小写不必与头名称大小写一致,所以getHeader("contenttype")可以匹配Content-Type头,如果多个头使用了相同的名字,将只返回第一个值如果不指定参数名,将返回所有值的枚举

  • getHeaderNames:返回请求中所有头数据的枚举
  • getDateHeader:对于可以表示有效时间戳的头数据,将返回一个Unix时间戳

2、使用HttpServletResponse

 编写响应正文

  • getOutputStream将返回一个javax.servlet.ServletOutputStream,将用于编写二进制数据
  • getWriter将返回一个java.io.PrintWriter,使用这个方法可以向客户端返回HTML或者其他基于字符编码的文本。

  同样不能对同一个响应对象同时使用这两个方法,调用了其中一个方法之后,再调用另一个方法将触发异常

  • setContentType和setCharacterEncoding将用于设置内容类型和编码格式

 设置头和其他响应属性

  • setHeader、setIntHeader、setDateHeader等方法可以设置几乎所有的头数据,如果现有的响应头中已经包括了同名的头、该头数据将被覆盖。
  • 为了防止覆盖可以使用addHeader、addIntHeader、addDateHeader等方法,这些方法不会覆盖原有的头数据,会添加一个额外的值。
  • 还可以使用getHeader、getIntHeader、getDateHeader等方法判断是否已经在响应中设置过某个响应头

  另外还可以使用

  • setStatus 用于设置HTTO响应状态码
  • getStatus 判断当前响应的状态
  • sendError 设置状态码,表示一条可选的错误消息将会输出到响应数据中,重定向到Web容器为客户端提供错误页面,并清空缓存

sendRedirect 将客户端重定向至另一个URL

3、使用参数和接受表单提交

  上面记录了很多方法,接下来就是使用的时候了

  在我自己实现的HelloServlet中我修改了doGet和doPost方法:

    private static final String DEFAULT_USER = "Guest";

    @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String user = req.getParameter("user");
if(user == null){
user = HelloServlet.DEFAULT_USER;
}
resp.setContentType("text/html");
resp.setCharacterEncoding("UTF-8"); PrintWriter writer = resp.getWriter();
writer.append("<!DOCTYPE html>\r\n")
.append("<html >\r\n")
.append(" <head>\r\n")
.append(" <title>hello user application</title>\r\n")
.append(" </head>\r\n")
.append(" <body>\r\n")
.append(" Hello, ").append(user).append("!<br/><br/>\r\n")
.append(" <form action=\"first\" method=\"POST\">")
.append(" Enter your name:<br/>\r\n")
.append(" <input type=\"text\" name=\"user\"/><br/>\r\n")
.append(" <input type=\"submit\" value=\"Submit\"/>\r\n")
.append(" </form>\r\n")
.append(" </body>\r\n")
.append("</html>\r\n");
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}

  这里的实现的具体逻辑是:

  • 检查请求中是否包含user参数,如果没有包含的话,就设置为我提前设置好的常量
  • 将响应的内容类型设置为text/html,将字符编码设置为UTF-8
  • 从响应中获取一个PrintWriter,然后调用append方法编写响应正文

  这里的HTML中的表单方法设置为POST,不过在doPost中只是简单的调用了doGet方法,因为这里的表单将读取我们输入的数据并赋值给user变量。

  这是直接访问这个URL的效果。

  在URL中添加字符串user=niko,变成http://localhost:8080/hello-world/first?user=niko

  在输入框中输入xx,点击Submit

然后我修改了一下,试用了上面的大部分代码,比较乱,代码是:

    private static final String DEFAULT_USER = "Guest";

    @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String user = req.getParameter("user");
if(user == null){
user = HelloServlet.DEFAULT_USER;
}
resp.setContentType("text/html");
resp.setCharacterEncoding("UTF-8"); PrintWriter writer = resp.getWriter();
writer.append("<!DOCTYPE html>\r\n")
.append("<html >\r\n")
.append(" <head>\r\n")
.append(" <title>hello user application</title>\r\n")
.append(" </head>\r\n")
.append(" <body>\r\n")
.append(" Hello, ").append(user).append("!<br/><br/>\r\n")
.append(" <form action=\"first\" method=\"POST\">\r\n")
.append(" 用户名:<input type=\"text\" name=\"user\"/><br/>\r\n")
.append(" 密码 :<input type=\"text\" name=\"pwd\"><br/>\r\n")
.append(" 性别:<input type=\"radio\" name=\"sex\" value=\"boy\" checked=\"checked\">男\r\n")
.append(" <input type=\"radio\" name=\"sex\" value=\"girl\">女<br/>\r\n")
.append(" 爱好:<input type=\"checkbox\" name=\"hobby\" value=\"game\" >打游戏\r\n")
.append(" <input type=\"checkbox\" name=\"hobby\" value=\"book\" >看书\r\n")
.append(" <input type=\"checkbox\" name=\"hobby\" value=\"music\" >听音乐\r\n")
.append(" <input type=\"checkbox\" name=\"hobby\" value=\"coding\" >编程<br/>\r\n")
.append(" 所在学校:<select name=\"school\">\r\n")
.append(" <option>---请选择---</option>\r\n")
.append(" <option value=\"yz\">一中</option>\r\n")
.append(" <option value=\"ez\">二中</option>\r\n")
.append(" <option value=\"bz\">八中</option>\r\n")
.append(" </select><br/>\r\n")
.append(" <input type=\"submit\" value=\"点击提交\">\r\n")
.append(" </form>\r\n")
.append(" </body>\r\n")
.append("</html>\r\n");
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String user = req.getParameter("user");
String pwd = req.getParameter("pwd");
String sex = req.getParameter("sex");
String[] hobby = req.getParameterValues("hobby");
String school = req.getParameter("school");
Map<String,String[]> paramMap = req.getParameterMap();
Enumeration<?> paramNames = req.getParameterNames();
Enumeration<?> HeaderNames = req.getHeaderNames();
this.doGet(req,resp); PrintWriter writer = resp.getWriter();
if(user != null){
writer.append("用户名 = ").append(user).append("<br/>");
}
if(pwd != null){
writer.append("密码 = ").append(pwd).append("<br/>");
}
if(sex != null){
writer.append("性别 = ").append(sex).append("<br/>");
}
if(hobby != null){
writer.append("爱好 = ").append(Arrays.toString(hobby)).append("<br/>");
}
if(school != null){
writer.append("学校 = ").append(school).append("<br/><br/>");
}
if(paramMap != null){
writer.append("paramMap:").append("<br/>");
for (Map.Entry<String,String[]> entry : paramMap.entrySet()) {
writer.append(entry.getKey()).append(" = ").append(Arrays.toString(entry.getValue())).append("<br/>");
}
}
if(paramNames != null){
writer.append("paramNames: ");
while(paramNames.hasMoreElements()){
String value = (String)paramNames.nextElement();
writer.append(value).append(", ");
}
writer.append("<br/>");
}
writer.append("getContentType: ").append(req.getContentType()).append("<br/>");
writer.append("getContentLength: " + req.getContentLength()).append("<br/>");
writer.append("getCharacterEncoding: ").append(req.getCharacterEncoding()).append("<br/>");
writer.append("getRequestURL: ").append(req.getRequestURL()).append("<br/>");
writer.append("getRequestURI: ").append(req.getRequestURI()).append("<br/>");
writer.append("getDateHeader: " + req.getDateHeader("")).append("<br/>");
if(HeaderNames != null){
writer.append("HeaderNames: ");
while(HeaderNames.hasMoreElements()){
String value = (String)HeaderNames.nextElement();
writer.append(value).append(", ");
}
writer.append("<br/>");
}
}

  具体效果:

JavaWeb——Servlet开发2的更多相关文章

  1. 【Java123】JavaWeb Servlet开发

    http://www.runoob.com/servlet/servlet-intro.html https://www.cnblogs.com/xdp-gacl/tag/JavaWeb学习总结/de ...

  2. JavaWeb——Servlet开发

    什么是Servlet? Servlet运行的过程 Servlet的生命周期 生命周期的各个阶段 Servlet的配置 使用Web.xml配置 使用注解配置 Servlet相关接口 ServletCon ...

  3. JavaWeb——Servlet开发3

    1.使用初始化参数配置应用程序 初始化参数的方式有两种 在Web.xml文件中使用<context-param>标签声明上下文初始化参数 <context-param> < ...

  4. JavaWeb——Servlet开发1

    Java Servlet是运行在服务器端上的程序,Servlet是Java Servlet包中的一个接口,能够直接处理和相应客户端的请求,也可以将工作委托给应用的其他类. public interfa ...

  5. javaweb学习之Servlet开发(二)

    javaweb学习总结(六)--Servlet开发(二) 一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个< ...

  6. JavaWeb学习总结第四篇--Servlet开发

    Servlet开发 用户在浏览器中输入一个网址并回车,浏览器会向服务器发送一个HTTP请求.服务器端程序接受这个请求,并对请求进行处理,然后发送一个回应.浏览器收到回应,再把回应的内容显示出来.这种请 ...

  7. JavaWeb开发之四:servlet技术 黑马程序员_轻松掌握JavaWeb开发之四Servlet开发 方立勋老师视频教程相当的经典

    总结: 记住:servlet对象在应用程序运行的过程中只创建一次,浏览器每次访问的时候,创建reponse对象 request对象,然后调用servlet的service方法,reponse对象和re ...

  8. javaweb学习总结(五)——Servlet开发(一)

    一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...

  9. javaWeb中servlet开发(5)——WEB开发模式:Mode I与Mode II

    1.servlet开发 2.model I模式 客户端通过访问JSP,调用里面的javabean,而通过javabean调用处理数据库的操作,javabean中有专门处理数据库的操作,数据库主要以DA ...

随机推荐

  1. k8s学习 - API

    k8s学习 - API 之前对k8s并没有很深入的了解,最近想把手头一个项目全部放到k8s上,以方便部署,需要研究.这里记录一下自己研究过程中头脑中的理解. k8s 和 docker 首先,需要先理解 ...

  2. ReentrantLock源码的一点总结

    ReentrantLock 是可重入锁,可重入锁的意思就是同一个线程可以重复获得该锁. 如何做到可重复获得该锁?计数器实现. 第一次加锁,cas比较是不是0,是0设置为1,并设置当前拥有锁的线程: 第 ...

  3. 数字IC前后端设计中的时序收敛(六)--Max Fanout违反

    本文转自:自己的微信公众号<数字集成电路设计及EDA教程>(二维码见博文底部) 里面主要讲解数字IC前端.后端.DFT.低功耗设计以及验证等相关知识,并且讲解了其中用到的各种EDA工具的教 ...

  4. C++学习书籍推荐《Exceptional C++(英文)》下载

    百度云及其他网盘下载地址:点我 作者简介 Herb Sutter is the author of three highly acclaimed books, Exceptional C++ Styl ...

  5. Asp.Net url参数加密存在特殊符号处理方法

    Url出现了有+,空格,/,?,%,#,&,=等特殊符号的时候,服务器端无法获得正确的参数值,解决办法. 使用System.Web.HttpUtility.UrlEncode()方法将这些字符 ...

  6. 拓扑排序 (Topological Sorting)

    拓扑排序(Topological Sorting) 一.拓扑排序 含义 构造AOV网络全部顶点的拓扑有序序列的运算称为拓扑排序(Topological Sorting). 在图论中,拓扑排序(Topo ...

  7. ESXI好好研究

    之前几周在公司要搭建一个平台,因为服务器不够用,所以需要要一台服务器上装虚拟机.有人说用ESXI装虚拟机,并且不用装操作系统,我当时还纳闷儿了,不装操作系统,直接装虚机?这里我有点孤陋寡闻了,其实ES ...

  8. Communicating with the UI Thread_翻译

    In the previous lesson you learned how to start a task on a thread managed by ThreadPoolExecutor. Th ...

  9. Win10更新后,MySQL服务莫名消失的问题

    手欠的给Win10更新,之后就发现右下角托盘里的小海豚变成白色的了,最后确认MySQL服务丢失 解决办法1: 1.重新安装服务:mysqld --install 2.如果之前没有自定义数据保存路径(d ...

  10. micropython TPYBoard v201 简易的web服务器的实现过程

    转载请注明文章来源,更多教程可自助参考docs.tpyboard.com,QQ技术交流群:157816561,公众号:MicroPython玩家汇 前言 TPYBoard v201开发板上搭载了以太网 ...