`
guiqing85
  • 浏览: 170462 次
  • 性别: 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(){}
...

}
分享到:
评论

相关推荐

    JavaWeb阶段学习笔记

    以上就是关于JavaWeb阶段的学习笔记,重点介绍了Servlet的基本概念和开发流程、ServletConfig与ServletContext的应用、处理HTTP请求的相关技术、Request对象的使用、JSP的简介以及BeanUtils工具包的介绍。...

    Head First Servlets & JSP 学习笔记

    - **ServletConfig**:每个Servlet实例有一个ServletConfig对象,提供Servlet的初始化参数。 - **ServletContext**:全局上下文,所有Servlet共享,可用于跨Servlet通信和存储全局信息。 8. **Cookie**: - ...

    韩顺平servlet部分视频教程代码+工具

    4. **笔记或说明文档**:可能包含学习笔记或简短的说明,帮助理解代码和视频内容。 5. **测试用例**:如果有的话,可能会有测试类,用于验证Servlet功能的正确性。 **Servlet基础知识**: - **Servlet生命周期**:...

    javaee思维导图版笔记-吉林大学

    ServletConfig是每个Servlet对象对应的唯一对象,Servlet容器在调用init方法时,将ServletConfig对象作为参数传递给Servlet对象。 ServletContext是Servlet与Servlet容器之间的直接通信接口,Servlet容器在启动Web...

    javax.servlet-api:Java Servlet API规范规范原始代码阅读笔记

    总的来说,深入学习和理解`javax.servlet-api`源代码,对于提升Java Web开发技能,尤其是对服务器端逻辑的掌控,具有极大的价值。这将帮助开发者更好地设计和实现高效、可靠的Web应用程序,并为解决实际问题提供更...

Global site tag (gtag.js) - Google Analytics