介绍
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象和代表响应的response对象,要向网页输出数据,只需要找response对象。
常用方法
方法 | 描述 |
---|---|
addHeader(String name, String value) | 添加指定的键值到响应头信息中 |
containsHeader(String name) | 判断响应的头部是否被设置 |
encodeURL(String url) | 编码指定的 URL |
sendError(int sc) | 使用指定状态码发送一个错误到客户端 |
setHeader(String name, String value) | 设置指定响应头的值 |
setStatus(int sc) | 给当前响应设置状态 |
setContentType(String ContentType) | 设置响应的 MIME 类型 |
getWriter() | 获取输出字符流 |
getOutputStream() | 获取输出的字节流 |
如何查看MIME类型
找到tomcat服务器->选择web.xml->ctrt+f>输入文件类型->点击Find
刷新和页面自动跳转
所有头信息都是随着请求和回应自动发送到服务器端(客户端),在 response 中一个比较常用
的头信息就是刷新的指令,可以完成定时刷新的功能。
resp.setHeader("refresh", "2");//每2秒刷新一次
对于刷新的头信息,除了定时的功能外,还具备了定时跳转的功能,可以让一个页面定时跳转到一
个指定的页面。(已经注册成功,两秒后跳转到登陆页面)
response.setHeader("refresh","3;URL=ok.html");
但是这种跳转不是万能的,有时候根本就无法进行跳转操作,返回后刷新不会跳转;对于这种定时
跳转的头信息,也可以采用 HTML 的方式进行设置,HTML 本身也可以设置头信息。(客户端跳转)
<meta http-equiv="refresh" content="3;http://www.baidu.com" />
数据响应
接收到客户端请求后,可以通过 HttpServletResponse 对象直接进行响应,响应时需要获取输出流,有两种形式 getWriter()获取字符流(只能响应回字符);getOutputStream()获取字节流(能响应一
切数据)。响应回的数据到客户端被浏览器解析。注意:两者不能同时使用。
响应图片
public class Show extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
//通过输入流读取图片,然后通过输出流输出图片
String imageName = req.getParameter("imageName");
//判断是否为空
if(imageName == null||"".equals(imageName)) {
resp.getWriter().write("请告诉我你要看啥图片");
return;
}
String realPath = req.getServletContext().getRealPath("/WEB-INF/img/");
System.out.println(realPath);
String Path = realPath + imageName;
File file = new File(Path);
if(file !=null && file.isFile()) {
//判断用户访问的图片类型
String imageType = imageName.split("\\.")[1];
if("jpg".equals(imageType)) {
resp.setContentType("image/jpeg;charset=utf-8");
}else if("png".equals(imageType)){
resp.setContentType("image/png;charset=utf-8");
}else if("gif".equals(imageType)){
resp.setContentType("image/gif;charset=utf-8");
}
FileInputStream in = new FileInputStream(file);
ServletOutputStream out = resp.getOutputStream();
byte[] car = new byte[1024];
int len=0;
while((len=in.read(car))!=-1) {
out.write(car,0,len);
}
in.close();
out.close();
}else {
resp.getWriter().write("请输入正确的图片名称");
return;
}
}
}
重定向跳转
重定向是一种服务器指导客户端的行为。客户端发出第一个请求,被服务器接收,经过处理服务器
进行响应,与此同时,服务器给客户端一个地址(下次请求的地址 resp.sendRedirect(“url”);),当客
户端接收到响应后,立刻、马上、自动根据服务器给的地址进行第二个请求的发送,服务器接收请求并
作出响应,重定向完成。从描述中可以看出重定向当中有两个请求存在,并且属于客户端行为。实现方
式如下:
resp.sendRedirect();
通过观察浏览器我们发现第一次请求获得的响应码为 302,并且含有一个 location 头信息。并且地
址栏最终看到的地址是和第一次请求地址不同的,地址栏已经发生了变化。
请求转发和重定向比较:
请求转发(req.getRequestDispatcher().forward()) | 重定向(resp.sendRedirect()) |
---|---|
一次请求,数据在request域中共享 | 两次请求,数据不共享 |
服务器端行为 | 客户端行为 |
地址栏不发生改变 | 地址栏发生改变 |
绝对地址定位到站点后 | 绝对地址可写到 http:// |
// 请求转发跳转到 http://xxxx HTTP Status 404 - /path/http://taobao.com
request.getRequestDispatcher("http://taobao.com").forward(request, response);
// 重定向跳转到 http://xxxx
response.sendRedirect("http://jd.com");
请求时的路径问题
在请求资源时,必须给出正确的路径,否则是找不到资源的。路径分为相对路径和绝对路径,绝对
路径可简单理解为完整路径,在 web 项目中绝对路径分两种,一种是以 http:// 开头的,该种绝对路径
已经跨域,即任何地方的资源都能访问,另一种则是从当前域名|IP|主机后的端口号开始的,不能跨
域,也属于一种绝对路径。相对路径则就是相对当前资源所在路径。
绝对路径:
使用绝对路径时则有两种方式,以 http:// 开头,或者以 / 开头,但是注意:只有客户端跳转才能
使用 http:// 这种方式,此时需要写出资源的完整路径;另一种以 / 开头的绝对路径,则是绝对到端口
后,例如本机则是:http://localhost:8080 此时则是 / 代表以上一串字符。 /helloworld/a.html → htt
p://localhost:8080/helloworld/a.html
浏览器中:“/”代表的是 http://主机|IP:端口
的绝对路径,则是绝对到端口
后,例如本机则是:http://localhost:8080 此时则是 / 代表以上一串字符。 /helloworld/a.html → htt
p://localhost:8080/helloworld/a.html
浏览器中:“/”代表的是 http://主机|IP:端口
服务器中:“/”代表的是 http://主机|IP:端口/站点名