概述
文章目录
- 初识Servlet
- 1 Servlet 概述
- 2 第一个 Servlet 程序
- 2.3 Servlet 两种配置方式
- 2.3.1 web.xml xml文件方式配置
- 2.3.2 web.xml 配置 Tomcat 解析流程
- 2.3.3 @WebServlet 注解方式配置
- 2.3.4 @WebServlet 配置 Tomcat 解析流程
- 2.3.5 配置 Servlet 常见错误
- 2.4 Servlet 资源匹配规则
- 2.4.1 精准匹配
- 2.4.2 模糊匹配
- 2.4.3 允许多个资源名称对应一个 Servlet
- 2.4.4 模糊匹配数据截取调用方法案例
- 2.4.5 匹配规则错误
初识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/") 正确
最后
以上就是欢喜高山为你收集整理的初识Servlet,第一个Servlet项目的全部内容,希望文章能够帮你解决初识Servlet,第一个Servlet项目所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复