servlet基础知识

Servlet Api,运行在客户端的浏览器中。不是独立的应用程序,没有main()方法。生存在容器中,由容器管理。Servlet运行在Servlet容器中。

javax.servlet.Servle接口时核心接口,每个servlet类都须直接或间接的实现该接

 

Servlet接口:
public void init(ServletConfig config) throws ServletException;

在Servlet实例化后,Servlet容器会调用该方法来初始化该对象。每个Servlet实例,此方法只调用一次。ServletConfig,Servlet容器通过这个参数向Servlet传毒配置信息;还可以获取描述Servlet运行环境的ServletContext对象,使用该对象,Servlet可以和Servlet容器进行通信。

public void service(ServletRequest request, ServletResponse response)
容器通过这个方法处理客户端的请求,在调用此方法之前,必须完成init方法。容器构造出一个客户端请求信息的请求对象(ServletRequest--得到客户端的相关信息和请求信息)和对客户端响应的响应对象(ServletResponse--设置响应头)作为参数传递给service方法。

public void destroy();
当容器检测到Servlet对象从服务器移除时,容器会调用此方法。客户端再次请求,Servlet需要重新产生一个Servlet对象处理客户端的请求。

public ServletConfig getServletConfig();
返回init的一个ServletConfig对象

public String getServletInfo();
返回一个String对象,包括关于Servlet的信息。

 

 

 

 

ServletRequest接口---定义一个Servlet引擎产生的对象,通过这个对象,Servlet可以获得客户端请求的数据。这个对象通过读取请求体的数据提供包括参数的名称、值和属性以及输入流的所有数据

ServletResponse接口-- 定义一个Servlet引擎产生的对象,通过这个对象,Servlet对客户端的请求作出响应。这个响应应该是一个MIME实体,可能是一个HTML页、图象数据或其他MIME的格式。

 

getAttribute(String name):返回以name为名字的属性的值,不存在返回null

getAttributeNames():返回请求中所有可用的属性名称,没有属性,返回一个空的枚举集合

removeAttribute(String name):移除请求中名字为name的属性

setAttribute(String name, Object o): 请求保存名字为name的属性,第二个参数为null,那么相当于removeAttribute。

getCharacterEncoding():请求正文使用的字符编码集。没有指定则返回null

getContextType():请求正文的MIME类型。不知道返回null

getInputStream():返回一个输入流

getParameter(String name):返回请求中name参数的值,如果有多个值,则返回第一个值。

getParameterNames():请求包含的所有的参数的名字。没有请求参数,返回空的枚举集合。

getParameterValues(String name):返回name参数所有的值。

 

 

 

GenericServlet类--实现了Servlet接口和SservletConfig接口。

 

GenericServlet类中有两种init方法:
public void init(ServletConfig config) throws SercletException--首先将ServletConfig对象保存在transient实例变量中,然后再调用不带参数的init方法。
public void init() throws SercletException

 

 

 

HttpServlet类--这是一个抽象类,用来简化HTTP Servlet写作的过程。它是GenericServlet类的扩充,提供了一个处理HTTP协议的框架。在这个类中的service方法支持例如GET、POST这样的标准的HTTP方法。

 

在javax.servlet.http包中提供一个抽象的类HttpServlet,继承GenericServlet类,创建HTTPServlet。这个类没有抽象方法,所有的方法都已经实现。

 

 

 

HttpServletRequest接口--用来处理一个对Servlet的HTTP格式的请求信息。

 

HttpServletResponse接口--描述一个返回到客户端的HTTP回应。这个接口允许Servlet程序员利用HTTP协议规定的头信息。

 

ServletConfig接口--这个接口定义了一个对象,通过这个对象,Servlet引擎配置一个Servlet并且允许Servlet获得一个有关它的ServletContext接口的说明。每一个ServletConfig对象对应着一个唯一的Servlet。

 

 

Servlet异常:ServletException和UnavailableException。


Servlet生命周期
  加载和实例化,----Servlet容器负责加载和实例化Servlet。
  初始化,----实例化Servlet后,容器必须调用init()方法初始化这个对象。对于每一个Servlet实例,init方法只能被调用一次。在初始化期间,Servlet实例可以使用容器为他准备的ServletConfig对象从web应用程序的配置信息(web.xml)中获取初始化的参数信息。
  请求处理,----Servlet容器调用Servlet的service方法对请求进行处理。service方法调用之前,init必须成功执行
  服务停止。-----容器检测到Servlet实例从服务器中移除的时候,容器就会调用destroy方法。


Servlet上下文:java servlet api提供了一个ServletContext接口用来表示上下文。ServletContext对象是web服务器中的一个已知路径的根。
ServletContext接口:Servlet容器实例化Servlet,向其传递ServletConfig对象,通过ServletConfig对象的getServletContext方法得到ServletContext对象。

          也可以通过GenericServlet类的getServletContext方法得到ServletContext对象。

 

getAttribute(String name)
getAttributeNames()
removeAttribute(String name)
setAttribute(String name, Object obj)
getCcontext(String path):参数必须以反斜杠开头,被解释为相对于服务器文档根的路径。
getInitParameter(String name)
getInitParameterNames():可以在web.xml中使用<context-param>元素定义上下文的初始化参数。

 

 

 


请求转发
RequestDispatcher接口-----RequestDispatcher对象由Servlet容器创建,用于封装一个路径所标识的服务器资源。利用RequestDispatcher对象,可以将请求转发给其他Servlet或jsp页面。

forword(ServletRequest request, ServletRsponse response):必须在响应被提交给客户端之前被调用,否则会抛出IllegalStateException异常。-----请求转发

include(ServletRequest request, ServletRsponse response):-----请求转发


得到RequestDispatcher对象:一是利用ServletRequest接口中的getRequestDispatcher(相对于上下文路径,或者相对于当前上下Servlet的路径。如果有斜杠/,则被解释为相对于当前上下文根路径。没有,则被解释为相对于当前Servlet的路径。)方法                                                                                                                         二是利用ServletContext接口中的getRequestDispatcher(方法参数必须以斜杠/开始,被解释为相对于当前上下文路径。)和getNameDispatcher


都可以实现获取相应URL资源
forward浏览器url地址不变,sendRedirect浏览器url地址变为目的url地址。
HttpServletResponse接口的sendRedirect方法:sendRedirect实现请求重定向。客户机发送了两次请求,接受了两次。1请求2,2告诉1去请求3,3再把资源响应给1
RequestDispatcher接口的forward方法:forward实现的是请求转发。客户机发送了一次请求,接受一次响应数据。1请求2,2去请求3,3再把资源响应给1。

 

重定向--1请求2,2告诉1去请求3,3再把资源响应给1

请求转发--1请求2,2去请求3,3再把资源响应给1。

 

 

 

与生命周期相关的方法:在生命的某个特定时刻一定会执行某一件事情。

 

资源下载,实现断点下载:

public class Demo extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {    
        //代表下载资源
        URL url = new URL("http://localhost:8088/day5/a.txt");
        //打开资源链接
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        //发送一个带range的头
        conn.setRequestProperty("Range", "bytes=5-");
        //读取资源数据
        InputStream in = conn.getInputStream();
        int len = 0;
        byte buffer [] = new byte[1024];
        //写入到的文件,
        FileOutputStream out = new FileOutputStream("c:\\a.txt", true);
        //读到buffer里面去
        while((len = in.read(buffer)) > 0){
            out.write(buffer, 0, len);
        }
        in.close();
        out.close();
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    }

 

 

 

在创建servlet的时候,要继承javax.servlet.GenericServlet,要导入源码

Servlet接口的实现类:GenericServlet,HttpServlet
HttpServlet--指能够处理Http请求的servlet,在原有的Servlet接口上添加了一些与HTTP协议处理的方法,它比Servlet接口的功能更为强大。在编写servlet时,通常继承这个类,避免直接实现servlet接口
GenericServlet--在实现servlet接口时,覆写了service方法。通常只覆写了doGet和doPost方法。

修改servlet模板:找到myeclipse里面的servlet.xml文件。

 

 

把一个程序映射到多个网页
<servlet-mapping>
    <servlet-name>Demo</servlet-name>
    <url-pattern>/servlet/Demo</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>Demo</servlet-name>
    <url-pattern>aa.html</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>Demo</servlet-name>
    <url-pattern>1.html</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>Demo</servlet-name>
    <url-pattern>....../*</url-pattern>          --无论在地址栏写入什么都是访问这个servlet
</servlet-mapping>
<servlet-mapping>
    <servlet-name>Demo</servlet-name>
    <url-pattern>.....*.html</url-pattern>       --无论在地址栏写入什么都是访问这个servlet  ,多个servlet的时候,谁长的最像,谁就匹配,*在前面的优先级最低
</servlet-mapping>

 

 

针对客户端的多次Servlet请求,通常情况下,服务器只会创建一个Servlet实例对象,也就是Servlet实例对象一旦创建,它就会驻留在内存中,为后续的其他请求服务,知道web容器退出,servlet实例对象才会被销毁

在servlet整个生命周期内,Servlet的init方法只被调用一次。而对一个Servlet的每次访问请求都导致Servlet
引擎调用一次servlet的service方法。对于每次访问请求,servlet引擎都会创建一个HttpServletResponse响应对象
然后将这两个对象作为参数传递给它的调用的Servlet的service方法,service方法再根据请求方式分别调用的doxxx方法。

 

如果在<servlet>元素中配置了一个<load-on-startup>元素,那么web应用程序在启动时,就会装载并创建servlet的实例方法,以及调用servlet实例对象的init方法,而不是第一次调用servlet时创建。
<load-on-startup>数值-数值越小,越优先创建<load-on-startup>

若果某个servlet的映射路径仅仅为一个证斜杠(/),那么这个servlet就成为当前web应用程序的缺省servlet
凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,他们的访问请求都会将交给缺省servlet处理,也就是说,缺省servlet用于处理所有的其他servlet都不处理的访问请求
当访问服务器中的某个静态的html文件和图片,实际上是在访问这个缺省servlet


线程安全问题:当很多客户并发访问同一个servlet时,web服务器会为每一个客户端的访问创建一个线程,并且在这个线程上调用servlet的service方法,因此service方法内如果访问了同一个资源的话,就有可能引发线程安全问题。
(共享资源)
子类在覆盖父类方法时,不能抛出比父类更多的异常

 

 

 

<servlet>元素的各个子元素:

 

<description>:  为Servlet指定一个文本描述。
<display-name>:  为Servlet指定一个简短的名字,这个名字可以被某些工具所显示。
<icon>:          为Servlet指定一个图标
<servlet-name>:  指定Servlet的名字,这个名字在同一个Web应用程序中必须是唯一的。
<servlet-class>: 指定Servlet类的完整限定名
<jsp-file>:      指定在Web应用程序中的JSP文件的完整路径,该路径以斜杠(/)开始。如果要对一个JSP文件做URL映射,就会用到这个元素。
<init-param>:      定义Servlet的初始化参数。如果使用了<init-param>元素,则必须包含<param-name><param-value>元素,可以包含零个或多个<description>元素。
<description>:  为初始化参数提供一个文本描述。
<param-name>:   定义初始化参数的名字。
<param-value>:   定义初始化参数的值
<load-on-startup>:指定当Web应用程序启动时,Servlet被加载的次序。元素的内容必须是一个整数,如果这个值是一个负数,或者没有设定这个元素,Servlet容器将在客户端首次请求这个Servlet时加载它;如果这个值是正数或0,容器将在Web应用程序部署时加载和初始化这个Servlet,并且先加载数值小的Servlet,后加载数值大的Servlet。如果某个Servlet需要在其他Servlet被加载之前加载,可以在部署描述符中使用这个元素。如果<servlet>元素包含了<jsp-file>元素和<load-on-startup>元素,则JSP文件将被预编译并加载。
<run-as>:        指定用于执行组件的角色。如果使用了<run-as>元素,可以包含零个或多个<description>元素,必须包含<role-name>元素
  <description>:指定一个文本描述。
  <role-name>:指定用于执行组件的角色名。
<security-role-ref>:声明在组件或部署的组件的代码中的安全角色引用。如果使用了<security-role-ref>元素,则必须包含<role-name>元素,可以包含零个或多个<description>元素,零个或一个<role-link>元素。
<description>:为安全角色引用提供一个文本描述。
<role-name>:指定在代码中使用的安全角色的名字。
<role-link>:指定到一个安全角色的引用。

 

 


<servlet-mapping>元素及其子元素:

<servlet-mapping>元素在Servlet和URL样式之间定义一个映射。它包含了两个子元素<servlet-name><url-pattern><servlet-name>元素给出的Servlet名字必须是在<servlet>元素中声明过的Servlet的名字。<url-pattern>元素指定对应于Servlet的URL路径,该路径是相对于Web应用程序上下文根的路径。
<servlet-mapping><url-pattern>子元素出现多次,之前的规范只允许一个<servlet-mapping>元素包含一个<url-pattern>子元素。

 

posted @ 2015-03-15 21:32  肉球  阅读(214)  评论(0编辑  收藏  举报