@
目录requset对象
什么是request对象
request对象是由tomcat创建,用来获取浏览器发起请求时所发送的请求行,请求头,请求体的内容
获取请求行的内容
在请求行中可以获取request对象的相应请求方法, 获取到比如协议名、服务名、端口号、项目名称、请求方式、参数列表等信息。
/**
*getContextPath() 获取项目名称
*getMethod() 获取请求方式
*getRequestURL() 获取包含协议和端口的url地址
*这三个比较重要
*还有些其他的在下面一块演示
*/
public class MyServlet01 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取协议
System.out.println("协议名称为---" + req.getScheme());
//获取服务名称
System.out.println("服务器名称为---" + req.getServerName());
//获取端口号
System.out.println("服务器端口号为" + req.getServerPort());
//获取项目名称
String contextPath = req.getContextPath();
System.out.println("项目名称为" + contextPath);
//获取请求方式
String method = req.getMethod();
System.out.println("此次请求方式为" + method);
//获取查询参数
String queryString = req.getQueryString();
System.out.println("此次查询参数为" + queryString);
//获取请求地址
String uri = req.getRequestURI();
System.out.println("不包含协议和端口的地址:" + uri);
//获取包含http协议的请求地址
StringBuffer requestURL = req.getRequestURL();
System.out.println("包含协议和端口的地址:" + requestURL);
}
}
获取请求头的内容
请求头是当前对用户发送的数据的描述信息。
请求头信息在请求的时候不需要程序员手动添加,是浏览器发送的时候已经处理好的。
如果想查看请求头信息,也可以在Servlet中requeqt通过getHeader方法获取。
req.getHeader()
//括号里面写key
获取请求体的内容
需要注意的是,只有post请求才会有请求体,在请求体里面有form表单的请求参数
//获取请求体内容的三种方式
//在获取请求体内容的过程中,会产生乱码是因为浏览器编码方式为utf-8,而request采用的编码方式为ISO-8859-1
//设置编码方式
req.setCharacterEncoding("utf-8")
//第一种,根据请求题中的key获取值
String value = req.getParameter("key");//key为表单中的name属性的值
//第二种,表单中一个name属性可能会有多个value值,比如说复选框的内容,此时用到该种方式,把该属性的内容封装成一个数组
String [] strings = req.getParameterValues("key");
//第三种,把所有请求体里面的数据,封装成一个map集合对象要是想要拿数据,直接遍历map集合
Map<String,String[]> map = req,getParameterMap();
request请求域对象(域对象的一种)
域对象就是实现不同servlet之间的数据共享。
通过request作用域设置域对象的时候,该作用域可以在一次请求内被访问,当该请求结束时,该request作用域对象自动被销毁
//在作用域里面存如一个域对象,名字为key,值为value
req.serAttribute("key","value");
//拿到作用域里面名字为key的值
req.getAttribute("key")
//移除作用域里面名字为key的作用域对象
req.removeAttribute("key")
请求转发
该行为发生在服务器内部,当浏览器请求servletA的时候,servletA资源不足或者无法满足该请求时,可以使用请求转发请求其他的servlet,然后响应给浏览器
//别忘了加" / "
req.setResponseDispatcher("/另一个servelet的名字").forword(req,resp)
请求转发的特点
- 地址栏不会发生变化
- 一次请求一次响应
- 可以实现request作用域的数据共享
- 不能访问外网
- 路径里面不能携带项目名称(浏览器会自动拼接上项目名称)
response对象
什么是response对象
response对象也是tomcat创建的用来设置响应信息,响应信息有响应行,响应头,响应体
设置响应行
响应行里面有协议和协议版本,以及响应状态码
常见的状态码
- 200 表示响应成功
- 302 资源重定向
- 401 未授权
- 404
出现的原因:
浏览器访问路径错误
tomcat服务未开启,项目没有部署到tomcat服务器中
你要访问的页面资源在WEB-INF文件夹中,无法访问 - 500
表示服务器端代码出错,可以通过控制台查看异常消息。
可以通过response.sendError(sc, msg)来设置状态信息,但一般不会手动设置,仅用来做测试。
//给页面响应错误信息
resp.sendError(状态码,"状态码信息")
设置响应头
常见的响应头
1、refresh:完成定时跳转 ***
2、Content-Type: 响应内容的MIME类型 (text/html;charset=utf-8) mime类型可以通过servletContext获取
3、Content-Length: 响应体的长度(在UTF-8的编码格式下,一个汉字对应3个字节)
4、Date: 发送响应的开始时间
5、Content-Disposition:告诉浏览器以下载方式打开数据(做文件下载时使用)
resp.setHeader("key","value")
resp.setHeader("refresh","5;url=http://www.baidu.com")//5秒后跳转到百度
resp.setHeader("Content-Type","text/html;charset=utf-8")
resp.setHeader("Content-Disposition","attachment;filename="+filename);
设置响应体
响应体就是要响应的数据。响应对象response在返回数据、响应数据的时候,会将一些HTML、text、流数据等信息通过响应主体返回给页面,而响应体绝大多数都是文本类型
响应的数据需要流来传递
response自带的流有两个
response.getWriter() ==> PrintWriter 输出文本信息
print() write()
response.getOutputStream ==> ServletOutputStream 输出字节信息,比如图片、音频、视频
需要注意:
这两个流不能同时存在。
如果在响应体中包含了中文、此时网页中会出现乱码
乱码产生的原因:编码和解码不一致造成的、response默认编码方式iso-8859-1 页面解码方式 uft-8
解决方式
resp.setContenType("text/html;charset=utf-8") 一定放在返回响应内容最前面
重定向
重定向是了服务器行为,它是浏览器在向服务器发送请求时,服务器向浏览器发送指令去访问一个新的URL地址,这个指令就是重定向
resp.sendRedirect("/项目名/servlet名");
重定向特点
- 多次请求多次响应
- 浏览器地址栏会发生变化
- 允许访问外网(重定向到其他项目)
- 请求的地址必须加上项目名称
- 不可以共享request作用域的数据(他是多次请求)
这里解释下多次请求多次响应
比如当客户端浏览器向AServlet发送一个请求,经过处理后向客户端做出响应,这个响应就是向服务器再次发送新的请求,去请求BServlet,而这个新请求的地址将为浏览器做出第二次响应,此时浏览器地址栏会发生改变,由于一次请求/响应结束后,request对象会自动销毁,所以两次请求的request对象并非同一个,所以两次请求域中的数据信息不会共享。由此可见,重定向是做了两次请求和响应
servletContext对象
什么是servletContext对象
ServletContext是应用域对象、在应用域创建的域对象,只要服务器不重新启动或者是关闭,都可以进行访问。
当我们服务器启动时候、服务器会为部署在webapps里面每一个web项目都创建一个ServletContext对象来表示该项目的上下文环境。当服务器关闭的时候ServletContext对象销毁
ServletContext的获取
1. request.getServletContext(); 推荐
2. getServletContext();
ServletContext的作用
- 获取MIME类型
String filename = "带后缀的文件名"
ServletContext context = req.getServletContext();
String type = context.getMimeType(fileName);
- 域对象共享数据
Servlet创建的域对象是一个全局域对象,
当服务器启动的时候,服务器会为每一个web项目创建一个ServletContext对象,
它创建的域对象只有在服务器关闭时才会被销毁
ServletContext context = req.getServletContext();
context.setAttribute("msg","阉人张飞在此");
//设置好对象后,无论哪次请求都可以通过getAttribute("msg")获取到该条信息
- 获取文件的真实路径
使用getRealPath()方法
ServletContext context = req.getServletContext()
//获取src路径下的文件 会把编译好的字节码文件放到WEB—INF下面
context.getRealPath("/WEB-INF/classes/文件名")
//获取与WEB-INF同级目录下的文件 比如说同级目录是img
context.getRealPath("/img/文件名")
//获取与WEB-INF同级的文件
context.getRealPath("文件名")
请求转发和重定向的区别
请求转发使用方式是req.getRequestDispatcher("/rb3").forward(req,resp);
,是服务器的行为,它是request对象发起的,他是一次请求一次响应,他所传的参数是servlet的名字,不能写项目名,不能访问其他的项目,在请求转发时会在浏览器地址栏不会发生变化,可以共享域对象的数据
重定向是使用方式是resp.sendRedirect("/day16/rb3");
,是浏览器的行为,它是response对象发起的,里面可能会有多次请求多次响应,所传的参数项目名/servlet名,该路径必须加上项目名,它可以在请求时重定向到其他项目,由于是多次请求,所以它不会共享域对象中的数据