编写Servlet的方式

编写Servlet的方式

  • 1.方式一
    • 1.1编写Servlet的方式一
  • 2.方式二(IDE,继承HttpServlet)
    • 2.1编写Servlet的方式二
  • 3.方式三
    • 3.1编写Servlet的方式三
  • 4.方式四(IDEA和tomcat关联的方式)
    • 4.1编写Servlet的方式四
    • 4.2 IDEA设置部署目录
    • 4.3 IDEA设置部署说明

1.方式一

1.1编写Servlet的方式一

编写Servlet的方式_第1张图片
如果java文件的代码变更,一般选择第二个即可,但是有时候会失效,这个时候你可以再次选择第三个就ok了,或者说如果你的电脑性能比较好, 那么你可以每次都选择第三个。
编写Servlet的方式_第2张图片
编写Servlet的方式_第3张图片
FirstServlet.java

public class FirstServlet extends GenericServlet {

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("hello servlet");
    }
}

结果:
编写Servlet的方式_第4张图片

2.方式二(IDE,继承HttpServlet)

2.1编写Servlet的方式二

1.如果使用的是get请求去访问当前servlet,那么会进入到doGet方法中

使用的是post请求,那么会进入到doPost方法中
配置
编写Servlet的方式_第5张图片
表单页面位置
编写Servlet的方式_第6张图片

package com.cskaoyan.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
// 封装、继承、多态
public class SecondServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //super.doGet(req, resp);
        System.out.println("doget");
    }

    //如何让doPost方法执行到?
    //doGet, if the servlet supports HTTP GET requests
    //doPost, for HTTP POST requests
    //你需要使用post请求去访问当前servlet,就会执行该方法
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //super.doPost(req, resp);
        System.out.println("dopost");
    }
}

结果
编写Servlet的方式_第7张图片
编写Servlet的方式_第8张图片

问题1:既然每个servlet都有service方法,那么为什么继承httpServlet没有service?

因为父类里面有service方法,所以可以继承得到父类的该方法。

HttpServlet已经对service方法做出了实现。

问题2:为什么程序会执行到doGet或者doPost里面呢?
servlet程序的执行入口是什么?

一定要记住,是service方法。
service源代码

public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
    HttpServletRequest request;
    HttpServletResponse response;
    try {
        request = (HttpServletRequest)req;
        response = (HttpServletResponse)res;
    } catch (ClassCastException var6) {
        throw new ServletException("non-HTTP request or response");
    }

    this.service(request, response);
}
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String method = req.getMethod();
    long lastModified;
    if (method.equals("GET")) {
        lastModified = this.getLastModified(req);
        if (lastModified == -1L) {
            this.doGet(req, resp);
        } else {
            long ifModifiedSince;
            try {
                ifModifiedSince = req.getDateHeader("If-Modified-Since");
            } catch (IllegalArgumentException var9) {
                ifModifiedSince = -1L;
            }

            if (ifModifiedSince < lastModified / 1000L * 1000L) {
                this.maybeSetLastModified(resp, lastModified);
                this.doGet(req, resp);
            } else {
                resp.setStatus(304);
            }
        }
    } else if (method.equals("HEAD")) {
        lastModified = this.getLastModified(req);
        this.maybeSetLastModified(resp, lastModified);
        this.doHead(req, resp);
    } else if (method.equals("POST")) {
        this.doPost(req, resp);
    } else if (method.equals("PUT")) {
        this.doPut(req, resp);
    } else if (method.equals("DELETE")) {
        this.doDelete(req, resp);
    } else if (method.equals("OPTIONS")) {
        this.doOptions(req, resp);
    } else if (method.equals("TRACE")) {
        this.doTrace(req, resp);
    } else {
        String errMsg = lStrings.getString("http.method_not_implemented");
        Object[] errArgs = new Object[]{method};
        errMsg = MessageFormat.format(errMsg, errArgs);
        resp.sendError(501, errMsg);
    }

}

问题3:为什么要有doGet和doPost之分呢?

可以做一些更精细的划分。比如当前请求只允许post请求方式进行提交,那么我就可以把逻辑写在doPost里面,doGet不写对应的逻辑。

3.方式三

3.1编写Servlet的方式三

关于映射关系的配置,不仅可以通过web.xml方式,还可以通过注解的方式。

//@WebServlet(name = “thirdServlet”, urlPatterns = “/servlet3”)
//我们还可以进一步简化,因为我们发现其实name属性好像没啥用
//@WebServlet(urlPatterns = “/servlet3”)
//到这一步之后,还可以精简到底,如果括号里面只有一个值,那么默认表示的就是urlPattern

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//@WebServlet(name = "thirdServlet", urlPatterns = "/servlet3")
//我们还可以进一步简化,因为我们发现其实name属性好像没啥用
//@WebServlet(urlPatterns = "/servlet3")
//到这一步之后,还可以精简到底,如果括号里面只有一个值,那么默认表示的就是urlPattern
@WebServlet("/servlet3")
public class ThirdServlet extends HttpServlet {

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

    }

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

    }
}

4.方式四(IDEA和tomcat关联的方式)

4.1编写Servlet的方式四

在tomcat的三个可能有部署痕迹的地方都没有找到部署的迹象。

CATALINA_BASE:隐藏配置文件路径所在
编写Servlet的方式_第9张图片

可以理解为idea会复制tomcat的配置文件,然后再该目录下重新开启一个新的tomcat实例(记住结论即可,过程不需要掌握)。
编写Servlet的方式_第10张图片
编写Servlet的方式_第11张图片

4.2 IDEA设置部署目录

编写Servlet的方式_第12张图片
编写Servlet的方式_第13张图片

4.3 IDEA设置部署说明

  1. 开发目录和部署目录不是同一个目录,但是也不是毫无关联,因为开发目录里面web目录下的文件会再部署根目录里面出现
  2. 开发目录里面的java源代码文件,经过编译以后,也会出现再部署根目录的WEB-INF/classes目录下。
  3. 其中web(带有蓝色小点的目录为一个功能性目录),它做了如下的一个映射,其实是为了方便再部署根目录里面放置静态资源文件。

规则:

凡是再改web目录下出现的文件,最终再部署之前,都会原封不动地复制到部署根目录里面去。也就是说,如果今后你希望再部署根目录里面新建一个1.html,那么你只需要再这个web目录里面设置就可以了,因为再项目部署地时候,它会把1.html给复制到部署根目录里面去。

今后如果问你,如何去查找某个应用的部署根目录,应该如何去查找?artifacts

本质就是开发目录里面地文件会东拼西凑凑在一起,凑到out/artifacts/xxxx目录下,然后将这个目录部署在tomcat里面。

经常出现的一个问题

比如再开发环境的web目录下有一个1.html,然后通过tomcat部署,访问该1.html发现无法访问
1.确保开发目录里面的web是一个功能性目录
2.也会出现有时候开发目录里面的文件无法复制到部署根目录的情况。
此时可以先尝试这么做:

1.先重新部署,点击Redeploy

如果不行,那么执行

2.rebuild project,然后再次执行1

如果再实际过程中,此时还是不行,那么可以

3.把部署根目录全部删了,然后再次执行2,再次执行1

你可能感兴趣的:(Java,EE,Java,java,tomcat,servlet)