文档章节

Servlet 学习笔记 (一)

宇哥v587
 宇哥v587
发布于 2017/04/16 12:02
字数 1621
阅读 22
收藏 1


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   

© 著作权归作者所有

宇哥v587
粉丝 1
博文 47
码字总数 20855
作品 0
南京
程序员
私信 提问
JavaWeb12-HTML篇笔记(二)

Ø 为什么学习JSTL: JSTL和EL结合 替换页面中<%%> Ø JSTL版本: JSTL1.0 :不支持EL表达式. JSTL1.1 和 1.2 :支持EL表达式. Ø JSTL的标签库:包含了五类标签. core(核心标签),fmt(国际化标签)...

我是小谷粒
2018/05/28
0
0
重温JSP学习笔记--三大指令九大内置对象

最近在温习javaweb的相关基础知识,鉴于我弄丢了记满了整整一本的笔记,决定以后把笔记和一些学习上的心得以及碰到的一些问题统统都放在网上,今天看了一下jsp的相关基础,以下是笔记:   JSP三...

冬至饮雪
2016/01/26
0
0
如何成为一个优秀的JSP程序员

一个普通的错误是把JSP当作简化的Java,它不是,(事实上, JSP是简化的Servlet)程序员通常试着没有学习要求的支持技巧而直接学习JSP。JSP是一个衔接技术,并且成功地连接你需要理解的另外的...

五味格子
2011/05/11
0
0
tomcat类加载器深入研究笔记

1、StandardClassLoader 继承自URLClassLoader,和URLClassLoader相比没有添加任务新的功能。这个类已经被tomcat7.x废弃掉了,官方准备在tomcat8.x版本中去掉这个类。 2、BootStrapClassLoa...

heroShane
2014/02/11
0
0
Servlet的一些细节--学习笔记

Servlet细节 1)浏览器访问的url-pattern只是一个符合格式的任意字符串,以/开头 2)一个Servlet的url-pattern可以是1个或多个,有二种形式; a).xx b)/xx/ 注意:/不能一起直接使用 3)/和....

知止内明
2018/04/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Oracle SQL语法实例合集

如需转载请注明出处https://my.oschina.net/feistel/blog/3052024 目的:迅速激活Oracle SQL 参考:《Oracle从入门到精通》 ------------------------------------------------------------......

LoSingSang
58分钟前
1
0
增加 PostgreSQL 服务进程的最大打开文件数

https://serverfault.com/questions/628610/increasing-nproc-for-processes-launched-by-systemd-on-centos-7 要在systemd的配置里加才行...

helloclia
今天
2
0
组合模式在商品分类列表中的应用

在所有的树形结构中最适合的设计模式就是组合模式,我们看看常用商品分类中如何使用。 先定义一个树形结构的商品接口 public interface TreeProduct { List<TreeProduct> allProducts(...

算法之名
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部