【Servlet】03-Web容器模型

来源:互联网 发布:淘宝进销存系统 编辑:程序博客网 时间:2024/06/05 23:02

在Servlet技术模型中,我们了解到了Web应用中,Servlet的基础职能,和使用Servlet的一些注意事项。但是,这一切,都需要Web容器进行管理,Web容器在Servlet编程中起到如下作用:

  • 通过部署文件,初始化Servlet和ServletContext
  • 控制Servlet的作用域,对Servlet属性进行增删查改
  • 描述Web容器请求处理模型元素:过滤器、过滤器链、请求/响应的包装
  • 监听Web事件(监听器的使用)
  • 描述RequestDispatcher,用Servlet转发、包含目标资源

我们先来讲讲容器部署应用时,对Servlet怎么做初始化的:
DD(Deployment Descriptor)文件中

<servlet>    <init-param>        <param-name>paramName</param-name>        <param-value>paramValue</param-value>    <init-param></servlet>

Java文件中

// 在一个Servlet中getServletConfig().getInitParameter("paramName");

如果我们有如下需求:在整个项目中获取某一个属性,那么,我们是这样初始化的:
DD文件中:

<context-param>            <param-name>paramName</param-name>    <param-value>paramValue</param-value></context-param>

Java文件中:

getServletContext().getInitParameter("paramName");

如果,我们需要在Web项目启动时,构造一些对象,那么,监听器就粉墨登场。

要使用监听器,我们需要做如下几件事:
1. 实现一个监听器接口
2. 覆盖接口里的方法
3. 配置DD文件或者注解

我们监听器的Java文件如下:

@WebListenerclass SomeListener implements ServletContextListener{    public void contextInitialzed(ServletContextEvent sce){        // 获取Context的引用        ServletContext context = sce.getServletContext();    }}

我们的DD文件(没有使用@WebListener的时候有用):

<listener>    <listener-class></listener-class></listener>

我们还有更多的Listener可以选择:

类 作用 ServletContextAttributeListener 监听Web应用的属性 HttpSessionListener 监听Web中的Session HttpSessionBindingListener 监听对象绑定到会话 HttpSessionActivationListener 对Session迁移事件监听 ServletRequestListener 监听Web中的请求

对于属性而言,我们还需要知道属性的作用域,我们需要知道的作用域有:

  • 上下文(Context)
  • 请求(Request)
  • 会话(HtttpSession)

我们有一个参照表,用来描述各种作用域:

名称 意义 作用域 PageContext 页面上下文,可以获取所有页面对象 页面 HttpServletRequest 客户端请求 请求域 HttpServletResponse 服务器响应 ServletContext 表示一个应用程序 整个服务器端

我们需要知道,ServletContext属性不是线程安全的,因为,它可能被其它用户更改。

这里有一个对上下文属性加锁的示例:

public void doGet(HttpServletRequest request, // 下面的代码对ServletContext同步HttpServletResponse response){    synchronized(getServletContext()){        getServletContext().setAttribute("attributeName","attributeValue");    }}

同样,我们的HttpSession属性也不是线程安全的,对HttpSession进行同步处理,可以避免线程不安全的修改。

对于和线程有关的问题,我们应做到:

  • 声明局部变量,而不是实例变量
  • 在合适的作用域里使用属性

我们认识了属性的一些知识后,我们可以把属性请求/分派出去:

request.setAttribute("beer","BEER");request.getRequestDispatcher("someurl");// 使用如下方法,必须以/打头getServletContext().getRequestDispatcher("/someurl");
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 迅雷登录太频繁怎么办 糖果手机声音小怎么办 产品出现了问题怎么办 插头螺丝太紧怎么办 宜家儿童乐园怎么办卡 泰国旅游有蚊子怎么办 啦泰国旅游拉肚子怎么办 电动车上不了牌怎么办 电动车电压低了怎么办 电车显示器不亮怎么办 电动车故障显示m怎么办 电动车上面出现m怎么办 佰仟乐购额度没有了怎么办 交易密码忘记了怎么办? 电脑打开没网怎么办 网络配适器无法运行怎么办 电脑dns没有响应怎么办 win7系统没有网上邻居怎么办 win10网络重置了怎么办 win7桌面没有网上邻居怎么办 win7电脑没有网上邻居怎么办 无线网连接受限怎么办 win7账户被锁定怎么办 贷款sdk授权失败怎么办 京东保价发票怎么办 淘宝购物出现质量问题怎么办 淘宝购物降价了怎么办 淘宝购物物流慢怎么办 在淘宝购物退货怎么办 淘宝购物未付款怎么办 淘宝购物余额不足怎么办 淘宝购物漏发货怎么办 京东618无货怎么办 iis默认文档无效怎么办? 购物卡没有磁性怎么办 墙面贴纸没有贴怎么办 车显示电池符号怎么办 遇上北京购物团怎么办 钱柜老是钱不见怎么办 写真顾客退单怎么办 电视不支持投屏怎么办