request对象是服务器对浏览器请求的封装,而response是服务器对服务器响应的封装。
html
request用来取出请求信息,而response则用来添加要返回给浏览器的信息。java
用来生成Http响应信息,发送给用户。数据库
响应首行数组
HTTP/1.1 200 OK浏览器
setStatus(int sc)
:设置正常的响应状态码 status codesetStatus(int sc, String sm)
:设置正常的响应状态码,状态码描述 status message,过期,由于正常状态下,状态码信息不会显示给用户,因此没有必要设置sendError(int sc)
:设置错误的状态码sendError(int sc, String sm)
:设置错误的状态码,包含错误信息响应头tomcat
key:value服务器
setHeader(String name, String value)
:设置一个键值对,值为stringsetDateHeader(String name, long date)
:设置一个键值对,值为long,long经常使用于毫秒的表示setIntHeader(String name, int value)
:设置一个键值对,值为int类型setHeader(String name, String value)
:添加一个键值对,值为stringsetDateHeader(String name, long date)
:添加一个键值对,值为long,long经常使用于毫秒的表示setIntHeader(String name, int value)
:添加一个键值对,值为int类型几个常见的响应头:jsp
html中meta标签的做用就是用于向响应头中添加信息。post
响应空行编码
一个分隔符
响应正文
须要发送的资源
response.getWriter()
:获取字符流getOutputSteam()
:获取输出字节流实现重定向很简单,只须要两个步骤:
在响应头中添加302状态码,告诉浏览器须要进行重定向
response.setStatus(302)
在响应头中添加Location,指定重定向的位置
response.setHeader("Location", "http://www.baidu.com");
当用户请求servlet时,服务器返回一个相似上面的响应头,上面的信息告诉浏览器,应该从新进行一次请求,请求的地址为 Header中的Location地址。
因此,请求重定向其实是两次请求。
咱们只须要使用:response.setRedirect("http://www.baidu.com")
便可实现。
// 获取图片输入流 InputStream is = getServletContext().getResourceAsStream("/WEB-INFO/mm.jpg"); // 获取浏览器的输出流 byte[] buffer = new byte[1024]; // 将图片篇输入流写出到浏览器中 int len = -1; while((len = is.readBuffer(buffer)) != -1){ os.write(buffer, 0, len); os.flush(); }
相似于图片,可是浏览器不能识别文件的名称和文件的类型,须要咱们在响应头中设置文件的类型:
ServletContext sc = getServletContext();
String mimeType = sc.getMimeType("下载的文件名称"); // 传入下载的文件名称,会根据名称的拓展名识别mime类型 response.setContentType(type);
便可。
用来生成http请求信息。
请求首行
请求方式 请求路径 协议/版本号
request.getMethod()
请求方式request.getContextPath()
,getServletPath()
…获取请求路径父类方法 request.getScheme()
获取请求协议请求头
键值对
request.getHeader(String name)
request.getIntHeader(String name)
request.getDateHeader(String name)
request.getHeaderNames()
request.getHeaders(Sring name)
一个key对应多个value请求空行
请求正文(post才有)
可是如下方法,不管是get仍是post请求均可以得到参数值
父类方法 String getParameter(String name)
Map<String, String[]> getParameterMap()
Enumeration getParameterNames()
String[] getParameterValues(String name)
解决方案:在conf/server.xml中URIEncoding="UTF-8"
69行,
<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8888" protocol="HTTP/1.1" redirectPort="8443"/>
设置URIEncoding为UTF-8
服务器响应时的数据,即服务器向浏览器传递的数据的编码格式由服务器决定:
编码时使用的编码表,使用getByte("编码表")
设置,或者使用response.setCharacterEncoding(编码表)
设置。二者的区别在于 ,前者设置字节流码表,后者设置字符流码表。
解码时使用的编码表,使response.setHeader("ContentType","text/html;charset=utf-8")
指定http响应头来设置。
客户端发送请求时的乱码解决:
GET提交,参数在URL中,设置URL的解码配置,服务器默认使用IOS-8855-1拉丁码表解码URL,咱们能够经过 tomcat/config/server.xml
配置文件中:
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
添加属性URIEncoding="UTF-8"
便可将服务器默认的解码url的方式设置为utf-8
或者在doget方法中
将接收的乱码文字使用新的码表转换:
String name = request.getParamter("name"); // 获取乱码文字 byte[] bs = name.getBytes("IOS-8859-1"); // 根据乱码码表,将文字转换为字节数组 String s = new String(bs, "UTF-8"); // 将字节数组按照新的码表解码,生成文字
POST提交:
与GET提交解码的区别:
解码事件不一样,GET由于参数在URL中,因此服务器一旦接受请求就会马上解码参数,而POST在Servlet调用获取参数的方法时才会解码。
因此,解决post请求的乱码很简单,只须要在参数调用前使用
request.setCharacterEncoding("utf-8");
设置请求解码表便可。
这就是请求转发,浏览器发送请求,servlet处理request和response部分业务,可是没法所有处理,也没法简单的显示到页面中,因此将处理过得request和response发送给jsp,jsp进行一些业务操做,并响应给浏览器,展现。
请求转发主要用来分工操做。
AServlet doGet():
// ***** 不标准自定义转发 //todo AServlet进行业务处理,好比从数据库获取数据 // 处理结束后:=> // 发送给Bservlet BServlet bServlet = new BServlet(); bServlet.doGet(request, response); //*****标准转发 // 使用request域(一个请求内有效,主要用于请求转发) 保存数据库的信息,发送给BServlet,即 AServlet和BServlet使用request域共享数据,request域是request对象中的一个Map。 request.setAttribute("name","Feathers"); // 向request域中存入一个键值对 request.getRequestDispatcher("/servlet/BServlet").forword(request.response);
BServlet doGet():
// todo 负责输出显示 // 从request域中取出值 System.out.println((String)request.getAttribute("name"));
不能在转发的Servlet中向浏览器输出任何响应正文的内容,可是能够添加响应头。
由于Servlet中,即便你添加了响应体,也会被清空。
请求转发,转发的Servlet不能修改请求体,而请求包含中,同请求转发相似,可是能够修改请求体。
用途:用来解决重复操做。
将重复的操做提取到这个Servlet中,统一进行处理。
每每在多个JSP中使用,一个jsp用于处理相同的操做,其他的jsp根据是否须要处理,进行依次处理。
实现:
AServlet doGet():
response.setContentType("text/html;charset=utf-8"); // 包含 request.getRequestDispatcher("/servlet/BServlet").include(request,response); response.getWriter().write("Aservlet 处理");
BServlet doGet():
response.getWriter().write("Bservlet 处理");
结果:
Aservlet 处理Bservlet 处理