我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。
service方法中的response的类型是ServletResponse,而doGet/doPost方法的response的类型是HttpServletResponse,HttpServletResponse是ServletResponse的子接口,功能和方法更加强大,今天我们学习HttpServletResponse。
因为response代表响应,所以我们可以通过该对象分别设置Http响应的响应行,响应头和响应体
如果下载中文文件,页面在下载时会出现中文乱码或不能显示文件名的情况, 原因是不同的浏览器默认对下载文件的编码方式不同,ie是UTF-8编码方式,而火狐 浏览器是Base64编码方式。
解决方案:response.setContentType(“text/html,charset=utf-8”)
把自己的文件用utf-8编码,并且告诉浏览器我用什么方式编码
1.转发的地址栏不变,而重定向的地址栏变化
2.转发只能在网站内部进行,而重定向不是
3.转发请求次数是一次,重定向是两次
4.转发request和response数据传递,重定向不传递
java有把字符串变成图片的API。
有专业的验证码公司,提供验证码API
public class show0 extends HttpServlet {
/**
*
*
* 1、请求行
Get http://localhost:8080/day09/servlet/req1?username=zs http/1.1
getMethod(); 获得请求方式
***getRequestURL();返回客户端发出请求时的完整URL。
***getRequestURI(); 返回请求行中的资源名部分。
*****getContextPath(); 当前应用的虚拟目录 /day09_01_request
getQueryString() ; 返回请求行中的参数部分。
2、请求消息头
* String getHeader(String name) 根据头名称得到头信息值
Enumeration getHeaderNames() 得到所有头信息name
Enumeration getHeaders(String name) 根据头名称得到相同名称头信息值
3、请求正文(重要)
与获取表单数据相关的方法
*** getParameter(name) 根据表单中name属性的名,获取value属性的值方法
*** getParameterValues(String name)专业为复选框取取提供的方法
getParameterNames() 得到表单提交的所有name的方法
*** getParameterMap 到表单提交的所有值的方法 //------------做框架用,非常实用-----------
getInputStream 以字节流的方式得到所有表单数据
与操作非表单数据相关的方法(request也是一个域对象)
*** void setAttribute(String name, Object value);
*** Object getAttribute(String name);
Void removeAttribute(String name);
与请求转发相关的方法
//得到请求转发或请求包含的协助对象
RequestDispatcher getRequestDispatcher(String path)
*** forward(ServletRequest request, ServletResponse response) //转发的方法
include(ServletRequest request, ServletResponse response) //请求包含
与请求编码相关的方法:
//解决post方式编码
*****request.setCharacterEncoding("UTF-8"); //告诉服务器客户端什么编码,只能处理post请求方式
//解决get方式编码
String name = new String(name.getBytes(“iso-8859-1”),”UTF-8”);
*
*/
/**
* web服务器每次收到客户端的http请求,会这对每一次请求,创建request和response对象
*
* 1、响应行 HTTP/1.1 200 OK
setStatus(int sc) 设置响应状态码
2、响应头
***** sendRedirect(String location) 请求重定向
setHeader(String name, String value) 设置响应头信息
//告知浏览器使用什么码表
response.setHeader("content-type", "text/html;charset=UTF-8");
//告知客户端不缓存
response.setHeader("pragma", "no-cache");
response.setHeader("cache-control", "no-cache");
response.setDateHeader("expires", 0);
Referesh刷新
3、响应正文(主体)
*** getWrite(); 字符输出流
getOutputStream(); 字节输出流
setCharacterEncoding(String charset) 告知服务器使用什么编码
*****setContentType(String type)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//response.setCharacterEncoding("UTF-8"); //告知服务器使用什么编码
//response.setHeader("content-type", "text/html;charset=UTF-8");//告诉浏览器
response.setContentType("text/html;charset=UTF-8");//告诉浏览器和服务器什么编码
response.getWriter().write("邪恶的hero"); //直接打印过去的结果是: ???hero ,查不到码表,不是乱码
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
/**
* 请求转发:request.getRequestDispatcher("/demo").forward(request,response)
* 请求转发不能跳到别的应用,只能是当前app下的网址
* request.getRequestDispatcher("http://www.baidu.com").forward(request,response)
* 这个只会跳到 http://.....ReqAndRes/http://www.baidu.com根本去不了百度,用重定向吧。
* a
* b
* c //转发 or重定向 如果是转发,去别的页面回来后执行d,如果是重定向,直接执行完d,再去别的页面。
* d
*
* 请求重定向 response.sendRedirect("/ReqAndRes/demo")
*
* 1.转发地址栏不变,重定向变,转发是request由服务器执行的,重定向是response由浏览器执行
* 2.转发请求次数是一次,重定向是两次
* 3.转发request和response数据传递,重定向不传递
* 4.转发不能跳转别的网页,重定向可以
*
*
* 请求包含request.getRequestDispatcher("/demo").include(request,response)
* 请求包含就是把demo的代码直接拿过来用,两个资源当成一个资源。
*
*/
public class show1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//通过路径得到输入流
String path=this.getServletContext().getRealPath("/WEB-INF/classes/图片.jpg");
FileInputStream fis=new FileInputStream(path);
//创建字节输出流
ServletOutputStream sos=response.getOutputStream();
//得到下载的文件名字
String name=path.substring(path.lastIndexOf("\\")+1);
System.out.println(path);
System.out.println(name);
//设置图片的文件名字编码
name=java.net.URLEncoder.encode(name, "UTF-8");
//告诉浏览器要下载文件
response.setHeader("content-disposition", "attachment;filename="+name);
response.setHeader("content-type", "image/jpeg");//告诉其文件类型
//执行输出操作
int len=1;
byte[] b=new byte[1024];
while((len=fis.read(b))!=-1){
sos.write(b, 0, len);
}
//这里不用关流,response是会自己关的
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}