equest&response&servletContext

1. request

1.1 request概述

request是Servlet.service()方法的一个参数,类型为javax.servlet.http.HttpServletRequest。在客户端发出每个请求时,服务器都会创建一个request对象,并把请求数据封装到request中,然后在调用Servlet.service()方法时传递给service()方法,这说明在service()方法中可以通过request对象来获取请求数据。

request功能

  • 封装了请求头数据
  • 封装了请求正文数据,如果是GET请求,那么就没有正文
  • request是一个域对象,可以把它当成Map来添加获取数据
  • request提供了请求转发和请求包含功能

1.2 request域方法

request是域对象!在JavaWeb中一共四个域对象,其中ServletContext就是域对象,它在整个应用中只创建一个ServletContext对象。request其中一个,request可以在一个请求中共享数据

一个请求会创建一个request对象,如果在一个请求中经历了多个Servlet,那么多个Servlet就可以使用request来共享数据

request的域方法

  • void setAttribute(String name, Object value):用来存储一个对象,也可以称之为存储一个域属性
    例如:servletContext.setAttribute(“xxx”, “XXX”),在request中保存了一个域属性,域属性名称为xxx,域属性的值为XXX
    请注意,如果多次调用该方法,并且使用相同的name,那么会覆盖上一次的值,这一特性与Map相同

  • Object getAttribute(String name):用来获取request中的数据,当前在获取之前需要先去存储才行
    例如:String value = (String)request.getAttribute(“xxx”);,获取名为xxx的域属性

  • void removeAttribute(String name):用来移除request中的域属性,如果参数name指定的域属性不存在,那么本方法什么都不做

  • Enumeration getAttributeNames():获取所有域属性的名称

1.3 request获取请求头数据

request与请求头相关的方法有:

  • String getHeader(String name):获取指定名称的请求头
  • Enumeration getHeaderNames():获取所有请求头名称
  • int getIntHeader(String name):获取值为int类型的请求头

1.4 request获取请求相关的其它方法

request中还提供了与请求相关的其他方法,有些方法是为了我们更加便捷的方法请求头数据而设计,有些是与请求URL相关的方法:

  • int getContentLength():获取请求体的字节数,GET请求没有请求体,没有请求体返回-1

  • String getContentType():获取请求类型,如果请求是GET,那么这个方法返回null
    如果是POST请求,那么默认为application/x-www-form-urlencoded,表示请求体内容使用了URL编码

  • String getMethod():返回请求方法,例如:GET

  • Locale getLocale():返回当前客户端浏览器的Locale。java.util.Locale表示国家和言语,这个东西在国际化中很有用

  • String getCharacterEncoding():获取请求编码,如果没有setCharacterEncoding(),那么返回null,表示使用ISO-8859-1编码

  • void setCharacterEncoding(String code):设置请求编码,只对请求体有效!
    注意,对于GET而言,没有请求体!!!所以此方法只能对POST请求中的参数有效!

  • String getContextPath():返回上下文路径
    例如:/hello

  • String getQueryString():返回请求URL中的参数
    例如:name=zhangSan

  • String getRequestURI():返回请求URI路径
    例如:/hello/oneServlet

  • StringBuffer getRequestURL():返回请求URL路径
    例如:http://localhost/hello/oneServlet,即返回除了参数以外的路径信息

  • String getServletPath():返回Servlet路径
    例如:/oneServlet

  • String getRemoteAddr():返回当前客户端的IP地址

  • String getRemoteHost():返回当前客户端的主机名,但这个方法的实现还是获取IP地址

  • String getScheme():返回请求协议
    例如:http;

  • String getServerName():返回主机名
    例如:localhost

  • int getServerPort():返回服务器端口号
    例如:8080

1.5 request获取请求参数

最为常见的客户端传递参数方式有两种:

  • 浏览器地址栏直接输入:一定是GET请求
  • 超链接:一定是GET请求
  • 表单:可以是GET,也可以是POST,这取决与的method属性值

GET请求和POST请求的区别:

  • GET请求:
    • 请求参数会在浏览器的地址栏中显示,所以不安全
    • 请求参数长度限制长度在1K之内
    • GET请求没有请求体,无法通过request.setCharacterEncoding()来设置参数的编码
  • POST请求:
    • 请求参数不会显示浏览器的地址栏,相对安全
    • 请求参数长度没有限制

2. response

2.1 response概述

response是 Servlet.service方法的一个参数,类型为 avax.servlet.http. HttpServletResponse。在客户端发出每个请求时,服务器都会创建一个 response对象,并传入给 Servlet. service()方法。 response对象是用来对客户端进行响应的,这说明在 service()方法中使用 response对象可以完成对客户端的响应工作

response对象的功能分为以下四种

  • 设置响应头信息
  • 发送状态码
  • 设置响应正文
  • 重定向

2.2 response用法

  • 设置响应行的状态码
    setStatus(int value)

  • 设置响应头

    • addHeader(String name,String value)
      addIntHeader(String name,int value)
      addDateHeader(String name,long value)
    • setHeader(String name,String value)
      setIntHeader(String name ,int value)
      setDateHeader(String name, long value)

注意了,要注意setHeader和addHeader的不同,一个是设置,一个是添加,设置只能是设置最后一个,但是添加可以添加很多个

2.3 response实现重定向

方法一:

response.setStatus(302); //设置响应行的状态码为302 重定向
response.setHeader("Location", "/Servlet/servlet2"); //设置响应头的属性 跳转到Servlet2

方法二:

response.sendRedirect("/Servlet/servlet2"); //利用response中的sendRedirect属性完成重定向

2.4 Response中应注意的细节

  • response获得的流OutputStream不需要手动关闭,Tomcat容器会帮助我们关闭
    但是InputStream需要手动关闭
  • getWriter和getOutputStream不能同时调用

3. servletContext

3.1 servletContext概述

ServletContext官方叫servlet上下文。服务器会为每一个工程创建一个对象,这个对象就是ServletContext对象。这个对象全局唯一,而且工程内部的所有servlet都共享这个对象。所以叫全局应用程序共享对象
在这里插入图片描述

3.2 servletContext作用

  • 是一个域对象
  • 可以读取全局配置参数
  • 可以搜索当前工程目录下面的资源文件
  • 可以获取当前工程名字(了解)

servletContext是一个域对象

  • 域对象是服务器在内存上创建的存储空间,用于在不同动态资源(servlet)之间传递与共享数据
  • 凡是域对象都有如下3个方法:
    • setAttribute(name,value);name是String类型,value是Object类型;
      往域对象里面添加数据,添加时以key-value形式添加
    • getAttribute(name);
      根据指定的key读取域对象里面的数据
    • removeAttribute(name);
      根据指定的key从域对象里面删除数据

servletContext存储数据特点

  • 全局共享,里面的数据所有动态资源都可以写入和获取
  • 服务器启动的时候创建,服务器关闭的时候销毁,因为这是全局应用程序对象,全局共享对象

3.2.1 可以读取全局配置参数

servletContext读取全局参数核心方法

  • getServletContext().getInitParameter(name);
    根据指定的参数名获取参数值
  • getServletContext().getInitParameterNames();
    获取所有参数名称列表

实现步骤

  1. 在web.xml中配置全局参数
<!-- 全局配置参数,因为不属于任何一个servlet,但是所有的servlet都可以通过servletContext读取这个数据 -->  
<context-param>          
	<param-name>param1</param-name>          
	<param-value>value1</param-value>   
</context-param>    
<context-param>          
	<param-name>param2</param-name>          
	<param-value>value2</param-value>   
</context-param>   
  1. 在动态资源servlet里面使用servletcontext读取全局参数代码
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
                    //使用servletContext读取全局配置参数数据        
                    //核心方法            
                    /*getServletContext().getInitParameter(name);//根据指定的参数名获取参数值            
                    getServletContext().getInitParameterNames();//获取所有参数名称列表*/                        //打印所有参数            
                    //1.先获取所有全局配置参数名称            
                    Enumeration<String> enumeration =  getServletContext().getInitParameterNames();            
                    //2.遍历迭代器            
                    while(enumeration.hasMoreElements()){                     
                    		//获取每个元素的参数名字                     	
                    		String parameName = enumeration.nextElement();  //根据参数名字获取参数值                     
                    		String parameValue = getServletContext().getInitParameter(parameName);                    //打印                    
				System.out.println(parameName+"="+parameValue);           
                   
                   }         
                    	 
}

3.2.2 可以搜索当前工程目录下面的资源文件

核心方法

  • getServletContext().getRealPath(path)
    根据相对路径获取服务器上资源的绝对路径
  • getServletContext().getResourceAsStream(path)
    根据相对路径获取服务器上资源的输入字节流

3.2.3 可以获取当前工程名字

核心方法

  • getServletContext().getContextPath()
    作用:获取当前工程名字
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值