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> ") .append("<html > ") .append(" <head> ") .append(" <title>hello user application</title> ") .append(" </head> ") .append(" <body> ") .append(" Hello, ").append(user).append("!<br/><br/> ") .append(" <form action="first" method="POST">") .append(" Enter your name:<br/> ") .append(" <input type="text" name="user"/><br/> ") .append(" <input type="submit" value="Submit"/> ") .append(" </form> ") .append(" </body> ") .append("</html> "); } @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> ") .append("<html > ") .append(" <head> ") .append(" <title>hello user application</title> ") .append(" </head> ") .append(" <body> ") .append(" Hello, ").append(user).append("!<br/><br/> ") .append(" <form action="first" method="POST"> ") .append(" 用户名:<input type="text" name="user"/><br/> ") .append(" 密码 :<input type="text" name="pwd"><br/> ") .append(" 性别:<input type="radio" name="sex" value="boy" checked="checked">男 ") .append(" <input type="radio" name="sex" value="girl">女<br/> ") .append(" 爱好:<input type="checkbox" name="hobby" value="game" >打游戏 ") .append(" <input type="checkbox" name="hobby" value="book" >看书 ") .append(" <input type="checkbox" name="hobby" value="music" >听音乐 ") .append(" <input type="checkbox" name="hobby" value="coding" >编程<br/> ") .append(" 所在学校:<select name="school"> ") .append(" <option>---请选择---</option> ") .append(" <option value="yz">一中</option> ") .append(" <option value="ez">二中</option> ") .append(" <option value="bz">八中</option> ") .append(" </select><br/> ") .append(" <input type="submit" value="点击提交"> ") .append(" </form> ") .append(" </body> ") .append("</html> "); } @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/>"); } }
具体效果: