目录

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文件中对应标签,可以使用ServeltContext的getMimeType(String name)获得

简化方法:

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 list = template.query(sql, new BeanPropertyRowMapper<>(Emp.class), "%" + ename + "%");

// 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("

");

for (Emp e : list) {

writer.println("

");

writer.println("

");

writer.println("

");

writer.println("

");

writer.println("

");

}

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的作用和生命周期

好文阅读

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。