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(){}
...
}
分享到:
相关推荐
在 Servlet 编程中,ServletConfig 和 ServletContext 两个对象经常被混淆,然而它们有着截然不同的作用域和用途。 首先, lets 看看 ServletConfig 对象。ServletConfig 对象是 Servlet 的配置对象,用于存储 ...
### Servlet学习笔记精炼知识点 #### 一、Servlet初始化与加载机制 1. **Servlet注册与实例化**:在Web应用中,一个Servlet的生命周期始于它的注册与实例化过程。通常,这一过程是在Web服务器启动时,根据`web.xml...
- 通过ServletConfig对象获取Servlet的配置信息,如在`web.xml`中定义的初始化参数。 - ServletConfig还提供了获取ServletContext对象的方法。 9. **ServletContext对象** - 代表整个Web应用程序,全局唯一,...
### Servlet学习笔记2 在Java Web开发中,Servlet是一种重要的技术,它负责处理客户端的请求并生成响应。本文档将围绕“Servlet学习笔记2”这一主题进行深入探讨,旨在为读者提供一个清晰的学习路径和实践指导。 #...
动力节点老杜的Servlet学习笔记涵盖了这一关键领域的深入理解,旨在帮助开发者掌握Servlet的基本概念、工作原理以及实际应用。下面将详细阐述Servlet的相关知识点。 一、Servlet概述 Servlet是一个Java类,它遵循...
ServletConfig和ServletContext是Java Servlet API中的两个重要接口,它们在Web应用程序中扮演着关键角色,主要负责管理和传递初始化参数以及实现应用级别的通信。 ServletConfig对象主要用于装载Servlet的初始化...
6. Servlet API:熟悉Servlet API中提供的各种接口和类,如HttpServletRequest、HttpServletResponse、ServletConfig、ServletContext等,它们是进行Servlet开发的基础。 7. 数据共享和数据持久化:了解如何在JSP和...
而ServletContext对象则代表整个Web应用程序的共享环境,Servlet可以通过它与其他Servlet共享信息,或者访问Web应用的全局资源。 11.在编程时,Servlet应该遵循一定的最佳实践,比如在service()方法中避免执行长...
- `ServletConfig`接口提供了获取Servlet初始化参数的方法。 - `HttpServletRequest`接口代表HTTP请求,包含请求参数、请求头、请求方法等信息。 - `HttpServletResponse`接口用于构建HTTP响应,可以设置响应状态...
2. **初始化**:创建实例后,容器会调用Servlet的`init()`方法进行初始化,传递一个ServletConfig对象,该对象包含了Servlet的配置信息。 3. **服务**:对于后续的每一个请求,Servlet容器并不会每次都创建新的...
二、`servletContext`的主要功能 1. **获取初始化参数**:在Web应用的部署描述符(web.xml)中,我们可以设置全局的初始化参数。这些参数可以通过`servletContext`获取,供整个Web应用使用。 2. **发布事件**:`...
在Java Web开发中,`ServletContext`和`ServletConfig`是非常重要的两个接口,它们分别代表了应用级别的共享环境和单个Servlet的配置信息。理解这两个接口的工作原理对于构建高效、可维护的应用程序至关重要。 ####...
韩顺平老师的“2011细说Servlet笔记”是针对这一主题的深入讲解,旨在提供全面且实用的学习资料。在本篇中,我们将深入探讨Servlet的相关知识点,包括其原理、配置、生命周期以及与HTTP协议的交互。 1. **Servlet...
ServletConfig和ServletContext是Java Servlet API中的两个重要概念,它们在Web应用程序中扮演着配置和通信的角色。理解并熟练使用这两个接口对于开发高效、可维护的Web应用至关重要。 ServletConfig对象代表了一个...
### Servlet&JSP 学习笔记精要 #### 一、Servlet 基础 ##### 1.1 Web 容器 - **概念**: Web 容器是支持 Servlet 和 JSP 运行的基础环境,主要功能是加载和管理 Servlet 实例,处理客户端请求并返回响应。常见的 ...