Servlet学习总结

来源:互联网 发布:java线程死锁解决 编辑:程序博客网 时间:2024/06/06 09:42

Servlet

一个servlet就是Java编程语言中的一个类,它被用来扩展服务器的性能,服务器上驻留着可以通过“请求-响应”编程模型来访问的应用程序。虽然servlet可以对任何类型的请求产生响应,但通常只用来扩展Web服务器的应用程序。Java Servlet技术为这些应用程序定义了一个特定于HTTP的 servlet类。

服务器端小应用程序
它运行在Servlet容器中,它是由服务器直接解析运行。


Servlet生命周期

     1. 创建Servlet对象 调用init方法

     2. 通过Service方法处理请求(提交方式是get就调用doget 是post就调用dopost      一般都是get 只有表单才能设置post)

     3. 通过destroy方法来销毁Servlet.

      

    我们创建Servlet时  第一次访问 会创建Servlet对象 然后调用init方法. init方法只调用一次  

           开启一个线程调用Service方法   当下次访问又开启一个线程调用Service方法    Servelt对象一般情况下我们只创建一次  他常驻内存中

            当服务器停止.或者Servlet对象销毁时会调用destroy方法   

     如果Servlet中创建了成员变量,就可能出现线程安全问题  在开发中尽量避免在Servlet中创建成员变量 如果创建了就需要同步


关于Url-pattern配置 

           一个Servlet允许被多个不同的路径映射   

         

     Ur-patternl配置写法      

               1.完全匹配

                    要求必须/开始

              2.目录配置

                       /开始*结束         例如:/目录名/*          

              3.扩展名匹配

                    *开始.xxx                例如   *.txt      

          三种配置优先级    完全匹配>目录匹配>扩展名匹配


关于ServletContext功能描述

           ServletContext代表整个Web应用 

              通过   ServeltConfig.getServletContext()         获取ServletContext对象

            

         ServeltContext作用 

               1.  ServeltContext可以获取全局初始化参数 

                           String getInitParameter(String name) 获取指定名称的Context-param 的值

                          Enumeration getInitParameterNames()   获取所有Context-param名称

              在web.xml文件中配置全局初始化参数

           <context-param>

                    <param-name>name</param-name>

<param-value>tom</param-value>

            <context-param>

                    它配置是针对于整个web应用

        2 它可以让Servlet实现信息共享

                      setAttribute(String name,Object value);
getAttribute(String name);
removeAttribute(String name);


   3.可以获取路径(资源)

              在web开发中 如果想要获取资源 必须使用绝对磁盘路径

                          通过  

                               1.      String getRealPath(String s ) 

                                        ServletContext.getRealPath("/" );  得到当前工程磁盘上的绝对路径

                               2.   Url get  Resource(String s );

       得到一个Url路径,他也是指向web工程下的资源

       3.  inputStream  getResourceAsStream(String s )         

  得到一个指向资源的输入流


                         对于classes目录下的文件,它有其它的方式可以获取到.

                     通过反射获取class文件                     class.getResource("/").getPath();  获取的就是class文件所在的目录绝对路径


关于web路径问题

            访问Servlet路径问题 

                    1. 绝对路径 

                                     带协议<a href="http://localhost:8080/day-05Servlet/demo> Demo1</a>

                                                    这种方式在开发不常用,如果使用这种方式,一般是用于访问站外资源。

                                     

2.不带协议
在浏览器端写一个"/"相当于是服务器的根路径.
<a href="/day-05Servlet/demo">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>



关于servlet自动加载.
我们可以通过设置让servlet跟随服务器启动而创建.

只需要在servlet配置中<servlet>这个标签中加上 <load-on-startup>2</load-on-startup>

问题1:servlet跟随tomcat启动有什么作用?
就是用来加载资源。
问题2:load-on-startup它的值可以取什么?

优先级有10个,是从1-10,1已经被占用了,我们在使用时,一般情况下是从2开始。
数值越小优先级越高。

优先级相同情况下根据配置的顺序加载。


关于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();
----------------------------------------------------------------

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对象。它们之间是不能共享的。


关于默认的servlet
如果某个Servlet的映射路径它是 "/" 那么它就是默认Servlet.
默认的Servlet是用于处理不能处理的请求。


在tomcat中conf/web.xml文件,我们自己工程的所有的web.xml相当于继承了这个xml.


当我们去访问web工程下内容时,都是通过web.xml文件中的<url-pattern>去查找到资源。
而我们在访问  a.txt  a.html时在xml文件中没有与其对应的资源,这时,是默认的servlet进行处理。








0 0
原创粉丝点击