servlet对象

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)

请求转发的特点

  1. 地址栏不会发生变化
  2. 一次请求一次响应
  3. 可以实现request作用域的数据共享
  4. 不能访问外网
  5. 路径里面不能携带项目名称(浏览器会自动拼接上项目名称)

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名");

重定向特点

  1. 多次请求多次响应
  2. 浏览器地址栏会发生变化
  3. 允许访问外网(重定向到其他项目)
  4. 请求的地址必须加上项目名称
  5. 不可以共享request作用域的数据(他是多次请求)

这里解释下多次请求多次响应

比如当客户端浏览器向AServlet发送一个请求,经过处理后向客户端做出响应,这个响应就是向服务器再次发送新的请求,去请求BServlet,而这个新请求的地址将为浏览器做出第二次响应,此时浏览器地址栏会发生改变,由于一次请求/响应结束后,request对象会自动销毁,所以两次请求的request对象并非同一个,所以两次请求域中的数据信息不会共享。由此可见,重定向是做了两次请求和响应

servletContext对象

什么是servletContext对象

ServletContext是应用域对象、在应用域创建的域对象,只要服务器不重新启动或者是关闭,都可以进行访问。
当我们服务器启动时候、服务器会为部署在webapps里面每一个web项目都创建一个ServletContext对象来表示该项目的上下文环境。当服务器关闭的时候ServletContext对象销毁

ServletContext的获取

	1. request.getServletContext(); 推荐
	2. getServletContext();

ServletContext的作用

  1. 获取MIME类型
String filename = "带后缀的文件名"
ServletContext context = req.getServletContext();
String type = context.getMimeType(fileName);
  1. 域对象共享数据
Servlet创建的域对象是一个全局域对象,
当服务器启动的时候,服务器会为每一个web项目创建一个ServletContext对象,
它创建的域对象只有在服务器关闭时才会被销毁
ServletContext context = req.getServletContext();
context.setAttribute("msg","阉人张飞在此");
//设置好对象后,无论哪次请求都可以通过getAttribute("msg")获取到该条信息
  1. 获取文件的真实路径
使用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名,该路径必须加上项目名,它可以在请求时重定向到其他项目,由于是多次请求,所以它不会共享域对象中的数据

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值