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