Servlet入门

项目搭建

1.创建一个JavaWeb项目


image.png
  1. 定义一个类,实现Servlet接口,并实现所有的抽象方法
public class ServletDemo implements Servlet {
// 初始化方法    第一次访问的时候回执行一次  , 一般用于初始化一些参数  
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("初始化执行...........");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
        //  关键方法  用于执行具体代码逻辑  每次访问  都会执行一次service 
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("执行具体服务.........");
        //  将信息响应给客户端
        PrintWriter writer = servletResponse.getWriter();
        writer.print("<h1>hello...Servlet</h1>");

    }

    @Override
    public String getServletInfo() {
        return null;
    }
    
// 销毁方法  , tomcat 关闭之前会执行一次   一般用于做资源释放等操作
    @Override
    public void destroy() {
        System.out.println("服务器关闭  销毁中........");
    }
  1. 在web.xml 配置
  <!--配置Servlet -->
  <servlet>
      <servlet-name>demo1</servlet-name>
      <!--被访问的servlet具体路径-->
      <servlet-class>cn.llxurs.ServletDemo</servlet-class>
  </servlet>

  <servlet-mapping>
      <!--servlet名称  需与上面  servlet-name 名称一致-->
      <servlet-name>demo1</servlet-name>
      <!--servlet 的访问路径-->
      <url-pattern>/demo1</url-pattern>
  </servlet-mapping>
  1. 启动tomcat ....出现错误o(╥﹏╥)o
  com.intellij.javaee.oss.admin.jmx.JmxAdminException: com.intellij.execution.ExecutionException
image.png

解决办法

  1. 设置正确的web.xml 路径
    setting --> ProjectStrucutre -->Facets


    image.png
image.png

2.在artifacts 中创建war包和web包


image.png
  1. 重新在tomcat中配置war包

  2. 启动 访问成功!


    image.png

控制台打印信息

初始化执行...........
执行具体服务.........
执行具体服务.........

关闭tomcat

服务器关闭  销毁中........

执行原理

  • 执行原理:
    1. 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
    2. 查找web.xml文件,是否有对应的<url-pattern>标签体内容。
    3. 如果有,则在找到对应的<servlet-class>全类名
    4. tomcat会将字节码文件加载进内存,并且创建其对象
    5. 调用其方法
image.png

Servlet3.0 实现

经过上面servlet原始方式实现 我们发现它的配置过于繁琐 于是我们引入servlet 3.0 它可以不用配置web.xml 支持注解实现

搭建步骤

  1. 创建一个JAVA web 项目 选择servlet3.0以上的版本

    image.png

  2. 定义一个类 实现Servlet 接口 并复写其抽象方法

  3. 在类上加上@WebServlet注解 加上url-partten 路径 即可

@WebServlet("/demo2")
public class ServletDemo2 implements Servlet {
  @Override
  public void init(ServletConfig servletConfig) throws ServletException {

  }

  @Override
  public ServletConfig getServletConfig() {
      return null;
  }

  @Override
  public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
      System.out.println("servlet 3.0 注解实现!");
  }

  @Override
  public String getServletInfo() {
      return null;
  }

  @Override
  public void destroy() {

  }
}
  1. 启动tomcat 访问 http://localhost:8080/demo2
    5.控制台输出
servlet 3.0 注解实现!

Servlet的体系结构

前面我们的类都是实现servlet 接口 重写他的所有方法,但是,我们其实真正使用到的 一般只有service() 这一个方法 但是其他方法又不得不实现 这样的话代码阅读性不是很好


image.png

要想解决这个问题 我们需要了解一下servlet的体系结构

servlet体系结构图.png

根据API 我们知道 Servlet有一个抽象子类 叫做GenericServlet 它就能解决这个问题 根据源码 我们知道 他将servlet的那几个抽象方法都做了一个默认的空实现 只有service() 方法 还是一个抽象方法 需要我们去实现


GenericServlet 部分源码.png

于是我们 新建一个类 继承GenericServlet 重写service() 方法即可

@WebServlet("/demo2")
public class ServletDemo2 extends GenericServlet {

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("继承自GenericServlet");
    }
}

事实上 , 我们实际开发中使用servlet 并不会使用GenericServlet 而是会使用他的子类 HttpServlet 这个类
HttpServlet是 对HTTP协议的一种封装 ,在实际企业开发中 一般我们使用service() 方法 时 客户端会根据http协议提交一些数据信息 而提交方式有post get put .... 等7种方式 我们常用的一般是get 和post 的方式 , 而get 和post 方式提交的数据 service()方法中封装的位置和格式是不一样的 所以 所以在 实际开发中 执行service()方法时,我们得事先对客户端的请求方式进行判断 如下伪代码

voidservice(ServletRequest req, ServletResponse res){
// 判断请求方式 
String method = req.getMethod();
if("GET".equals(method)){
//get 方式获取数据
... 
}else if("POST".equals(method)){
    //post 方式获取数据
........
 }
}

所以实际开发中 无论如何 我们基本都得写如上代码 对客户端请求方式的判断 进行不同的逻辑处理 而HttpServlet 就是对如上代码进行的封装

HttpServlet service()方法的部分源码
HttpServlet 使用步骤
  1. 定义类 实现HttpServlet
  2. 重写doGet()/doPost()方法 即可
  3. 启动tomcat......
@WebServlet("/demo2")
public class ServletDemo2 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        System.out.println("doGet.... 执行");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost....... 执行");
    }
}

浏览器直接请求(默认get)
控制台直接打印

doGet.... 执行

浏览器post方式提交表单


表单提交
doPost.... 执行
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容