首页 > 代码库 > Servlet

Servlet

    一】Servlet入门
        1)是SUN公司基于Java技术的一个开发动态资源支持的规范,以
        2)Servlet是一种特殊的Java类,运行时服务端/容器中,接收每一个客户端的请求并响应,遵循HTTP协议
        3)Servlet手工开发过程,参见<<手工创建Servlet的全过程.txt>>
        
        配置环境变量set classpath=%classpath%;
        配置servlet如何被外界访问
        <servlet>
            <servlet-name>MyServlet</servlet-name>//Servlet的名字
            <servlet-class>cn.itcast.web.servlet.MyServlet</serblet-class>//Servlet全路径
        </servlet>
        <servlet-mapping>
            <servlet-name>MyServlet</servlet-name>  //servlet名字,必须和上述一致
            <url-pattern>/my</url-pattern>//以/开头,提供外界用户访问的路径
        </servlet-mapping>
        
        
    二】开发Servlet的三种方式
        1)实现Servlet接口
            
        2)继承并扩展GanericServlet类
        
        3)继承并扩展HttpServlet类,注意:此类只适合Http协议的类型。
            1》如果浏览器以get方式提交,复写doGet()方法
            2》如果浏览器以post方式提交,复写doPost()方法
        
        补充:
            1》web.xml配置:
                <servlet>
                    <servlet-name>Dem11[servlet名字,可以任意]</servlet-name>
                    <servlet-class>cn.itcast.web.servlet.Demo11[servlet全路径名]</srevlet-class>
                </servlet>
                <servlet-mapping>
                    <servlet-name>Demo11[servlet名字,必须和上述一致]</servlet-name>
                    <url-pattern>/qq[以/开头,提供外界用户访问的路径]</url-pattern>
                </servlet-mapping>
            2》如果需要输出中文,需要在Servlet中做如下设置:
                //服务端通知浏览器以指定的编码方式来显示中文
                response.setContentType("text/html;charset=utf-8");
                response.getWriter().write("欢迎学习JavaServlet程序!");
                方法原型:
                        void setContentType(String type);
 
    三】Servlet调用的详细步骤
        1》当浏览器第一次访问Servlet时,服务器首先会解析web.xml文件,根据浏览器访问的路径,解析出该Servlet的全路径
        2》找到Servlet后进行反射(Class.forName().newInstance),创建一个Servlet对象(此时会调用构造方法)
        3》调用init()方法:Servlet作初始化工作
        3》调用doXxxx()方法:为浏览器响应
        4》如果浏览器再次访问相同的Servlet,只需从服务端维护的Servlet实例结合中取得对象的实现,来进行相应的动作
        5》当服务器决定销毁Servlet实例之前(如重新部署工程时),调用此Servlet实例的destroy()方法,销毁此对象。
        注意:
            1》每创建一个Servlet实例后,会自动放入服务端的Servlet实例池(容器)当中存储,备用。
            2》同一个Servlet实例,在服务端只有一个。
            3》每个实例只会调用一次的方法:构造方法、init()方法,Destroy()方法
        
        输出结果:
            Demo2()--hashCode://构造函数,在反射阶段调用
            init()--hashCode:
            doGet()--hashCode:
            doGet()--hashCode:
            doGet()--hashCode:
            doGet()--hashCode:
    四】Servlet细节
        1)浏览器访问的url-pattern只是一个符合格式的任意字符串,以/开头
        2)一个Servlet的url-pattern可以是1个或者多个
        3)url-pattern只能有两种格式,但只能使用其中一种:
                    1》*.后缀名(后缀名是任意的)
                    2》/*
                    即:/和*不能同时使用                               */
        4)多种url-pattern的优先级:
                1》不同方式:/*优先级大于*.后缀名            */
                2》同种方式:最相似的为准。
        5)程序员编写的Servlet其实是由tomcat容器中Servlet引擎来处理的,引擎会产生
                对应的HttpServletRequest、HttpServletResponse等对应传入到Servlet的doXxxx()等方法中
        6)允许在用户第一次方法之前就做一些初始化工作:
                    通过在web.xml中配置代码,让Servlet在部署时就创建。
                    即,加上:<load-on-startup>n</load-on-startup>//n为正整数,或者0,不能为负数
                        n越小,部署的时候,先加载。
                eg:
                     <servlet>
                        <servlet-name>Demo1</servlet-name>
                        <servlet-class>cn.itcast.web.servlet.Demo1</servlet-class>
                        <load-on-startup>2</load-on-startup>
                      </servlet>
        7)url-pattern为/的servlet是一个缺省的servlet,专用于处理当前web应用下,访问路径错误的请求。
                所以,只需要修改web.xml就可以设置一个缺省的servlet了。
                且,任何web服务器都有一个缺省的servlet来处理。
            eg:
                <servlet-mapping>
                <servlet-name>Demo3</servlet-name>
                <url-pattern>/</url-pattern>
              </servlet-mapping>
              
        补充:当访问Tomcat服务器中的某个静态HTML文件和图片时,实际是在访问这个缺省的Servlet,
                    只是此缺省的Servlet里面带有转向到静态HTML的功能而已。            
        8)每个线程会共享同一个Servlet的实例变量,所以要对临界资源进行加锁的操作。
                产生线程安全问题的条件(缺一不可):
                    1》单例
                    2》实例变量
                    3》实例变量进行修改操作
                解决办法:
                    1》通过加锁的方式,对敏感数据块进行代码的同步。
                    2》过时的方式:实现类SingleThreadModel(实际运行会出错。)

Servlet