文章目录
1 概念
- servlet是连接web服务器和服务端java程序的协议,是一种通信规范,是一套接口。
- 通常来讲,servlet是servle规范的一个具体接口
- servlet是serlet接口实现类的一个实例对象,是运行在服务器上的一段java小程序,即sever Applet。
- servlet的主要功能是根据客户端提交的请求,调用服务端的相关方法,完成对请求的处理。
2 执行过程
- servlet由servlet容器创建,servlet容器是指Tomcat、 weblogic、Jboss
- 相同Servlet的实例在一个应用中只有一个,可以被不同浏览器访问,是多线程的。
- servlet创建时机:默认是第一次请求的时候去创建
- 用户每提交一次对当前servlet的请求,就会执行一次service()方法
- 一个servlet实例只会执行一次destory()方法,在应用停止时执行。
- 由于servlet是单例多线程的,一般不为servlet定义可修改的成员变量。
2.1 web.xml
<!--注册servlet -->
<servlet>
<servlet-name>some-servlet</servlet-name>
<servlet-class>com.cc.</servlet-class>
<servlet>
<!--建立servlet和URl映射关系-->
<servlet-mapping>
<servlet-name>some-servlet</servlet-name>
<url-pattern>/some</url-pattern>
</servlet-mapping>
2.1.1 url-pattern
url-pattern匹配方式有四种:完全匹配、目录匹配、扩展名匹配、默认匹配
- 完全匹配(/a):根据路径精确匹配,通常一个servlet只能处理一个请求。若一个servlet配置多个url-pattern,则可以匹配多个请求
- 目录匹配(/*):通配符匹配,不建议这种配置,会拦截jsp请求,tomcat无法处理jsp请求
- 扩展名匹配(*.do)
- 默认匹配(/):建议使用
2.1.2 tomcat中的web.xml
web.xml是所有发布到tomcat中的web应用共享。
url-pattern | servlet-class |
---|---|
.jsp,*.jspx | jspServlet |
/ | DefaultServlet |
2.1.3 webapp中的web.xml
url-pattern | servlet-class |
---|---|
/ | DefaultServlet |
2.1.4 DefaultServlet
- 除了jsp,接收所有的请求url
- 不处理具体业务,只做调度者,分发请求。
- 响应处理结果,由具体业务处理器返回给DispatcherServlet
2.1.5 loadOnStartup
在web.xml中,每个servlet标签都拥有一个子标签load-on-startup标签,作用是在servlet容器启动时,定义创建servlet对象的顺序。数字越小,加载优先级越高。
- loadOnStartup <0,即负数的情况下,web容器启动的时候不做实例化处理,servlet首次被调用时做实例化,这种情况和没有设置loadOnStartup是一样的。
- loadOnStartup > =0 web容器启动的时候做实例化处理,顺序是由小到大,正整数小的先被实例化
- 如果没有设置loadOnStartup,则第一次请求的时候实例化
2.2 dome
在web.xml中注册Servlet,并编写一个实现servlet接口的类
<!-- 注册servlet
ServletConfig对象-->
<servlet>
<servlet-name>configTest</servlet-name>
<servlet-class>servlet.ConfigTest</servlet-class>
<init-param>
<param-name>name</param-name>
<param-value>ccc</param-value>
</init-param>
<init-param>
<param-name>address</param-name>
<param-value>yyyy</param-value>
</init-param>
</servlet>
<!--建立servlet和URl映射关系-->
<servlet-mapping>
<servlet-name>configTest</servlet-name>
<url-pattern>/config</url-pattern>
</servlet-mapping>
package com.cc.servlet;
import javax.servlet.*;
import java.io.IOException;
import java.util.Enumeration;
public class ConfigTest implements Servlet {
private ServletConfig config;
@Override
public void init(ServletConfig servletConfig) throws ServletException {
this.config =servletConfig;
System.out.println("初始化实例");
System.out.println(config.toString());
}
@Override
public ServletConfig getServletConfig() {
return config;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
String name = config.getServletName();
System.out.println("ServletName:"+name);
//遍历初始化参数
Enumeration<String> names = config.getInitParameterNames();
while (names.hasMoreElements()){
String n= names.nextElement();
String v = config.getInitParameter(n);
System.out.println(n+":"+v);
}
// 获取ServletContext对象,一个应用只有一个
ServletContext context = config.getServletContext();
System.out.println("ServletContext:"+context);
System.out.println("执行service");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
3 ServletConfig
如 2.2demo所示,ServletConfig是根据web.xml中信息解析的配置对象。在调用==init()==对象时,将ServletConfig对象传递给当前Servlet
4 ServletContext
web.xml配置
<!-- ServletContext 参数 -->+
<context-param>
<param-name>name</param-name>
<param-value>ccStudy</param-value>
</context-param>
// 获取ServletContext对象,一个应用只有一个
ServletContext context = config.getServletContext();
System.out.println("ServletContext:"+context);
//获取context初始化参数
Enumeration<String> scNames = context.getInitParameterNames();
while (scNames.hasMoreElements()){
String n= scNames.nextElement();
String v= context.getInitParameter(n);
System.out.println(n+":"+v);
}
// 设置域属
context.setAttribute("a","ceshiAttribute");
String a= (String) context.getAttribute("a");
System.out.println(a);
//获取应用名
String contextPath = context.getContextPath();
System.out.println(contextPath);
//获取绝对路径
String realPath = context.getRealPath("/test");
System.out.println(realPath);