Servlet

Servlet:开发动态web的技术

全称Java Servlet。是用Java编写的服务器端程序,其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类。
API应用程序编程接口

如果你想开发一个servlet程序,只需要完成两个步骤:

  1. 编写一个类,实现servlet接口
  2. 把开发好的Java类部署到web服务器中

总结:把实现了servlet接口的Java程序叫做servlet。

HelloServlet

servlet接口 sun公司有两个默认的实现类:HttpServlet,GenericServlet

重写快捷键:CTRL+o,按shift可以多选

实例化快捷键alt+enter

步骤:

  1. 构建一个基本的maven项目。
  2. 删掉里面所有的东西:idea配置不能删,pom.xml不能删,src可以删
  3. 在项目里面建立Module。这个原始的空的就是maven的主工程。
  4. 配置maven中jar.和servlet依赖
 <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>

        </dependency>


        <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.1</version>

        </dependency>
        </dependencies>
  1. 关于maven父子工程:
    1.父项目中会有:module
      <modules>
        <module>Servlet-01</module>
    </modules>
    
    1. 子项目中会有parent
     <parent>
        <groupId>com.xin</groupId>
        <artifactId>javaweb-02-Servlet</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    
    1. 父项目中的Java子项目可以直接使用(多态)
  2. 把新建的maven里的main-web-inf-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_4_0.xsd"
         version="4.0"
         metadata-complete="true">

</web-app>
  1. 将maven文件搭建完整,新建Java目录
  2. 编写一个servlet程序
    1. 编写一个普通类
    2. 实现servlet接口,直接继承HttpServlet
public class HelloServlet extends HttpServlet {
    @Override
    //由于get.post只是请求实现的不同方式,可以相互调用,业务逻辑都一样
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      //  super.doGet(req, resp);
        //输出流,有输出就有输入
      //  ServletOutputStream outputStream = resp.getOutputStream();
        PrintWriter writer = resp.getWriter();//响应流
        writer.print("HelloServlet");
    }

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //super.doPost(req, resp);直接调用doget方法,只在上面写方法就可以了。
        doGet(req,resp);
    }
}
  1. 编写servlet的映射:我们写的是Java程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web服务器中注册我们写的servlet,还需要给他一个浏览器能够访问的路径。
    配置servlet
   //注册servlet
    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.xin.servlet.HelloServlet</servlet-class>
    </servlet>
    //请求路径
    <servlet-mapping>
	//需要和上方name一致
        <servlet-name>hello</servlet-name>
		//路径是用户访问的外部路径,只需要符合url路径规则即可。是动态web路径
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
  1. 配置tomcat
    注意配置项目发布的路径,不是上方的路径
  2. 启动测试
    屏幕截图 2025-08-23 184304
    在我们自己配置的tomcat路径下,输入我们在web.xml输入的路径地址,target中classes中就是我们编写Java类。

原理

Servlet是web服务器调用,web服务器在收到浏览器请求之后,会:
屏幕截图 2025-08-24 140919
web服务器就比如tomcat.

mapping

  1. 一个servlet可以指定一个映射路径

     <servlet-mapping>
        <servlet-name>hello</servlet-name> 
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    
  2. 一个servlet可以指定多个映射路径

     <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    
     <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello2</url-pattern>
    </servlet-mapping>
    
     <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello3</url-pattern>
    </servlet-mapping>
    
  3. 一个servlet可以指定通用映射路径

     <servlet-mapping>
        <servlet-name>hello</servlet-name>
    	//hello下的任何路径都可以被映射,即使是我们没写过的路径也可以,会直接映射hello里面的
        <url-pattern>/hello/*</url-pattern>
    </servlet-mapping>
    
  4. 默认请求路径:通配符:/* :会进入local host

  5. 指定一些后缀或者前缀:当去掉/,也就是*前面不能加映射路径。如:
    *。xin,运行tomcat时,先会进入localhost,当我们输入自己指定的后缀xin为路径,如abcd。xin,依旧会进入helloservlet。只要以指定后缀结尾,前面怎么加都可以。

  6. 优先级问题:
    指定了固有的映射路径优先级最高,没有指定的才会走到默认得到。

error

用来处理404情况

package com.xin.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class ErrorServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     //   super.doGet(req, resp);
        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        PrintWriter writer = resp.getWriter();
        writer.print("<h1>404</h1>");

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doPost(req, resp);
        doGet(req, resp);
    }

}

配置servlet

  <servlet>
   <servlet-name>error</servlet-name>
        <servlet-class>com.xin.servlet.ErrorServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>error</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

启动测试:
屏幕截图 2025-08-25 164345

若此时再输入我们自己指定的映射路径hello:
屏幕截图 2025-08-25 164405
因为指定的路径优先级高于默认的路径。

posted @ 2025-08-25 16:50  xixixixin  阅读(19)  评论(0)    收藏  举报