servlet原理

servlet原理

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

1.servlet简介

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

servlet中规定一个javaweb项目里面必须有WEB-INF文件夹和.html的页面

servlet中规定WEB-INF里面有classes,用来放置编译后的.class文件

servlet中规定WEB-INf里面有we.xml文件,用来配置请求和要执行的类文件的对应关系

servlet中规定WEB-INF中还有lib文件夹,用来存放jar文件,lib的名称也是规定的

servlet中规范了一个web项目的项目结构和文件结构

2.开发一个servlet规范的webapp

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

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

(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">
​
<servlet>
    <servlet-name>kxg</servlet-name>
    <servlet-class>com.bjpowernode.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>kxg</servlet-name>
    <url-pattern>/a/b/c</url-pattern>
</servlet-mapping>
​
</web-app>
​

(4)在classes文件夹中创建com/bjpowernode/servlet/HeloServlet.java文件,这个类就是我们要开发的逻辑程序,该类 必须实现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()在serlet中,不需要我们写
    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;
    }
}

(5)编译HelloServlet.java文件

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

(6)注册servlet,即配置web.cml文件

复制代码
<?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">
<!--配置请求路径和相应的serlvet类之间的关系-->
<!--servlet的响应信息-->
<servlet>
    <!--servlet的名称:这个名称自定义,见名知意即可-->
    <servlet-name>kxg</servlet-name>
    <!--servlet请求加载的类-->
    <servlet-class>com.bjpowernode.servlet.HelloServlet</servlet-class>
</servlet>
<!--servlet的映射信息-->
<servlet-mapping>
    <!--servlet的名称:要和上面的名称相同-->
    <servlet-name>kxg</servlet-name>
    <!--servlet的映射路径-->
    <url-pattern>/a/b/c</url-pattern>
</servlet-mapping>
​
</web-app>
​

注意:在浏览器中输入的地址URL:http://127.0.0.1:8080/crm/a/b/c,会通过解析请求路径,找到web.xml文件中对应的路径/a/b/c,那么就找到 servlet的名称是kxg,再找到kxg对应的请求加载类HelloServlet,即可执行该类中的service()方法

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

(8)启动成功后在浏览器地址栏中输入URL:http://127.0.0.1:8080/crm/a/b/c

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

(9)也可以通过网页来实现跳转,在index.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/crm/index.html

总结:

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

3.关于JavaEE的版本

  • JavaEE目前最高版本是JavaEE8

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

  • Apache把JavaEE换名了,以后不叫JavaEE了,以后叫做JakartaEE

  • JavaEE8版本升级之后的"JavaEE9",不再是"JavaEE9"这个名字了,叫做JakartaEE9(雅加达EE9)

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

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

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

相关推荐
Dest1ny-安全11 小时前
2026最新CTF知识库:12大Web漏洞深度文章+1156篇历年大赛WP+50+脚本+Payload速查 +AI/RAG离线在线知识库
java·学习·安全·web安全·servlet
tianyuanwo1 天前
Jenkins × Gerrit 集成:自动触发构建的全流程解析
运维·servlet·jenkins
勿芮介1 天前
【研发工具】Jenkins镜像源配置问题及解决方案
运维·servlet·jenkins
tang7451639622 天前
Huawei Cloud EulerOS 2.0(x8664)安装 Jenkins
java·servlet·jenkins
砍材农夫3 天前
物联网 基于netty核心实战-心跳保活机制
java·后端·物联网·struts·servlet·netty
李少兄3 天前
深入理解 Web 服务器、Servlet 容器与现代 Java Web 架构
java·服务器·servlet
范什么特西12 天前
idea里面jsp找不到图片
java·开发语言·servlet
多敲代码防脱发12 天前
Spring进阶(Bean的生命周期与Bean的后处理器)
java·服务器·开发语言·spring boot·spring·servlet
甲方大人请饶命13 天前
Java-面向对象进阶之接口与内部类
java·开发语言·servlet