Servlet 学习笔记 (一)

Java Servlet 是和平台无关的服务器端组件, 它运行在 Servlet 容器中。
Servlet 容器负责 Servlet 和客户的通信以及调用 Servlet 的方法, Servlet
和 客户通信采用“请求/响应”的模式。


Servlet 容器为 JavaWeb 应用提供运行时环境,它负责管理 Servlet 和 JSP 的生命周期,以及管理它们的共享数据。
Servlet 容器也称为 JavaWeb 应用容器,或者 Servlet/JSP 容器。
目前最流行的 Servlet 容器软件括:
Tomcat
Resin
J2EE 服务器(如Weblogic)中也提供了内置的 Servlet 容器

Tomcat 是一个免费的开放源代码的 Servlet 容器,它是 Apache 软件基金会的一个顶级项目,
由 Apache,Sun和其他一些公司及个人共同开发而成。由于有了 Sun 的参与与支持,
最新的 Servlet 和 JSP 规范总是能在 Tomcat 中的到体现。


Servlet 可完成如下功能:
    1)、创建并返回基于客户请求的动态 HTML 页面。
    2)、创建可嵌入到现有 HTML 页面中的部分 HTML页面 (HTML片段)。
    3)、与其它服务器资源(如数据库或基于 Java 的应用程序) 进行通信。
    
注:Servlet 本质上讲就是一个 Java 类,只不过它部署在 Servlet 容器里面。

 

1、Servlet 容器响应客户请求的过程

        请求              ServletRequest
    客户     ——>  Servlet容器   ——>  Servlet
         <——            <——
        响应              ServletResponse
        

        
2、Servlet 的 HelloWorld
    1)、创建一个 Servlets 的接口的实现类
        public class HelloServlet implements Servlet
        
    2)、在 web.xml 文件中配置和映射这个 Servlet
    
<!-- 配置和映射 Servlet -->
 <servlet>
     <!-- Servlet 注册的名字 -->
     <servlet-name>HelloServlet</servlet-name>
     <!-- Servlet 的全类名。HelloServlet.java 文件最好放在包内,可以通过 ctrl 检查该全类名是否正确-->
     <servlet-class>web.HelloServlet</servlet-class>
 </servlet>
 
 <servlet-mapping>
     <!-- 需要和某一个 servlet 节点的 serlver-name 子节点的文本节点一致 -->
     <servlet-name>HelloServlet</servlet-name>
     <!-- 映射具体的访问路径:/ 代表当前 WEB 应用的根目录。 -->
     <url-pattern>/hello</url-pattern>
 </servlet-mapping>
 
 
 
3、Servlet容器 : 运行 Servlet、 JSP、 Filter 等软件环境。
     1)、可以来创建 Servlet, 并调用 Servlet 的相关生命周期方法。
     2)、JSP, Filter, Listener, Tag ...
 


 !!!(重点)    
4、Servlet 生命周期的方法: 以下方法都由 Serlvet 容器调用。
     1)、构造器:当且仅当第一次请求 Servlet 时, 创建 Servlet 的实例,调用构造器。
              这说明 Serlvet 是单实例的!
     2)、init 方法: 只被调用一次,在创建好实例后立即被调用,用于初始化当前 Servlet.
     3)、service: 被多次调用,每次请求都会调用 service 方法,实际用于响应请求的。
     4)、destroy: 只被调用一次,在当前 Servlet 所在的WEB 应用被卸载前调用,用于释放当前
         Servlet 所占用的资源。


    
5、load-on-startup:
    1)、配置在 servlet 节点中:
        
 <servlet>
     <servlet-name>HelloServlet</servlet-name>
     <servlet-class>web.HelloServlet</servlet-class>
     <!-- 可以指定 Servlet 被创建的时机 -->
     <load-on-startup>1</load-on-startup>
 </servlet>
 
 2)、load-on-startup: 可以指定 Serlver 被创建的时机,若为负数,则在第一次请求时被
     创建。若为 0 或正数, 则在当前 WEB 应用被 Serlver 容器加载时创建实例,且数组越小越早
     被创建。
     
     
Servlet容器响应客户请求的过程
     a、Servlet 引擎检查是否已经装载并创建了该 Servlet 的实例对象。如果是,则直接执行第④步,否则,执行第②步。
    b、装载并创建该 Servlet 的一个实例对象:调用该  Servlet 的构造器
    c、调用 Servlet 实例对象的 init() 方法。
    d、创建一个用于封装请求的 ServletRequest 对象和一个代表响应消息的 ServletResponse 对象,
        然后调用 Servlet 的 service() 方法并将请求和响应对象作为参数传递进去。
    e、WEB应用程序被停止或重新启动之前, Servlet 引擎将卸载 Servlet ,
        并在卸载之前调用 Servlet 的 destroy() 方法
        
        
Servlet的注册与运行
    Servlet 程序必须通过 Servlet 容器来启动运行,并且储存目录有特殊要求,
    通需要存储在 <WEB应用程序目录>\WEB-INF\classes\ 目录中。
    Servlet 程序必须在 WEB 应用程序的 web.xml 文件中进行注册和映射其访问路径,才可以被 Servlet 引擎加载和被外界访问。
    一个 <servlet> 元素用于注册一个 Servlet,它包含有两个主要的子元素: <servlet-name> 和 <servlet-class>,
    分别用于设置 Servlet 的注册名称和 Servlet 的完整类名。
    一个 <servlet-mapping> 元素用于映射一个已注册的 Servlet 的一个对外访问路径,它包含有两个子元素:
    <servlet-name> 和 <url-pattern>,分别用于指定 Servlet 的注册名称和 Servlet 的对外访问路径。
    
    
    
6、关于serlvet-mapping

    1)、同一个 Servlet 可以被映射到多个 URL 上, 即多个 <serlvet-mapping> 元素的
        <servlet-mapping> 子元素的设置值可以是同一个 Servlet 注册名。
        
    2)、 在 Servlet 映射到 URL 中也可以是 * 通配符,但只能有两种固定的格式。
        一种格式是 “*.扩展名”,另一种格式是以正斜杠(/)开头并以 “/*”结尾。
        
<servlet-mapping>
     <servlet-name>HelloServlet</servlet-name>
     <url-pattern>/*</url-pattern>
 </servlet-mapping>
 
  <servlet-mapping>
     <servlet-name>HelloServlet</servlet-name>
     <url-pattern>*.xml</url-pattern>
 </servlet-mapping>
 
 
 
 7、
<!-- 配置 Serlvet 的初始化参数 ,且该节点必须在 load-on-startup 节点前面-->
     <init-param>
         <!-- 参数名 -->
         <param-name>user</param-name>
         <!-- 参数值 -->
         <param-value>root</param-value>
     </init-param>

     <init-param>
         <param-name>password</param-name>
         <param-value>123456</param-value>
     </init-param>
     
 2)、获取初始化参数:
 
     > servletConfig.getInitParameter(String name); 获取指定参数名的初始化参数。
     > getInitParameterNames(): 获取参数名组成的 Enumeration 对象
     
        String password = servletConfig.getInitParameter("password");
        
        Enumeration<String> names = servletConfig.getInitParameterNames();
        while(names.hasMoreElements()){
            String name = names.nextElement();
            String value = servletConfig.getInitParameter(name);
        }
        
3)、获取 Serlvet 的配置名称:
        String serlvetName = servletConfig.getServletName();
        


<!-- 配置当前 WEB 应用的全局的初始化参数, WEB 服务器启动时便初始化 -->
    <context-param>
        <param-name>driverClass</param-name>
        <param-value>com.mysql.jdbc.Driver</param-value>
    </context-param>
    

8.
ServletContext(三大框架整合使用)
1)、可以由 SerlvetConfig 获取

2)、该对象代表当前 WEB 应用:可以认为 SerlvetContext 是当前 WEB 应用的一个大管家。
    可以从中获取到当前 WEB 应用的各个方面的信息。
    
    a、获取当前 WEB 应用的全局的初始化参数。
        servletContext.getInitParameter("driverClass");
    
9、获取当前 WEB 应用的名称:
        String contextPath = servletConfig.getServletContext().getContextPath();
        System.out.println(contextPath);
            
    获取当前 WEB 应用的某一个文件在服务器上的绝对路径,而不是部署前的路径 :
        String realPath = servletConfig.getServletContext().getRealPath("contextPath");
        System.out.println(realPath);


  获取当前 WEB 应用的某一个文件对应的输出流。
  getResourceAsStream(String Path): Path 的/ 为当前 WEB 应用的根目录。
        ClassLoader classLoader = getClass().getClassLoader();
        InputStream is = classLoader.getResourceAsStream("jdbc.properties");
        System.out.println("1、"+is);
        
        InputStream is2 = servletConfig.getServletContext().getResourceAsStream("/WEB-INF/classes/jdbc.properties");
        System.out.println("2、"+is2);
jsp九大内置对象对应servlet:
jsp                servlet

out                PrintWriter
request            HttpServletRequest
response        HttpServletResponse
session            HttpSession
application        ServletContext
config            ServletConfig
exception        Throwable
page            this
pageContext   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值