HttpServletResponse回传页面的方法
2017-04-19 14:22
309 查看
前面已经说过无数多次了,我们的项目都是基于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
package linkin;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author LinkinPark
* @author 2015-7-10
* @Descri HttpServletResponse的2个输出流
*/
public class LinkinServlet extends HttpServlet
{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
//resp.setContentType("text/html;charset=UTF-8");
resp.getWriter().write("林肯公园");
resp.getOutputStream().write("林肯公园".getBytes());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
this.doGet(req, resp);
}
}
我们现在访问下:http://localhost:8080/linkin/LinkinServlet结果报错了,报错说:
什么意思呢?就是说上面第一次使用流返回响应已经将这个流关闭了,这个是Servlet引擎自动帮我们做的,所以就不能第2次再去获得这个流来操作了。当然这里我们也可以自己来将输出流关闭,不过即使我们不关闭,引擎也会自动帮我关闭了。
@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);
}
首先我们翻下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
package linkin;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author LinkinPark
* @author 2015-7-10
* @Descri HttpServletResponse的2个输出流
*/
public class LinkinServlet extends HttpServlet
{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
//resp.setContentType("text/html;charset=UTF-8");
resp.getWriter().write("林肯公园");
resp.getOutputStream().write("林肯公园".getBytes());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
this.doGet(req, resp);
}
}
我们现在访问下: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& b5a7 lt;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);
}
相关文章推荐
- 从servlet发送http请求进入http页面的方法
- HttpServletResponse.sendRedirect()方法/RequestDispatcher.forward()方法
- HttpServletRequest和HttpServletResponse接口的方法
- Servlet--HttpServletResponse的2个操作流的方法
- JavaWeb如何将后台数据传递到前台页面HttpServletResponse和HttpServletRequest
- HttpServletResponse的常用方法
- HttpServletResponse.sendRedirect()方法/RequestDispatcher.forward()方法
- Struts2:在Action类中获得HttpServletResponse,HttpServletRequest对象的四种方法
- HttpServletResponse.sendRedirect()方法/RequestDispatcher.forward()方法
- RequestDispatcher.forward() 方法和HttpServletResponse.sendRedirect()方法的区别
- Grails HTTP response codes mapping(默认错误页面)bug的解决方法
- HttpServletResponse.sendRedirect()方法/RequestDispatcher.forward()方法
- HttpServletResponse 的 sendError( )方法以及常用的HttpServletResponse常量级错误代码
- 请求重定向与请求转发的比较(HttpServletResponse.sendRedirect方法和RequestDispatcher.forward方法)
- 请求重定向与请求转发的比较(HttpServletResponse.sendRedirect方法和RequestDispatcher.forward方法)
- Java httpservletresponse 中的sendRedirect()方法的重定位乱码的总结
- struts2学习笔记---获得HttpServletResponse或HttpServletRequest对象的几种方法
- HttpServletResponse 的状态码含义及方法摘要----api
- HttpServletResponse得到的四种方法
- JAVA -- HttpServletResponse 的状态码含义及方法说明