request对象
作用:request对象中封存了当前请求的所有请求信息使用:
获取请求行数据
req.getMethod();//获取请求方式
req.getRequestURL();//获取请求URL信息
req.getRequestURI();//获取请求URI信息
req.getScheme();//获取协议
获取请求头数据
req.getHeader("键名");//返回指定的请求头信息
req.getHeaderNames();//返回请求头的键名的枚举集合
获取用户数据
req.getParameter("键名");//返回指定的用户数据
req.getParameterValues("键名");//返回同键不同值的请求数据(多选),返回的数组。
req.getParameterNames()//返回所有用户请求数据的枚举集合
注意:
如果要获取的请求数据不存在,不会报错,返回null。
注意:
request对象由tomcat服务器创建,并作为实参传递给处理请求的servlet的service方法。
1 public class RequestServlet extends HttpServlet { 2 @Override 3 protected void service(HttpServletRequest req, HttpServletResponse resp) 4 throws ServletException, IOException { 5 //获取请求头数据 6 //获取请求方式 7 String method = req.getMethod(); 8 System.out.println(method); 9 //获取请求URL 10 StringBuffer url=req.getRequestURL(); 11 System.out.println(url); 12 //获取URI 13 String uri=req.getRequestURI(); 14 System.out.println(uri); 15 //获取协议 16 String h=req.getScheme(); 17 System.out.println(h); 18 //获取请求行数据 19 //获取指定的请求行信息 20 String value=req.getHeader("aaa"); 21 System.out.println(value); 22 //获取所有的请求行的键的枚举 23 Enumeration e = req.getHeaderNames(); 24 while(e.hasMoreElements()){ 25 String name=(String) e.nextElement(); 26 String value2=req.getHeader(name); 27 System.out.println(name+":"+value2); 28 } 29 //获取用户数据 30 String name=req.getParameter("uname"); 31 String pwd=req.getParameter("pwd"); 32 System.out.println(name+":"+pwd); 33 //String fav=req.getParameter("fav"); 34 String[] favs=req.getParameterValues("fav"); 35 if(favs!=null){ 36 for(String fav:favs){ 37 System.out.println(fav); 38 } 39 } 40 //获取所有的用户请求数据的键的枚举集合---req.getParameterNames() 41 } 42 }
respone对象
作用:
用来响应数据到浏览器的一个对象
使用:
设置响应头
setHeader(String name,String value);//在响应头中添加响应信息,但是同键会覆盖
addHeader(String name,String value);//在响应头中添加响应信息,但是不会覆盖。
设置响应状态
sendError(int num,String msg);//自定义响应状态码。
设置响应实体
resp.getWrite().write(String str);//响应具体的数据给浏览器
设置响应编码格式:
resp.setContentType("text/html;charset=utf-8");
用来响应数据到浏览器的一个对象
使用:
设置响应头
setHeader(String name,String value);//在响应头中添加响应信息,但是同键会覆盖
addHeader(String name,String value);//在响应头中添加响应信息,但是不会覆盖。
设置响应状态
sendError(int num,String msg);//自定义响应状态码。
设置响应实体
resp.getWrite().write(String str);//响应具体的数据给浏览器
设置响应编码格式:
resp.setContentType("text/html;charset=utf-8");
1 public class ResponseServlet extends HttpServlet { 2 @Override 3 protected void service(HttpServletRequest req, HttpServletResponse resp) 4 throws ServletException, IOException { 5 //获取请求信息 6 //获取请求头 7 //获取请求行 8 //获取用户数据 9 //处理请求 10 11 //响应处理结果 12 //设置响应头 13 resp.setHeader("mouse", "two fly birds"); 14 resp.setHeader("mouse", "bjsxt"); 15 resp.addHeader("key", "thinkpad"); 16 resp.addHeader("key", "wollo"); 17 //设置响应编码格式 18 //resp.setHeader("content-type", "text/html;charset=utf-8"); 19 //resp.setContentType("text/plain;charset=utf-8"); 20 //resp.setContentType("text/xml;charset=utf-8"); 21 resp.setContentType("text/html;charset=utf-8"); 22 //设置响应状态码 23 //resp.sendError(404, "this Method is not supported"); 24 //设置响应实体 25 resp.getWriter().write("<b>今天天气真好,适合学习</b>"); 26 27 28 } 29 }
请求中文乱码解决
1、使用String进行数据重新编码
uname=new String(uname.getBytes("iso8859-1"),"utf-8");
2、使用公共配置
get方式:
步骤一:在service方法中使用:req.setCharacterEncoding("utf-8");
步骤二:
在tomcat的目录下的conf目录中修改server.xml文件:在Connector标签中增加属性useBodyEncodingForURI="true"
post方式:
在service方法中使用:req.setCharacterEncoding("utf-8");
服务器接受浏览器的请求,进行解析,创建request对象存储请求数据
服务器调用对应的servlet进行请求处理,并将request对象作为实参传递给servlet的方法
servlet的方法执行进行请求处理
设置请求编码格式
req.setCharacterEncoding("utf-8");
设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
获取请求数据
处理请求数据
创建业务层对象
调用业务层对象的方法
响应处理结果
使用:
req.getRequestDispatcher("要转发的地址").forward(req, resp);
地址:相对路径,直接书写servlet的别名即可。
特点:
一次请求,浏览器地址栏信息不改变。
注意:
请求转发后直接return结束即可。
解决:使用request对象的作用域
使用:
request.setAttribute(Object name,Object value);
request.getAttribute(Object obj);
作用:解决了一次请求内不同的servlet的数据(请求数据+其他数据)共享问题。
注意:使用Request对象进行数据流转,数据只在一次请求内有效。
特点:
服务器创建
每次请求都会创建
生命周期一次请求
uname=new String(uname.getBytes("iso8859-1"),"utf-8");
2、使用公共配置
get方式:
步骤一:在service方法中使用:req.setCharacterEncoding("utf-8");
步骤二:
在tomcat的目录下的conf目录中修改server.xml文件:在Connector标签中增加属性useBodyEncodingForURI="true"
post方式:
在service方法中使用:req.setCharacterEncoding("utf-8");
Servlet流程总结
浏览器发起请求到服务器(请求)服务器接受浏览器的请求,进行解析,创建request对象存储请求数据
服务器调用对应的servlet进行请求处理,并将request对象作为实参传递给servlet的方法
servlet的方法执行进行请求处理
设置请求编码格式
req.setCharacterEncoding("utf-8");
设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
获取请求数据
处理请求数据
创建业务层对象
调用业务层对象的方法
响应处理结果
请求转发
作用:实现多个servlet联动操作处理请求,这样避免代码冗余,让servlet的职责更加明确。使用:
req.getRequestDispatcher("要转发的地址").forward(req, resp);
地址:相对路径,直接书写servlet的别名即可。
特点:
一次请求,浏览器地址栏信息不改变。
注意:
请求转发后直接return结束即可。
reuqest作用域
问题:使用请求转发后,数据怎么从一个servlet流转给另一个servlet?解决:使用request对象的作用域
使用:
request.setAttribute(Object name,Object value);
request.getAttribute(Object obj);
作用:解决了一次请求内不同的servlet的数据(请求数据+其他数据)共享问题。
注意:使用Request对象进行数据流转,数据只在一次请求内有效。
特点:
服务器创建
每次请求都会创建
生命周期一次请求
请求重定向
解决了表单重复提交的问题,以及当前servlet无法处理的请求的问题。
使用:
resp.sendRedirect(String uri);
示例:
resp.sendRedirect("/login/main");
特点:
两次请求,两个request对象。
浏览器地址栏信息改变
时机:
如果请求中有表单数据,而数据又比较重要,不能重复提交,建议使用重定向。
如果请求被Servlet接收后,无法进行处理,建议使用重定向定位到可以处理的资源。
使用:
resp.sendRedirect(String uri);
示例:
resp.sendRedirect("/login/main");
特点:
两次请求,两个request对象。
浏览器地址栏信息改变
时机:
如果请求中有表单数据,而数据又比较重要,不能重复提交,建议使用重定向。
如果请求被Servlet接收后,无法进行处理,建议使用重定向定位到可以处理的资源。
代码:
1 protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 2 //设置请求编码格式: 3 req.setCharacterEncoding("utf-8"); 4 //设置响应编码格式 5 resp.setContentType("text/html;charset=utf-8"); 6 //获取请求信息 7 String uname=req.getParameter("uname"); 8 //uname=new String(uname.getBytes("iso8859-1"),"utf-8");//使用String进行数据重新编码 9 String pwd=req.getParameter("pwd"); 10 System.out.println(uname+":"+pwd); 11 //处理请求信息 12 //获取业务层对象 13 LoginService ls=new LoginServiceImpl(); 14 User u=ls.checkLoginService(uname, pwd); 15 System.out.println(u); 16 //响应处理结果 17 if(u!=null){ 18 resp.sendRedirect("/Login/main"); 19 return; 20 }else{ 21 //使用request对象实现不同Servlet的数据流转 22 req.setAttribute("str", "用户名或密码错误"); 23 //使用请求转发 24 req.getRequestDispatcher("page").forward(req, resp); 25 return; 26 } 27 }
1 protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 2 //设置响应编码格式 3 resp.setContentType("text/html;charset=utf-8"); 4 //获取请求信息 5 //处理请求 6 //响应处理结果 7 //获取request作用域数据 8 String str=(String) req.getAttribute("str")==null?"":(String) req.getAttribute("str"); 9 resp.getWriter().write("<html>"); 10 resp.getWriter().write("<head>"); 11 resp.getWriter().write("</head>"); 12 resp.getWriter().write("<body>"); 13 resp.getWriter().write("<font color='red' size='20px'>"+str+"</font>"); 14 resp.getWriter().write("<form action='login' method='get'>"); 15 resp.getWriter().write("用户名:<input type='text' name='uname' value=''/><br/>"); 16 resp.getWriter().write("密码:<input type='password' name='pwd' value=''/><br/>"); 17 resp.getWriter().write("<input type='submit' value='登录'/><br/>"); 18 resp.getWriter().write("</form>"); 19 resp.getWriter().write("</body>"); 20 resp.getWriter().write("</html>"); 21 }
请求重定向 vs 请求转发 区别
请求重定向:(浏览器行为)
1)地址栏改变,改变为重定向到的地址
2)可以重定向到当前web应用,其他web应用,甚至是其他站点资源。
3)处于两次不同的请求。不可以使用request域对象来共享数据。
2)可以重定向到当前web应用,其他web应用,甚至是其他站点资源。
3)处于两次不同的请求。不可以使用request域对象来共享数据。
请求转发:(服务器行为)
1)地址栏不会改变。
2)只能转发到当前web应用内部资源。
3)处于同一次请求。可以使用request域对象来共享数据
1)地址栏不会改变。
2)只能转发到当前web应用内部资源。
3)处于同一次请求。可以使用request域对象来共享数据