一、web.xml中有关servlet的配置

web.xml中Servlet的定义主要有两部分:

  • servlet:定义servlet名字与Servlet接口的实现类名,访问对应映射中的url时执行该类的service方法
  • servlet-mapping:servlet名字与访问url,形成一个映射,通过浏览器访问时使用此路径,本文使用的默认工程路径为:http://localhost:8080/myWeb/,则访问时使用:http://localhost:8080/myWeb/ms(/hs为映射中设置的路径)

在这里插入图片描述
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">
         
    <servlet> <!--servlet名字与类名(实现Servlet接口),访问对应映射中的url时执行该类的service方法-->
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>com.my.servlet.MyServlet</servlet-class>
    </servlet>
    <servlet-mapping> <!--自定义servlet名字与访问url,形成一个映射-->
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/ms</url-pattern> <!--代表资源路径-->
    </servlet-mapping>

    <servlet> 
        <servlet-name>MyHttpServlet</servlet-name>
        <servlet-class>com.my.servlet.MyHttpServlet</servlet-class>
    </servlet>
    <servlet-mapping> 
        <servlet-name>MyHttpServlet</servlet-name>
        <url-pattern>/mhs</url-pattern>
    </servlet-mapping>

</web-app>

二、自定义servlet类

1.直接实现Servlet接口

实现所有抽象方法(init,service,destroy等方法),显式定义无参构造器

package com.my.servlet;

import java.io.IOException;

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

/**
 * 功能描述
 *
 * @author yunweixiaocai
 * @since 2021-06-25
 */
public class MyServlet implements Servlet {
	// 自定义方法返回访问次数
    private static int times= 1;
    private static void printGoTimes(){
        System.out.print("第"+times+"次访问----");
    }
    public MyServlet() {
        printGoTimes();
        System.out.println("执行构造器方法");
    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        printGoTimes();
        System.out.println("执行init方法");
    }

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

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        printGoTimes();
        times++;
        System.out.println("执行service方法");
    }

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

    @Override
    public void destroy() {
        printGoTimes();
        System.out.println("执行destroy方法");
    }
}

浏览器输入url:http://localhost:8080/myWeb/ms,四次访问后返回:

[2021-06-25 11:37:09,609] Artifact myWebApplication:war exploded: Artifact is deployed successfully
[2021-06-25 11:37:09,609] Artifact myWebApplication:war exploded: Deploy took 567 milliseconds
第1次访问----执行构造器方法
第1次访问----执行init方法
第1次访问----执行service方法
第2次访问----执行service方法
第3次访问----执行service方法
第4次访问----执行service方法

初次访问时,实例化该类,构造方法与init只执行一次,service方法执行多次。

通过getMethod()方法获取请求方式:

页面myHtml.html实现post:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="http://localhost:8080/myWeb/hs" method="post">
        <input type="submit" value="转到hs" />
    </form>
</body>
</html>

在这里插入图片描述

使用上面的类改写service方法,通过service方法的第一个参数servletRequest可获得请求方式,实例代码如下

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        printGoTimes();
        times++;

        HttpServletRequest hsr = (HttpServletRequest)servletRequest;
        String method = hsr.getMethod();
        System.out.println(method);
        if ("get".toUpperCase().equals(method)) {
            System.out.println("get请求执行service方法");
        }else if("post".toUpperCase().equals(method)){
            System.out.println("post请求执行service方法");
        }
    }

点击按钮后输出:

1次访问----执行构造器方法
第1次访问----执行init方法
第1次访问----执行service方法
POST
post请求执行service方法

2.生产常用方式,继承HttpServlet类

定义页面myHtml.html放在web目录下,实现不同的请求方式:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="http://localhost:8080/myWeb/hs" method="post">
        <input type="submit" value="postBtn" />
    </form>
    <form action="http://localhost:8080/myWeb/hs" method="get">
        <input type="submit" value="getBtn" />
    </form>
</body>
</html>

页面显示如下:
在这里插入图片描述
根据重写方法执行对应请求的执行代码
在这里插入图片描述
代码示例:

package com.my.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyHttpServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //super.doGet(req, resp);
        System.out.println("doGetting");
    }

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

}

分别点击postBtn和getBtn后,输出:

doPosting
doGetting

三、idea中创建servlet类

包右键–>new->Create New Servlet
在这里插入图片描述
在这里插入图片描述

创建后,web.xml中自动定义一个servlet,需手动添加映射
在这里插入图片描述
默认类:

package com.my.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyServlet1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐