重新学javaweb---Response&Request

一、response

ServletResponse -- 通用的response提供了一个响应应该具有最基本的属性和方法
    |
    |-HttpServletResponse -- 在ServletResponse的基础上针对于HTTP协议增加了很多强化的属性和方法

1.输出数据

    response.setContentTye("text/html;charset=utf-8");//通知浏览器
    response.getOUtputStream().write("".getBytes("utf-8"));

    response.setCharacterEncoding("utf-8");//通知服务器
     //通知浏览器(其实底层也通知了服务器 所以上一行代码其实可用不用写)
    response.setContentType("text/html;charset=utf-8");
    response.getWriter().write("");

2.实现下载

resp.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode("图片啦啦啦.jpg","utf-8"));//响应头中不能包含中文 +encode编码时浏览器只认识u8
        FileInputStream inputStream = new FileInputStream(this
                .getServletContext().getRealPath("1.png"));
        OutputStream os = resp.getOutputStream();
        byte[] bs = new byte[1024];
        int i = 0;
        while ((i = inputStream.read(bs)) != -1) {
            os.write(bs, 0, i);
        }
        inputStream.close();

3.定时刷新 header

response.getWriter().write(new Date().toGMTString());
response.setHeader("Refresh", "1");
//注册回到主页
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("恭喜您注册成功,3秒后回到主页。。。");
response.setHeader("Refresh", "3;url=/day04/index.jsp");
//或者在  html  meta 标签中实现  浏览器会自动把meta标签当作响应头进行处理

用可以模拟头功能

4.控制缓存资源

让浏览器不用缓存的资源:

        response.setIntHeader("Expires", -1);//   设置expires响应头为0或-1浏览器就不会缓存当前资源
        response.setHeader("Cache-Control", "no-cache");//历史原因
        response.setHeader("Pragma", "no-cache");//历史原因
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().write("当前时间是:" + new Date().toLocaleString());

控制浏览器缓存资源:

        response.setDateHeader("Expires",
                1000L * 3600 * 24 * 30 + System.currentTimeMillis());
        response.setHeader("Cache-Control", "no-cache");
        response.setHeader("Pragma", "no-cache");
        FileInputStream inputStream = new FileInputStream(this
                .getServletContext().getRealPath("1.png"));
        OutputStream os = response.getOutputStream();
        byte[] bs = new byte[1024];
        int i = 0;
        while ((i = inputStream.read(bs)) != -1) {
            os.write(bs, 0, i);
        }
        inputStream.close();

5.请求重定向
利用response设置状态码为302,并设置响应头Location为要重定向到的地址,就可以实现请求重定向操作了。为了方便进行请求重定向操作,response提供了response.sendRedirec(“….”) 实现请求重定向。

在大部分情况下请求重定向和转发的效果是差不多的,这时候我们推荐使用转发,以减少对服务器的访问。
而在某些情况下是需要使用转发的,目的往往是为了改变浏览器地址栏里的地址(如登录成功后转到主页),和更改刷新操作(如加入商品到购物车后转到购物车页面的操作)

        // response.setStatus(302);
        // response.setHeader("Location", "http://baidu.com");
        response.sendRedirect("http://baidu.com");

需要注意的细节:

  1. response 的 getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。(转发后的 那个servlet主要不要重复获取)
  2. Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。
  3. Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎tomcat将调用close方法关闭该输出流对象。所以一般不要自己在Servlet中关闭这个流

Request

HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。

通过Request对象进行的常用操作

  1. 获取客户机信息
    getRequestURL方法返回客户端发出请求完整URL
    getRequestURI方法返回请求行中的资源名部分
    getQueryString 方法返回请求行中的参数部分
    getRemoteAddr方法返回发出请求的客户机的IP地址
    getMethod得到客户机请求方式
    getContextPath 获得当前web应用虚拟目录名称 /Day04 (发布后的web应用名称)
  2. 获取请求头信息
    getHeader(name)方法 — String
    getHeaders(String name)方法 — Enumeration
    getHeaderNames方法 — Enumeration
    获得具体类型客户机请求头
    getIntHeader(name)方法 — int
    getDateHeader(name)方法 — long(日期对应毫秒)

防盗链:利用Referer请求头
这里写图片描述

3获取请求参数

getParameter(name) --- String 通过name获得值
getParameterValues  --- String[ ] 通过name获得多值 checkbox
getParameterNames  --- Enumeration< String> 获得所有name
getParameterMap  --- Map<  String,String[ ]> key :name value: 多值

乱码的问题:
浏览器以什么编码来发送请求参数? 浏览器以什么编码打开的表单页面,就用什么编码发送这个页面提交的数据
服务器以什么编码来打开呢?如果不指定,则使用ISO8859-1,这样如果请求参数中有中文必然就乱码了

  对于POST提交,可以设置request.setCharacterEncoding(“utf-8”);明确的通知服务器以浏览器发送过来的编码来打开数据就可以解决乱码,//放在getParameter前才有效

  但是上面的方法只对请求中实体内容部分起作用,所以GET提交的乱码并不能解决.
   对于GET提交的乱码,只能手动的进行编解码从而解决乱码问题:(因为服务器默认的就是iso8859-1所以先用它解码为二进制,再用utf-8编码回去)
String username = request.getParameter(“username”);
username = new String(username.getBytes(“iso8859-1”),”utf-8”);
4. 利用请求域传递对象(域对象)
作用范围:整个请求链上
生命周期:当服务器收到一个请求,创建出代表请求的request对象,request开始.当请求结束,服务器销毁代表请求的request对象,request域结束.
作用:在整个请求链范围内共享数据,通常我们在Servlet中处理好的数据会存入request域后请求转发到jsp页面来进行展示

5.request实现请求转发(上一问的servletcontext也可以)

this.getServletContext().getRequestDispatcher("").forward(request,response);
request.getRequestDispatcher("").forward(request,response);

1*请求转发时,如果已经有数据被写入到了response的缓冲区,但是这些数据还没有被发送到客户端,则请求转发时,这些数据将会被清空.但是清空的只是响应中的实体内容部分,头信息并不会被清空.
2 *而请求转发时已经有数据被打给了浏览器(res.getWriter.flush()),那么再进行请求转发,不能成功,会抛出异常,原因是响应已经结束了,再转发交给其他人没意义了
3 *在最终输出数据的Servlet执行完成后,response实体内容中的数据将会被设置为已提交的状态,再往里写数据也不会起作用

——-使用以上三条,就保证了最终只有一个Servlet能够向浏览器输出数据,所以
*一个Servlet里两次请求转发也是不可以的,一次请求交给两人处理自然也是不行.

6.请求包含(只包含被包含内容的实体内容)
this.getServletContext().getRequestDispatcher(“”).include(request,response);
request.getRequestDispatcher(“”).include(request,response);

*被包含的Servlet程序不能改变响应消息的状态码和响应头,如果它里面存在这样的语句,这些语句的执行结果将被忽略
*常被用来进行页面布局

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值