Tomcat与Servlet——浅入

2022-05-05 11:33:40 浏览数 (1)

本篇文章整理自我的CSDN,是我以前学习的时候总结的,当时使用的IDE是MyEclipse,内容没什么问题,可能过于书面化,等我整理完毕我的CSDN相关内容后,会开始更新进阶内容。

Tomcat

“Tomcat服务器是一个免费开源的Web应用服务器,属于轻量级应用服务器,是开发和调试JSP的首选。-----百度百科 ”

我的理解是,JSP和Servlet的一个容器。

那么Tomcat到底是干什么的呢?大家既然接触过HTML那么就知道,我们所写的代码文件,只能在本机运行和自己访问,而通过Tomcat别人就可以远程访问你的界面。

上图看不太懂没关系,在学习了servlet,了解request和response对象后自然就明白了。Tomcat的目录结构:

具体的安装和配置步骤我就不过多阐述了。

Servlet

Servlet是什么?

“Servlet全称Java Servlet,是一种用Java编写的服务器端程序。Servlet由服务器调用,运行在服务器端。Servlet的主要功能在于交互式的浏览和修改数据,生成动态Web内容。比如网上聊天、评论这些交互功能。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类。

Servlet的作用:

Servlet既然是接口,那么它就是起到规范作用。 Servlet接口定义的是一套处理网络请求的规范,所有实现Servlet的类,都需要实现它的五个方法。

其中最重要的是两个生命周期方法 init()和destory(),还有一个处理请求的service(),因此所有实现Servlet接口的类,或者说,所有想要处理网络请求的类,都需要回答这三个问题:

  • 初始化时做什么?
  • 销毁时做什么?
  • 接受到请求时做什么?

通过Web服务器映射的URL访问资源,需要经历三个过程:

  • 接受请求
  • 处理请求
  • 响应请求

西瓜籽:“那么Servlet能直接处理请求吗?” 大西瓜:“不能。”

Servlet是不会直接和客户端打交道的,Tomcat才是那个和客户端直接打交道的家伙。Tomcat监听了端口,请求过来后,根据URL等信息,确定要将请求交给哪个Servlet去处理,然后调用那个Servlet的service(),service()会返回一个response对象,Tomcat再把这个response返回给客户端。 ”

Servlet带给我们的最大的作用就是能够处理浏览器带来的HTTP请求,并返回一个响应给浏览器,从而实现浏览器的服务器的交互。

Servlet的实现:

创建Myservlet类,实现Servlet接口。

代码语言:javascript复制
import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class Myservlet implements Servlet {
/*
 * Serclet配置
 * (non-Javadoc)
 * @see javax.servlet.Servlet#getServletConfig()
 */
 @Override
 public ServletConfig getServletConfig() {
  // TODO Auto-generated method stub
  return null;
 }
/*
 * Servlet信息
 * (non-Javadoc)
 * @see javax.servlet.Servlet#getServletInfo()
 */
 @Override
 public String getServletInfo() {
  // TODO Auto-generated method stub
  return null;
 }
/*
 * 初始化
 * (non-Javadoc)
 * @see javax.servlet.Servlet#init(javax.servlet.ServletConfig)
 */
 @Override
 public void init(ServletConfig arg0) throws ServletException {
  // TODO Auto-generated method stub
  
 }
/*
 * 服务
 * (non-Javadoc)
 * @see javax.servlet.Servlet#service(javax.servlet.ServletRequest, javax.servlet.ServletResponse)
 */
 @Override
 public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
  // TODO Auto-generated method stub
  
 }
 
/*
 * 销毁
* (non-Javadoc)
* @see javax.servlet.Servlet#destroy()
*/
 @Override
 public void destroy() {
     // TODO Auto-generated method stub
  
  
 } 
}

以我们大家熟悉的Hello World为例

代码语言:javascript复制
 public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
  response.setContentType("text/html;charset=UTF-8");//防止乱码
  PrintWriter out=response.getWriter();
  out.println("Hello World");
 }

接下来就是配置xml文件,让Tomcat知道如何调用Servlet:

代码语言:javascript复制
  <!-- 声明Servlet对象 -->
  <servlet>
  <!-- 指定Servlet对象的名称,一般为类名 -->
  <servlet-name>Myservlet</servlet-name>
  <!-- 指定Servlet对象的完整位置,包含Servlet对象的包名和类名 -->
  <servlet-class>Servlet.Myservlet</servlet-class>
  </servlet>
  
  <!-- 映射Servlet -->
  <servlet-mapping>
  <!--与Servlet对象中保持一致-->
  <servlet-name>Myservlet</servlet-name>
  <!--用于映射访问URL,外界访问Myservlet的路径-->
  <url-pattern>/Myservlet</url-pattern>
  </servlet-mapping>

接下来就是通过浏览器访问该Servlet:

!!!这里提醒一下,不要从eclipse打开servlet,可能会导致service()方法被调用两次。

Servlet的生命周期:

代码语言:javascript复制
  public class Myservlet implements Servlet {
 
  @Override
  public void destroy() {
   // TODO Auto-generated method stub
         System.out.println("Servlet正在销毁");
  }
 
  @Override
  public ServletConfig getServletConfig() {
   // TODO Auto-generated method stub
   return null;
  }
 
  @Override
  public String getServletInfo() {
   // TODO Auto-generated method stub
   return null;
  }
 
  @Override
  public void init(ServletConfig config) throws ServletException {
   // TODO Auto-generated method stub
         System.out.println("Servlet正在初始化");
  }
 
  @Override
  public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
   // TODO Auto-generated method stub
      System.out.println("Servlet正在提供服务");
  }
  
 }

运行结果:

  1. 第一次访问:我们发现init()和service()方法都被调用
  1. 第二次访问:相比与第一次访问,这次只调用了service()
  1. 当关闭Tomcat时,destroy()被调用:

Servlet声明周期可分为5个步骤

“1.加载Servlet。Tomcat首次访问Servlet时,会创建Servlet的实例 ”

“2.初始化。Servlet被实例化后,Tomcat会调用init()方法初始化这个对象 ”

“3.处理服务。当浏览器访问Servlet时,Servlet会调用service()方法处理请求 ”

“4.销毁。当Tomcat关闭或者检测到Servlet要从Tomcat删除的时候会自动调用destroy()方法,释放该实例所占用的资源。一个Servlet如果长时间不被使用的话,也会被Tomcat自动销毁 ”

“5.卸载。当Servlet调用完destroy()方法后,等待垃圾回收。如果有需要再次使用这个Servlet,会重新调用init()方法进行初始化操作。 ”

简单总结: 只要访问Servlet,service()方法就会被调用。init()只有第一次访问Servlet的时候才会被调用。destroy()只有在Tomcat关闭的时候才会被调用。

继承HttpServlet类编写Servlet程序:

HttpServlet类也是一个抽象类,实现了service()方法,并针对HTTP/1.1中定义的7种请求类型提供了相应的方法 - doGet()、doPost()、doPut()、doDelete()、doHead() 、 doTrace() 和 doOptions() 方法。HttpServlet类已经实现了Servlet接口的所有方法,我们在使用过程中只用继承HttpServlet,重写我们需要的方法就行了。而且HttpServlet类在原有Servlet接口上添加了一些HTTP协议处理方法,它的功能也更加强大。

HttpServlet类继承GenericServlet类。HttpServlet类、GenericServlet类、Servlet接口的关系如图:

HttpServlet有两个特性是GenericServlet所不具备的:

“不用覆盖service方法,而是覆盖doGet或者doPost方法。在少数情况,还会覆盖其他的5个方法。 ”

使用的是:

HttpServletRequest、HttpServletResponse对象。

一般我们都是重写doGet()和doPost()方法。这里我使用的是MyEclipse2018:

创建完成后会自动配置好XML文件,我们直接使用就好了!

continue

0 人点赞