JavaWeb——Servlet开发1

Java Servlet是运行在服务器端上的程序,Servlet是Java Servlet包中的一个接口,能够直接处理和相应客户端的请求,也可以将工作委托给应用的其他类。

public interface Servlet {
    void init(ServletConfig var1) throws ServletException;

    ServletConfig getServletConfig();

    void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

    String getServletInfo();

    void destroy();
}

  这是Java Servlet包中的Servlet接口的源代码,init方法用于初始化,service用于响应请求,destroy用于销毁该Servlet。

public abstract class HttpServlet extends GenericServlet {
    public HttpServlet() {
    }

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

    protected long getLastModified(HttpServletRequest req) {}

    protected void doHead(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException}

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

    protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{    }

    protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{}

    private Method[] getAllDeclaredMethods(Class<? extends HttpServlet> c) {}

    protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}

    protected void doTrace(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}

    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}

    private void maybeSetLastModified(HttpServletResponse resp, long lastModified) {}

    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {}
}

  这是Java Servlet包中的HttpServlet的所有方法(具体实现我删掉了),

  • 可以看到HttpServlet继承自GenericServlet,GenericServlet是一个实现了Servlet接口的抽象类,不过GenericServlet只是添加了一些用于日志操作的和从应用和Servlet配置中获取信息的方法。
  • HttpServlet提供了响应每种Http方法类型的实现。

1、使用maven引入Java Servlet包

    <!-- servlet -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>

2、实现一个基本的HttpServlet类。

  创建一个继承自HttpServlet的HelloServlet类,这里调用参数HttpServletResponse中的getWriter方法,获得一个Java.io.PrintWriter.接下来再调用PrintWriter的println方法向输出流中输入文本“helloworld”+Serlet的名字

  这里的初始化仅仅只是添加了输出几句话而已,平常我们可以选择什么都不做。

public class HelloServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().println("helloworld" + this.getServletName());
    }


    @Override
    public void init() throws ServletException {
        System.out.println("Servlet " + this.getServletName() + "has started");
    }

    @Override
    public void destroy() {
        System.out.println("Servlet " + this.getServletName() + "has stopped");
    }
}

3、部署Servlet

  打开Web.xml。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
         http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1" id="data-fabric-web-tool">

  <display-name>Hello World Application</display-name>
  
  <servlet>
    <servlet-name>firstServlet</servlet-name>
    <servlet-class>servlet.HelloServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>firstServlet</servlet-name>
    <url-pattern>/first</url-pattern>
  </servlet-mapping>

</web-app>

  其中<servlet></servlet>和<servlet-mapping></servlet-mapping>是部署的关键,而且它两是一一对应的。

  <servlet-name>是Servlet的名字,这里是任意设定的。

  <servlet-class>是使用的类

  <load-on-startup>的用处是,如果多个Servlet包含了该标签那么它们将按照标签内的大小顺序启动,数字越大启动得越晚。

  所以<servlet></servlet>就是将一个<servlet-class>中的servlet类命名为<servlet-name>这样应用程序运行的时候就会启动这个servlet

  <servlet-mapping></servlet-mapping>中的<servlet-name>和<url-pattern>配置之后,所有访问应用程序的URL/first都将由firstServlet处理。

  <servlet>
    <servlet-name>firstServlet</servlet-name>
    <servlet-class>servlet.HelloServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet>
    <servlet-name>secondServlet</servlet-name>
    <servlet-class>servlet.HelloServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>firstServlet</servlet-name>
    <url-pattern>/first</url-pattern>
    <url-pattern>/third</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>secondServlet</servlet-name>
    <url-pattern>/second</url-pattern>
  </servlet-mapping>

  我们甚至可以这么来设置部署,这里的意思是一个Servlet可以使用不同的URL进行访问,如果两个Servlet有着相同的逻辑,但链接到不同的数据库,我们可以使用相同的类。

  所以最后实现了两个Servlet的实例,它们使用的是相同的Servlet类,名字不同,被映射到了不同的URL上,而且这里有两个不同的URL指向firstServlet。

4、使用Tomcat+IDEA运行测试

  点击Run,添加Tomcat Server,在Deployment中点击+号,点击Aetifact添加项目,修改Application context,下图这样运行项目的时候浏览器可以通过这个"http://localhost:8080/hello-world/"URL进行访问

5、效果

原文地址:https://www.cnblogs.com/xxbbtt/p/8327843.html