初识Servlet,第一个Servlet项目

初识Servlet

1 Servlet 概述

	Java WEB 相关技术 Server Applet 服务器小程序 ==> Servlet 类型。JavaWEB项目的核心组成部分。提供的能力是处理用户请求(ServletRequest) 以及用户响应(ServletResponse),有大量配套方法和处理方式。用户和服务器数据衔接,传递的核心组成部分。
	
	JavaWEB 三大核心组件:;
		Servlet 【重点】
		Filter 过滤器
		Listener 监听器

2 第一个 Servlet 程序

使用idea新建一个idea项目,配置依赖
在这里插入图片描述

package com.qfedu.a_servlet;

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;
/**
 * 完成 Servlet 程序流程
 *      1. extends 继承 HttpServlet
 *      2. 【重写】 Override
 *          doGet 方法对应用户提交数据请求方式为 GET 请求方式
 *          doPost 方法对应用户提交数据请求方式为 POST 请求方式
 *      3. doPost 方法重写内容
 *          调用当前 Servlet 程序重写的 doGet 方法
 *      4. doGet 方法重写内容
 *          利用 HttpServletResponse 响应对象给予用户(浏览器)数据反馈
 *      5. 注册资源名称【重点重点重点】
 *          Servlet 项目不再是 IDEA 直接运行,而是需要打包(war)到 Tomcat 服务器,服务器解析之后
 *          程序准备就绪,用户需要通过浏览器和对应的资源 URL 访问请求当前资源。当前 Servlet 程序
 *          资源需要在 Tomcat 服务器上进行注册!!!
 *          利用注解(Servlet 2.X  以上版本支持)
 *          TODO Servlet 版本信息尚未明确
 *      6. 启动服务器请求资源,验证操作
 *          浏览器 URL
 *              http://localhost:8080/Day37/hello
 * @author Anonymous 2022/6/8 11:37
 */
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    /*
    doGet 和 doPost 方法参数都是
        HttpServletRequest 符合 HTTP 协议 Servlet 规范的 请求类对象
        HttpServletResponse 符合 HTTP 协议 Servlet 规范的 响应类对象
    Tomcat 服务器在用户请求当前资源之后,会根据用户请求创建对应的 Request 对象,同时【绑定】对应请求的 Response 响应对象
    同时交给 Servlet 程序处理使用。
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 利用响应 Response 对象获取输出流 发送数据到浏览器
        resp.getWriter().append("<h1 style='color:yellowgreen'>Hello Servlet</h1>");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // doPost 方法调用当前类重写的 doGet 方法
        doGet(req, resp);
    }
}
2.3 Servlet 两种配置方式
2.3.1 web.xml xml文件方式配置

通过 JavaWEB 规范约束的 XML 文件对整个 Java WEB Application 进行配置操作。

web.xml 配置项目是可以使用到 任何一个 Servlet 版本

<?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">
    <!--
     web-app 存在大量的  xmlns ==> XML NameSpace XML 命名空间 可以认为是引入
     第三方规范的 XML 标准,或者是约束当前 XML 文件功能
     schemaLocation XML-schema 约束对应 约束文件所在 URL
     -->
    <!--  Servlet 标签,用于明确 Servlet 名称和 Servlet 程序对应的完整包名.类名  -->
    <servlet>
        <!--  servlet-name 在整个 web.xml 文件中 servlet-name 不可以重复,一般情况下是对应的类名 -->
        <servlet-name>WebXMLConfigServlet</servlet-name>
        <!-- 对应 Servlet 程序的完整的包名.类名 -->
        <servlet-class>com.qfedu.b_servletconfiguration.WebXMLConfigServlet</servlet-class>
    </servlet>

    <!-- servlet 程序映射标签,要求明确对应的 servlet-name 是哪一个, 同时明确当前servlet程序对应的资源名 -->
    <servlet-mapping>
        <!-- servlet-name 要求必须匹配一个 servlet 标签中的 servlet-name,绑定 servlet 标签和 servlet-mapping标签 -->
        <servlet-name>WebXMLConfigServlet</servlet-name>
        <!-- 当前 Servlet 程序注册的名称,要求在整个 web.xml 文件中唯一 -->
        <url-pattern>/webXML</url-pattern>
    </servlet-mapping>
</web-app>
package com.qfedu.b_servletconfiguration;

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

/**
 * 通过 web.xml 配置 Servlet 程序
 *
 * web.xml 在 项目根目录/web/WEB-INF/web.xml
 *
 * 流程:
 *      1. 继承 HttpServlet
 *      2. web.xml 文件配置 Servlet ,完成在 Tomcat 中的资源注册
 *
 * @author Anonymous 2022/6/8 14:50
 */
public class WebXMLConfigServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().append("<h1>Web.xml Config Servlet</h1>");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
2.3.2 web.xml 配置 Tomcat 解析流程

在这里插入图片描述

2.3.3 @WebServlet 注解方式配置
package com.qfedu.b_servletconfiguration;

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 注解明确当前 Servlet 资源名称以及其他相关内容
 *
 * @author Anonymous 2022/6/8 15:32
 */
@WebServlet("/anno")
public class AnnotationConfigServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().append("<h1>@WebServlet Annotation Config Servlet</h1>");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
2.3.4 @WebServlet 配置 Tomcat 解析流程

在这里插入图片描述

2.3.5 配置 Servlet 常见错误

url-pattern 注册资源名称错误

url-pattern 配置错误
在这里插入图片描述

配置信息错Tomcat启动错误情况

在这里插入图片描述

url-pattern 注册资源名称冲突

在这里插入图片描述

同名url-pattern错误信息
在这里插入图片描述

2.4 Servlet 资源匹配规则
2.4.1 精准匹配
注解方式:
		@WebServlet("/laohei")
	web.xml
		<url-pattern>/laohei</url-pattern>
	要求必须 / 开头。并且名称中没有通配符	
2.4.2 模糊匹配
注解方式:
	@WebServlet("*.do")
web.xml
	<url-pattern>*.do</url-pattern>
要求资源名称必须是 .do 结尾即可,可以用于动态操作
2.4.3 允许多个资源名称对应一个 Servlet
tips:
	匹配规则中允许一个 Servlet 程序对应多个 url-pattern 注册资源名称
	注解方式:
	 	@WebServlet(value = {"/laohei", "/feri"})
	web.xml
	<servlet-mapping>
		<url-pattern>/laohei</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<url-pattern>/feri</url-pattern>
	</servlet-mapping>
2.4.4 模糊匹配数据截取调用方法案例
package com.qfedu.c_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;
import java.lang.reflect.InvocationTargetException;

/**
 * 模糊匹配
 *
 * @author Anonymous 2022/6/8 16:47
 */
@WebServlet("*.do")
public class UrlPatternTestTwoServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /*
        super.doGet(req, resp);
        HTTP Status 405 – Method Not Allowed
         */
        // 从用户请求对应的 HttpServletRequest 对象中获取用户请求资源信息
        String requestURI = req.getRequestURI();
//        System.out.println("用户请求资源信息:" + requestURI);
        String methodName = requestURI.substring(requestURI.lastIndexOf("/") + 1, requestURI.lastIndexOf("."));

        try {
            this // 表示当前 Servlet 程序
                    .getClass()
                    .getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class)
                    .invoke(this, req, resp);
        } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
            e.printStackTrace();
        }


        resp.getWriter().append("<h1>Feri so Sexy!!!</h1>");
    }

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

    public void addStudent(HttpServletRequest req, HttpServletResponse resp) {
        System.out.println("addStudent Method Called");
    }

    public void studentOrder(HttpServletRequest req, HttpServletResponse resp) {
        System.out.println("studentOrder Method Called");
    }

    public void deleteStudent(HttpServletRequest req, HttpServletResponse resp) {
        System.out.println("deleteStudent Method Called");
    }

    public void removeStudent(HttpServletRequest req, HttpServletResponse resp) {
        System.out.println("removeStudent Method Called");
    }

    public void findStudent(HttpServletRequest req, HttpServletResponse resp) {
        System.out.println("findStudent Method Called");
    }
}
2.4.5 匹配规则错误
/**
 * /*.do 不允许!!!
 * /user/*.do 不允许!!!
 * user/*.do 不允许!!!
 *
 * 模糊匹配和精确匹配不能融合
 *
 * /user/ 期望完成资源的虚拟路径分配
 *
 * @author Anonymous 2022/6/8 17:01
 */
@WebServlet("/*.do ") 错误
@WebServlet("/user/*.do") 错误 
@WebServlet("user/*.do") 错误
@WebServlet("/user/") 正确

ServletRequest req, HttpServletResponse resp) {
System.out.println(“findStudent Method Called”);
}
}


###### 2.4.5 匹配规则错误

```java
/**
 * /*.do 不允许!!!
 * /user/*.do 不允许!!!
 * user/*.do 不允许!!!
 *
 * 模糊匹配和精确匹配不能融合
 *
 * /user/ 期望完成资源的虚拟路径分配
 *
 * @author Anonymous 2022/6/8 17:01
 */
@WebServlet("/*.do ") 错误
@WebServlet("/user/*.do") 错误 
@WebServlet("user/*.do") 错误
@WebServlet("/user/") 正确
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值