Servlet映射、生命周期和相对路径与绝对路径
一、tomcat和servlet的关系
Tomcat 是Web应用服务器,是一个Servlet/JSP容器. Tomcat 作为Servlet容器,负责处理客户请求,把请求传送给Servlet,并将Servlet的响应传送回给客户.而Servlet是一种运行在支持Java语言的服务器上的组件.
二、Servlet映射
- 当创建一个TestServlet文件的时候,需要在web.xml中配置TestServlet文件。
public class DataServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
- 为什么需要在web.xml中配置TestServlet。让浏览器发出的请求知道到达哪个servlet,也就是让tomcat将封装好的request找到对应的servlet让其使用
<servlet>
<!-- 给servlet取名字,一般跟我们写的servlet类名相同 -->
<servlet-name>TestServlet</servlet-name>
<!-- servlet的全限定类名,也就是servlet的位置 -->
<servlet-class>com.jd.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<!-- 跟上面的servlet名字相同 -->
<servlet-name>TestServlet</servlet-name>
<!-- 浏览器通过该url找到servlet。/一定要加,相当于项目名称 -->
<url-pattern>/TestServlet</url-pattern>
</servlet-mapping>
映射步骤:首先浏览器通过127.0.0.1/test/TestServlet来找到web.xml中的url-pattern。2.匹配到了url-pattern后,就会找到第二步servlet的名字TestServlet,知道了名字,就可以通过servlet-name找到第三步,也就能够知道servlet的位置了。然后到其中找到对应的处理方式进行处理。
三、Servlet生命周期
init( ),service( ),destroy( )是Servlet生命周期的方法。代表了Servlet从“出生”到“工作”再到“死亡 ”的过程。Servlet容器(例如TomCat)会根据下面的规则来调用这三个方法:
- init( ),当Servlet第一次被请求时,Servlet容器就会开始调用这个方法来初始化一个Servlet对象出来,但是这个方法在后续请求中不会在被Servlet容器调用。我们可以利用init( )方法来执行相应的初始化工作。调用这个方法时,Servlet容器会传入一个ServletConfig对象进来从而对Servlet对象进行初始化。同时也可用于获取web.xml中的数据
//sevlet对象属于实例(程序运行结束之前,缓存中只有一个对象存在)
public TestServlet() {
//用于成员变量赋值,会触发对象创建
//默认情况下,第一次使用该Servlet时创建对象
//如果配置<load-on-startup>1<load-on-startup>,则servlet对象随着tomcat的启动而创建
super();
}
public void init() throws ServletException {
//servlet对象创建后,该方法立即执行,用于获取web.xml中的数据。
//由于servlet方法式单例,仅仅创建一次,所以该方法只执行一次
super.init();
//System.out.println("init"+this);
String name = getServletContext().getInitParameter("name");//获取web.xml中多个Servlet共享的值
System.out.println(name);
String mobile = getInitParameter("mobile");//获取自己Servlet的值
System.out.println(mobile);
}
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
//System.out.println("init(ServletConfig config)"+this);
String name = config.getServletContext().getInitParameter("name");//获取web.xml中多个Servlet共享的值
System.out.println(name);
String mobile = config.getInitParameter("mobile");//获取自己Servlet的值
System.out.println(mobile);
}
web.xml中配置:
<context-param>
<!-- 多个Servlet共享的值 -->
<param-name>name</param-name>
<param-value>Jimmy</param-value>
</context-param>
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>com.zzu.servlet.TestServlet</servlet-class>
<init-param>
<!-- 自己Servlet的值 -->
<param-name>mobile</param-name>
<param-value>110</param-value>
</init-param>
<load-on-startup>1</load-on-startup><!-- 在启动tomcat的时候创建servlet对象 -->
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/TestServlet</url-pattern>
</servlet-mapping>
- service( )方法,每当请求Servlet时,Servlet容器就会调用这个方法。第一次请求时,Servlet容器会先调用init( )方法初始化一个Servlet对象出来,然后会调用它的service( )方法进行工作,但在后续的请求中,Servlet容器只会调用service方法了。
//任何请求优先到达service方法,通过该方法确定执行doGet还是doPost
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.service(req, resp);//将这行代码注释将不执行doget或dopost方法
}
//a连接 form指定method标签属性get,异步不写或者指定为get
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
//form指定method标签属性get,异步指定为get
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
- destory,当要销毁Servlet时,Servlet容器就会调用这个方法。在卸载应用程序或者关闭Servlet容器时,就会发生这种情况,一般在这个方法中会写一些清除代码。
//Servlet对象销毁之前调用,用于释放资源。由于servlet方法式单例,仅仅创建一次,所以该方法只执行一次
//Tomcat服务器关闭时调用,项目重新发布前调用
@Override
public void destroy() {
super.destroy();
System.out.println("destroy"+this);
}
四、HttpServlet中的service()、doPost()、doGet()的区别
-
Service() 方法:
不管是 get 方式或是 post 方式的请求,如果 自己写的Servlet 类中有 service() 方法,则优先调用 Service 方法进行处理。(如果覆写的service方法中调用了父类的servic()方法super.service(req,resp),则service方法处理完后,会再根据请求方式相应的doPost或是doGet方法执行)。 -
doGet() 方法:
在没有 service 方法的情况下如果是 get 方式的请求所调 用的处理请求的方法 -
doPost() 方法:
在没有 service 方法的情况下如果是 post 方式的请求所调 用的处理请求的方法
执行结果:我是service方法
五、相对路径与绝对路径
在Servlet中,"/“代表Web应用的根目录。
“./” 代表当前目录,”…/"代表上级目录
动态获取根目录目录:
request.getContextPath()