Servlet学习笔记04-HttpServletRequset接口
一、接口介绍
- HttpServletRequest接口来自于Servlet规范中,在Tomcat中存在servlet-api.jar。
- HttpServletRequest接口实现类由Http服务器负责提供。
- HttpServletRequest接口负责doGet/doPost方法运行时读取Http请求协议包中信息。
- 开发人员习惯于将HttpServletRequest接口修饰的对象称为【请求对象】
二、接口作用
- 可以读取Http请求协议包中【请求行】信息。
- 可以读取保存在Http请求协议包中【请求头】或者【请求体】中的请求参数信息。
- 可以代替浏览器向Http服务器申请资源文件调用。
三、代码演示
-
通过Get请求并从请求中获取URL和HTTP方法。
public class OneServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.通过请求对象,读取【请求行】中的【url】信息 String url = req.getRequestURL().toString(); //2.通过请求对象,读取【请求行】中的【method】信息 String method = req.getMethod(); System.out.println("URL:"+url); System.out.println("Method:"+method); }
通过网站访问,看控制台内容(配置xml以及jar包前面加个笔记中有)
URL:http://localhost:8080/05_servlet_war_exploded/one Method:GET
通过请求对象,读取【请求行】中的【uri】信息
uri:资源文件精准定位地址,在请求行并没有uri这个属性,是在utl上截取的。
public class OneServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.通过请求对象,读取【请求行】中的【url】信息 String url = req.getRequestURL().toString(); //2.通过请求对象,读取【请求行】中的【method】信息 String method = req.getMethod(); //3.通过请求对象,读取【请求行】中的【uri】信息 String uri = req.getRequestURI(); System.out.println("URL:"+url); System.out.println("Method:"+method); System.out.println("uri:"+uri); }
访问网站
URL:http://localhost:8080/05_servlet_war_exploded/one Method:GET uri:/05_servlet_war_exploded/one
-
通过Get请求并从请求中获取所有请求参数名
提前准备一个html页面,里面有一个a标签用于携带请求参数跳转到TwoSverlet页面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <center> <a href="/05_servlet_war_exploded/two?userName=tom&password=123456">通过超链接访问TwoServlet携带请求参数</a> </center> </body> </html>
HttpServlet实现类
public class TwoServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.通过请求对象获得【请求头】中【所有请求参数名】 Enumeration<String> parameterNames = req.getParameterNames(); while(parameterNames.hasMoreElements()){ String paramName = parameterNames.nextElement(); System.out.println("请求参数名"+paramName); } } }
启动TomCat,点击跳转后,观看控制台
请求参数名userName 请求参数名password
通过请求对象读取指定的请求参数值
public class TwoServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.通过请求对象获得【请求头】中【所有请求参数名】 Enumeration<String> parameterNames = req.getParameterNames(); while(parameterNames.hasMoreElements()){ String paramName = parameterNames.nextElement(); //2.通过请求对象读取指定的请求参数值 String value = req.getParameter(paramName); System.out.println("请求参数名: " + paramName + "请求参数值:"+value); } } }
观看控制台
请求参数名: userName请求参数值:tom 请求参数名: password请求参数值:123456
-
通过表单获取请求参数值
准备一个html页面,通过表单实现Get和Post请求
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <center> <form action="/05_servlet_war_exploded/three" method="get"> 请求参数:<input type="text" name="username"/> <br/> <input type="submit" value="get方式访问ThreeServlet"> </form> <form action="/05_servlet_war_exploded/three" method="post"> 请求参数:<input type="text" name="username"/> <br/> <input type="submit" value="post方式访问ThreeServlet"> </form> </center> </body> </html>
HttpServlet实现类
public class ThreeServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //通过请求对象,读取【请求体】参数信息 String value = req.getParameter("username"); System.out.println("get方式从请求体得到参数值:"+value); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //通过请求对象,读取【请求体】参数信息 String value = req.getParameter("username"); System.out.println("post方式从请求体得到参数值:"+value); } }
观看控制台
get方式从请求体得到参数值:zhangsan post方式从请求体得到参数值:admin
值得注意的是:
- 以GET方式发送中文参数内容时,会返回正常的结果。
- 以POST方式发送中文参数内容时,会得到乱码。
这是因为:
-
浏览器以GET方式发送请求,请求参数保存在【请求头】,在HTTP请求协议包到达Http服务器之后,第一件事就是进行解码请求头二进制内容由Tomcat负责解码,Tomcat9.0默认使用【utf-8】字符集,可以解释一切国家文字。
-
浏览器以POST方式发送请求,请求参数保存在【请求体】,HTTP请求协议包到达Http服务器之后,第一件事就是进行解码请求头二进制内容由当前请求对象(request)负责解码,request默认使用【ISO-8859-1】字符集,一个东欧语系字符集。这时使用中文就会得到乱码。
可以通过在post请求方式下声明使用utf-8,重新编码。
req.setChararcterEncoding("utf-8");