Chinaunix首页 | 论坛 | 博客
  • 博客访问: 255319
  • 博文数量: 164
  • 博客积分: 60
  • 博客等级: 民兵
  • 技术积分: 1129
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-09 21:55
文章分类

全部博文(164)

文章存档

2017年(2)

2015年(67)

2014年(95)

我的朋友

分类: Web开发

2015-05-30 22:44:24

1.sun公司提供的动态web资源开发技术。本质是上一段java小程序,要求这个小程序必须实现Servlet接口,以便服务器能够调用。
开发Servlet的两个步骤
*实验:Servlet的快速入门
(1)步骤一:写一个java程序实现Servlet接口(此处直接继承了默认实现类GenericServlet)
        

点击(此处)折叠或打开

  1. package cn.itheima;
  2. import java.io.*;
  3. import javax.servlet.*;

  4. public class FirstServlet extends GenericServlet{
  5. public void service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException{
  6. res.getOutputStream().write("My FirstServlet!".getBytes());
  7. }

  8. }

  9. (2)将编译好的带包的.class放到WEB-INF/classes下以外,还要配置web应用的 web.xml注册Servlet
  10. <servlet>
  11.        <servlet-name>FirstServlet</servlet-name>
  12.        <servlet-class>cn.itheima.FirstServlet</servlet-class>
  13.    </servlet>
  14.    <servlet-mapping>
  15.        <servlet-name>FirstServlet</servlet-name>
  16.        <url-pattern>/FirstServlet</url-pattern>
  17.    </servlet-mapping>

 2.Servlet的调用过程/生命周期
    Servlet的生命周期:通常情况下,servlet第一次被访问的时候在内存中创建对象,在创建后立即调用init()方法进行初始化。对于每一次请求都掉用service(req,resp)方法处理请求,此时会用Request对象封装请求信息,并用Response对象(最初是空的)代表响应消息,传入到service方法里供使用。当service方法处理完成后,返回服务器服务器根据Response中的信息组织称响应消息返回给浏览器。响应结束后servlet并不销毁,一直驻留在内存中等待下一次请求。直到服务器关闭或web应用被移除出虚拟主机,servlet对象销毁并在销毁前调用destroy()方法做一些善后的事情。

3.Servlet的继承结构
        Servlet接口 -- 定义了Servlet应该具有的基本方法
            |
            |--GenericServlet --通用基本Servlet实现,对于不常用的方法在这个实现类中进行了基本的实现,对于Service设计为了抽象方法,需要子类去实现
                    |
                    |--HttpServlet --在通用Servlet的基础上基于HTTP协议进行了进一步的强化:实现了GenericServlet中的Service方法,判断当前的请求方式,调用对应到doXXX方法,这样一来我们开发Servlet的过程中只需继承HttpServlet ,覆盖具体要处理的doXXX方法就可以根据不同的请求方式实现不同的处理.一般不要覆盖父类中的Service方法只要覆盖doGet/doPost就可以了

4.web.xml注册Servlet的注意事项
4.1利用标签注册一个Servlet

        FirstServlet
        cn.itheima.FirstServlet  注意:此处要的是一个Servlet的完整类名,不是包含.java或.class扩展的文件路径
   

   
        FirstServlet
        /FirstServlet
   

    4.2一个可以对应多个
    4.3可以用*匹配符配置,但是要注意,必须是*.do或者/开头的以/*结束的路径。
    ~由于匹配符的引入有可能一个虚拟路径会对应多个servlet-mapping,此时哪个最像找哪个servlet,并且*.do级别最低。
    4.4可以为配置子标签,指定servlet随着服务器的启动而加载,其中配置的数值指定启动的顺序
   
invoker

org.apache.catalina.servlets.InvokerServlet

2

4.5缺省servlet:如果一个servlet的对外访问路径被设置为/,则该servlet就是一个缺省servlet,其他servlet不处理的请求都由它来处理
~在conf/web.xml中配置了缺省servlet,对静态资源的访问和错误页面的输出就是由这个缺省servlet来处理的。如果我们自己写一个缺省servlet把爸爸web.xml中的缺省servlet覆盖的话,会导致静态web资源无法访问。所以不推荐配置。
4.6servlet的线程安全问题
4.6.1由于通常情况下,一个servlet在内存只有一个实例处理请求,当多个请求发送过来的时候就会有多个线程操作该servlet对象,此时可能导致线程安全问题。
(1)serlvet的成员变量可能存在线程安全问题
*实验:定义一个成员变量 int i = 0;在doXXX()方法中进行i++操作并输出i值到客户端,此时由于延迟可能导致线程安全问题
(2)serlvet操作资源文件时,多个线程操作同一文件引发线程安全问题
*实验:请求带着一个参数过来,servlet将请求参数写入到一个文件,再读取该文件,将读取到的值打印到客户端上,有可能有线程安全问题

4.6.2解决方法
(1)利用同步代码块解决问题。缺陷是,同一时间同步代码块只能处理一个 请求,效率很低下,所以同步代码块中尽量只包含核心的导致线程安全问题的代码。
(2)为该servlet实现SingleThreadModel接口,此为一个标记接口,被标记的servlet将会在内存中保存一个servlet池,如果一个线程来了而池中没有servlet对象处理,则创建一个新的。如果池中有空闲的servlet则直接使用。这并不能真的解决线程安全问题。此接口已经被废弃。
(3)两种解决方案都不够完美,所以尽量不要在servlet中出现成员变量。











阅读(573) | 评论(0) | 转发(0) |
0

上一篇:http协议概述

下一篇:Servlet的调用过程图

给主人留下些什么吧!~~