Servlet处理HTTP响应
设置响应状态行
状态行:HTTP协议,状态码,状态描述。
HTTP状态码:
1. 100-199 :表示信息性代码,标示客户端应该采取其他动作,请求正在进行。
2. 200-299 :表示客户请求成功。
3. 300-399 :表示用于已经移走的资源文件,指示新的地址
4. 400-499 :表示由客户端引发的错误。
5. 500-599 :表示由服务器端引发的错误。
设置状态码
使用HttpServlet的setStatus();
使用HttpServlet的sendError(状态码,状态描述);
设置状态码重定向,请求资源不存在,再次请求到另外的资源:
response.setStatus(302);
response.setHeader("Location","index.jsp");
也可以用:
response.sendRedirect("http://127.0.0.1:8080//lovobook/bar.html")
把请求重定向到一个完全不同的url上(选择别的服务器端程序来处理请求)
重定向:
1. 重定向的状态码是302,表示资源被移走,重新请求新的资源。
2. 重定向是客户端发起的2次请求。
3. 调用sendRedirect方法可以不用设置状态码,会自动把状态码设置为302
设置响应头
HttpServletResponse 对象用于操作响应的响应头。
1.设置响应内容的类型MIME类型
什么是MIME类型:
告诉浏览器服务器发送回去的数据类型是什么,客户端启动的相应的应用程序来处理响应内容。
response.setContentType("text/html");
response.setContentType("image/gif");
......
2.设置响应头
通过响应头设置MIME类型:
/*类似于 <meta charset = utf-8>*/
esponse.setHeader("Content-Type","text/html;charset=utf-8");
自动刷新功能:
/后面数字的单位是秒,不是毫秒了/
response.setHeader("refresh","1")
response.setHeader("refresh","1;index.jsp");在一秒后跳转
控制数据是否缓存:
response.setHeader("Pragma","NO-cache");
response.setHeader("Cache-Control","No-cache");
设置过期时间(缓存到什么时候):
response.setDateHeader("Expries",System.currentTimeMillis());
3.设置响应消息体
HttpServletResponse对象负责将信息返回给客户端
HttpServletResponse对象只产生一个空的http响应。
传回自定义的内容需要getWriter()或者
getOutputStream()方法。
-传送普通文本
-传送二进制内容
传送普通文本:
//tomcat默认响应客户端解析的时候编码集是ISO-8859-1
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.print();
out.write();
//write(),print()方法区别:
//共同点:两者都不会刷新页面,只在原来的页面上写数据。两个方法都是重写了Writer类里面的write方法。
//不同点:print方法可以将各种不同的数据转换为字符串输出,write方法只能操作字符,或者字符数组,字符串,只能操作和字符串相关的
//输出中文浏览器
//设置传输过程中编码格式是utf-8,一般写在最上面
respons.setCharacterEncoding("utf-8");
传送二进制:
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//获取到输出流对象
OutputStream out = response.getOutputStream();
//将字符串转换成字节数组
byte[] ca = str.getBytes();
out.write(ca);
文件下载:
protecter void doGet(HttpServletRequest req,HttpServletResponse resp)
throws ServletException,IOException{
resp.setCharacterEncoding("utf-8");
resp.setContentType("image/jpeg");
//获取到文件要下载的路径,通过上下文对象获取到文件的物理路径
String path = this.getServletContext().getRealPath("/image/1.jpg");
//设置响应头,控制浏览器打开下载框
resp.setHeader("Content-disposition","attachment;fileName=1.jpg")
{
如果是中文的路径:操作图片的中文名字也要转换为字节数组,还要保持编码级和服务器一致。
String path = this.getServletContext().getRealPath("/image/高圆圆.jpg");
resp.setHeader("Content-disposition","attachment;fileName="+new String(path.getBytes("utf-8"),"ISO8859-1"))
}
//获取到图片的二进制流
InputStream in = new FileInputStream(path);
//创建一个二进制流
OutputStream out = resp.getOutputStream();
//创建一个缓冲区
int len = 0 ;
byte[] by = new byte[1024]
while((len = in.read(by))!= -1){
out.write(by,0,len);
}
}
通过字符流操作二进制文件,有可能出现内容丢失
Servlet处理HTTP请求
HttpServletRequest 对象主要用户获取客户端发送过来的请求头,状态行,空行,消息体
GET/POST 提交方法
GET方法提交
- 地址栏直接输入服务器资源
- 通过js直接访问
- 超链接访问默认也是GET提交
用于获取到服务器的资源。
POST提交
主要是用于传输数据。客户端向服务器发送数据,一般用post。可以发送文本数据,二进制数据。
特征 | GET方法 | Post方法 |
提交数据类型 | 文本 | 文本、二进制文本 |
提交数据长度 | 不超过255字符 | 没有限制 |
提交数据可见性 | 作为URl地址的一部分显示 | 作为请求的消息体,不可见 |
提交数据缓存 | 缓存在浏览器URL历史状态中 | 不会被浏览器缓存 |
何时使用GET/POST方法:
- 请求一个静态页面或者图形文件时用GET方法
- 发送大数据的时候,使用POST方法
- 上传文件时,使用POST方法
- 发送用户名,密码或其他保密信息的时候用POST方法
方法操作
获取请求行
http 传送的请求行的内容全部封装到了request对象,可以直接调用方法获取到请求行的内容
1.获取到客户端请求的方法
String method = request.getMethod();
2.获取到请求的URL地址
String URL = request.getRequestURL().toString();
String URI = request.getRequestURI()
URL:统一资源定位符(实实在在的全路径)
URI:统一资源标志符
3.获取到请求过程中附带的参数
String qu = request.getQueryString();
4.获取到客户端的IP
String ipstr = request.getRemoteAddr();
5.获取到服务器的端口
int port = request.getLocationPort();
获取请求头
1.获取到请求头
String agent = request.getHeader("User-Agent");
传入一个请求头名字
2.获取到所有的请求头
Enumeration num = request.getHeaderNames();
3.获取到日期类型的请求头
Date date = request,getDateHeader(arg0);
获取消息体
request封装了客户端传过来的数据
在POST提交的方法内部:
要在开始设置编码集
request.setCharacterEncoding("utf-8");
1.获取到消息体
String username = request.getParameter("username");
2.获取到客户端传入的多个数据(eg:复选框)
String[] s = request.getParameterValues("like")
注意:提交中文一般采用POST,GET提交默认乱码,需要自己处理编码集。
String name = reques.getParameter(“uesename”);
String newName = new String(name.getBytes(“ISO8859-1”),”utf-8”);
请求派发(内部派发)
- 每个客户的请求可以传递给很多Servlet以及web应用程序中的其他资源
- 整个过程完全是在服务端完成的
- 不需要任何客户端浏览器的行为
- 不需要在客户端浏览器和服务器端之间传递特殊信息
通过javax.servlet.RequestDispatcher对象实现
RequestDispatcher rd = request.getRequestDispatcher(“html/succes.html”);
/指定跳转资源,如果是servlet就直接写名字就可以了/
rd.forward(request,response);
/客户端还是原来的地址,不会改变为新的地址/
rd.include(request,response);
/是把资源的控制权移交给下一个资源,当下一个资源操作完毕后,最后将控制权再回收到本资源中,最后响应客户端的也是本资源/
当前请求派发后,这个资源就将控制权移交给下一个资源了,就没有响应的能力了。
请求派发默认调用dopost()
请求派发和重定向的区别:
1. 请求派发的状态码是307,重定向是302.
2. 请求派发是在服务器端完成的,不影响客户端,地址栏不会变化。重定向是客户端来完成,地址栏会变化。
3. 请求派发只能在本服务器完成,重定向是可以访问其他服务器的资源。
注意:如果是客户端提交过来的内容 /JavaWeb04/xxxxx 前面的第一个/只能到达webapps ,所以要加上工程名字。