今天学习了http协议和servlet的一些基本使用。
下面首先说http协议
HTTP协议是指浏览器和WEB服务器通信的规则,其中http有2个版本:HTTP1.0/HTTP1.1
HTTP1.0:
客户端请求服务器后,服务器响应信息后,立即断开,且只能请求和响应一个资源 。
缺点:客户端创建连接需消耗大 量时间和资源,一次连接只响应一个资源,下一个请求又需要创建新的连接。
HTTP1.1:
优点:客户端请求服务器后,得到响应后,在一定时间内,这个连接是保留的。在短时间之内,
客户端再次请求服务器,就不需要创建新的连接了。
HTTP请求组成:
1,请求行-------------请求方式和请求版本
2,请求头----------key:value组成的内容,每次请求都不同,下面是一个例子:
Accept:text/html;image/* 表示浏览器可以接受什么类型的响应数据
Accept-Charset :GBK 浏览器接收什么类型的编码方式
Accept-Encoding:gzip compress 浏览器可以接受gzip的压缩数据
Accept-Language:en-us,zn-cn 浏览器接收什么类型的语言
Host:www.itheima.com:80 请求的主机名和端口号
If-Modified-Since: Tue,11 Jul 2014 28:23:51 最后修改时间
Referer:http://www.itheima.com/index.html 由那个页面跳转过来的
User-Agent:Mozilla/4.0 浏览器类型和版本
Cookie: 浏览器缓存服务器响应的信息
Connection:close/Keep-Alive 浏览器和服务器的连接是打开或是关闭的
Date: Tue, 11 Jul 2014 18:23:51 GMT (访问时间) 浏览器请求服务器的时间,这个时间不是中国时间
3_请求体或实体内容
不是每次请求都有内容的,GET方式请求体是没有内容的,因为内容都在请求行中,POST方式请求体是有内容的,例如:文件上传,表单以POST方式提交。
一个完整的HTTP响应,分为三部份:
1_响应行
协议名和版本 响应状态码 响应状态码的英文描述
2_响应头
有很多key:value组成的内容,每次响应都不相同
Location: http://www.itheima/index.html 服务器要求浏览器访问的URL地址
Server:apache tomcat 服务器通知浏览器服务器的名字
Content-Encoding: gzip 服务器通知浏览器需要接收的压缩数据类型
Content-Length: 80 服务器通知浏览器需要接收的响应内容的字节数
Content-Language: zh-cn 服务器通知浏览器需要接收的语言类型
Content-Type: text/html; charset=GBK 服务器通知浏览器需要接收的类型和使用什么方式解码
Last-Modified: Tue, 11 Jul 2014 18:23:51 GMT 服务器通知浏览器浏览器访问的请求最近一次修改的时间
Refresh: 1; url=http://www.itheima.com 服务器通知浏览器1秒钟后刷新,并且访问指定的URL页面
Content-Disposition: attachment; filename=aaa.zip (下载文件) 服务器通知浏览器以下载方式打开资源
Transfer-Encoding: chunked (分块传递数据到客户端)服务器通知浏览器以
分块方式下载文 件的浏览器指定的目录
Set-Cookie:SS=Q0=5Lb_nQ; path=/search 服务器通知浏览器需要接收数据缓存到浏览器
Expires: -1//3种禁止缓存的头字段 以下三个响应头都表示服务器要求浏览器不要缓存
来自服务器的web页面
Cache-Control: no-cache
Pragma: no-cache
Connection: close/Keep-Alive 服务器通知浏览器之间的连接是否已以关闭或者打开的
Date: Tue, 11 Jul 2014 18:23:51 GM 服务器通知浏览器的时间
如果上述头中,请求也有,响应也用,我们叫其通用头,Connection和Date就是通用头。
3,响应体或实体内容
响应体和响应头之间有一个空行,响应状态吗是服务器对这次响应设置的一个唯一编号。每个编码都有其特定的含义,常见的响应编号有:
200:表示服务器响应正确
302:重定向 表示该服务器没有这个资源,服务器要求客户端自己去另一台服务器找资源。
307:转发 服务器没有该资源,服务器自己去另一台服务端找资源。
304:客户端请求服务器资源,资源没有修改过,并且已经缓存到客户端,客户端去缓存中获取。
404:客户端请求服务器的URL出错了。
500:客户端请求URL没错,但是服务器处理资源出错了 。
设置响应头让客户端不缓存信息使用一下代码:
<span style="font-size:14px;"> response.setDateHeader("expires",-1); response.setHeader("cache-control","no-cache"); response.setHeader("pragma","no-cache");</span>设置浏览器3面后跳转到tomcat首页:
resp.setHeader("Refresh", "3;url=http://127.0.0.1:8080");
response.setHeader("content-disposition","attachment;filename="+filename);
init();
doGet(); 多次执行时重复调用
destory(); 服务器断开的时候执行
始终只有一个Servlet为所有客户端服务,即Servlet是单例的。Servlet 只有在首次访问的时候才会创建实例。自动加载Servlet,可以在部署服务器之前启动在<servlet></servlet>中添加一个属性:<load-on-startup>0|>0</load-on-startup>如果值为负数,则没任何效果,数值越小,就先启动。
Servlet中重写init(ServletConfig config)方法 参数可以获取web.xml中的数据:
<init-param> <param-name></param-name> <param-value></parame-value> </init-param> 下面提供一个例子:</span><pre name="code" class="java"><span style="font-size:14px;"> <servlet> <servlet-name>Demo06</servlet-name> <servlet-class>itcase.http.Demo06</servlet-class> <init-param> <param-name>haha</param-name> <param-value>哈哈</param-value> </init-param> <init-param> <param-name>xixi</param-name> <param-value>嘻嘻</param-value> </init-param> </servlet> 以下代码: public class Demo06 extends HttpServlet{ private ServletConfig config; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Enumeration<String> names = config.getInitParameterNames(); while(names.hasMoreElements()){ String name = names.nextElement(); String value = config.getInitParameter(name); } } @Override public void init(ServletConfig config) throws ServletException { this.config = config; }
/* * 写一个servlet,把文件输出到浏览器 */ public class Demo09 extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { InputStream is = this.getClass().getClassLoader().getResourceAsStream("../../images/广州地铁规划图.jpg"); //获取输出流对象 if(is == null){ System.out.println("hah "); return; } OutputStream os = resp.getOutputStream(); int len = 0; byte[] buf = new byte[1024]; while((len = is.read(buf))>0){ os.write(buf, 0, len); } os.close(); is.close(); } }