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