- 背景:本系列为个人学习复盘查漏补缺,并非从0至1的学习笔记。浏览学习不要以本系列概全局。
什么是servlet
1 servlet 是 javaee规范之一,规范就是接口
2 servlet 是 javaweb三大组件之一 三大组件分别是 servlet程序 filter 过滤器,listener 监听器
3 servelet 是运行在服务器上的一个java小程序,可以接受客户端发送过来的请求,并响应数据给客户端类关系图
手动实现一个servlet程序
1 编写一个类实现servlet接口 ```java package com.addicated.servlet_01;
import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import java.io.IOException;
public class servlet_01 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
// 获取servletname
System.out.println(servletConfig.getServletName()); // 用来获取该servlet程序在web.xml 中配置的别名
// 获取web.xml 中对一个servlet程序配置的初始化变量
System.out.println(servletConfig.getInitParameter("url"));
// 获取servletcontext对象
ServletContext servletContext = servletConfig.getServletContext();
}
@Override
public ServletConfig getServletConfig() {
return null;
}
/*
* @Author shihu
* @Description //TODO 专门用来处理请求和响应
* @Date 10:01 下午 2021/9/9
* @Param [servletRequest, servletResponse]
* @return void
**/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
// 当前存在问题,就是所有请求都会走service
// servletRequest 的父类中有getMethod方法 用来得到前端页面传来请求的类型
// 但是其本身并没有getMethod方法,这时候使用多太特性,向下转型,父类转子类
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
// 调用父类中的getMethod方法拿到请求类型和
String method = httpServletRequest.getMethod();
// 之后通过对method判断进行分别调用
if ("GET".equals(method)){
//get 代码
doGet();
}else if ("POST".equals(method)){
// post 代码
doPost();
}
// 但是上面这样写代码 如果请求中的逻辑很多的话,不方便维护。所以封装出来doGet doPost
System.out.println("hello addicated this is a servlet");
}
public void doGet(){
}
public void doPost(){
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
2 实现service请求方法,处理请求,并且响应数据<br />3 到web.xml 中进行servlet程序注册
```java
<?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">
<!-- context-param是上下文参数 属于整个web工程-->
<context-param>
<param-name>username</param-name>
<param-value>context</param-value>
</context-param>
<!--servlet 标签给tomcat配置servle程序-->
<servlet>
<!-- servlet name 标签,给servlet程序起一个别名 -->
<servlet-name>servlet_01</servlet-name>
<!-- servlet 的犬类名-->
<servlet-class>com.addicated.servlet_01.servlet_01</servlet-class>
<!-- 配置初始化参数-->
<init-param>
<param-name>url</param-name>
<param-value>jdbc:mysql//localhost:3306?</param-value>
</init-param>
</servlet>
<servlet>
<servlet-name>servlet02</servlet-name>
<servlet-class>com.addicated.servlet_02.servlet02</servlet-class>
</servlet>
<servlet>
<servlet-name>Servlet03</servlet-name>
<servlet-class>com.addicated.servlet_03.Servlet03</servlet-class>
</servlet>
<servlet>
<servlet-name>ContextServlet</servlet-name>
<servlet-class>com.addicated.servlet_4.ContextServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>Servlet05</servlet-name>
<servlet-class>com.addicated.servlet_4.Servlet05</servlet-class>
</servlet>
<servlet-mapping>
<!-- 标签作用告诉服务器,当前配置是给那个servlet程序来进行使用-->
<servlet-name>servlet_01</servlet-name>
<!-- 告诉服务器,访问该servlet程序的访问路径
/hello
/ 斜杠在服务器解析的时候表示地址为 http://ip:port/工程路径
/ hello 表示 工程路径/hello
-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>servlet02</servlet-name>
<url-pattern>/hello2</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ContextServlet</servlet-name>
<url-pattern>/ContextServlet</url-pattern>
</servlet-mapping>
</web-app>
常见的错误
- url-pattern 中的配置没有以 / 开头
- servlet 中 / 会被解析成为当前服务器中部署项目的地址
- 假如 端口为 8888 ,项目名为 addicated ,那么 / 在解析之后的地址其实是 localhost:8888/addicated/
- 也就不难理解为什么不加 / 会发生404 之类的错误,因为访问不到对应的servlet程序
- servlet 中 / 会被解析成为当前服务器中部署项目的地址
- 如果servlet-mapping 与上面servlet-class 中的值不一致,会报错,servlet-name不存在
-
servlet的生命周期
一个servlet程序创建的过程
执行servlet的构造方法
- 执行 init 初始化方法
- 前两步是在第一次访问时创建servlet会自动调用
- 执行service 方法处理请求
- 每次处理请求的时候出发
- 执行destory 方法
- web工程停止的时候触发