servlet(3) - servlet知识点 - 小易Java笔记
1、servlet的生命周期
(1)容器最终要调用service方法为客户进行服务。(此处“容器”指java运行的环境,tomcat是jsp/servlet的容器)
==> 在内存中一个Servlet只有一个实例。针对不同的用户请求,容器采用多线程的机制调用service方法的。
(2)Servlet接口中的常用方法:
==> public void init():初始化。Servlet类被实例化后就执行,且执行一次。由容器进行调用。启动服务器时还没有创建,当第一个人通过浏览器访问某个servlet时调用此方法
==> public void destroy():销毁Servlet对象。由容器进行调用。服务器关闭是,摧毁对象
==> Servlet实例对象和初始化方法,默认情况下,只有第一次访问时才执行,且只执行一次。
(3)利用load-on-startup在应用被Tomcat加载完毕后(此时还没有任何人访问),就实例化并完成初始化Servlet的工作,其中的数字越小代表越先执行
<servlet>startup</servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.smalle.servlet.HelloServlet</servlet-class>
<load-on-startup>2</load-on-startup>
2、模板方法设计模式
==> 如果设计与HTTP协议有关的Servlet,一般选择集成javax.servlet.http.HttpServlet==> 不要覆盖其中的service(ServletRequest req,ServletResponse resp)方法,而应该覆盖掉,doXXX方法(doGet、doPost),doXXX就是根据你的请求方式来的。==> HttpServlet中的service方法是典型的模板方法设计模式的具体应用。
3、Servlet配置:url-pattern
(1)一个Servlet可以被映射到多个URL地址上(2)URL地址映射还支持通配符*==> 方式一:以*开头,以扩展名结尾。比如<url-pattern>*.html</url-pattern>==> 方式二:以/前缀开头,以*结尾。 比如<url-pattern>/action/*</url-pattern>(3)多个Servlet使用通配符时,有可能有多==> 以"/"开头(方式二)要比"*"开头(方式一)优先级高==> 都以"/"开头,还是有多个匹配,找最匹配的(4)如果一个Servlet的映射为一个"/",就称之为缺省的Servlet,它负责处理没有映射路径的URL请求的响应。(5)当访问Tomcat服务器中的某个静态HTML文件和图片时,实际上是在访问这个缺省Servlet。所以无特殊要求在web.xml中尽量不要有缺省的Servlet
4、Servlet中的线程安全问题
==> 在Servlet中定义变量,除非特殊要求,尽量使用局部变量。==> 如果有需要实例变量时,应做同步处理,且同步代码块尽量包围少的代码。==> 解决思路:用synchronized处理,但在实际中不会用,不可能让同一时刻访问网站的用户排队访问
5、拦截器:使用时要实现Filter接口
当用户访问Web工程时就调用拦截器,并且每次访问servlet时还会调用一次拦截器
==> java代码
public class CharacterEncodingFilter implements Filter{ private FilterConfig config; @Override
public void init(FilterConfig config) throws ServletException {
this.config = config;
} @Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 获取filter初始化的参数值
String encoding = config.getInitParameter("encoding");
if (null != encoding && !"".equalsIgnoreCase(encoding)) {
request.setCharacterEncoding(encoding);
response.setCharacterEncoding(encoding);
System.out.println("从拦截器获得的参数encoding = " + encoding + ", 在servlet执行之前已经设置了字符编码哦。");
}
// 把请求和响应传给过滤链中的下一个调用者或servlet
chain.doFilter(request, response);
} @Override
public void destroy() {
}
} ==> web.xml代码
<!-- 定义一个拦截器CharacterEncodingFilter -->
<filter>
<!-- 过滤器的标识名 -->
<filter-name>characterEncodingFilter</filter-name>
<!-- 过滤器对应的实现类 -->
<filter-class>com.smalle.filter.CharacterEncodingFilter</filter-class>
<!-- 配置初始化参数 -->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<!-- 过滤器的标识名 -->
<filter-name>characterEncodingFilter</filter-name>
<!-- 过滤器的URL匹配模式 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
6、监听器:使用时要实现某些接口
(1)Servlet监听器可以使你的应用对某些事情做出反应。每一个监听器都定义了一个回调方法,当对应的事件发现前或发生后,Web容器会自动调用对应监听器实现类中的相应方法。
(2)在ServletApi提供了以下的监听接口:
==> ServletContextListener:应用上下文生命周期的监听器。用于监听Web应用的启动和销毁事件。
==> ServletContextAttributeListener:应用上下文属性事件监听器。用于监听Web应用上下文的属性改变的事件。
==> ServletRequestListener:请求生命周期监听器,用于监听请求的创建和销毁事件。
==> HttpSessionListener:会话生命周期监听器,用于监听会话的创建和销毁事件。
==> HttpSessionActivationListener:会话集合和钝化事件监听器,用于监听会话的激活和钝化的事件。
==> HttpSessionAttributeListener:会话属性事件监听器。用于监听会话中的属性改变事件。
==> HttpSessionBindingListener:会话值绑定事件监听器,知识唯一不需要在web.xml中设定的监听器。
(3)实例
package com.smalle.listener; import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener; public class DemoListener implements ServletContextListener { private ServletContext application = null; //应用上下文初始时会回调的方法
@Override
public void contextInitialized(ServletContextEvent e) {
//初始化一个application对象
System.out.println("DemoListener");
application = e.getServletContext();
this.application.setAttribute("key", "可以在其他地方调用到我");
} public void contextDestroyed(ServletContextEvent e) {}
}
-------------------------------------------------------
package com.smalle.listener; import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class DemoServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String value = (String) getServletConfig().getServletContext().getAttribute("key");
System.out.println("DemoServlet" + value);
}
}
------------------------------------------------------------
<!-- 注册一个监听器 -->
<listener>
<listener-class>com.smalle.listener.DemoListener</listener-class>
</listener> <servlet>
<servlet-name>DemoServlet</servlet-name>
<servlet-class>com.smalle.listener.DemoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DemoServlet</servlet-name>
<url-pattern>/demoListener</url-pattern>
</servlet-mapping>
(4)利用监听器实现用户在线人数监测:查看项目源代码
servlet(3) - servlet知识点 - 小易Java笔记的更多相关文章
- servlet(6) - servlet总结 - 小易Java笔记
垂阅前必看: 这都是我总结的我觉得是学习servlet应该掌握的,我在学习期间也做了一个博客项目来让所学的知识得以巩固.下面就是博客项目链接.前面的servlet相关的笔记总汇,还有就是我把觉得在学习 ...
- servlet(4) - servletAPI - 小易Java笔记
Servlet规范核心类图 1.请求和响应对象 ==> HTTP协议包含请求和响应部分. ==> HttpServletRequest就代表着请求部分 ==> HttpServlet ...
- servlet(2) - 利用MyEclipse新建一个servlet - 小易Java笔记
1.Tomcat在MyEclipse中集成 ==> Window-preferences-MyEclipse-Servers-Tomcat-Tomcat 6.x-点击右侧的Browse,选择你的 ...
- servlet(1) - 手写第一个servlet程序 - 小易Java笔记
声明:如tomcat的安装目录为D:\Java\tomcat6,下面要根据tomcat的安装目录而定 1. 建立程序的文件结构 ==>找到tomcat的安装目录,在webapps目录下新建一个名 ...
- JSP(3) - 9个JSP内置对象 - 小易Java笔记
1.9个JSP内置对象 内置对象引用名称 对应的类型 request HttpServletRequest response HttpServletResponse config Servle ...
- JSP(2) - JSP指令 - 小易Java笔记
JSP指令是给JSP引擎用的,即给服务器用的.作用是告诉服务器,该如何处理JSP中除了指令之外的内容.包括page.include.taglib三种 基本的语法格式:<%@ 指令名称 属性1=& ...
- JSP(1) - JSP简介、原理、语法 - 小易Java笔记
1.JSP简介 (1)JSP的全称是Java Server Pages(运行在服务器端的页面),实际就是Servlet(学习JSP的关键就是时刻联想到Servlet) (2)JSP.Servlet各自 ...
- servlet(5) - Cookie和session - 小易Java笔记
1.会话概述 (1)会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. (2)会话过程中的数据不宜保存在request和servle ...
- JAVAWEB - Servlet原理及其使用>从零开始学JAVA系列
目录 Servlet原理及其使用 什么是Servlet Servlet的使用 编写一个Servlet,使用继承HttpServlet的方式 配置web.xml 很简单的几个JSP文件 小提示,如果继承 ...
随机推荐
- 用Fluent实现MySQL到ODPS数据集成
安装ruby 首先通过 /etc/issue 命令查看当前使用centos是哪个版本: [hadoop@hadoop03 ~]$ cat /etc/issue 由于centos版本是6.6,安装ru ...
- LeetCode 全解(bug free 训练)
1.Two Sum Given an array of integers, return indices of the two numbers such that they add up to a s ...
- redis-Windows下安装与操作
Redis windows下安装 1.安装 (1)windows把redisbin_x32安装包放在电脑任意的盘里 (2)通过cmd找到对应目录: D\redisbin_x32 (3)开始安装 D\ ...
- POJ 1463 Strategic game(二分图最大匹配)
Description Bob enjoys playing computer games, especially strategic games, but sometimes he cannot f ...
- Linux SPI总线和设备驱动架构之四:SPI数据传输的队列化
我们知道,SPI数据传输可以有两种方式:同步方式和异步方式.所谓同步方式是指数据传输的发起者必须等待本次传输的结束,期间不能做其它事情,用代码来解释就是,调用传输的函数后,直到数据传输完成,函数才会返 ...
- OpenCV膨胀和腐蚀示例代码
#include<cv.h> #include<highgui.h> int main(int argc, char** argv) { IplImage* img = cvL ...
- java线程(5)——线程池(上)
引入: 在之前的例子中,我们需要使用线程时就直接去创建一个线程,这样既不浪费资源又十分方便.但如果我们需要创建多个并发的线程,而且短时间执行就结束了,如果还用之前的方式,就会大大降低效率和性能了. 因 ...
- WCF服务全局异常处理机制
服务端增加WCF服务全局异常处理机制,任一WCF服务或接口方式出现异常,将统一调用WCF_ExceptionHandler.ProvideFault方法,因此不需要每个方法使用try catch写法. ...
- 搭建Lepus数据库监控系统
一. 安装环境 系统环境:centos6.5 IP:192.168.30.242 hostname:vpn.org 软件:LAMP均已安装.(请确保这些正常安装,并能使用). 系统核心包:(摘自官方 ...
- LeetCode--Factorial Trailing Zeroes(注意)
Given an integer n, return the number of trailing zeroes in n!. 问题描述:给出一个正整数n,计算n!结构后面有几个0.要求:在多项式时间 ...