• 【JavaEE】_Servlet程序的编写方法


    目录

    1. 创建项目

    2. 引入依赖

    3. 创建目录结构

    3.1 在main目录下创建一个webapp目录

    3.2 在webapp目录下创建一个WEB-INF目录

    3.3 在WEB-INF目录下创建一个web.xml文件

    3.4 在web.xml中进行代码编写

    4. 编写代码

    4.1 在java目录下创建类

    4.2 打印"hello world"

    4.2.1 在服务器控制台上打印

    4.2.2 在客户端打印

    4.2.3 在新建类的首行添加注解

    5. 打包程序

    6. 部署程序

    7. 验证


    Servlet其实是较早的编写方式,当今Spring对Servlet进行了进一步封装,从而令编写网站更简单了。现在的Java商业级开发基本都以Spring为主。Spring是基于Servlet实现的,本篇介绍Servlet程序的编写方法,以Servlet的hello world程序为例

    一个Servlet程序的编写需要以下7个步骤:

    1. 创建项目

    此处需要创建一个maven程序了,maven是一个Java中知名的构建工具,其主要作用如下:

    ① 规范目录结构; ② 管理依赖(如处理使用的第三方库);③ 构建;④ 打包;⑤ 测试;

    idea已经集成了Maven,可以无需额外安装;

    注意查看maven的项目结构:

    2. 引入依赖

    Servlet的API是tomcat提供的,而不是jdk提供的,即是一个第三方库。

    引入依赖即引入servlet对应的jar包,首先进入maven仓库,搜索servlet:

    maven仓库链接如下:

    https://mvnrepository.com/

    选中maven,复制代码将其粘贴至pom.xml文件中:

    注意:

    (1)复制粘贴的代码是不包含dependencies标签的,需要在project顶级标签下创建dependencies标签后,将复制来的代码粘贴至该标签内

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    5. <modelVersion>4.0.0modelVersion>
    6. <groupId>org.examplegroupId>
    7. <artifactId>hello_servletartifactId>
    8. <version>1.0-SNAPSHOTversion>
    9. <properties>
    10. <maven.compiler.source>8maven.compiler.source>
    11. <maven.compiler.target>8maven.compiler.target>
    12. properties>
    13. <dependencies>
    14. <dependency>
    15. <groupId>javax.servletgroupId>
    16. <artifactId>javax.servlet-apiartifactId>
    17. <version>3.1.0version>
    18. <scope>providedscope>
    19. dependency>
    20. dependencies>
    21. project>

    也把这一段配置称为该依赖在maven仓库的坐标; 

    (2)首次使用时字体颜色为红色,说明尚未下载完成,一般只要粘贴进来,idea的maven就会自动刚出发依赖下载,下载结束后则不再是红色字体,如果长时间红色字体仍未变更,可在右侧面板进行强制刷新

     

    (3)servlet版本与tomcat版本对应表,请查看官网,链接如下:

    Apache Tomcat® - Which Version Do I Want?

    (4)此操作的jar包就被下载到了Maven本地仓库,如果本机安装了Maven,Maven就会在本机上创建一个目录保存下载好的jar包,可以在idea中查看本地Maven仓库路径:

    根据该路径查看:

    3. 创建目录结构

    虽然maven已经帮助我们自动地创建了一些目录,但是还不够,此处需要使用maven开发一个web程序,还需要别的目录:

    3.1 在main目录下创建一个webapp目录

    (Directory)

    3.2 在webapp目录下创建一个WEB-INF目录

    (方法同上)(Directory)

    3.3 在WEB-INF目录下创建一个web.xml文件

    (File)

    创建完毕后的src目录结构如下:

    3.4 在web.xml中进行代码编写

    1. web-app PUBLIC
    2. "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    3. "http://java.sun.com/dtd/web-app_2_3.dtd" >
    4. <web-app>
    5. <display-name>Archetype Created Web Applicationdisplay-name>
    6. web-app>

    这段代码可以视为固定代码,当前不需要进行调整;

    注:(1)servlet程序和以往的代码相比,有一个非常大的区别:没有main方法;

    servlet程序类似没有发动机的车厢,想要运行就要靠车头有带动,而tomcat就是车头;

    将写好的servlet程序复制粘贴至webapps目录下,就相当于是把车厢挂到车头后了。

    tomcat识别其webapps目录下哪些车厢需要靠车头带动,哪些不需要带动,就是靠目录下的WEB-INF/web.xml;

    即:web.xml文件的作用是让tomcat能够识别的当前代码为webapp,并进行加载

    (2)pom.xml的标红才是插件下载问题,对于其他语言,如:xml,  html, js sql等语言的标红很有可能是idea的误判,判定代码是否正确的唯一方法是运行后查看结果;

    4. 编写代码

    4.1 在java目录下创建类

    此处以HelloServlet为例:

    注:(1) HttpServlet类是servlet jar包提供的类,故而如果前面引入依赖有问题,此处可能就无法正确提示甚至会报错。

    写servlet代码一般都继承该类,继承的主要目的是可以令新建的类针对HttpServelt进行功能扩展,通过重写父类方法的方式实现;

    (2) doGet方法就是一个根据请求计算响应的方法,我们写的这个doGet方法,不需要我们进行手动调用,而是交给tomcat调用,当tomcat收到get请求,就有可能执行到这个子类的方法

    tomcat会构造好两个参数:req和resp,其中:

    req就是TCP socket中读出的字符串按照HTTP协议解析得到的对象,这个对象中的属性与HTTP请求报文格式相对应,是tomcat针对请求已经解析好,构造好了的。

    resp对象是一个空对象(不是null,只是new了个对象),程序员的任务就是在doGet方法内部实现:根据请求(req)计算响应(resp),resp本质上是一个输出型参数;

    (3)在新类继承HttpServlet类后,输入doget并按下Tab键会自动生成一个默认格式,此时在方法内部有super.doGet(req,resp)语句,父类的doGet方法没有实际作用,只是返回了一个错误页面,故而这句需要注释掉

    4.2 打印"hello world"

    4.2.1 在服务器控制台上打印

    1. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    2. System.out.println("hello world");
    3. }

    4.2.2 在客户端打印

    1. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    2. resp.getWriter().write("hello world");
    3. }

    注:(1)此处的resp.getWriter会获取到一个writer对象,此处的writer对象是从属于resp对象的,此时进行的write操作其实是在往resp的body部分进行写入,等resp对象整个构造好了,tomcat会统一转成HTTP响应的格式,再写socket;

    (2)java中分字节流与字符流两类,writer属于字符流的写操作。

    流对象不一定要写入网卡或硬盘,也可以写入内存缓冲区,取决于代码实现的细节;

    4.2.3 在新建类的首行添加注解

    在新建类首行增加@WebServlet("/hello")注解;

    整体编写完毕的完整代码如下:

    1. import javax.servlet.ServletException;
    2. import javax.servlet.annotation.WebServlet;
    3. import javax.servlet.http.HttpServlet;
    4. import javax.servlet.http.HttpServletRequest;
    5. import javax.servlet.http.HttpServletResponse;
    6. import java.io.IOException;
    7. @WebServlet("/hello")
    8. // 令当前的HelloServlet类继承自HttpServlet类:
    9. public class HelloServlet extends HttpServlet {
    10. @Override
    11. // 重写HttpServlet类的doGet方法:
    12. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    13. // 该语句只能实现在服务器的控制台中打印:
    14. System.out.println("hello world");
    15. // 在客户端实现打印:
    16. resp.getWriter().write("hello world");
    17. }
    18. }

     注:(1)注解是java中的特殊类,注解可以针对一个类或方法进行额外的解释说明,赋予这个类或方法额外的功能或含义

    (2)此处WebServlet注解的作用是:把当前的类和一个HTTP请求的路径关联起来

    (3)之前“doGet是tomcat收到GET请求的时候就会调用”这种说法其实并不准确,具体是否要调用doGet,还是得看当前GET请求的路径,不同的路径可以触发不同的代码(即关联到不同的类上);

    (4)一个Servlet程序中可以有很多Servlet类,每个Serlet类都可以关联到不同的路径(对应到不同资源),因此此处的多个Servlet就实现了不同的功能

    (5)路径与Servlet之间是一一对应的;

    5. 打包程序

    (1)打包程序即:把程序编辑好,得到一些.class文件(此例中只有一个文件,一个.java文件对应一个.class文件),将这些.class文件打成压缩包即可;

    注:jar就是一种.class构成的压缩包,但此处要打的是war包;

    ① jar包只是一个普通的java程序;

    war则是tomcat专属的用来描述webapp的程序war包中不止有.class文件,还有一些tomcat要求的配置文件,如web.xml等,还有一些前端的代码,如html,css,js等;

    (2)借助maven直接点击即可:

    第一步:点击右侧maven展开maven面板选中package,直接双击或右键运行均可:

    如果出现错误,则页面会显示具体的错误信息,如果运行一切顺利,则页面如下:

    第二步:打包完毕后,包会生成在target目录下,可在左侧目录栏查看:

    (3)默认情况下,maven打的是jar包,此处需要打war包,故而需要微调一下pom.xml:

    点击pom.xml,在project顶级标签下,增加一个packaging标签和一个build标签

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    5. <modelVersion>4.0.0modelVersion>
    6. <groupId>org.examplegroupId>
    7. <artifactId>hello_servletartifactId>
    8. <version>1.0-SNAPSHOTversion>
    9. <properties>
    10. <maven.compiler.source>8maven.compiler.source>
    11. <maven.compiler.target>8maven.compiler.target>
    12. properties>
    13. <dependencies>
    14. <dependency>
    15. <groupId>javax.servletgroupId>
    16. <artifactId>javax.servlet-apiartifactId>
    17. <version>3.1.0version>
    18. <scope>providedscope>
    19. dependency>
    20. dependencies>
    21. <packaging>warpackaging>
    22. <build>
    23. <finalName>hello_servletfinalName>
    24. build>
    25. project>

    其中,packaging标签就是描述打包的类型

    build标签中嵌套一个finalName标签,该标签描述的是war包的名字,(可不指定,但默认生成的名字会较复杂);

    此时重新操作maven的package选项,在左侧目录栏可见一个新生成的war包:

    注:(1)如果打包失败,在控制台中也会显示一些出错原因:

    ① 打包操作依赖了一些第三方的jar包,maven就会自动下载,如果下载过程中网络不太顺畅,就容易出错;

    ② 代码的配置文件如pom.xml出现问题;

    (2)这种手动打包和手动部署的操作也体现了开发与运行分离的思想,直接使用IDEA的三角符号进行运行是本地运行,而不是在另一个服务器上运行;

    6. 部署程序

    部署程序即:把刚打包好的war包拷贝到tomcat的webapps目录中即可

    无论tomcat是在本机还是跨服务器,都是这样拷贝,拷贝完毕后启动tomcat即可;

    注:(1)在windows环境下,如果tomcat正在运行,直接拷贝,tomcat也能识别,但是有可能存在bug。实际开发中,tomcat基本都是在linux上运行的,在linux上不存在bug。

    (2)tomcat可以自动识别war包并进行解压缩

    7. 验证

    启动tomcat后,在浏览器中输入url,注意路径的写法:

    访问成功后页面如图:

    注:(1)在浏览器中输入url后,浏览器就构造了一个对应的HTTP GET请求,发给了tomcat,tomcat根据第一级路径,确定了具体的webapp,根据第二级路径,确定了调用哪个类,再通过GET / POST方法确定调用HelloServlet的哪个方法:doGet或doPost等等;

    (2)也可以在服务器代码处看到日志(tomcat处):

  • 相关阅读:
    linux 系统redis常用命令
    Python批量测试IP端口GUI程序(Tkinter)
    2、适配器模式
    形态学笔记:侵蚀+膨胀+开运算+闭运算+形态学梯度+顶帽运算+黑帽运算
    实战:docker式部署frp内网穿透-2024.7.13(测试成功)
    CSS中如何设置单行或多行内容超出后,显示省略号
    Elasticsearch:什么是检索增强生成 - RAG?
    数据库事务
    Linux进程控制(一)
    完全指南:mv命令用法、示例和注意事项 | Linux文件移动与重命名
  • 原文地址:https://blog.csdn.net/m0_63299495/article/details/136240732