http_servlet

今天学习了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);

创建Servlet方式有三种

            1,普通类实现Servlet接口,并重写service()方法,每次请求服务器都调用service()方法,缺点:不必要的方法必须得实现。
             2,普通类继承GenericServlset类,重写service();每次请求服务器都调用Service()方法。缺点:不同的请求不能分开处理。
             3,继承HttpServlet类,重写doPost()和doGet()方法,doPost接收post请求,doGet接收get请求。


ServlerRequest是父接口,既能处理http协议,也能处理非http协议,HttpServletRequest 是子接口,所有建议用HttpServletRequest


Servlet 的生命周期,


             constructor():第一次访问执行->只有init() ->doGet()/doPost()

              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直接继承HttpServlet的原因:       1,我们在企业中,处理的web请求,大多是http协议的,正好HttpServlet 类是符合HTTP协议规则的。       2,HttpServlet类,继承了GenericServlet类,也实现了Servlet接口,不光有父类的功能,也有自己独特的操作       3,HttpServlet类可以根据客户端提交的方法来处理,例如:doGet doPost   通常不需要重写service方法       4,HttpServlet无法init无法获取ServletCOnfig,但是可以通过 getServletConfig方法获取ServletConfig对象一个servlet映射多个虚拟路径    1,使用 /*  通配符    2,*.do       3,* 和 / 不能同时存在        项目中将<url-pattern>/</url-pattern>的Servlet,叫缺省,Servlet,一般不处理http请求,专处理别的Servlet不处理HTTP请求程序员不用编写 缺省Servlet,每个web服务器中都有缺省Servlet,例如:404页面。如果有2个缺省Servlet,只要访问当前web应用,就用当前web应用的缺省Servlet处理;如果访问的不是当前web应用,则有tomcat中的缺省Servlet处理。以下代码实现了把一个人间输出到浏览器 
 
 /*
 * 写一个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();
			
	}
}

你可能感兴趣的:(http_servlet)