Servlet原理
注:以下内容均是以纯手动的方式来模拟开发javaweb项目的过程,通过这个过程来理解servlet的执行原理,不需要idea开发工具
1.什么是servlet?
servlet是一套开发javaweb项目的规范,也就是javaEE中的一部分,这个规范中说明了webapp开发要遵循什么
servlet中规定了一个javaweb项目里必须有WEB-INF文件夹和.html的页面
servlet中规定WEB-INF里面有classes,用来放置编译后的.class文件
servlet中规定WEB-INF里面有web.xml,用来配置请求和要执行的类文件的对应关系
servlet中规定WEB-INF中还有lib文件夹,用于存放jar文件,lib的名称也是规定的
servlet中规范了一个web项目的项目结构和文件结构
2.开发一个servlet规范的webapp步骤
2.1.在Tomcat服务器中找到webapps,在webapps中创建一个项目test,test就是项目的根
2.2..在crm项目中创建WEB-INF文件夹和index.htnl页面
注:这个WEB-INF文件夹名称不可改,页面名称可改
这里的html页面中我写入了一个a标签
(下面的跳转路径需要在注册servlet的时候,也就是配置web.xml文件更改)
<!doctype html> <html> <head> <mate charset="utf-8"> <title>index</title> </head> <body> <!--<a href="http://127.0.0.1:8080/test/a/b/c">servlet</a >--> <!--端口号及之前的内容可以省略--> <a href="/test/a/b/c">servlet</a> </body> </html>2.3.在WEB-INF中创建classes文件夹和lib文件夹和web.xml文件
这里的web.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" metadata-complete="true"> </web-app>2.4.在classes文件夹中创建com/bjpowernode/servlet/HelloServlet.java文件(前面创建的分包也是为了模拟servlet),这个类就是我们要开发的逻辑程序,该类必须实现Servlet接口,因为该类是一个复合servlet规范的实现类,该类层级如下
类中程序如下
package com.bjpowernode.servlet; //导入servlet包中的接口 //现在用的是javaEE8-的版本,包名为javax.servlet.*; //如果是javaEE9+的版本,包名为jakarta.servlet.*; import javax.servlet.*; import java.io.IOException; import java.io.PrintWriter; //我们自己的类必须实现Servlet接口 public class HelloServlet implements Servlet{ //实现了servlet接口中的5个方法 public void init(ServletConfig config) throws ServletException{} //调用时会自动执行service方法,main()方法在servlet中,不需要我们写 public void service(ServletRequest request,ServletResponse response) throws ServletException,IOException{ //打印文本信息在Tomcat控制台 System.out.println("hello,my servlet!"); //指定响应的内容类型为文本或html代码,必须写流前面 response.setContentType("text/html"); //创建一个流来把文本信息输出在浏览器中 PrintWriter out=response.getWriter(); //打印在浏览器中 out.print("print my servlet."); //打印在浏览器中,浏览器会自动解析html标签 out.print("<h1>one servlet</h1>"); } public void destroy(){} public String getServletInfo (){ return ""; } public ServletConfig getServletConfig() { return null; } }2.5.编译HelloServlet.java文件找到该文件,在地址栏输入cmd回车,进入dos命令窗口
输入javac HelloServlet.java,回车编译,编译成功后会在同一位置有一个HelloServlet.class可执行文件
2.6.注册servlet,即配置web.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" metadata-complete="true"> <!--配置请求路径和响应的servlet类之间的关系--> <!--servlet的响应信息--> <servlet> <!--servlet的名称 名称自定义,见名知意即可--> <servlet-name>ServletTest</servlet-name> <!--servlet请求加载的类 相当于加载类的路径--> <servlet-class>com.bjpowernode.servlet.HelloServlet</servlet-class> </servlet> <!--servlet的映射信息--> <servlet-mapping> <!--servlet的名称 和上方的名称要相同--> <servlet-name>ServletTest</servlet-name> <!--servlet的映射路径--> <url-pattern>/a/b/c</url-pattern> </servlet-mapping> </web-app>注:在浏览器中输入的地址ULR:http:127.0.0.1:8080/test/a/b/c会通过解析请求路径,找到web.xml文件中的对应路径,那么就找到了servlet的名称是ServletTest,再找到ServletTest对应的请求加类HelloServlet,即可执行该类中的servlet()方法
2.7.启动Tomcat服务器:在dos中输入startup.bat
显示服务器启动后即可,但是不要关掉服务器,也就是别给下面这个窗口叉了
2.8.启动成功后在浏览器地址栏中输入URL:http:127.0.0.1:8080/test/a/b/c
在Tomcat后台就会打印:hello,my servlet!
2.9.也可以通过网页在实现跳转
启动Tomcat后,在浏览器地址栏输入URL:http//localhost:8080/crm/index.html
就可以进入我们一开始写的和WEB-INF同级的index.html页面了
点击链接后跳转
开发一个webapp,其实就是写了一个实现Servlet接口的类,然后在web.xml中配置该类和请求路径的事件的关系即可调用
JavaEE版本
JavaEE目前最高的版本是JavaEE8
JavaEE被Oracle捐献了,Oracle将JavaEE规范捐献给Apache了
Apache把JavaEE换名了,叫JakartaEE
以后没有javaEE了,只有jakartaEE
JavaEE8升级之后的"JavaEE9",不再是"JavaEE9"这个名字了,叫JakartaEE9(雅加达EE9)
javaEE8的时候对应的Servlet类名是:java.servlet.Servlet
JakartaEE9的时候对应的Servlet类名是:jakarta.servlet.Servlet(包名都换了)
如果你之前的项目还是再使用javax.servlet.Servlet,那么你的项目无法直接部署到Tomcat10+版本上。你只能部署到Tomcat9上,以及9之前的版本都能够识别javax.servlet这个包
