Servlet&JSP-HTTP服务器响应信息
完整代码请参考:https://github.com/devway9/java-exercise/tree/master/servlet-jsp
目录
- 1 HTTP响应的格式
- 2 如何设置状态代码
- 3 HTTP响应报文头
- 4 Servlet状态的持续和页面的自动重载
- 5 使用Servlet生成Excel
正文
1 HTTP响应的格式
1) Web服务器响应的格式由以下内容构成:
① 状态行:由HTTP版本(如HTTP/1.1)+状态码+状态码对应的信息构成。
② 响应报文头。
③ 空行。
④ 相应的文档。
2 如何设置状态代码
1) 系统自动设置的状态码是200。如果需要修改,可以使用HttpServletResponse的以下方法修改:
① setStatus:设置任意状态码,必须在PrintWriter使用前调用。
② sendRedirect:生成302响应以及Location报文头,重定向到指定的URL。
③ sendError:设置一个错误状态码(一般为404),以及一段描述信息返回给客户端。
④ 状态码一般使用HttpServletResponse的SC_**常量,而不直接使用数字。
2) HTTP1.1的状态码:
① 100-199:信息性的标示用户应该采取的其他动作。
② 200-299:请求成功。
③ 300-399:重定向。
④ 400-499:客户引发的错误。
⑤ 500-599:服务器引发的错误。
3) 状态码详解:
① 100(Contiune,继续):如果客户端发送100的请求,表示在询问是否在随后的请求中可以发送附件文档,服务器可以返回100,表示继续,或者返回417告诉浏览器不接受。
② 200(OK,一切正常)。
③ 202(Accepted,已接受):请求已接受,但处理未完成。
④ 204(No Content,没有新文档):浏览器继续显示之前的文档。
⑤ 205(Reset Content,重置内容):表示没有新的文档,但浏览器需要重置当前文档。
⑥ 301(Moved Permanently,被永久移动):表示文件已移向别处,新URL在Loaction响应报文头中给出。
⑦ 302(Found,找到):类似301,大多数浏览器等同对待301和302,。使用sendRedirect和refresh不同,sendRedirect不显示中间输出,可以用于以下场景:
a) 判断用户需要重定向的地址。
b) 跟踪用户的行为。
c) 执行边界效应,设置cookie等。
d) response.sendRedirect("http://www.baidu.com")和下面的代码等价:
response.setStatus(302);
response.setHeader("Location","http://www.baidu.com");
⑧ 303(See Other,检查其他文档):类似301和302
⑨ 304(Not Modified,未发生更改):表示缓存的版本是最新的。一般不直接设置该状态,而是用getLastModified方法。
⑩ 307(Temporanry Redirect,临时重定向):如果接收到303响应,则继续进行GET和POST的重定向,如果接收到307响应,则对GET请求继续重定向,POST请求则不重定向。
11 400(Bad request,错误请求):表明客户请求中含有语法错误。
12 401(Unauthorize,未授权)。
13 403(Forbidden,资源不可用):服务器拒绝提供相关资源。
14 404(Not Found,未找到):客户端给定的地址找不到资源。
15 405(Method Not Allowed,方法不允许):资源不允许使用该请求方法(GET、POST、HEAD、PUT、DELETE等)。
16 415(Unsupported Media type,不支持的媒体类型):服务器不知道如何处理附加文件的类型。
17 417(Expectation Failed,期望不满足):参考状态100。
18 500(Internal Server Error,服务器内部错误)。
19 501(Not Implemented,未实现):表示服务器不支持客户端发送的命令,比如PUT。
20 503(Service Unavailable,服务不可用):由于服务器不能做出相应,比如线程池或数据库连接池被占用。
21 505(HTTP Version Not Supported,不支持的HTTP版本)。
package com.devway.servlet.response; import com.devway.servlet.common.BaseServlet; import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; /**
* TestResponseCode class
*
* @author devway
* @date 2017-12-06
*/
public class TestResponseCode extends BaseServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp); //resp.setStatus(204); //resp.setStatus(307);
// resp.setHeader("Location","http://www.baidu.com"); //505
//System.out.println(1/0); out.println("测试setStatus:"+resp.getStatus()); //重定向
//resp.sendRedirect("http://www.baidu.com"); //resp.sendError(405,"页面错误"); }
}
3 HTTP响应报文头
1) 使用HttpServletResponse的方法设置响应报文头。
2) setHeader/addHeader:将指定名称的响应报文头设定为指定的值,set和add方法的区别在于,如果已存在同名的报文头名字,使用set会替换报文头的值,而使用add则是新增一个同名的报文头。
3) setDateHeader/addDateHeader:省去将毫米数转为Date的步骤。
4) setIntHeader/addIntHeader:省去将int转为String的步骤。
5) setContentType:设置Content-Type报文头。
6) setContentLength:设置Content-Length报文头,在浏览器支持持续性HTTP连接时,这个报文头很有用。
7) addCookie:插入cookie,没有setCookie方法。
8) sendRedirect:将状态代码设为302,同时设置Location报文头。
9) 报文头详解:
① Allow:指定服务器支持的请求方法(GET、POST等),405响应需要用到这个报文头。
② Cache-Control:告诉客户端,什么环境可以安全的缓存文档,可以取以下值
a) public:文档可以缓存。
b) private:适用单个用户,只能存储在私有缓存中。
c) no-cache:不能缓存。
d) no-store:不能缓存,且不能存储在磁盘的临时目录中。
e) must-revalidate:每次使用文档时,客户端必须联系原来的服务器重新验证文档。
f) proxy-revalidate:只适用于共享缓存,其他和must-revalidate相同。
g) max-age=xxx:xxx秒之后,将该文档认为失效,可替代Expires,如果两个都存在,则max-age优先。
h) s-mas-age=xxx:共享缓存在xx秒之后将文档认为失效。
③ Connection:如果为close,则指示浏览器不要使用持续性HTTP连接,可以省略Content-Length报文头,如果未指定,则默认为持续性连接。
④ Content-Disposition:控制用户请求所得的内容存为一个文件的时候提供一个默认的文件名,文件直接在浏览器上显示或者在访问时弹出文件下载对话框。
⑤ Content-Encodig:页面传输中使用的编码方式。
⑥ Content-Language:文档使用的语言。
⑦ Content-Length:响应的字节数。
⑧ Content-Type:设置响应文档的MIME类型以及字符编码,MIME一般指定为text/htm,如果字符编码没指定,则默认为ISO-8859_1。也可使用setContentType方法。常见的MIME类型:
a) application/msword:Microsoft Word 文档。
b) application/pdf: .pdf文件。
c) application/vnd.ms-excel:excel。
d) application/x-java-archive:JAR文件。
e) application/zip:zip文件。
f) image/gif:GIF图像。
g) text/css:HTML层叠样式表。
h) text/html:HTML文档。
i) text/plain:纯文本。
j) text/xml:xml文件。
⑨ Expires:过期时间。
⑩ Last-Modified:文件的最后修改时间,时间单位为毫秒。
11 Location:重定向地址,状态代码在300-399,都应该包括这个报文头。
12 Refresh:表明浏览器间隔x秒后,自动刷新页面,时间单位为秒。response.setIntHeader("Refresh",30);如果要跳转到新页面,则设置response.setHeader("Refresh","5;URL="http://www.baidu.com");一般将这部分放入HTML页面的HEAD中,间接的设置这个报文头,而不是在服务器显示设置。<META HTTP-EQUIV="Refresh" Content="5;URL="http://www.baidu.com">
13 Retry-After:和状态码503结合使用,告诉客户端多久后可以重复请求。
14 WWW-Authenticate:和401结果使用,告诉浏览器应该提供那种类型的验证。
package com.devway.servlet.response; import com.devway.servlet.common.BaseServlet; import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; /**
* TestSetHeader class
*
* @author devway
* @date 2017-12-07
*/
public class TestSetHeader extends BaseServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doGet(req, resp); //set***方法,如果有同名的报文头则替换,而add***方法,则即使报文头已存在,也添加一个同名的新的报文头
resp.setHeader("headerName ","headerValue");
resp.setDateHeader("headerDate",System.currentTimeMillis());
resp.setIntHeader("headerInt",1001); resp.addHeader("headerName","headerValue1");
resp.addDateHeader("headerDate",System.currentTimeMillis()+1000000);
resp.addIntHeader("headerInt",1002); resp.setContentType("text/html;charset=\"utf-8\"");
//resp.setContentLength(200); resp.addCookie(new Cookie("c","c1")); //指定服务器支持的请求方法(GET、POST等),405响应需要用到这个报文头
resp.setHeader("allow","GET"); //告诉客户端,什么环境可以安全的缓存文档
//resp.setHeader("Cache-Control","no-cache");
resp.setHeader("Cache-Control","public"); //resp.setContentType("application/vnd.ms-excel;charset=utf-8");
//resp.setHeader("Content-Disposition","attachment;filename=1.xls"); //设置内容的过期时间
resp.setDateHeader("Expires",10*1000);
println("test"); //resp.setHeader("Refresh","2");
//resp.setHeader("refresh","3;URL=\"http://www.baidu.com\"");
//resp.setIntHeader("Refresh",2); }
}
4 Servlet状态的持续和页面的自动重载
1) 对于处理耗时较长的任务,需要以下功能:
① 一种跨请求存储数据的方式:对于不属于客户的数据,存储在servlet的字段中;对于用户专属的数据,存储在HttpSession对象中;于其他servlet和jsp需要用到的数据,存储在ServletContext中。
② 一种在请求发送给客户之后,继续运算的方式:启动一个线程。
③ 一种在计算结果继续后,使浏览器得到他的方式:使用Refresh响应报文头。
5 使用Servlet生成Excel
1) 如何创建Excel
① Excel支持多种不同格式的输出:制表符分隔的数据、HTML表格、本地二进制格式。
② 构建Excel,使用response.setContentType("application/vnd.ms-excel");
2) 使用制表符生成Excel
package com.devway.servlet.response; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter; /**
* TestExcel class
*
* @author devway
* @date 2017-12-07
*/
public class TestExcel extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("application/vnd.ms-excel");
PrintWriter out = resp.getWriter();
out.println("\tQ1\tQ2\tQ3\tQ4\tTotal");
out.println("Apples\t1\t2\t3\t4\t=SUM(B2:E2)");
out.println("Oranges\t2\t2\t3\t4\t=SUM(B3:E4)");
} }
Servlet&JSP-HTTP服务器响应信息的更多相关文章
- jsp的服务器响应,out.println 与response.setIntHeader的报错解决方案,附:导入jar包的方法
在九大内置对象中,笔者认为用的最多的就是out.println 与response.setIntHeader,今天刚写了一个服务器响应的代码,也总是这两个报错.具体请看图. 先来说说response. ...
- Servlet+jSP+java实现商品信息和流水的操作
设计思路:先是创建两个表,一个用来操作库内商品的增删改查,一个用来记录商品的流水信息. 设计过程:先对商品的属性进行创建javaBean编写,之后编写数据库连接类,之后编写数据库操作类,之后编写服务类 ...
- ajax获取服务器响应信息
window.onload = function(){ document.getElementById('btn').onclick = function(){ var req = new XMLHt ...
- JSP服务器响应
以下内容引用自http://wiki.jikexueyuan.com/project/jsp/server-response.html: 当一个Web服务器响应浏览器的HTTP请求时,响应通常包括一个 ...
- JSP-Runoob:JSP 服务器响应
ylbtech-JSP-Runoob:JSP 服务器响应 1.返回顶部 1. JSP 服务器响应 Response响应对象主要将JSP容器处理后的结果传回到客户端.可以通过response变量设置HT ...
- web容器 web服务器 servlet/jsp容器 之间的区别和关系是什么?
web容器 web服务器 servlet/jsp容器 之间的区别和关系是什么? 这是我在网上找的一些资料:1. Web浏览器除了可以在本地硬盘上打开网页文档外,还可以使用http网络协议从网络上的We ...
- 支持JSP和Servlet的Web服务器
支持JSP和Servlet的Web服务器 1.Tomcat 服务器 目前非常流行的Tomcat服务器是Apache-Jarkarta开源项目中的一个子项目,是一个小型.轻量级的支持JSP和Servle ...
- JSP 表单处理向服务器提交信息
JSP 表单处理 我们在浏览网页的时候,经常需要向服务器提交信息,并让后台程序处理.浏览器中使用 GET 和 POST 方法向服务器提交数据. GET 方法 GET方法将请求的编码信息添加在网址后面, ...
- servlet/jsp详解
首先谈servlet的简单定义,servlet其实就是一门web服务器端编程的技术. servlet它分两种,一种是servlet容器,所有的servlet对象都要放在servlet容器中才能被调用执 ...
随机推荐
- Keras学习环境配置-GPU加速版(Ubuntu 16.04 + CUDA8.0 + cuDNN6.0 + Tensorflow)
本文是个人对Keras深度学习框架配置的总结,不周之处请指出,谢谢! 1. 首先,我们需要安装Ubuntu操作系统(Windows下也行),这里使用Ubuntu16.04版本: 2. 安装好Ubunt ...
- LeetCode 62. Unique Paths(所有不同的路径)
A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). The ...
- 我的第一个python web开发框架(14)——后台管理系统登录功能
接下来正式进入网站的功能开发.要完成后台管理系统登录功能,通过查看登录页面,我们可以了解到,我们需要编写验证码图片获取接口和登录处理接口,然后在登录页面的HTML上编写AJAX. 在进行接口开发之前, ...
- 微信小程序之页面下拉刷新
如果需要给单个页面设置下拉刷新功能,不需要写在""window"对象里面,直接在 文件名称.json 里面设置即可 { "enablePullDownRefr ...
- Java调用C++类库--JNI
JNI是Java平台中的一个重要的功能,这里我把我做的Demo总结一下,分享一下,我会把每个步骤尽量的详细的展现出来. 这里我就不讲解JNI的原理了,google,百度一下,到处都是 好了,直接来讲步 ...
- ajax+php(环境搭建+测试)
在学习JavaScript,jQuery的ajax部分的时候,一直不明白要如何进行,不知道服务器要怎么弄,什么都不知道,当初在学ajax的时候,除了看一下ajax的内容,实践极少,因为,不知道要怎么做 ...
- JS模块化-requireJS
1. 为什么要使用require.js 刚开始的时候,网页需要用到很多不同的插件,都是依次加载,需要注意其中的加载顺序即依赖关系. <script src="1.js"> ...
- Node.js 常用工具
Node.js 常用工具 util 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心JavaScript 的功能 过于精简的不足. util.inherits util.inherit ...
- 使用qt制作一个简单的计算器
前言:今天使用qt制作了一个很简单的计算器,觉得挺有意思的,所以在这里跟大家分享一下. 这里先跟大家说说使用到的函数: 一.槽连接函数 connect(信号发送者,发送的信号,信号接收者,信号接收者的 ...
- NoSQL:linux操作memcached
缓存数据库 一 NoSQL简介 NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL",泛指非关系型的数据库,随着互联网web2.0网站的兴起,传统的关系 ...