`
guiqing85
  • 浏览: 168852 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Servlet学习笔记(二)servletconfig servletcontext requestdispatcher

阅读更多
1 IDE+Tomcat Server.
2 Servlet Life cycle.
3 ServletConfig&ServletContext.
4 SingleThreadModel(interface).
5 RequestDispatcher.
6 exercise.
*****************************************************************

1 IDE+Tomcat Server.
熟悉Myeclipse环境下配置Tomcat服务器以及部署和运行Web App。

tomcat
   /bin  可执行文件
   /conf 配置文件
   /logs 日志文件
   /temp 临时文件
   /work 工作目录
   /server 服务器包
   /common 公用包
   /shared 共享包
   /webapps WebApp发布目录

2 Servlet Life cycle.
1) ClassLoader载入Servlet类并实例化
2) 调用init()
3) 调用service()<doGet(),doPost(),etc>处理客户端请求
4) 调用destroy()

  <servlet>
    <servlet-name>s1</servlet-name>
    <servlet-class>com.S1Servlet</servlet-class>
    <load-on-startup>3</load-on-startup>
  </servlet>
<servlet>
    <servlet-name>s2</servlet-name>
    <servlet-class>com.S2Servlet</servlet-class>
    <load-on-startup>2</load-on-startup>
  </servlet>
load-on-startup: 表示Servlet在部署时通过ClassLoader直接载入并初始化,
数值越低(从1开始计数),载入的优先级越高。否则,用户第一次访问的时候才实例化Servlet。
值相同,一般按在web.xml文件中的出现的顺序执行。

init()--->对Servlet将要使用的资源作初始化,如读入配置文件信息等(只执行一次)
init(ServletConfig config)
service()----->为客户端提供服务,能够被多客户端多次调用(每个请求都要执行一次)
destroy()--->在Web Container停止Web App或WebApp被停止/reload时调用,
通常完成一些资源释放,停止后台程序等工作。释放或销毁一些非内存资源。
(只执行一次)
例子:
观察三个生命周期方法何时执行
lifecycleWeb
       /WEB-INF/web.xml
       /WEB-INF/classes/com/LifeCycleServlet.class
      
部署和实例化一个Servlet的情况有两种
1)web.xml中没有load-on-startup标记
a 在用户第一次请求的时候tomcat服务器加载servlet类,
并且实例化一个对象,接着执行init方法。最后执行service方法为第一次请求服务。
b 用户的第二次以及其后的所有请求,servlet对象直接调用service方法为其服务。
2)web.xml中有load-on-startup标记
a 在webapp被启动的时候,tomcat服务器加载servlet类,并且实例化一个对象,
接口执行init方法。
b 用户任何请求,servlet对象都调用service方法为其服务。

destroy方法什么时候执行?:关闭webapp的时候(只执行一次)。

3 ServletConfig&ServletContext.

ServletConfig:从一个servlet被实例化后,对任何客户端在任何时候访问有效,
但仅对本servlet有效,一个servlet的ServletConfig对象不能被另一个servlet访问。

ServletContext:对同一个WebApp的任何servlet,任何人在任何时间都有效,
这才是真正全局的对象。

  <servlet>
    <servlet-name>lifecycleServlet</servlet-name>
    <servlet-class>com.LifeCycleServlet</servlet-class>
    <init-param>
      <param-name>email</param-name>
      <param-value>narci.ltc@gmail.com</param-value>
    </init-param>
    <load-on-startup>5</load-on-startup>
  </servlet>

String email=config.getInitParameter("email");

ServletConfig---->对应某个具体的Servlet,主要用来读取web.xml中配置的
Servlet初始信息,不能被其它Servlet共享

如何获得ServletConfig对象
1)init(ServletConfig config)
2)this.getServletConfig()


ServletContext---->对应整个Web Application运行环境,可以用来读取web.xml
中配置的应用初始信息,写日志,共享数据等,ServletContext被所有Servlet共享

如何获得ServletContext对象
1)config.getServletContext()
2)this.getServletContext()

利用ServletContext写日志
log(String info)

例子:
如何获取web.xml配置文件中的context param和init param。
比较它们的作用域范围有什么不同。学会使用context对象写日志。
classNo:context param
email:intit param
phone:init param
configWeb
    /WEB-INF/web.xml
    /WEB-INF/classes/com/ConfigServlet.class
    /WEB-INF/classes/com/ContextServlet.class   


4 SingleThreadModel(interface).
该接口已经废弃(deprecated)
请不要实现 SingleThreadModel 接口。
这种实践将导致 Web 容器创建多个 servlet 实例;
即为每个用户创建一个实例。对于任何大小的应用程序,
这种实践都将导致严重的性能问题。
request  <--->servlet实例(对象) 一一对应的

正常servlet:
n个request <--->一个servlet实例(对象)
深入理解:servlet是单实例多线程
servlet对象只有一个

public class SomeServlet extends HttpServlet implements SingleThreadModel{}

代替SingleThreadModel的方案:
Servlet是单实例,多线程:使用synchronized块解决同步问题。
提示:在Servlet中尽量少使用成员变量,一旦使用必须自己维护其并发问题。

实际应用中,service()方法中使用synchronized来解决并发问题,synchronized
块作用域应该越小越好,并且通常只在对实例变量作修改时使用。
同步控制的粒度要尽量小。

建议:
1)尽量不要使用成员变量。一旦使用,必须自己控制并发问题。
2)同步块应该尽可能小。

例子:

count:int 访问计数
name:String 用户名称
singleWeb
    /WEB-INF/web.xml
    /WEB-INF/classes/com/VisitorServlet.class  (SingleThreadModel)
    /WEB-INF/classes/com/Visitor2Servlet.class   
注意:对成员变量的访问必须注意同步操作


5 RequestDispatcher.

RequestDispatcher---->实现Servlet之间的请求传递(页面跳转)
forward(ServletRequest, ServletResponse)  //跳转到其他资源
include(ServletRequest, ServletResponse)  //包含其他资源

如何获得RequestDispatcher对象
1) request.getRequestDispatcher(String page)   ---->相对路径
2) ServletContext.getRequestDispather(String page)  ---->绝对路径

例子:
用户登录,成功跳转到target servlet,失败则跳转到fail.html
target servlet包含版权声明页面(copyright.html)。
login2Web
    /WEB-INF/web.xml
    /WEB-INF/classes/com/LoginServlet.class
    /WEB-INF/classes/com/TargetServlet.class 
    /login.html
    /fail.html
    /copyright.html
   
6 exercise.
改写用户登录WebApp,要求通过读取web.xml来决定用户登录成功和失败后分别跳转到的那个
资源。不管用户登录成功还是失败,必须写日志,记录下用户名、密码、角色以及登录时间。
login3Web
    /WEB-INF/web.xml
    /WEB-INF/classes/com/LoginServlet.class
    /WEB-INF/classes/com/TargetServlet.class    (登录成功,需要包含版权信息)
    /login.html
    /fail.html
    /copyright.html
   
练习:(ServletConfig,ServletContext,RequestDispatcher)
一个网上书店系统,用户分5个等级,对网上书店上所有商品,
一星会员可以享受 95%的优惠。
二星会员可以享受 90%的优惠。
三星会员可以享受 85%的优惠。
四星会员可以享受 80%的优惠。
五星会员可以享受 75%的优惠。
其中外文书籍对任何用户都有额外的95%的优惠,计算机类书籍也有额外的85%的优惠
bookWeb
    /WEB-INF/web.xml
    /WEB-INF/classes/com/ForeignBookServlet.class
    /WEB-INF/classes/com/ComputerBookServlet.class 
     /WEB-INF/classes/com/OtherBookServlet.class   
    /foreign.html
    /computer.html
    /other.html

用户输入要购买的图书以及价格等信息提交后,将这打折后的价格和其他信息返回显示
给用户。每次购买行为要求写日志。
日志格式为:用户名 购买的图书名称 原价 打折后的价格 购买时间

ServletConfig:
1)this.getServletConfig()     任何方法中都可以调用
2)config.getServletConfig()   在init(ServletConfig config)方法可以调用

ServletContext:
1)this.getServletContext()    任何方法中都可以调用
2)config.getServletContext()  在init(ServletConfig config)方法可以调用

public MyServlet extends HttpServlet{

ServletConfig config=getServletConfig();//可不可以? null
//不可以!
//原因:成员变量的初始化次序优先于构造方法。
//而我们ServletConfig对象是在调用了init方法之后才初始化的。
//init的执行肯定是在执行了构造方法之后才执行。

ServletContext context=getServletContext();//null?
//?

public void init(){}
...

}
分享到:
评论

相关推荐

    ServletContext与ServletConfig关系

    在 Servlet 编程中,ServletConfig 和 ServletContext 两个对象经常被混淆,然而它们有着截然不同的作用域和用途。 首先, lets 看看 ServletConfig 对象。ServletConfig 对象是 Servlet 的配置对象,用于存储 ...

    Servlet学习笔记

    ### Servlet学习笔记精炼知识点 #### 一、Servlet初始化与加载机制 1. **Servlet注册与实例化**:在Web应用中,一个Servlet的生命周期始于它的注册与实例化过程。通常,这一过程是在Web服务器启动时,根据`web.xml...

    Java web中servlet学习笔记 核心

    - 通过ServletConfig对象获取Servlet的配置信息,如在`web.xml`中定义的初始化参数。 - ServletConfig还提供了获取ServletContext对象的方法。 9. **ServletContext对象** - 代表整个Web应用程序,全局唯一,...

    Servlet学习笔记2

    ### Servlet学习笔记2 在Java Web开发中,Servlet是一种重要的技术,它负责处理客户端的请求并生成响应。本文档将围绕“Servlet学习笔记2”这一主题进行深入探讨,旨在为读者提供一个清晰的学习路径和实践指导。 #...

    动力节点老杜servlet学习笔记.zip

    动力节点老杜的Servlet学习笔记涵盖了这一关键领域的深入理解,旨在帮助开发者掌握Servlet的基本概念、工作原理以及实际应用。下面将详细阐述Servlet的相关知识点。 一、Servlet概述 Servlet是一个Java类,它遵循...

    ServletConfig与ServletContext.docx

    ServletConfig和ServletContext是Java Servlet API中的两个重要接口,它们在Web应用程序中扮演着关键角色,主要负责管理和传递初始化参数以及实现应用级别的通信。 ServletConfig对象主要用于装载Servlet的初始化...

    JSP-Servlet学习笔记第2版.pdf

    6. Servlet API:熟悉Servlet API中提供的各种接口和类,如HttpServletRequest、HttpServletResponse、ServletConfig、ServletContext等,它们是进行Servlet开发的基础。 7. 数据共享和数据持久化:了解如何在JSP和...

    servlet学习笔记

    而ServletContext对象则代表整个Web应用程序的共享环境,Servlet可以通过它与其他Servlet共享信息,或者访问Web应用的全局资源。 11.在编程时,Servlet应该遵循一定的最佳实践,比如在service()方法中避免执行长...

    Servlet初学者笔记+示例代码(学习JSP之前的基础)

    - `ServletConfig`接口提供了获取Servlet初始化参数的方法。 - `HttpServletRequest`接口代表HTTP请求,包含请求参数、请求头、请求方法等信息。 - `HttpServletResponse`接口用于构建HTTP响应,可以设置响应状态...

    servlet入门经典笔记

    2. **初始化**:创建实例后,容器会调用Servlet的`init()`方法进行初始化,传递一个ServletConfig对象,该对象包含了Servlet的配置信息。 3. **服务**:对于后续的每一个请求,Servlet容器并不会每次都创建新的...

    35、servlet--servletContext

    二、`servletContext`的主要功能 1. **获取初始化参数**:在Web应用的部署描述符(web.xml)中,我们可以设置全局的初始化参数。这些参数可以通过`servletContext`获取,供整个Web应用使用。 2. **发布事件**:`...

    ServletContext与ServletConfig的深度分析

    在Java Web开发中,`ServletContext`和`ServletConfig`是非常重要的两个接口,它们分别代表了应用级别的共享环境和单个Servlet的配置信息。理解这两个接口的工作原理对于构建高效、可维护的应用程序至关重要。 ####...

    韩顺平 2011细说Servlet笔记

    韩顺平老师的“2011细说Servlet笔记”是针对这一主题的深入讲解,旨在提供全面且实用的学习资料。在本篇中,我们将深入探讨Servlet的相关知识点,包括其原理、配置、生命周期以及与HTTP协议的交互。 1. **Servlet...

    有关ServletConfig与ServletContext的访问

    ServletConfig和ServletContext是Java Servlet API中的两个重要概念,它们在Web应用程序中扮演着配置和通信的角色。理解并熟练使用这两个接口对于开发高效、可维护的Web应用至关重要。 ServletConfig对象代表了一个...

    Servlet&JSP学习笔记

    ### Servlet&JSP 学习笔记精要 #### 一、Servlet 基础 ##### 1.1 Web 容器 - **概念**: Web 容器是支持 Servlet 和 JSP 运行的基础环境,主要功能是加载和管理 Servlet 实例,处理客户端请求并返回响应。常见的 ...

Global site tag (gtag.js) - Google Analytics