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(){}
...
}
分享到:
相关推荐
以上就是关于JavaWeb阶段的学习笔记,重点介绍了Servlet的基本概念和开发流程、ServletConfig与ServletContext的应用、处理HTTP请求的相关技术、Request对象的使用、JSP的简介以及BeanUtils工具包的介绍。...
- **ServletConfig**:每个Servlet实例有一个ServletConfig对象,提供Servlet的初始化参数。 - **ServletContext**:全局上下文,所有Servlet共享,可用于跨Servlet通信和存储全局信息。 8. **Cookie**: - ...
4. **笔记或说明文档**:可能包含学习笔记或简短的说明,帮助理解代码和视频内容。 5. **测试用例**:如果有的话,可能会有测试类,用于验证Servlet功能的正确性。 **Servlet基础知识**: - **Servlet生命周期**:...
ServletConfig是每个Servlet对象对应的唯一对象,Servlet容器在调用init方法时,将ServletConfig对象作为参数传递给Servlet对象。 ServletContext是Servlet与Servlet容器之间的直接通信接口,Servlet容器在启动Web...
总的来说,深入学习和理解`javax.servlet-api`源代码,对于提升Java Web开发技能,尤其是对服务器端逻辑的掌控,具有极大的价值。这将帮助开发者更好地设计和实现高效、可靠的Web应用程序,并为解决实际问题提供更...