目录
HttpServletResponse
响应行
响应头
重定向
响应体
输出流
案例:下载
案例:搜索框
Cookie
总结
HttpServletResponse
服务器向客户端传递数据
响应行
设置状态码:
void response.setStatus(int encoding)
响应头
设置响应头:
void response.setHeader(String name,String value);void response.addHeader(String name,String value);
重定向
客户端对A资源发送请求后,A资源响应302状态码,指示客户端再去访问B资源,A资源不止要返回302状态码,还需要指示B资源的地址,可以设置响应头的location参数,设置成B资源的绝对路径
// response.setStatus(302);
// response.setHeader("location","/demo02");
response.sendRedirect(request.getContextPath()+"/demo02");
// response.sendRedirect("http://www.baidu.com");
响应体
输出流
字节流和字符流只能使用其中一个,通过response获得的流不要自己关闭,它会自己关闭
PrintWriter response.getWriter();ServletOutputStream response.getOutputStream();
直接写内容的话,将写出在response缓冲区(默认字符集ISO8859-1),要在获得流之前设置response的字符集UTF-8
传统方式:
//字节流和字符流只能使用其中一个
response.setContentType("text/html;charset=utf-8");//要在获得输出流前设置
PrintWriter writer = response.getWriter();
writer.println("响应成功,中文响应
换行");
text/html是客户端解析格式,在tomcat全局的web.xml文件中对应
简化方法:
response.setCharacterEncoding("utf-8");
PrintWriter writer = response.getWriter();
writer.println("响应成功,中文响应
换行");
案例:下载
难点:
直接用超链接,浏览器会把能解析的资源展示出来,而不是下载用获取复制流需要用绝对路径不同浏览器对于中文的解析不同,可能导致下载后文件名字无法显示
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取绝对路径
String name = request.getParameter("name");
String path = request.getServletContext().getRealPath("/download/" + name);
//获得解析方式,告诉浏览器以对应方式解析而不是打开
String mimeType = getServletContext().getMimeType(name);
response.setContentType(mimeType);
//得到浏览器信息,重新编码中文文件名
String userangent = request.getHeader("User-Agent");
response.setHeader("ContentDisposition","attachment;filename="+DownLoadUtils.getFileName(userangent,name));
//获取流开始复制
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(path));
ServletOutputStream sos = response.getOutputStream();
byte[] bs = new byte[1024];
int len = 0;
while ((len=bis.read(bs))!=-1){
sos.write(bs,0,len);
}
bis.close();
}
案例:搜索框
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1.接收请求参数
String ename = request.getParameter("ename");
// 2.连接数据库查询
JdbcTemplate template = new JdbcTemplate(C3P0Utils.getDataSource());
String sql = "select * from emp where ename like ?";
List
// 3.使用jsp显示数据 资源2 (使用转发跳转)
request.setAttribute("随意", list);
request.getRequestDispatcher("/download.html").forward(request, response);
// 3.响应写出数据 - 不推荐
/*response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.println("
员工编号 | 员工姓名 | 职位 |
---|---|---|
"+e.getEmpno()+" | ");"+e.getEname()+" | ");"+e.getJob()+" | ");
}
Cookie
存储在客户端的临时/永久信息,默认情况下Cookie从访问服务器(开始会话)时开始创建,在关闭服务器(结束会话)后销毁,如果服务器在客户端有对应的Cookie,则不管服务器是否需要,每次请求都会带上Cookie,Cookie底层就是一个Map
//服务器将Cookie写入客户端
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookie1 = new Cookie("name","lisa");
//同名的cookie,后来的会覆盖前面的
Cookie cookie2 = new Cookie("name","tom");
Cookie cookie3 = new Cookie("age","19");
response.addCookie(cookie1);
response.addCookie(cookie2);
response.addCookie(cookie3);
}
//服务器从request中读取Cookie
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie[] cookies = request.getCookies();//可能会有多个Cookie
if (cookies!=null){//可能会没有Cookie
for (Cookie c:cookies){
response.getWriter().println(c.getName()+"="+c.getValue());
}
}
}
总结
响应行设置返回的状态码setContentType设置浏览器的解析方式,getMimeType可以根据文件后缀得到对应解析格式(文件名不用去除)cookie的作用和生命周期
好文阅读
发表评论