HttpServletResponse回传页面的方法

前面已经说过无数多次了,我们的项目都是基于HTTP协议的一次请求,一次响应。实际编码中,我们在处理完逻辑后一般是跳转到一个页面上,或者用输出流返回json字符串。其实跳转到一个页面往往也就是JSP,JSP运行在tomcat里面编译处理后返回响应,最后一步都是通过response获得输出流来返回到浏览器。这里总结下response的2个输出流。
  • 首先我们翻下API:
public ServletOutputStream getOutputStream() throws IOException;
返回一个记录二进制的响应数据的输出流。
注意:如果这个响应对象已经调用getWriter,将会抛出IllegalStateException。
public PrintWriter getWriter() throws IOException;
这个方法返回一个PringWriter对象用来记录格式化的响应实体。如果要反映使用的字符编码,必须修改响应的MIME类型。
注意:在调用这个方法之前,必须设定响应的content类型。如果没有提供这样的编码类型,会抛出一个UnsupportedEncodingException,如果这个响应对象已调用getOutputStream,会抛出一个getOutputStream。

  • 对比上面的2个方法我们来整理一下:
1,getWriter()用于向客户机回送字符数据
2,getOutputStream()用于向客户机回送字符数据,也可以回送字节数据

  • 那么我们应该怎么选择这2种输出流呢?
如果我们回送字符数据,就用getWriter,效率高
如果我们回送的是字节数据,也就只能用getOutputStream了。


上面API上已经说的很明白,这2个方法不能同时使用,看下面的代码:
[java]  view plain  copy
  1. package linkin;  
  2.   
  3. import java.io.IOException;  
  4. import javax.servlet.ServletException;  
  5. import javax.servlet.http.HttpServlet;  
  6. import javax.servlet.http.HttpServletRequest;  
  7. import javax.servlet.http.HttpServletResponse;  
  8.   
  9. /** 
  10.  * @author LinkinPark 
  11.  * @author 2015-7-10 
  12.  * @Descri HttpServletResponse的2个输出流 
  13.  */  
  14. public class LinkinServlet extends HttpServlet  
  15. {  
  16.     private static final long serialVersionUID = 1L;  
  17.   
  18.     @Override  
  19.     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException  
  20.     {  
  21.         //resp.setContentType("text/html;charset=UTF-8");  
  22.         resp.getWriter().write("林肯公园");  
  23.         resp.getOutputStream().write("林肯公园".getBytes());  
  24.     }  
  25.   
  26.     @Override  
  27.     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException  
  28.     {  
  29.         this.doGet(req, resp);  
  30.     }  
  31.       
  32. }  

我们现在访问下:http://localhost:8080/linkin/LinkinServlet结果报错了,报错说:

getWriter() has already been called for this response

什么意思呢?就是说上面第一次使用流返回响应已经将这个流关闭了,这个是Servlet引擎自动帮我们做的,所以就不能第2次再去获得这个流来操作了。当然这里我们也可以自己来将输出流关闭,不过即使我们不关闭,引擎也会自动帮我关闭了。



@ResponseBody
	@RequestMapping(value="productStockUploadFile")
	public void productStockUploadFile(Model model, HttpServletRequest req,HttpServletResponse resp,String filePath,String fileName) throws IOException{
		Map<String, Object> mapRes=new HashMap<String, Object>();
		try {
			//获取当前的Subject  
	        Subject curUser = SecurityUtils.getSubject();
	        //获取当前登录人信息
		    Session session=curUser.getSession();
		    User loginUser=(User) session.getAttribute("user");
			    
			 Map<String, Object> rapams=new HashMap<String, Object>();	
			 rapams.put("fileName", fileName);
			 rapams.put("filePath", filePath);
			 rapams.put("userId", loginUser.getId());
			 productLocalService.insertProductStockFile(rapams);
			 mapRes.put("code", "200");
			 mapRes.put("msg", "上传成功");
		} catch (Exception e) {
			 e.printStackTrace();
			 mapRes.put("code", "201");
			 mapRes.put("msg", "上传失败");
		} 
			
		 ServletHelper.outRequestForJson(req,resp,JSONObject.fromObject(mapRes).toString());
		  
	}


	@RequestMapping(value="productStockUploadFileList")
	public String productStockUploadFileList(Model model, HttpServletRequest req,String pageNum,String fileName){
		int pageSize = 20;
		int totalPage = 0;
		if (StringUtils.isEmpty(pageNum)) {
			pageNum ="1";
		}
		List<Map<String,Object>> list = null;
		Map<String,Object> paramMap = new HashMap<String,Object>();
		paramMap.put("fileName", fileName);
		int stockFileListCount = productLocalService.getBatchUpdateStockFileCount(paramMap);
		if (stockFileListCount>0) {
			Map<String,Object> paMap = new HashMap<String,Object>();
			paMap.put("start", (Integer.parseInt(pageNum)-1)*pageSize);
			paMap.put("pageSize", pageSize);
			paMap.put("fileName", fileName);
			list = productLocalService.getBatchUpdateStockFile(paMap);
		}
		 totalPage = stockFileListCount%pageSize == 0? stockFileListCount/pageSize:(stockFileListCount/pageSize)+1;
		model.addAttribute("fileName", fileName);//如果前台传入的参数比较多,可以直接把paMap塞到model里,在前台jstl里取,如model.addAttribute("map", paMap);${map.fileName}
		model.addAttribute("pageNum", pageNum);
		model.addAttribute("totalPage", totalPage);
		model.addAttribute("stockFileList", list);
		return "product/stockUpload";
	}


可以自己封装一个ServletHelp工具类:

	public static void outRequestForJson(HttpServletRequest request,
			HttpServletResponse response, String res) throws IOException {
		response.setContentType("application/json; charset=UTF-8");
		response.getWriter().print(res);
	}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值