Sun提供的一种动态web资源开发技术。本质上一段Java程序。将Servlet加入到Servlet容器中运行。
区分以下几个名词:
Servlet<I>






init() 做初始化操作service() 并将请求和响应对象作为参数传递进去,每次对这个Servlet的访问都会导致Servlet中 service() 执行destory() 做一些善后工作
Servlet<I>:定义了Servlet应该具有的基本方法GenericServlet <abstract C>:通用的基本Servlet实现
service() 则保留为抽象方法,需要让子类去实现HttpServlet<C>
service():根据当前请求方式,调用对应的 doXXX()
<servlet> 可以对应多个 <servlet-mapping>,从而使一个Servlet可以有多个路径来访问<url-pattern>中的路径可以使用 * 匹配符进行匹配
/ 开头 ,/* "结尾 ② *.后缀* 的引入,有可能一个路径被多个 <url-pattern> 匹配,这时优先级判断条件
<url-pattern> 最长匹配 选哪个*.后缀 优先级最低,比 /* 还低
<url-pattern> 都是非法的,如果设置,tomcat 将报错<url-pattern>/kata/*.jsp</url-pattern>
<url-pattern>/*.jsp</url-pattern>
<url-pattern>he*.jsp</url-pattern>
/*<servlet> 配置 <load-on-startup> 标签
init()<url-pattern> 被配置为 /,这个 Servlet 就变成了缺省 Servlet<url-pattern>,比如 html、css、js…
service(),因此 service() 内如果访问了同一个资源的话,就有可能引发线程安全问题SingleThreadModel<I>
SingleThreadModel<I>,那么Servlet引擎将以单线程模式来调用 service()。SingleThreadModel <I> 没有任何方法,只是一个"标记接口"。在Sever内部维护一个"池",产生多个 Servlet 实例对象,并发的每个线程分别调用一个独立的 Servlet 实例对象。SingleThreadModel <I> 并不能真正解决 Servlet 的线程安全问题,因为 Servlet 引擎会创建多个 Servlet 实例对象,而真正意义上解决多线程安全问题是指一个 Servlet 实例对象被多个线程同时调用的问题。事实上,在 Servlet API 2.4 中,已经将 SingleThreadModel <I> 标记为Deprecated(过时的)。


public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletConfig config = this.getServletConfig();
// 获取当前Servlet在web.xml中配置的名称
String sName = config.getServletName();
System.out.println(sName);
// 获取当前Servlet在web.xml中配置的初始化参数name1
String value1 = config.getInitParameter("name1");
System.out.println(value1);
// 获取所有初始化参数
Enumeration<String> enums = config.getInitParameterNames();
while(enums.hasMoreElements()) {
String name = enums.nextElement();
String value = config.getInitParameter(name);
System.out.println(name + ":" + value);
}
}
getServletContext()获得 ServletContext 对象。
public void setAttribute(String name, Object object)
public Object getAttribute(String name)
public void removeAttribute(String name)

String getInitParameter(String name)
Enumeration<String> getInitParameterNames()
// 虚拟路径
String path = "/servlet/SContextServlet3";
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(path);
dispatcher.forward(request, response);
public String getRealPath(String)public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// File file = new File("config.properties");
// 当前程序启动的目录下找文件 => D:\Java\tomcat\bin\config.properties
// System.out.println(file.getAbsolutePath());
// 方法底层会拼接 [当前web应用在虚拟主机管理的文件夹的
// 硬盘路径] 在方法形参前面从而获得当前资源的硬盘路径
String path = getServletContext().getRealPath("config.properties");
System.out.println(path);
}

public void method() {
// 类加载器从哪里加载类, 就从哪里加载资源文件, 对应到web应用, 也就是classes文件夹
File file = new File(PathDemo.class.getClassLoader()
.getResource("config2.properties").getPath());
System.out.println(file.getAbsolutePath());
}
原文:https://www.cnblogs.com/liujiaqi1101/p/13388401.html