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

servlet基础知识

时间:2015-03-15 22:35:24      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:

Servlet Api,运行在客户端的浏览器中。不是独立的应用程序,没有main()方法。生存在容器中,由容器管理。Servlet运行在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的格式。

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

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

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对象。


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


得到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基础知识

标签:

原文地址:http://www.cnblogs.com/lcpholdon/p/4340479.html

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