基本概念:html
在调用service以前,服务器(tomcat)会将用户的请求封装到request对象里面,同时也会建立一个response对象,经过service方法传递到咱们的Servlet中。咱们作必定的处理,将处理的结果,封装到response中,再将response对象返回给服务器,服务器响应到客户端。java
response:web
1.设置响应体
浏览器
(1) 向客户端响应文本缓存
PrintWriter response.getWriter();tomcat
writer.write("文本") --- 向response的缓冲区中去写服务器
注:向客户端回写中文数据时 乱码 post
乱码的缘由:response缓冲区的编码方式是iso8859-1(西欧编码方式)性能
解决方式:response.setContentType("text/html;charset=UTF-8");编码
上面的代码完成两个设置:(1) 设置response缓冲区的编码---response.setCharacterEncoding("UTF-8");
(2) 设置浏览器的解码方式----response.setHeader("Content-Type", "text/html;charset=UTF-8")
(2) 向客户端响应字节
ServletOutputStream out = response.getOutputStream();
2.response的一些细节:
(1) response.getOutputStream()得到的流不用手动关闭 --- web容器帮咱们关闭
(2) 重定向:302+Location
response有一个重定向的方法:sendRedirect(url)
(3) response有两个获取流的方法 getWriter和getOutputStream 不能一块儿使用
(4) response缓存区有大小 默认是8k 经过setBufferSize设置大小 只能向大设置
(5) resposse缓冲区的内容被真正的刷出 不能再进行转发和重定向
什么状况下 缓冲区的内容被刷出?
response.flushBuffer();
缓冲区的内容写满了
转发或重定向也会刷出缓冲区的内容
(6) 当进行转发或重定向时 以前写到response缓冲区的内容会被清空 可是写入的头仍然有效
servlet01.java
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class servlet01 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置响应头 response.setHeader("vw", "v6"); // 追加响应头 response.addHeader("mu", "77"); // 字符流响应正文,浏览器显示信息 /* * PrintWriter writer = response.getWriter(); writer.print("thanks"); */ // 字节流响应正文(字节流和字符流不能同时使用) ServletOutputStream outputStream = response.getOutputStream(); outputStream.write("hello".getBytes()); } }
request:
get提交方式有哪些?
直接输入网址 、超连接<a href=""> 、<from method="get"> 、重定向 、定时跳转 、 js的location.href
post提交方式哪些?
<form method="post">
URI与URL?
URI:全球资源标识符 能够是绝对的,也能够是相对的。相对的都是uri /day10_205/request1 C:\\
URL: 全球资源定位符 URL是一种具体的URI http://
一、获取请求行的数据
得到请求方式:getMethod();
得到访问资源:getRequestURI/getRequestURL
获取访问的资源后面参数的字符串:getRequestQuery()
获取客户机的ip:getRemoteAddr()
获取web应用的名称:getContextPath()
二、获取请求头的信息
getHeader(头的名称)根据指定头名称获取值
getHeaderNames()获取全部的请求头的名字
getHeaders()获取指定的头的全部值
getIntHeader()
getDateHeader()
Referer:该资源的访问来源 ----- 防盗链
三、获取请求体的数据
(1) request.getParameter(name的属性值);
(2)request.getParameterNames(); 能够获得全部的要提交标签的name的属性值。
(3)request.getParameterValues("hobby"); 多个属性值 。例如checkbox 。
注:
request乱码问题
缘由:
咱们提交信息 =====》浏览器会按照utf-8的形式给咱们传递的信息 进行编码======》
服务器按照iso-8859-1的的形式给咱们解码。
解决:
乱码中文 ==== 》按照iso-8859-1编码===》 按照utf-8的格式进行解码===》咱们提交信息
post请求的乱码解决方案
request.setCharacterEncoding("utf-8");
get,post请求通用解决方式
String str1 = new String (name.getBytes("iso-8859-1"),"utf-8");
4. request对象是一个域对象
可见范围:一次请求链中
setAttribute(String name,Object value)
getAttrbute(String name)
removeAttrbute(String name)
5. 请求转发
request.getRequestDispatcher().forward(request,response);
转发和重定向的区别?
(1) 转发地址不变 客户端一次请求 重定向地址变化 两次请求
(2) 转发是web应用内部的行为 重定向是客户端从新访问的
(3) 转发的性能高一些
6.请求包含:
request.getRequestDispatcher().include(request,response);
RequestServlet01.java
import java.io.IOException; import java.io.PrintWriter; import java.util.Enumeration; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class RequestServlet01 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //解决request请求乱码问题(post提交数据) request.setCharacterEncoding("utf-8"); /*乱码缘由: * 咱们提交信息 =====》浏览器会按照utf-8的形式给咱们传递的信息 进行编码======》 服务器按照iso-8859-1的的形式给咱们解码。 * get请求方式解决乱码方法 String str1 = new String (name.getBytes("iso-8859-1"),"utf-8"); */ //获得用户的请求方式 String method = request.getMethod(); //获得协议 String protocol = request.getProtocol(); //获得资源路径 String requestURI = request.getRequestURI(); System.out.println(method+"--"+protocol+"--"+requestURI); System.out.println("------------------------------------------------------"); /* * POST--HTTP/1.1--/Response_Request_test/RequestServlet01 */ //协议的请求资源路径 StringBuffer requestURL = request.getRequestURL(); //获得用户的地址 String remoteAddr = request.getRemoteAddr(); //获得资源名或者项目名 String contextPath = request.getContextPath(); System.out.println(requestURL+"--"+remoteAddr+"--"+contextPath); /* * http://localhost:8080/Response_Request_test/RequestServlet01 * --0:0:0:0:0:0:0:1 * --/Response_Request_test */ System.out.println("--------------------------------------"); //根据请求头中相应的name得到相应的请求值 String header = request.getHeader("Host"); System.out.println(header); /* * localhost:8080 */ //获得全部请求头的name值 Enumeration headerNames = request.getHeaderNames(); while(headerNames.hasMoreElements()){ String nextElement = (String)headerNames.nextElement(); System.out.println(nextElement); } /* accept referer accept-language user-agent content-type accept-encoding host content-length connection cache-control */ //根据用户表单的name得到相应的值 String username = request.getParameter("username"); System.out.println("username:"+username); /*username:123*/ //获得咱们提交表单的标签name的属性值 Enumeration<String> names = request.getParameterNames(); while(names.hasMoreElements()){ String key = names.nextElement(); System.out.println(key); } /* username userpass */ //将用户的请求的信息放到map里面 Map<String,String[]> map = request.getParameterMap(); String usrname = map.get("username")[0]; System.out.println(usrname); /* 123*/ //获得一个属性值对应多个的值(checkbox) String[] values = request.getParameterValues("hobby"); for(String value:values){ System.out.println(value); } /* soccer basketball table tennis */ } }