JavaWeb-HttpServletResponse、HttpServletRequest

HttpServletResponse
一、概述及常用方法
  1. 作用:向客户端输出内容。
  2. 具体方法:
    1. 响应行:
      1. 设置响应码 :void setStatus(int sc);
      2. 响应码描述;
    2. 响应头:
      1. 设置响应头:setHeader(String name,String value);
    3. 正文:流
      1. 获取字符输出流: response.getWriter(); :获取字符输出流
      2. 获取字节输出流:javax.servlet.ServletOutPutStream getOutputStream():获取字节输出流
二、向客户端输出中文数据
  • 服务器以什么方式输出,就告诉客户端以什么方式显示。
  1. 输出流:
    • 输出字节流过程
      • OutputStream out = response.getOutputStream();
      • out.write(byte[]b);
      • String data = "中国"
      • data.getBytes():利用本地默认编码
      • data.getBytes("UTF-8"):指定编码
    • 乱码问题:
      • 客户端和服务端使用了不同码表分别编码和解码。
      • 解决方法:
      1. 通过设置响应头告知:Content-type=text/html;charset=UTF-8;
        1. response.setContentType("text/html;charset=UTF-8");
        2. 或者response.setHeader("Content-Type","text/html;charset=UTF-8");
      2. 给客户端输出<meta>头<meta http-equiv="Content-Type" content = "text/html;charset=UTF-8">
  2. 字符流
    • 输出字符流过程
      • String data ="北京";
      • Writer out = response.getWriter();
      • out.write(data);//注意此处的默认编码是ISO-8895-1
    • 编码
      1. 若想更改默认编码,需要使用以下方法
        1. response.setCharacterEncoding("UTF-8");//服务端编码是UTF-8,还需要告之客户端
        2. response.setHeader("Content-Type","text/html;charset=UTF-8");//通知客户端编码方式
      2. 一步到位,ServletAPI中提供了一个更有效地方法
        1. HttpServletResponse.setContentType("text/html;charset=UTF-8");
          • 这个方法更改了服务端的编码,并且告知了客户端。
三、HttpServletResponse应用案例
  1. 控制动态资源不要缓存
    1. 通过 response 设置响应头告知客户端不要缓存
      • 字符串资源
      • response.setHeader("Expires","-1");//时间,毫秒值
      • response.setHeader("Cache-Control","no-cache");//HTTP1.1
      • response.setHeader("Parama","no-cache");//HTTP1.0
      • 输出流写资源
  2. 控制静态资源的缓存时间
    1. 通过response 设置响应头 Expires 控制缓存时间
      • 字符串资源
      • response.setDateHeader("Expires",System.currentTimeMills()+(1*60*60*1000));
      • response写出资源
  3. 文件下载:中文名称的文件下载
    1. 想要下载某个资源,服务端首先得到文件的真实路径,再得到文件的输入流,然后用response的字节流输出,通知客户端以下载的方式打开。
      1. 得到文件的真实路径
        • ServletContext sc = getServletContext();//获得域对象ServletContext
        • String path = sc.getRealPath("/WEB-INF/霉女.jpg");
      2. 得到文件的输入流
        • InputStream in = new FileInputStream(path);
      3. response字节流输出
        •         //用response的字节流输出
        • OutputStream out = response.getOutputStream();
        • int len = -1;
        • byte b[] = new byte[1024];
        • while((len=in.read(b))!=-1){
        • out.write(b, 0, len);
        • }
        • out.close();
        • in.close();
      4. 通知客户端以下载的方式打开
      • //通知客户端以下载的方式打开
      • String filename = path.substring(path.lastIndexOf("\\")+1);
      • filename = URLEncoder.encode(filename, "UTF-8");
      • response.setHeader("Content-Disposition", "attachment;filename="+filename);
  4. 定时刷新
    1. 定时刷新是通过response的设置响应头Refresh实现的
      • response.setHeader("Refresh", "1"); //1代表刷新频率,1秒一次
      • response.setIntHeader("Refresh", 1);
    2. 定时刷新到某个目标: 也是通过 response 设置响应头Refresh实现的。
      1. response.setHeader("Refresh","2;URL=/day05/index.html");//注意这里的第二个参数中,条件2代表2秒后刷新,URL是刷新到的目标。重定向后地址栏变为条件URL,不会再刷新。"/"代表应用名
  5. 动态输出随机验证码图片
    1. 构建一副内存图片
      • BufferedImage image = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB);
    2. 得到属于自己的画笔
      • Graphics g = image.getGraphics();
      1. 画边框:g.setColor(Color.BLUE);   g.drawRect(0, 0, WIDTH, HEIGHT);
      2. 填充背景:g.setColor(Color.YELLOW);  g.fillRect(1, 1, WIDTH-2, HEIGHT-2);
      3. 画干扰线:
        • g.setColor(Color.GRAY);
        • Random r = new Random();
        • for(int i=0;i<9;i++)
        • g.drawLine(r.nextInt(WIDTH), r.nextInt(HEIGHT), r.nextInt(WIDTH), r.nextInt(HEIGHT));
      4. 画随机数
        • g.setColor(Color.RED);
        • g.setFont(new Font("宋体", Font.BOLD|Font.ITALIC, 20));
        • int x = 20;
        • for(int i=0;i<4;i++){
        • int num = r.nextInt(10);
        • g.drawString(num+"", x, 20);
        • x+=20;
        • }
    3. 输出:ImageIO.write(image, "jpg", response.getOutputStream());
    4. 注意:验证码不能缓存,要加上不能缓存的三个响应头。

HttpServletRequest
一、概述及常用方法
  • 用来处理一个对Servlet的HTTP格式的请求信息。
  • 常用方法
    • request.getMethod()//获取客户端的 请求方式
    • request.getRequestURI()/day05/servlet/RequestDemo1
    • request.getRequestURL()//  http://localhost:8080/day05/servlet/RequestDemo1
    • request.getProtocol()//获取客户端支持的协议
    • request.getRemoteAddr()//获取客户端的IP地址
    • request.getRemotePort()//大于1024的端口号
二、获取请求头
  • 获取单个请求头方法:
    • request.getHeader("Accept"):获取名为Accept的请求头
  • 获取多个相同请求头方法:
    • Enumeration e = request.getHeaders("Accept-Language");
    • while(e.hasMoreElements()){
    • String s = (String) e.nextElement();
    • System.out.println(s);
    • }
  • 获得所有请求头方法
    • e = request.getHeaderNames(); //这个e是 Enumeration类型的
    • while(e.hasMoreElements()){
    • String headerName = (String) e.nextElement(); //迭代取出e中的Name
    • System.out.println(headerName+":"+request.getHeader(headerName));//获得Name请求头和参数为Name的请求头内容。
    • }
三、获取请求参数(内省;BeanUtils框架)
  • //获取请求参数:get和post获取方式一样
  • //POST请求方式参数的获取
  • //用户所有的输入都是字符串

  • //普通获取请求参数方法
  • //Map获取请求参数
  • //利用属性描述器封装数据
  • //通过字段封装数据
  • //获取重名的请求参数值
  • //获取单一的请求参数值。重名参数只会获取第一个值
四、请求转发和重定向的不同
  1. 请求重定向:(客户端行为)
  2. 地址栏会变。发出了2次请求。
    • response.setStatus(302);
    • response.setHeader("Location", "/day05/servlet/RequestDemo5");

    • 或者
    • response.sendRedirect("/day05/servlet/RequestDemo5");
  3. 请求转发:(服务器行为)
    • 地址栏不会变。发出了1次请求。
    • 源资源(工商局)   目标资源(民政局):共享请求中的数据
    • 方式一:
      • ServletContext.getRequestDispatcher(String path):path必须以"/"开头,表示绝对路径

  4. 重点:
  • ServletRequest也是一个域对象:Map<String,Object>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值