码迷,mamicode.com
首页 > 其他好文 > 详细

Servlet

时间:2015-04-23 09:28:13      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:

    1.servlet(重点)
    2.ServletConfig(次重点)
    3.ServletContext(重点)
    
    1.Servlet:服务器端小应用程序
        它运行在Servlet容器中,它是由服务器直接解析运行。
        
    2.创建一个servlet步骤:
        1.创建一个类,去继承HttpServlet(实现Servlet接口 或继承 GenericServlet)
        2.重写方法  doPost  doGet  (接口中需要将所有方法重写,但是service方法是处理请求)
        3.在web.xml文件中配置
        
    3.servlet生命周期
        
        1.创建servlet,并调用init方法
        2.通过service方法来处理请求。
        3.通过destroy来销毁servlet。
        
        当我们创建一个servlet时,第一次访问,会创建servlet对象,并调用init方法,init方法只调用一次。
        开启一个线程来调用service方法。
        当下一次在访问时,又开启一个线程来调用service方法。
        servlet对象,一般情况只创建一次,它常驻内存。
        当服务停止,或servlet对象销毁时会调用destroy方法。
        
        注意:如果在servlet中创建了成员变量,就可以出现线程安全问题
        在开发中,尽量避免在servlet中创建成员变量。
        如果创建了,就需要同步。
        
    4.关于Servlet接口中service方法与HttpServlet中的doPost,doGet什么关系?
    
        一个servlet被访问时,它默认处理请求的是service方法,这个方法是在Servlet接口中定义的。
        
        根据请求的url,在web.xml文件中查找到具体的servlet,
        会默认调用service方法。
        对于我们来说,它在HttpServlet中对service方法进行了重写,执行其内容

        在HttpServlet的service方法中,会根据请求方式的不同,分别调用不同的方法。
        根据java中的多态,在调用doPost,doGet时,会调用的是我们自己的servlet中的方法。

        这里面涉及到一个java模式:模板方法模式
            
    ---------------------------------------------------------
    5.模板方法模式:
        

    6.关于servlet自动加载.
        我们可以通过设置让servlet跟随服务器启动而创建.
        
        只需要在servlet配置中<servlet>这个标签中加上 <load-on-startup>2</load-on-startup>
        
        问题1:servlet跟随tomcat启动有什么作用?
            就是用来加载资源。
        问题2:load-on-startup它的值可以取什么?
            
            优先级有10个,是从1-10,1已经被占用了,我们在使用时,一般情况下是从2开始。
            数值越小优先级越高。
            
            优先级相同情况下根据配置的顺序加载。
            
    ----------------------------------------------------------------------
    7.关于servlet配置中的url-pattern问题
        
        问题1:一个servlet是否可以被映射到多个路径?
            可以的,一个servlet允许被不同的路径映射.
            
        问题2:url-pattern它的写法是什么样的?
            1.完全匹配  要求必须以 /开始。
            
            以下两种可以使用通配符. *
            2.目录匹配  必须以/开始,以*结束。
            3.扩展名匹配  不能以/开始,以*.xxx结束.
            
            最经典错误  *.do
            
            以上三种配置有优先级:  完全匹配>目录匹配>扩展名匹配
            
    ----------------------------------------------------------------------
    8.web开发中的路径问题
        问题是:浏览器访问服务器有几种访问方式?
            1.直接在浏览器地址栏上输入url
            2.超链接.
            3.表单
            4.javascript
            
            请求的方式最常用的是post  get
            
            除了表单可以post请求,其它的都是get请求。
            
        访问servlet路径问题    
            
            1.绝对路径
                1.带协议
                    <a href="http://localhost:8080/day7_2/demo1">demo1Servlet</a>
                    这种方式在开发不常用,如果使用这种方式,一般是用于访问站外资源。
                2.不带协议
                    在浏览器端写一个"/"相当于是服务器的根路径.
                    <a href="/day7_2/demo1">demo1Servlet</a>                    
                    对于"/"它相当于是  http://localhost:8080也就是说,我们直接在"/"后面加上我们的工程名,在加上我们的资源名称就可以。
                    这种方式在开发中应用比较多,因为它一般用于访问站内资源。
                    
            2.相对路径        
                
                http://localhost:8080/day7_2/demo1         servlet路径
                http://localhost:8080/day7_2/admin.html       html路径
                
                通过它们的路径,我们发现它们是一个级别,那么我们在访问时,就可以写成以下效果.
                <a href="./demo1">demo1Servlet</a>
                
                这个路径可以简化成
                <a href="demo1">demo1Servlet</a>
                    
            
            在WebRoot下创建一个jsps目录,将admin.html放置到其中。那么在访问时,绝对路径不会出问题。
            相对路径失效。怎样修改它?
                
                        http://localhost:8080/day7_2/demo1  
                        http://localhost:8080/day7_2/jsps/admin.html    

                        路径:    <a href="../demo1">demo1Servlet</a>        

            -----------------------------------------------------------------
            结论:在开发中,推荐使用不带协议绝对路径。
                写法:  /工程名/servlet的url-pattern的值.
    ------------------------------------------------------------------------------------------
    9.关于Servlet接口中的init方法    
        
        问题1:在Servlet接口中定义的init方法是有参数的,它的参数类型是ServletConfig,而我们重写的init方法没有参数,为什么?
        
            原因:父类中已经将init(ServletConfig  config)这个方法进行了重写,而我们在自己的Servlet中就不需要在重写了,
                   我们重写的init()它不是接口中定义的,而是在父类中定义的。
                   
                   细节:在GenericServlet中对Servlet接口中的init(ServletConfig config)进行了重写,并且调用了自己定义的一个
                        init()方法。那么我们在自己的Servlet类中重写了init()方法,根据多态就会调用我们自己的init()方法。                        
                        
        
        问题2:ServletConfig是什么?它有什么作用?
            
            在GenricServlet中将ServletConfig对象保存到了GenericServlet中。
            public void init(ServletConfig config) throws ServletException {
                this.config = config;
                this.init();
            }
            
            ServletConfig对象,代表的是Servlet的配置对象。
            
            当去访问一个servlet时,就会实例化这个servlet对象,并且会创建一个servletConfig对象,将这个对象通过init方法传递到servlet中。
            那么我们就可以在自己的servlet中获取Servlet的配置信息.
            
            获取ServletConfig对象: this.getServletConfig();
    ----------------------------------------------------------------
    10.    ServletConfig对象
        
        功能:
            1.可以获取Servlet的name。
            2.可以获取初始化参数
                是我们可以在Servlet的配置中通过<init-param>来进行配置,
                对于这些配置,我们可以通过ServletConfig来获取.
                
                通过初始化参数,我们可以进行预定义信息的加载,这种操作一般情况是在框架中应用。
            3.可以获取ServletContext对象    
                
            常用API总结:
                public String getServletName();
                用于获取Servlet名称
                
                public String getInitParameter(String name);
                用于获取init-param中指定名称的value值.
                
                public Enumeration getInitParameterNames();
                用于获取所有的init-param中的name名称.
                
                public ServletContext getServletContext();
                用于获取一个ServletContext对象。

        ServletConfig要求掌握内容:
            1.它是由服务器创建,通过init方法传递到我们的Servlet中。
              我们在Servlet中通过  this.getServletConfig()获取ServletConfig对象.
              
            2.ServletConfig对象是用于获取当前Servlet的配置信息.
                1.Servlet的名称
                2.Servlet的初始化参数。
                
        每一个Servlet都具有自己的ServletConfig对象。它们之间是不能共享的。    

    -------------------------------------------------------------------------------------
    11.关于ServletContext对象.
        ServletContext它代表的是一个web应用。
        
        怎样获取一个ServletContext对象?
            可以通过ServletConfig对象获取.
            
            ServletConfig.getServletContext();
            
        作用:
            1.它可以获取全局初始化参数
                String getInitParameter(String name)  
                Enumeration getInitParameterNames()  
                
                在web.xml文件中可以配置我们的全局初始化参数
                <!-- 配置全局初始化参数 -->
                <context-param>
                    <param-name>name</param-name>
                    <param-value>tom</param-value>
                </context-param>
                
                它的配置是针对于整个web应用.
            2.它可以帮助我们让servlet实现信息共享.
            
                ServletContext是一个域对象,提到域对象想到两件事,一个是它相当于是一个Map,另一个它有作用域,对于
                ServletContext它的作用域是整个web应用。
                
                示例:统计站点访问次数
                    问题:怎样判断是第一次访问
                    
                setAttribute(String name,Object value);
                getAttribute(String name);
                removeAttribute(String name);
            
            3.可以获取路径(资源)***********************
            
                在web开发中,如果要想获取资源,必须使用绝对的磁盘路径。
                
                怎样可以得到在服务器上的文件的绝对磁盘路径?
                    
                1.String getRealPath(String s);
                    
                    ServletContext.getRealPath("/"); 得到当前工程在磁盘上的绝对路径。
                
                2.URL  gerResource(String s);
                    得到一个URL路径,它也是指向我们的web工程下的资源。
                    
                3.InputStream getResourceAsStream(String s);
                    得到一个指向资源的输入流.
                    
                扩展:对于classes目录下的文件,它有其它的方式可以获取到.
                
                    Class.getResource("/").getPath();  获取的就是class文件所有的目录的绝对磁盘路径。
                
                    对于存在于classes目录下的文件,我们可以通过classpath的方式去获取其绝对磁盘路径。                
                    
                
                
            4.其它功能(了解)
                1.获取MIME类型
                    String getMimeType(String file)   文件下载时会用到.
                    
                2.分发请求
                     RequestDispatcher getRequestDispatcher(String path)  
                     在开发中不常使用,如果使用通过request对象来操作。
                3.日志
                    log方法是用来处理日志.

            
            
    
        

 

Servlet

标签:

原文地址:http://www.cnblogs.com/jsnan/p/4449381.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!