一、Servlet技术
1、什么是Servlet
1.Servlet是JaveEE规范之一,规范就是接口
2.Servlet是JavaWeb三大组件之一。三大组件分别是:Servlet程序、Filter过滤器、Listener监听器
3.Servlet是运行在服务器上的一个java小程序,它可以接收客户端发送来的请求,并响应数据给客户端
2、手动实现Servlet程序
1.编写一个类去实现Servlet接口
2.实现service方法,处理请求,并响应数据
3.到web.xml中去配置程序的访问地址
package com.first.cyh; import jakarta.servlet.*; import java.io.IOException; public class HelloServlet implements Servlet { @Override public void init(ServletConfig servletConfig) throws ServletException { } @Override public ServletConfig getServletConfig() { return null; } @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("Hello Servlet!"); } @Override public String getServletInfo() { return null; } @Override public void destroy() { } }
<?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"> <!--给Tomcat配置Servlet程序--> <servlet> <!--给Servlet程序起一个别名,一般是类名--> <servlet-name>HelloServlet</servlet-name> <!--Servlet程序的全类名--> <servlet-class>com.first.cyh.HelloServlet</servlet-class> </servlet> <!--给Servlet程序配置访问地址--> <servlet-mapping> <!--告诉服务器我当前配置的地址给哪个Servlet程序用--> <servlet-name>HelloServlet</servlet-name> <!-- 配置访问地址 /斜杠在服务器解析时表示地址为http://ip:port/工程路径 /hello表示地址为http://ip:port/工程路径/hello --> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>
3、通过注解配置访问路径url-pattern
Servlet3.0支持注解配置——@WebServlet()
不用再编写xml文件,只需要在实现了Servlet的类加上该注解即可
1.一个servlet可以配置多个访问路径@WebServlet({"/hello","/hi",“nihao”})
2.路径定义规则(xxx可以为*,即通配符)
1./xxx
2./xxx/xxx:多层路径,目录结构
3.*.do
通配符优先级低,会在匹配不到时才访问
4、url地址到Servlet程序的访问
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7L80toVE-1636276443278)(C:\Users\Ken-Chy\Desktop\大二临时\00自学部分\后端\笔记\url地址如何访问到Servlet程序.png)]
5、Servlet的生命周期
1.执行Servlet构造器方法
2.执行init初始化方法
- 第一、二步是在第一次访问的时候创建Servlet程序时才调用
3.执行service方法
- 每次访问都会调用
4.执行destroy销毁方法
- 在web工程停止的时候调用
6、GET和POST请求的分发处理
package com.first.cyh; import jakarta.servlet.*; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import java.io.IOException; public class HelloServlet implements Servlet { public HelloServlet() { System.out.println("你好鸭"); } @Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("初始化成功咯!"); } @Override public ServletConfig getServletConfig() { return null; } @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { //ServletRequest和HttpServletRequest是两个接口,HttpServletRequest继承自ServletRequest //此处的形式参数其实是HttpServletRequest接口的实现类,因为接口不能实例化,所以传进来的是实现类 //因为需要实现ServletRequest到HttpServletRequest的强制类型转换(父类到子类) //只有父类对象是用子类构造方法生成的才能实现强制转换,所以传进来的参数应该是HttpServletRequest接口的实现类 //强制类型转换,因为HTTPServletRequest接口才有getMethod方法来判断请求的类型 HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; String method = httpServletRequest.getMethod(); if(method.equals("GET")){ doGet(); } else if("POST".equals(method)){ doPost(); } } private void doGet() { System.out.println("我是GET请求"); } private void doPost() { System.out.println("我是POST请求"); } @Override public String getServletInfo() { return null; } @Override public void destroy() { System.out.println("拜拜QAQ"); } }
7、通过继承HttpServlet实现Servlet程序
一般在实际项目开发中,都是使用继承HttpServlet类的方式去实现Servlet程序
1.编写一个类去继承HttpServlet类(Servlet是接口,HttpServlet是类)
2.根据业务需要重写doGet()或doPost()方法
3.到web.xml中配置Servlet程序的访问地址
package com.first.cyh; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; public class HelloServlet2 extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("hello doPost"); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("hello doGet"); } }
<?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-name>HelloServlet</servlet-name> <servlet-class>com.first.cyh.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> <!--新增部分--> <servlet> <servlet-name>HelloServlet2</servlet-name> <servlet-class>com.first.cyh.HelloServlet2</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloServlet2</servlet-name> <url-pattern>/hello2</url-pattern> </servlet-mapping> </web-app>
8、使用IDEA创建Servlet程序
1.项目结构->Facets->点开Web工程->在底部“根源”处把选项勾上
2.在需要创建Servlet程序的软件包处右键新建->Servlet->为程序命名->去掉创建注解类选项的勾
3.配置文件自动生成改Servlet程序的配置->手动配置该Servlet程序访问路径
4.重写Servlet程序的doGet()和doPost()方法
9、Servlet的继承体系
Servlet接口
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-glUAuPVZ-1636276443280)(C:\Users\Ken-Chy\Desktop\大二临时\00自学部分\后端\笔记\Servlet接口.png)]
Servlet继承体系
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BMmnO2xE-1636276443282)(C:\Users\Ken-Chy\Desktop\大二临时\00自学部分\后端\笔记\Servlet继承关系.png)]
二、ServletConfig类
ServletConfig类是Servlet程序的配置信息类
二者都是由Tomcat负责创建,我们负责使用
Servlet程序默认是第一次访问时创建对象,而ServletConfig是每个Servlet程序创建时就创建一个对应的ServletConfig对象
1、ServletConfig类的三大作用
1.可以获取Servlet程序的别名servlet-name的值
2.获取初始化参数init-param
3.获取ServletContext对象
<!--给Tomcat配置Servlet程序--> <servlet> <!--给Servlet程序起一个别名,一般是类名--> <servlet-name>HelloServlet</servlet-name> <!--Servlet程序的全类名--> <servlet-class>com.first.cyh.HelloServlet</servlet-class> <!--init-param是初始化参数--> <!--新增部分--> <!--可以配置多个参数--> <init-param> <!--参数名--> <param-name>username</param-name> <!--参数值--> <param-value>root</param-value> </init-param> <init-param> <param-name>url</param-name> <param-value>jdbc:mysql//localhost/test</param-value> </init-param> <!--新增部分--> </servlet>
public class HelloServlet implements Servlet { @Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("初始化成功咯!"); //获取配置文件中servlet-name的值 System.out.println("servlet程序的别名是" + servletConfig.getServletName()); //获取配置文件中的初始化参数init-param System.out.println("初始化参数username的值是" + servletConfig.getInitParameter("username")); System.out.println("初始化参数url的值是" + servletConfig.getInitParameter("url")); //获取ServletContext对象 System.out.println(servletConfig.getServletContext()); } //其他方法省略 } //输出结果 /* 初始化成功咯! servlet程序的别名是HelloServlet 初始化参数username的值是root 初始化参数url的值是jdbc:mysql//localhost/test org.apache.catalina.core.ApplicationContextFacade@5cd687b4 */
2、注意事项
如果Servlet程序继承HttpServlet类时重写了init(ServletConfig config) throws ServletException方法,需要加上super.init(config)
//这是GenericServlet类(HttpServlet类的父类)中的方法 public void init(ServletConfig config) throws ServletException { this.config = config; this.init(); } public void init() throws ServletException { } public ServletConfig getServletConfig() { return this.config; }
public class HelloServlet2 extends HttpServlet { @Override //Tomcat生成ServletConfig对象并调用init程序 public void init(ServletConfig config) throws ServletException { //super.init(config); //如果没有调用父类的init(config)方法,则Tomcat创建的ServletConfig值丢失 //即config属性(定义在GenericServlet类中)没有保存值 System.out.println("doSth"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("hello doPost"); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("hello doGet"); //由于GenericServlet类中的config没有保存值,所以getServletConfig()方法出现空指针异常 ServletConfig servletConfig = getServletConfig(); System.out.println("Servlet程序的别名为" + servletConfig.getServletName()); } }