2 Servlet 细节
1 Servlet 配置详解
① 由于客户端在浏览器只能通过URL访问web服务器的资源,所以Servlet程序若想被外界访问,必须把Servlet 程序映射到一个URL 地址上,这个工作在项目web.xml 完成。
② web.xml 的 <servlet>元素用于注册Servlet,它主要包含2个元素:<servlet-name>与<servlet-class>,分别用于注册Servlet 名称和设置Servlet 完整类名。
<servlet>
<!-- 注册Servlet -->
<servlet-name>FirstServlet</servlet-name>
<!-- 类的全路径 -->
<servlet-class>com.latiny.servlet.FirstServlet</servlet-class>
</servlet>
③ <servlet-mapping> 元素用于映射一个已经注册的Servlet对外的访问路径,它包含2个子元素:<servlet-name>与<url-pattern>,分别用于指定Servlet 注册名对应的对外访问路径。
<servlet-mapping>
<!--Servlet的注册名 -->
<servlet-name>FirstServlet</servlet-name>
<!--Servlet对外的访问路径 -->
<url-pattern>/FirstServlet</url-pattern>
</servlet-mapping>
④ 一个注册的Servlet可以映射为多个URL,且每个URL都可以被外部访问
⑤ 对Servlet映射时,可以使用通配符,有两种格式
第一种格式 *.扩展名,例如*.do,*.html
第二中格式 以 / 开头,同时以 /* 结尾 例如 /* 或者 /news/*
第三如果一个URL被映射成多种格式,匹配标准如下:
- 谁的匹配度高,谁先被选择
- *.do 优先级最低
案例:
① 如果在上面的<servlet-mapping> 元素里,FirstServlet 被映射成 *.html,那么在浏览器输入任何以html 结尾的地址都可以访问到该 Servlet
http://localhost:8080/TestWeb/abc.html,其中abc 可以换成任意字符都可以访问到该Servlet。
② 如果在上面的<servlet-mapping> 元素里,FirstServlet 被映射成 /*,那么在浏览器输入任何字符或者不输字符都可以访问到FirstServlet,如下面的地址都可以访问到:
http://localhost:8080/ServletProject/
http://localhost:8080/ServletProject/a
http://localhost:8080/ServletProject/.html
2 Servlet 单例问题
当Servlet第一次被访问后,就被加载到内存,以后该实例对各个请求服务,Servlet在使用中是单例的,因为Servlet是单例,因此会出现线程安全问题。比如:售票系统,不加同步机制,则会出现问题。
① 解决方案:
如果一个变量或者一段代码,可能会有多个用户共享,则应该在访问时加同步机制:
synchronized(对象)
{ }
如果一个变量不需要共享,则直接在doPost或doGet定义。
3 Servlet中的<servlet-on-startup> 配置
当我们启动网站的时候,可能会要求初始化一些数据,比如创建临时表、完成一些网站要求定时完成的任务如:定时写日志,定时备份数据库,定时发送邮件等。
解决方案:可以通过<load-on-startup>配合线程解决
① 通过配置<load-on-startup> 可以指定某个Servlet 自动启动
② 创建一个简单的线程:
public class SendEmail extends Thread
{
public void run()
{
int i=0;
try
{
while(true)
{
//每休息10秒,就去扫描sendmail表,看看哪份email应该发出
Thread.sleep(60*1000);
System.out.println("发出第"+(++i)+"邮件");
}
}
catch(Exception e)
{ }
} }
③ 创建一个简单的Servlet:FirstServlet,然后在该Servlet里创建SendEmail 线程并启动
public class FirstServlet extends HttpServlet { public void init() throws ServletException {
//完成一些初始化任务
System.out.println("FirstServlet is called");
SendEmail email = new SendEmail();
email.start(); } public void destroy() {
super.destroy(); }
.......
④ 在项目的web.xml配置该Servlet,随着网站启动时一起启动
<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>com.latiny.servlet.FirstServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
⑤ 部署该项目,然后启动Tomcat,启动之后我们可以在后台看到,每隔10秒就会输出一条信息
一月 27, 2018 4:39:51 下午 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler ["ajp-apr-8009"]
一月 27, 2018 4:39:51 下午 org.apache.catalina.startup.Catalina start
信息: Server startup in 5818 ms
发出第1邮件
发出第2邮件
发出第3邮件
发出第4邮件
发出第5邮件
发出第6邮件
发出第7邮件
以上只是简单的模拟了<load-on-startup> 配置Servlet 在项目启动时跟着一起启动的案例。
3 SerlvetConfig 对象
ServletConfig 对象主要用于读取Servlet的配置信息,要在项目中使用该对象来工作,需要做如下操作:
① 在web.xml 中给对应的Servlet 配置ServletConfig 信息,注意这个配置信息只能供该Servlet 访问,其他Servlet无法访问
<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>com.latiny.servlet.FirstServlet</servlet-class> <!-- Servlet 配置信息,此处配置信息只能被该Servlet读取 -->
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param> <init-param>
<param-name>name</param-name>
<param-value>latiny</param-value>
</init-param> <init-param>
<param-name>gender</param-name>
<param-value>male</param-value>
</init-param> </servlet>
② 获取使用
String encoding = this.getServletConfig().getInitParameter("encoding");
String name = this.getServletConfig().getInitParameter("name");
String gender = this.getServletConfig().getInitParameter("gender");
这种配置方式只能被某个Serlvet独立使用,如果希望所有Servlet都能读取到某个配置参数,则需要配置参数<context-param>
<context-param>
<param-name>contextName</param-name>
<param-value>Hello context config</param-value>
</context-param>
该项目任何Servlet 都可以通过以下代码获取<context-param> 中的配置
String contextName = this.getServletContext().getInitParameter("contextName");
4 修改Servlet的配置模板
MyEclipse提供的Servlet 模板有时候不一定适合项目的开发,为了方便我们可以按照实际需要修改模板
① 找到MyEclipse安装目录下的 \Common\plugins文件夹:
D:\Program Files\AppData\Local\MyEclipse\Common\plugins
② 然后找到com.genuitec.eclipse.wizards_9.0.0.me201211011550.jar这个jar文件
③ 用压缩工具打开,注意是打开不是解压这个jar包
④ 打开com.genuitec.eclipse.wizards_9.0.0.me201211011550.jar这个jar文件后,可以看到里面有一个templates文件夹,进入templates文件夹,可以看到里面有一个Servlet.java文件,然后打开按照自己的需求修改即可
2 Servlet 细节的更多相关文章
- Servlet细节
Servlet细节 线程不安全的做法: * 不要在Servlet中创建成员!创建局部变量即可! * 可以创建无状态成员! * 可以创建有状态的成员,但状态必须为只读的!(不提供set方法) 1.Ser ...
- HTTP协议 Servlet入门 Servlet工作原理和生命周期 Servlet细节 ServletConfig对象
1 HTTP协议特点 1)客户端->服务端(请求request)有三部份 a)请求行--请求行用于描述客户端的请求方式.请求的资源名称,以及使用的HTTP协议版本号 请求行中的GET ...
- 2016-2-1 Servlet细节
Servlet的一些细节(韩顺平老师视频讲解)(1)由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序想要被外界访问,必须把servlet程序映射到一个URL地址上.这个工作在 ...
- Servlet第二篇【Servlet调用图、Servlet细节、ServletConfig、ServletContext】
Servlet的调用图 前面我们已经学过了Servlet的生命周期了,我们根据Servlet的生命周期画出Servlet的调用图加深理解 Servlet的细节 一个已经注册的Servlet可以被多次映 ...
- Servlet细节整合
最近在复习Servlet,发现其中有很多细节方面的东西都没有接触到,只是学了大概 1.请求转发和请求重定向的区别 2.输入参数为中文时候的乱码问题 3.Web工程中的目录写法 下面分别阐述 1.请求转 ...
- Servlet细节处理
1.Servlet的线程安全问题 尽管servlet的工作效率高,但是线程也是不安全的,因为一个类型的Servlet只有一个实例对象,那么就有可能会出现一个Servlet同时处理多个请求 解决方案:所 ...
- Servlet技术之——概述、实现、细节、获取资源、ServletConfig、ServletContext
Servlet概述.实现.细节.获取资源.ServletConfig.ServletContext (一) Setvlet基本概述 (1) 什么是Servlet ? Servlet(Server Ap ...
- javaweb之servlet 全解
①Servlet概述 ⑴什么是Servlet Servlet是JavaWeb的三大组件之一,它属于动态资源.Servlet的作用是处理请求, 服务器会把接收到的请求交给Servlet来处理,在Serv ...
- 初学Java Web(4)——Servlet学习总结
经过一段时间的学习,对于Servlet有了新的不一样的见解,在这里做一下总结,将近来学习到的知识总结一下. Servlet 的请求流程 浏览器发出请求:http://localhost:80/xxx1 ...
随机推荐
- [福大软工] Z班 团队Alpha阶段成绩汇总
团队成绩汇总表 团队 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 总分 Dipper 9 85 90 26 42 27.5 120 74 25 111 19 628.5 SW ...
- 如何生成git ssh key
公司有自己的git版本控制,自己注册账号后,管理员同意,就可以查看项目代码了,但是要克隆的话需要在本地生成git ssh key 一.进入.ssh文件夹. cd ~/.ssh 若没有.ssh文件夹,则 ...
- Thread.interrupt()
作者:Intopass链接:https://www.zhihu.com/question/41048032/answer/89431513来源:知乎著作权归作者所有.商业转载请联系作者获得授权 ...
- 使用vue-cli脚手架创建项目
ue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目. GitHub地址是:https://github.com/vuejs/vue-cli 一.安 ...
- [matlab] 8.蚁群算法解决TSP问题
城市坐标数据下载 密码:07d5 求遍历这52座城市后最后回到最初城市的最短距离 %% 第9章 蚁群算法及MATLAB实现——TSP问题 % 程序9-1 %% 数据准备 % 清空环境变量 clear ...
- jquery懒加载插件 jquery_lazyload 下载
每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code https://pan.baidu.com/s/1UbOeyL_AaSNN_KMA4M ...
- 【转】CefSharp语言(Locales)本地化问题
CefSharp默认是嵌入的chrome浏览器内核,默认英文,所以右键菜单以及一些功能都是英文显示. 国内用需要汉化.CefSharp本身支持本地化Locales,需要在初始化Browser的时候设置 ...
- 三.js实例
1.完成一个双色球,红球的自选效果 规则:1-33 用表格画出一个1到33的格子,点击一个自选按钮,将随机选中6个数字,每个表格对应的数字的背景就改为一个红球的效果 双色球.html <!DOC ...
- appium遇到click事件,提示"w3cStatus":400
1.小米手机被开发借用后归还,使用该手机再进行自动化,发现appium遇到click事件,返回400 2.当时未想到是要在手机侧进行开发者选项-调试权限的设置 3.一直以为是appium的问题,app ...
- linux用法总结
scp -r -P 22 /srv/ox/demo ps@192.168.1.15:/home/ps/ 本地demo目录文件传到ps下 cp -r /home/ps/demo srv/ox/ ...