ServletContext、request、response

一、上下文对象

1、概述

ServletContext官方叫servlet上下文,是一个接口。服务器启动的时候创建,服务器关闭的时候销毁,启动时候会为每一个工程创建一个对象,这个对象就是ServletContext对象。这个对象全局唯一,而且工程内部的所有servlet都共享这个对象。所以叫全局应用程序共享对象。

2、如何获取

通过servlet中的init方法中的servletConfig对象获取

httpservlet中直接获取ServletContext servletContext   = getServletContext();

3、作用

1.      是一个域对象

域对象是服务器在内存上创建的存储空间,用于在不同动态资源(servlet)之间传递与共享数据,凡是域对象都有如下3个方法

setAttribute(name,value);name是String类型,value是Object类型;

往域对象里面添加数据,添加时以key-value形式添加

getAttribute(name);

根据指定的key读取域对象里面的数据

removeAttribute(name);

根据指定的key从域对象里面删除数据

2.      可以读取全局配置参数

getServletContext().getInitParameter(name);//根据指定的参数名获取参数值

getServletContext().getInitParameterNames();//获取所有参数名称列表

在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>

 在动态资源servlet里面使用servletcontext读取全局参数代码

ublic 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.      可以搜索当前工程目录下面的资源文件

getServletContext().getRealPath(path),根据相对路径获取服务器上资源的绝对路径

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

4.      可以获取当前工程名字(了解)

publicvoid doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //获取工程名字,getServletContext().getContextPath()
        response.getOutputStream().write(("工程名字:"+getServletContext().getContextPath()).getBytes());

    }

二、请求对象request

1、概述

我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。service()方法中写了根据请求方式的不同调用doget()和dopost().

service方法中的request的类型是ServletRequest,而doGet/doPost方法的request类型HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加强大

request运行流程

2、抓取http包,分别抓请求行,请求头,请求体 (post请求方式才会有)

请求行

获得客户端的请求方式---String getMethod()

web应用的名称---String getContextPath() 

获取URL---StringBuffer getRequestURL(); 如:http://localhost:8080/request/info

获取URI---String getRequestURI(); 如:/request/info

获得访问的客户端IP地址---request.getRemoteAddr()

获取get请求参数---String getQueryString();

请求头

获取所有请求头名称

//所有请求头名称
        Enumeration<String> headerNames = request.getHeaderNames();
        //遍历所有请求头
        while (headerNames.hasMoreElements()){
            //名称
            String s = headerNames.nextElement();
            //名称对应的值
            String requestHeader = request.getHeader(s);
            System.out.println(requestHeader);
        }

获取此次访问来源referer

String referer= request.getHeader("referer");

只有通过以下方式请求才会获取referer

  • 直接用<a href="">
  • submit提交表单
  • s提交的表单(get \post)

请求体

转发和重定向

三、响应对象

设置响应行

response.setState(Int code)

设置响应头

add是添加新的

addHeader(String name,String value)

addIntHeader(String name,int value)

addDateHeader(String name,date)

set是设置已经存在的

setHeader(String name,String value)

setIntHeader(String name,int value)

setDateHeader(String name,Date value)

设置响应体

1、通过write()方法来写

response.getWriter().write("hello 测试");

默认情况下写的中文会发生乱码,把写的内容存到缓冲区使用的时ISO8859,而ISO8859不支持中文,所以乱码

//在存之前设置存放的编码
response.setCharacterEncoding("UTF-8");
//然后告知浏览器使用的编码
response.setHeader("Content-Type","text/html;charset=UTF-8");
response.getWriter().write("hello 测试");

注意
上面可以只告知浏览器使用的编码即可,tomcat看到了设置成了utf-8 在存储时也会使用utf-8
或者直接用封装好的方法
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("hello 测试");

2、通过OutPutStream()来写

注意getWrite()和getOutputSteam不能同时调用

response.setContentType("text/html;charset=UTF-8");
response.getOutputStream().write("hello 测试".getBytes());

重定向

servlet1当中没有这个资源,告诉你去找servlet2,再去发送一个请求到servlet2,要访问两次服务器,状态码是302,浏览器地址栏已经发生变化

response.setStatus(302);
response.setHeader("location","/userInfo");
每次都要写状态码,和location比较麻烦,就封装了一个方法
response.sendRedirect("/userInfo");

定时刷新重定向

response.setHeader("refresh","5;url=http://www.baidu.com")

url的值为5秒后要去跳转的地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序三两行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值