Response及案例(重定向、自动刷新、禁用缓存、中文乱码、文件下载、验证码)

缺省的Servlethtml

在tomcat/conf/web.xml中java

 <init-param>web

            <param-name>listings</param-name>数组

            <param-value>false    这个改为true</param-value>浏览器

        </init-param>缓存

 

response对象(响应对象)tomcat

  想要获取客户端的内容,使用request对象;对客户端做出响应使用responsedom

 

状态码 jsp

setStatus(int sc)  设置状态码,如302字体

sendError(int sc):发送错误的状态码  如40四、500

sendError(int sc,String msg):发送错误的状态码,而且加上附加信息

 

   响应头(key:value的形式出现的,一个key对应一个value 一个key对应多个value)    下面add开头的不多见

   一、setHeader(String name,String value) 一个key对应一个value

        如 setHeader(“aa”, “bb”);

           setHeader(“aa”, “cc”);

         结果为 aa:cc 会进行覆盖

   二、addHeader(String name,String value) 一个key对应多个value

        如 setHeader(“aa”, “bb”);

            setHeader(“aa”, “cc”);

          结果 aa:bb,cc   会进行追加

   三、setIntHeader(String name,int value) 单值的int类型的响应头

   四、addIntHeader(String name,int value) 多值的int类型的响应头

   五、setDateHeader(String name,long value) 单值的毫秒类型的响应头

   六、addDateHeader(String name,long value) 多值的毫秒类型的响应头

   响应体

   ServletOutputStream getOutputStream() 字符输出流

   PrintWriter getWriter()

 

重定向案例 

package cn.idcast.response;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/*
 * 用户请求访问ResponseServlet,而后ResponseServlet响应302,给出Location头
 *   浏览器会重定向到ResponseServlet2
 */
public class ResponseServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("ResponseServlet");
		// 下面2个方法均可以用,建议重定向用第二个比较方便
		// response.setHeader("Location", "/Day4/ResponseServlet2");   //重定向到下面的那个页面  记得项目名前面要加 /
		// response.setStatus(302);

		response.sendRedirect("/Day4/ResponseServlet2");
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

  

package cn.idcast.response;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ResponseServlet2 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("ResponseServlet2");
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

  自动刷新案例

package cn.idcast.response;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ResponseRefresh extends HttpServlet {
	// 自动刷新
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.getWriter().write("5second");
		// 表示5秒后将会自动跳转到/Day4/Refresh2这个页面
		response.setHeader("Refresh", "5;Url=/Day4/Refresh2");
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

  

package cn.idcast.response;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ResponseRefresh2 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.getWriter().write("hahah");
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

  禁用浏览器缓存(三个头信息)

Cache-Control   no-cache

expires     这里是  -1       要用setDateHeader   其余2个都是setHeader

pragma   no-cache

   不用记   只要在index.jsp里面找 就能够

  

   中文乱码

字节输入中文乱码问题   不必定乱码

 解决方法

一、设置浏览器打开文件时所采用的编码。

二、获取字符串byte数组时编码和打开文件时编码一致。

response.setHeader(“Content-Type”,“text/html;charset=UTF-8”);

os.write(“你好”.getBytes(“UTF-8”));

 

字符输入中文乱码问题   确定乱码

解决方法

一、设置response缓冲编码

二、设置浏览器打开文件所采用的编码

response.setCharacterEncoding(“UTF-8”);

response.setHeader(“Content-Type”,“text/html;charset=UTF-8”);

  这2句能够简写成response.setContentType(“text/html;charset=UTF-8”);

 案例

package cn.idcast.response;

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class OutServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 解决字节中文乱码问题 记得解决乱码要写在前面
		// OutputStream os = response.getOutputStream();
		// response.setHeader("Content-Type", "text/html;charset=UTF-8");
		// os.write("你好啊".getBytes("UTF-8"));
		// 解决字符中文乱码问题 记得解决乱码要写在前面
		response.setContentType("text/html;charset=UTF-8");
		response.getWriter().write("哈哈哈");
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

  

  文件下载 

一、先准备一个文件

二、读取文件,读入到输出流中

三、经过response读出到浏览器

四、设置头信息

Content-Disposition      attachment;filename=文件名称

以附件的形式打开

 代码

package cn.idcast.response;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DownloadServlet extends HttpServlet {
	// 实现文件的下载,以附件的形式
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String path = getServletContext().getRealPath("/img/1.jpg");
		/*
		 * 这步是把文件路径设置让他不要写死了 好比文件是在c:\tomcat\1.jpg里面
		 */
		String filename = null;
		int index = path.lastIndexOf("\\");
		// 若是文件存在的话
		if (index != -1) {
			filename = path.substring(index + 1);
		}
		// 设置头信息,"Content-Disposition", "attachment;filename=文件名称"
		response.setHeader("Content-Disposition", "attachment;filename="
				+ filename);
		// 获得文件的路径:绝对路径
		InputStream is = new FileInputStream(path);
		OutputStream os = response.getOutputStream();
		// 字节流
		byte[] b = new byte[1024];
		int len = 0;
		while ((len = is.read(b)) != -1) {
			os.write(b, 0, len);
		}
		is.close();

	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

    验证码案例

package cn.idcast.response;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/*
 * 在内存中生成图片,由于没有方法设置背景颜色,因此要画一个填充的矩形,而且和画布的大小相同,矩形有颜色,最好要画个矩形边框
 * 获取笔的对象(设置颜色、字体,画验证码)
 * 先准备好数据,随机生成4个字符,把字符画到纸上
 * 画干扰线
 * 把内存中的图片输出到客户端上。
 * 
 * 
 */
public class DrawServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 在内存生成一张图片
		int width = 100;
		int height = 50;
		BufferedImage bi = new BufferedImage(width, height,
				BufferedImage.TYPE_INT_RGB);
		// 由于要用到弧度,因此用2D的画笔对象
		Graphics2D g = (Graphics2D) bi.getGraphics();
		g.setColor(Color.YELLOW);
		// 用矩形填充
		g.fillRect(0, 0, width, height);
		g.setColor(Color.BLUE);
		// 画一个边框,由于旁边会重合,因此-1
		g.drawRect(0, 0, width - 1, height - 1);
		// 得到验证码
		String s = "qwertyuiopasdfghjjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890";
		g.setColor(Color.BLACK);
		// 设置验证码的字体
		g.setFont(new Font("宋体", Font.BOLD, 20));
		Random r = new Random();
		int x = 20;
		int y = 20;
		for (int i = 0; i < 4; i++) {
			// 获取角度和弧度 弧度的公式为:角度*π/180,角度在正负30之间
			int jiaodu = r.nextInt(60) - 30;
			Double hudu = jiaodu * Math.PI / 180;
			g.rotate(hudu, x, y);
			// 获取验证码的下标
			int index = r.nextInt(s.length());
			// 返回指定下标位置的字符,随机获取下标
			char ch = s.charAt(index);
			// 把验证码写到画布上
			g.drawString("" + ch, x, y);
			// 由于字体旋转有可能会旋转到画布外面,因此要归零
			g.rotate(-hudu, x, y);
			// 验证码得有间隔
			x += 20;
		}
		// 设置干扰线
		g.setColor(Color.RED);
		int x1, y1, x2, y2;
		// 干扰线的不能超出画布的位置
		for (int i = 0; i < 4; i++) {
			x1 = r.nextInt(width);
			y1 = r.nextInt(height);
			x2 = r.nextInt(width);
			y2 = r.nextInt(height);
			g.drawLine(x1, y1, x2, y2);
		}
		// 把内存的图片输出到客户端中
		ImageIO.write(bi, "jpg", response.getOutputStream());
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}
相关文章
相关标签/搜索