• JavaWeb总结(二)—HttpServletResponse对象


        Web服务器收到客户端的http请求,会针对每一次的请求,分别创建一个用于代表请求的request对象和response对象。我们要获取客户端提交的数据,只需要找request对象。要向客户端输出数据,只需要找response对象。

    一、常用方法

    image

         HttpServletResponse对象代表服务器的响应。这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。查看HttpServletResponse的API,可以看到这些相关的方法。

    (1)负责向客户端发送数据的方法

    image

    (2)负责向客户端发送响应头的方法

    image

    (3)负责向客户端发送响应状态码的方法

    image

    (4)响应状态码的常量

    HttpServletResponse定义了很多状态码的常量(具体可以查看Servlet的API),当需要向客户端发送响应状态码时,可以使用这些常量,避免了直接写数字,常见的状态码对应的常量:

    image

    二、使用OutputStream流向客户端浏览器输出中文数据

    使用OutputStream流输出中文注意问题:

    在服务器端,数据是以哪个码表输出的,那么就要控制客户端浏览器以相应的码表打开,比如:outputStream.write("中国".getBytes("UTF-8"));使用OutputStream流向客户端浏览器输出中文,以UTF-8的编码进行输出,此时就要控制客户端浏览器以UTF-8的编码打开,否则显示的时候就会出现中文乱码,那么在服务器端如何控制客户端浏览器以以UTF-8的编码显示数据呢?可以通过设置响应头控制浏览器的行为,例如:response.setHeader("content-type", "text/html;charset=UTF-8");通过设置响应头控制浏览器以UTF-8的编码显示数据。

    private void dealReq(HttpServletRequest req,HttpServletResponse resp) throws IOException{
    
    		resp.setHeader("Content-type","text/html;charset=UTF-8");
    
    		String data = "中国";
    		OutputStream out = resp.getOutputStream();
    
    		//data.getBytes()是一个将字符转换成字节数组的过程,这个过程中一定会去查码表。
            //如果是中文的操作系统环境,默认就是查找查GB2312的码表, 将字符转换成字节数组的过程就是将中文字符转换成GB2312的码表上对应的数字
    		out.write(data.getBytes("UTF-8"));
    	}
    }

    三、使用PrintWriter流向客户端浏览器输出中文数据

    使用PrintWriter流输出中文注意问题:

    在获取PrintWriter输出流之前首先使用"response.setCharacterEncoding(charset)"设置字符以什么样的编码输出到浏览器,如:response.setCharacterEncoding("UTF-8");设置将字符以"UTF-8"编码输出到客户端浏览器,然后再使用response.getWriter();获取PrintWriter输出流,这两个步骤不能颠倒,如下:

    private void dealReq(HttpServletRequest req,HttpServletResponse resp) throws IOException{
    		
    		//设置Response使用的码表,以控制response以什么码表向浏览器写出数据
    		resp.setCharacterEncoding("UTF-8");
    		
    		//指定浏览器以什么码表打开服务器发送的数据
    		resp.setHeader("Content-type","text/html;charset=UTF-8");
    		
    		String data = "今天小雨吖";
    		PrintWriter out = resp.getWriter();
    		out.write(data);
    		out.flush();
    		out.close();
    	}
    }

    四、文件的下载

         文件下载功能是web开发中经常使用到的功能,使用HttpServletResponse对象就可以实现文件的下载

    文件下载功能的实现思路:

    1.获取要下载的文件的绝对路径。

    2.获取要下载的文件名。

    3.设置content-disposition响应头控制浏览器以下载的形式打开文件。

    4.获取要下载的文件输入流。

    5.创建数据缓冲区。

    6.通过response对象获取OutputStream流。

    7.将FileInputStream流写入到buffer缓冲区。

    8.使用OutputStream将缓冲区的数据输出到客户端浏览器。

    /*
     * 实现文件的下载
     */
    public class DownloadServlet extends HttpServlet{
    
    	private OutputStream fos;
    	private FileInputStream fis;
    
    	public void doGet(HttpServletRequest req,HttpServletResponse resp) throws 
                                                           ServletException,IOException{
    		///1.获取要下载的文件的绝对路径
    		String realPath = this.getServletContext().getRealPath("/download/1.jpg");
    		//2.获取要下载的文件名
    		String fileName =  realPath.substring(realPath.lastIndexOf("\") + 1) ;
    		
    		/*
    		 * 1.设置content-disposition响应头控制浏览器以下载的形式打开文件
    		 * 2.下载中文文件,中文文件下载时,文件名要经过URL编码,否则会出现文件名乱码
    		 */
    		resp.setHeader("content-disposition","attachment;filename=" + 
                                                          URLEncoder.encode(fileName,"UTF-8"));	
    		try{
    			fos = resp.getOutputStream();
    			fis = new FileInputStream(realPath);
    			int len = 0;
    			byte[] buffer = new byte[1024];
    			while((len = fis.read(buffer)) != -1){
    				//使用OutputStream将缓冲区的数据输出到客户端浏览器
    				fos.write(buffer,0,len);
    			}
    		}finally{	
    			if(fis != null){
    				try{
    					fis.close();
    				}catch(Exception e){
    					e.printStackTrace();
    				}
    			}
    			
    			if(fos != null){
    				try{
    					fos.close();
    				}catch(Exception e){
    					e.printStackTrace();
    				}
    			}
    		}
    	}
    
    	public void doPost(HttpServletRequest req,HttpServletResponse resp) throws 
                                                              ServletException,IOException{
    	}
    }

    五、随机验证码

    clip_image002[17]

    <html>
    <head>
    
    <title>验证信息</title>
    
    <script type="text/javascript">
    	function changeImg() {
    		document.getElementById("validateCodeImg").src = "RandomImgServlet?"
    				+ Math.random();
    	}
    </script>
    </head>
    
    <body>
    	<form action="ValidateServlet" method="post">
    	
    	请输入验证码:<input type="text" name="validateCode">&nbsp;
    	
    		<img alt="验证码看不清,换一张" src="RandomImgServlet" id="validateCodeImg" 
    onclick="changeImg()">
    		<a href="javascript:void(0)" onclick="changeImg()">看不清,换一张</a>
    	   <br />
    	<input type="submit" value="提交">
    	</form>
    </body>
    </html>
    public class RandomImgServlet extends HttpServlet{
    
    	public static final int AUTHCODE_LENGTH = 5; // 验证码长度
    	public static final int SINGLECODE_WIDTH = 15; // 单个验证码宽度
    	public static final int SINGLECODE_HEIGHT = 30; // 单个验证码高度
    	public static final int SINGLECODE_GAP = 4; // 单个验证码之间间隔
    	public static final int IMG_WIDTH = AUTHCODE_LENGTH * (SINGLECODE_WIDTH + SINGLECODE_GAP);
    	public static final int IMG_HEIGHT = SINGLECODE_HEIGHT;
    
    	private static String randString = "01234456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    	private static int srtLen = randString.length();
    
    
    	public void doGet(HttpServletRequest request,HttpServletResponse response) throws 
                                                                 ServletException,IOException{
    
    		String authCode = getAuthCode();
    
    		// 将验证码保存到session中,便于以后验证
    		request.getSession().setAttribute("checkCode",authCode); 
    
    		try{
    		    // 发送图片
    		    ImageIO.write(getAuthImg(authCode),"JPEG",response.getOutputStream());
    		}catch(IOException e){
    			e.printStackTrace();
    		}
    	}
    
    	public void doPost(HttpServletRequest req,HttpServletResponse resp) throws 
                                                          ServletException,IOException{
    		doGet(req,resp);
    	}
    	
    	public static String getAuthCode(){
    
    		String authCode = "";
    		for(int i = 0;i < AUTHCODE_LENGTH;i++){
    			int randNum = new Random().nextInt(srtLen);
    			authCode += randString.substring(randNum,randNum + 1);
    		}
    		return authCode;
    	}
    
    	public static BufferedImage getAuthImg(String authCode){
    		// 设置图片的高、宽、类型
    		// RGB编码:red、green、blue
    		BufferedImage img = new BufferedImage(IMG_WIDTH,IMG_HEIGHT,BufferedImage.TYPE_INT_BGR);
    		// 得到图片上的一个画笔
    		Graphics g = img.getGraphics();
    		// 设置画笔的颜色,用来做背景色
    		g.setColor(Color.white);
    		// 用画笔来填充一个矩形,矩形的左上角坐标,宽,高
    		g.fillRect(0,0,IMG_WIDTH,IMG_HEIGHT);
    		// 将画笔颜色设置为黑色,用来写字
    		g.setColor(Color.BLACK);
    		// 设置字体:宋体、不带格式的、字号
    		g.setFont(new Font("宋体",Font.PLAIN,SINGLECODE_HEIGHT + 5));
    
    		// 输出数字
    		char c;
    		for(int i = 0;i < authCode.toCharArray().length;i++){
    			// 取到对应位置的字符
    			c = authCode.charAt(i);
    			// 画出一个字符串:要画的内容,开始的位置,高度
    			g.drawString(c + "",i * (SINGLECODE_WIDTH + SINGLECODE_GAP) + SINGLECODE_GAP / 2,IMG_HEIGHT);
    		}
    		Random random = new Random();
    		// 干扰素
    		for(int i = 0;i < 20;i++){
    			int x = random.nextInt(IMG_WIDTH);
    			int y = random.nextInt(IMG_HEIGHT);
    			int x2 = random.nextInt(IMG_WIDTH);
    			int y2 = random.nextInt(IMG_HEIGHT);
    			g.drawLine(x,y,x + x2,y + y2);
    		}
    		return img;
    	}
    }
    public class ValidateServlet extends HttpServlet{
    
    	public void doGet(HttpServletRequest req,HttpServletResponse resp) throws 
                                                         ServletException,IOException{
    		String clientCode = req.getParameter("validateCode");
    		String serverCode = (String)req.getSession().getAttribute("checkCode");
    
    		if(clientCode.equals(serverCode)){// 将客户端验证码和服务器端验证比较,如果相等,则表示验证通过
    			this.getServletContext().getRequestDispatcher("/success.jsp").forward(req,resp);
    		}else{
    			this.getServletContext().getRequestDispatcher("/error.jsp").forward(req,resp);
    		}
    	}
    
    	public void doPost(HttpServletRequest req,HttpServletResponse resp) throws 
                                                          ServletException,IOException{
    		doGet(req,resp);
    	}
    }
  • 相关阅读:
    java多线程编程(一)
    java的本地文件操作
    Java基础总结(二)
    Gym 100851 Distance on Triangulation
    Gym 100851 题解
    Gym 101482 题解
    CodeForces Round 521 div3
    zoj 5823 Soldier Game 2018 青岛 I
    CodeForces round 520 div2
    CodeForces 1042 F Leaf Sets 贪心
  • 原文地址:https://www.cnblogs.com/yangang2013/p/5374654.html
Copyright © 2020-2023  润新知