Servlet原理

这里是用纯手动的方式 来模拟开发javaweb项目的过程,通过这个过程来理解servlet的执行原理。不需要idea开发工具。


1、Servlet简介

Servelt是一套开发javaweb项目的规范,也就是javaEE中的一部分。这个规范说明了webapp开发应该遵循什么。

  • Servlet中规定一个javaweb项目里面必须有WEB-INF文件夹 和**.html** 的页面
  • Servlet中规定WEB-INF里面有classes文件夹 ,用来放置编译后的.class文件
  • Servlet中规定WEB-INF里面有web.sml文件 ,用来配置请求要执行的类文件的对应关系
  • Servlet中规定WEB-INF中还有lib文件夹 ,用来存放jar文件,lib的名称也是固定的
  • Servlet中规范了一个web项目的项目结构和文件结构

2、开发一个Servlet规范的webapp

(1)在Tomcat服务器中找到webapps,在webapps中创建一个项目mmgf,mmgf就是项目的根


(2)在mmgf项目中创建WEB-INF文件夹和index.html页面


(3)在WEB-INF中创建classes文件夹,lib文件夹和web.xml文件

web.xml是从其他项目中复制过来的,里面的内容如下

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>

(4)在classes文件夹中创建com/bjpowernode/servlet/HelloServlet.java文件,这个类就是我们要开发的逻辑程序,该类必须实现Servlet接口,因为该类是一个符合Servlet规范的实现类。

类中的程序如下:

注意:程序中有中文注释的时候不可编译,注释只可在记忆的时候存在,不能在编译时存在

java 复制代码
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>welcome my servlet</h1>");
  	}
	public void destroy(){}
	public String getServletInfo (){
		return "";
	}
	public ServletConfig getServletConfig() {
		return null;
    }
}

以下代码可直接食用:

java 复制代码
package com.bjpowernode.servlet;

import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;

public class HelloServlet implements Servlet{
    public void init(ServletConfig config) throws ServletException{}
	public void service(ServletRequest request,ServletResponse response) throws ServletException,IOException{
       	System.out.println("hello,my servlet!");
		response.setContentType("text/html");
		PrintWriter out=response.getWriter();
		out.print("print my servlet.");
		out.print("<h1>welcome my servlet</h1>");
  	}
	public void destroy(){}
	public String getServletInfo (){
		return "";
	}
	public ServletConfig getServletConfig() {
		return null;
    }
}

(5)编译HelloServlet.java文件

找到该文件,在地址栏输入cm→回车→进入到dos命令窗口→输入javac HelloServlet.java→回车→编译成功后会在与.java文件同一位置生成一个HelloServlet.class的可执行文件


(6)注册Servlet,即配置web.xml文件

注意:程序中有中文注释的时候不可编译,注释只可在记忆的时候存在,不能在编译时存在

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>mmgj</servlet-name>
    <!-- servlet请求加载的类 -->
	<servlet-class>com.bjpowernode.servlet.HelloServlet</servlet-class>
</servlet>
<!-- servlet的映射信息 -->
<servlet-mapping>
    <!-- servlet的名称:要与上面的名称一致 -->
	<servlet-name>mmgj</servlet-name>
    <!-- servlet的映射路径 -->
	<url-pattern>/d/e/f</url-pattern>
</servlet-mapping>

</web-app>

以下代码可直接食用:

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-name>mmgj</servlet-name>
	<servlet-class>com.bjpowernode.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>mmgj</servlet-name>
	<url-pattern>/d/e/f</url-pattern>
</servlet-mapping>

</web-app>

注意:在浏览器中输入的地址(URL):http://127.0.0.1:8080/mmgf/d/e/f

会通过解析请求路径找到web.xml文件中对应的路径/d/e/f,就找到了servlet的名称mmgj,那么就找到mmgj对应的请求加载类HelloServlet,即可执行该类中的service()方法


(7)启动Tomcat服务器:在dos中输入startup.bat

当然也可以在Tomcat/bin目录下找到startup的启动方式,双击即可运行

startup.bat是应用于windows端的启动方式,startup.sh是应用于Linux或macOs系统的启动方式。


(8)启动成功后,在浏览器地址栏中输入URL:http://127.0.0.1:8080/mmgf/d/e/f

在Tomcat后台即可打印:hello,my servlet


(9)也可以通过网页来实现跳转,在index.html中使用超链接即可

html 复制代码
<!DOCTYPE html>
<html>
	<head>
		<mate charset="utf-8"/>
		<title>index</title>
	</head>
	<body>
        	<!--<a href="http://127.0.0.1:8080/crm/a/b/c">servlet</a >-->
        	<!--端口号及之前的内容可以省略-->
		<a href="/crm/a/b/c">servlet</a >
	</body>
</html>

启动Tomcat后,在浏览器地址栏输入URL:http://localhost:8080/mmgf/index.html


3、总结

开发一个webapp其实就是写了一个实现Servlet接口的类 ,然后在web.xml中配置该类和请求路径之间的关系即可调用。


4、关于JavaEE的版本

  • JavaEE目前最高版本是JavaEE8

  • JavaEE被Oracle捐献了,Oracle将JavaEE规范捐献给了Apache。

  • Apache把JavaEE换名了,不再叫做JavaEE了,加JakartaEE。

  • JavaEE8后没有JavaEE了,再往后的都叫做JakartaEE。

  • JavaEE8版本升级后的"JavaEE9",不再叫做"JavaEE9",而是JakartaEE9(雅加达EE9)

  • JavaEE8的时候对应的Servlet类名是:javax.servlet.Servlet

  • JakartaEE9的时候对应的Servlet类名是:jakarta.servlet.Servlet(包名也更换了)

  • 如果之前的项目还是在使用javax.servlet.Servlet,那么项目就无法直接部署到Tomcat10及以上的版本。只能部署到Tomcat9及以下的版本上。在Tomcat9及以下的版本中还是能够识别javax.servlet这个包

相关推荐
lifewange4 小时前
Jenkins Windows MSI 安装包完整安装教程
windows·servlet·jenkins
我登哥MVP6 小时前
【SpringMVC笔记】 - 6 - RESTFul编程风格
java·spring boot·spring·servlet·tomcat·maven·restful
我登哥MVP1 天前
【SpringMVC笔记】 - 5 - View
java·spring boot·spring·servlet·tomcat·maven·intellij-idea
我登哥MVP1 天前
【SpringMVC笔记】 - 4 - 三个域对象
java·spring boot·spring·servlet·tomcat·maven·intellij-idea
HoneyMoose2 天前
Jenkins Cloudflare 部署提示错误
java·servlet·jenkins
我登哥MVP2 天前
【SpringMVC笔记】 - 2 - @RequestMapping
java·spring boot·spring·servlet·tomcat·intellij-idea·springmvc
我登哥MVP2 天前
【SpringMVC笔记】 - 3 - 获取请求数据
java·spring boot·spring·servlet·tomcat·maven·intellij-idea
天若有情6734 天前
颠覆C++传统玩法!Property属性与伪类,开辟静态语言新维度
java·c++·servlet
freewlt5 天前
OpenClaw 工作流自动化实战:打造你的智能定时任务中心
运维·servlet·自动化