实现动态页面的技术Servlet

???Hello,我是,为了能够更好的学习Servlet,我给大家整理了一些前置知识,方便更好的理解Servlet:

在这里插入图片描述

目录

??一.Servlet

首先想要学懂Servlet的话,就必须要做到理解HTTP协议,这里的API是和HTTP协议是关联十分紧密的!!而想要学习Servlet就需要学习一些前置知识:前面学习的HTTP和Tomcat都是Servlet的前置知识,另外maven也是一个非常重要的工具??

??1.maven

?? 1.1 创建maven项目

maven是一个Java世界中,非常知名的"工程管理工具"/“构建工具”(核心功能:管理依赖(进行A操作要先进行B操作,A需要依赖B,在maven里面就可以直接引入依赖了),构建/编译(也是调用jdk),打包 (maven能把这些操作穿起来,不需要再分开编译打包了));那么如何使用maven呢,我这里就搭配idea来使用了
在这里插入图片描述
idea里面就可以直接可以选择maven的方式创建项目了
在这里插入图片描述
而下面的这些东西就是一些参数,将这个项目发布到maven仓库的话,这些就是这个程序的身份标识,而目前这些可以直接是默认的,不需要修改,名字改一下就可以了,简单解释一下下面的东西:GroupID表示你所在的公司/组织,ArtifactId表示当前的项目名字,Version表示当前项目的版本;完成创建之后一个maven项目就创建成功了!

?? 1.2 maven的目录结构

创建号一个maven项目之后,就会有这样的目录(介绍一些具体的结构):
在这里插入图片描述

  • src/main/java:这个目录就可以放我们写的javajava代码
  • src/main/resources:这个目录可以用来放一些依赖的资源
  • src/test/java:这个目录用来放单元测试的代码(这个暂时不涉及)
  • pom.xml:这个是maven项目的核心配置文件(这个就可以表示当前maven项目是一个什么样的项目,依赖的文件,一切相关的配置都放置在这个xml里面),文件是以xml格式组织的

?? 1.3 如何使用maven项目

在这里插入图片描述
①操作:maven项目里面可以有很多操作,而使用最多的就是package,打包所有的文件(而执行了package就会执行上面的所有操作,完成之后就会打包成一个war包)
②引入依赖:先在中央仓库里面找到所需要的驱动包,然后把maven标签也里面的xml配置复制下来,粘贴到pom.xml里面就行了,记得版本要和Tomcat的版本匹配
在这里插入图片描述

    <dependencies>
        <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

注意:在pom.xml里面粘贴这些需要使用dependencies标签包起来,dependencies就是表示多个依赖,里面可以放不止一组依赖,引入之后,记得刷新一下,不然可能下载不成功,不能使用,就会报错!!!
在这里插入图片描述
引入成功就会有这样的库~
在这里插入图片描述

??2.完成一个Servlet程序

Servlet是Tomcat的一组API,下面具体使用一下:

?? 2.1 创建一个maven项目

这个上面已经创建过了,就不再说如何创建了

?? 2.2 引入依赖

需要什么api,就从maven中央仓库中,找到对应的xml配置,放到dependencies标签中就可以了,记得刷新下载!

?? 2.3 创建目录结构

虽然maven项目已经有一些目录了,但是仍然不足以支撑完成一个Servlet项目,因此就需要手动的创建一些目录和文件出来,这样的目录结构也是约定好的,默这样创建好了:
在这里插入图片描述
然后这个xml文件里面也要放一些默认的配置:

<!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <display-name>Archetype Created Web Application</display-name>
</web-app>

这些也不需要手动敲,直接复制粘贴这个就可以了

?? 2.4 完成Servlet代码

完成了上述步骤之后就可以来编写代码了,在java里面创建个类就看有写代码了:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //req表示请求,resp表示响应
        //不能调用父类的doGet方法
        //super.doGet(req, resp);
        //这个是让服务器在控制台打印
        System.out.println("Hello world");
        //在页面上打印,把这个字符串放到http响应的body里面,浏览器就会把body的内容显示在页面上了
        resp.getWriter().write("Hello world" + System.currentTimeMillis());
    }
}
  • 这里需要继承HttpServlet类,另外如果使用的方法是get方法的话就需要重写doGet方法(两个参数一个是请求,一个是响应),记住不要使用父类的doGet方法,父类的doGet方法什么都没做,直接返回了405,就找不到这个方法了,因此这里就需要我们自己来根据请求计算生成的响应了,这也就是重写doGet方法的所需要做的工作了,doGet方法就会在Tomcat服务器收到HTTP GET请求的时候被Tomcat调用(就是一个回调函数);
  • 另外一个服务器的基本工作流程就是:①接收请求并解析,②根据请求计算响应③构造响应数据并返回给客户端;而Tomcat已经将一三步做好了,这里就只需要手动完成第二步的工作了,也就是doGet这个方法,另外doPost等一系列其他的方法都是有的!!
  • resp.getWriter().write(“Hello world” + System.currentTimeMillis()),就是将后面的内容写到响应的body中了,getWriter就是返回了一个Writer对象(字符流对象),而后面的write就是写数据的方法;
  • 最后记得@WebServlet(“/hello”),这个注解就会把当前的这个HelloServlet类和HTTP请求中的URL里面路径带有/hello这样的请求给关联起来了,具体解释一下:Tomcat可能会收到很多很多的请求,例如/123,/hh,/www,/hello…而这里的代码只是其中一个请求,也只处理路径中带有/hello这样的请求,只有/hello才会让Tomcat调用这个类!!!而且请求是什么方法,就会调用什么样的重写方法~

?? 2.5 打包

这里是没有main方法直接我们执行的,因此就需要将我们写的代码打包起来部署到Tomcat,然后Tomcat就会在合适的时候调用这个代码,使用上面说的package就可以进行打包了,但是打包之前一定要设置打包的类型和名字方便后面查询

    <!-- 打包的时候一定要修改打包类型和名字    -->
    <!-- 打的包是一个 war 包. 默认是 jar 包   -->
    <packaging>war</packaging>
    <!-- 指定打出的 war 包名字 -->
    <build>
        <finalName>helloS</finalName>
    </build>

后面访问页面的时候输入的url为http://127.0.0.1:8080/helloS/hello就可以了,这里设置的finalName是Context Path就是端口号后面的地址,是第一级路径,而后面hello是servlet Path(就是@WebServlet(“/hello”)里面的地址,是第二级路径;
在这里插入图片描述
在这里插入图片描述
出现这样的情况就打包成功了

?? 2.6 部署

将打包好的war复制到Tomcat的webapps目录里面就可以了

?? 2.7 验证

启动Tomcat,验证是否成功,启动了Tomcat之后就可以通过http://127.0.0.1:8080/helloS/hello这样的url来访问了,这两级目录就如同上面介绍的地址~
在这里插入图片描述

?? 2.8 补充优化

一个新的项目创建好,前三步只需要第一次创建,而后续就不需要做出改变了,而后面的操作,如果修改了代码,就需要重新部署打包,这还是有点麻烦的,因此整理可以借助一个idea的插件smart Tomcat将5-6步合并起来,(直接将Tomcat集成进来,做到"一键式"完成打包部署),就很方便了,需要记住的是Tomcat和idea不是一个东西,只是这里集成起来了,但是实质上Tomcat和idea不是同一个东西~
在这里插入图片描述
在这里插入图片描述
注意需要修改这三个地方,Name随便写,Tomcat Server需要找到Tomcat的安装目录,Context Path就需要记住,这是访问服务器的url的第一级地址需要匹配,使用了Smart Tomcat之后第一级路径就不再是压缩包的名字了,而是自己指定的Context Path!!
在这里插入图片描述
然后点击三角号就可以直接完成5-6步操作了

在这里插入图片描述

?? 二.常见的出错

?? 1. 出现404

在这里插入图片描述

出现404无非就是访问的资源在服务器上不存在,主要是以下问题:

  • 第一级路径没有写,只写了第二级路径,或者第二级路径没有写,只写了第一级路径;
  • 请求的路径和服务器设置的路径不匹配;
  • web.xml写错了(里面没写东西,或者内容写错了),只有当目录中存在了web.xml,并且里面的内容也是正确的,Tomcat才能正确加载这个webapp(页面);

?? 2. 出现405

在这里插入图片描述

出现405就是方法不被允许,重写的方法出现问题了:

  • 没有重写doGet/doPost方法
  • 重写的方法不匹配,需要处理的是get方法,但是在代码中重写了其他方法,
    需要的是Post方法,但重写了其他方法,这里简单介绍一些常见的GET请求:
    ① 在地址栏里面直接输入url
    ② 通过a标签跳转
    ③ 通过img/link/script…
    ⑥ 通过form表单,方法指定为GET
    ⑤ 通过ajax,方法指定为GET
    常见的POST请求:
    ① 通过form表单,方法指定为POST
    ② 通过ajax,方法指定为POST
  • 没有删除调用父类的方法

在这里插入图片描述

?? 3. 出现500

在这里插入图片描述
出现500就表示服务器里面出问题了,一般500就是意味着服务器代码出问题了,代码里面的异常没有处理,抛到Tomcat这了(在代码里面抛出异常了,如果有catch可以捕获到,但是没有catch的话,异常就会按着调用栈向上传递),然后就出现问题了,但是出现500是非常好处理的,下面的调用栈就会直接告诉我们错误的准确位置,直接根据提示去找就可以了!!!

?? 4. 出现"空白页面"

空白页面就是啥都没有,就是重写的方法里面并没有做任何处理,响应里面没有任何东西,就会出现空白页面,检查一下重写的方法就好了~

?? 5. 出现无访此网站

在这里插入图片描述
无法访问一般就是Tomcat启动失败了(@WebServlet(“/hello”)没写"/"就会启动失败),或者根本没有启动,需要去看一下这些细节问题!!!
在这里插入图片描述

?? 三.Servlet的运行原理

在这里插入图片描述

Servlet属于上层建筑(应用层),而下面的传输层,网络层,数据链路层,物理层…都是属于经济基础,这些都是紧密相连的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
虽然我们在写代码的时候,是关注不到这些底层的网络通信工作的,但是在调试/定位问题的时候,这些还是非常有必要的~Servlet的具体运行原理就介绍到这了,后面再详细介绍一些Servlet的相关API!

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_55613022/article/details/125402056