一.Servlet(Server Applet 服务器小程序)
Servlet生命周期:
当第一次访问servlet时创建,或配置load-on-startup随服务器启动而创建,调用init();
当WEB应用结束时销毁,调用destroy();
默认只创建一个servlet对象,多个网络连接共享同一个servlet,
也可以配成多个servlet对象,一个网络连接独享一个servlet,低效耗内存,不建议!
Servlet线程安全
默认只创建一个Servlet实例,多个网络连接(多线程)共享同一个Servlet对象
若使用Servlet成员变量保存数据,则多线程并发修改该成员变量,数据被覆盖丢失,出现线程安全问题!
所以除了必要的共享数据,慎用Servlet成员变量!
在 WEB应用/WEB-INF/web.xml 配置
MyServlet
win.lioil.MyServlet
1
MyServlet
/MyServlet
/aaa/MyServlet
/aaa/*
/*
/
*.mp3
匹配范围越大,优先级越低, 优先级: /MyServlet > /aaa/* > *.mp3 > /*
路径匹配 和 后缀名匹配 不能混合使用, 例如: /*.txt
在 Tomcat/conf/web.xml 默认配置 DefaultServlet.java, 用于处理WEB项目中的静态资源(html,css,js,png等文件), 输出错误页面
在 Tomcat/conf/web.xml 还默认配置 JspServlet.java, 用于处理WEB项目中的jsp文件
default
org.apache.catalina.servlets.DefaultServlet
debug
0
listings
false
1
jsp
org.apache.jasper.servlet.JspServlet
fork
false
xpoweredBy
false
3
default
/
jsp
*.jsp
*.jspx
二.ServletConfig
在 WEB应用/WEB-INF/web.xml 配置serlet的初始化参数(其它servlet不能访问)
MyServlet
win.lioil.MyServlet
name1
value1
在 MyServlet.java 获取初始化参数
getServletConfig().getInitParameter("name1");
getServletConfig().getInitParameterNames();
getServletConfig().getServletName();
ServletConfig-常用方法
String getInitParameter(String name) 获取servlet初始化参数值
Enumeration getInitParameterNames() 获取servlet所有初始化参数名
String getServletName() 获取servlet名称 (MyServlet )
ServletContext getServletContext() 获取ServletContext对象
三.ServletContext(Application)
1.概念
ServletContext 是 Application 域对象, 代表整个WEB应用, 在整个WEB应用范围内共享数据, 服务器组件之间的通讯。
作用域: 整个WEB应用
生存期: 当WEB应用启动时创建, 当WEB应用结束时销毁
2.WEB应用-Attribute
在WEB应用中共享数据,例如: 在不同servlet间共享数据
getServletContext().setAttribute(String name, Object value);
getServletContext().removeAttribute(String name);
getServletContext().getAttribute(String name);
getServletContext().getAttributeNames();
3.WEB应用-初始化参数
在 WEB应用/WEB-INF/web.xml 配置WEB应用的初始化参数
user
password
在 MyServlet.java 获取WEB应用的初始化参数
getServletContext().getInitParameter("user");
getServletContext().getInitParameterNames();
4.WEB请求-转发
Servlet转发: 在服务器内部转发,不涉及客户端(一次Http请求和响应)
getServletContext().getRequestDispatcher("/OtherServlet").forward(request, response);
Http重定向: 要求客户端重新请求(两次Http请求和响应)
状态码 302
响应头 Location: http://www.lioil.win
5.WEB资源-本地路径
在Servlet类中
getServletContext().getRealPath("") 获取WEB应用目录的绝对路径
在非Servlet类中
Class.getResource(String path)
当 path 不以'/'开头: 从类所在目录开始
当 path 以'/'开头: 从类加载目录ClassPath开始(WEB应用的classes目录)
getClass().getResource("") 当前类所在目录
getClass().getResource("/") WEB应用的classes目录
getClass().getResource("/..") WEB应用的WEB-INF目录(..表示上一级目录)
getClass().getResource("/../..") WEB应用目录
假设当前类是win.lioil.Util.java, 获取相同目录下的config.txt,有两种方法,如下:
getClass().getResource("config.txt") 等价于 getClass().getResource("/win/lioil/config.txt")
Class.getClassLoader().getResource(String path)
path 只能 从类加载目录ClassPath开始(WEB应用的classes目录)
getClass().getClassLoader().getResource("") WEB应用的classes目录
getClass().getClassLoader().getResource("..") WEB应用的WEB-INF目录(..表示上一级目录)
getClass().getClassLoader().getResource("../..") WEB应用目录
假设当前类是win.lioil.Util.java, 获取相同目录下的config.txt
getClass().getClassLoader().getResource("win/lioil/config.txt")
: http://www.jianshu.com/p/55e934b5d68a
CSDN博客: http://blog.csdn.net/qq_32115439/article/details/54618638
GitHub博客:http://lioil.win/2017/01/19/Servlet.html
Coding博客:http://c.lioil.win/2017/01/19/Servlet.html