Servlet

什么是Servelt?
Servelt是一种实现动态页面的技术 是一组Tomcat提供给程序员的API 帮助程序员简单高效的web app

tomcat对于Java有一定的支持 提供了一系列的api接口 这些接口背后已经把一些基础的工作做好了(例如处理http协议重复性的工作)
程序员只需要调用上述的api通过少量的代码就可以完成基本的http服务器的核心功能 tomcat把这组api起了一个名字 称为’Servlet’

动手来编写一个Servelt的hello world程序!

  1. 创建一个Servelt的新项目
    Servlet_第1张图片
    Maven是java中一个常用的’构建工具’
    一个程序 编写过程中 往往需要涉及到第三方库的依赖 另外还需要针对这个写好的程序进行打包部署
    Maven的意义 就是为了能够方便进行依赖管理和打包

创建后会生成这样的目录
Servlet_第2张图片

src 放源码
main 业务代码
java java 代码
resources 依赖的资源(图片 视频等)
test 测试代码
pom.xml 这个文件就是maven项目的最主要的配置文件主要用来管理依赖和打包

  1. 引入依赖
    当前的代码要用Servlet开发 而Servelt并不是Java标准库自带的 所以就需要让maven能够把Servlet的依赖给获取过来
    我们先需要找到maven中央仓库点开以下连接
    https://mvnrepository.com/ maven中央仓库连接

进入网站后搜索servlet 选择第一个
Servlet_第3张图片
然后进入选择3.10版本 因为 Servlet的版本和Tomcat的版本 是一一对应的 而Tomcat使用8 Servlet是3.10其他Tomcat版本可自行查阅 (注意:如果Tomcat和Servlet不匹配就可能出现问题)
Servlet_第4张图片
进去之后把这段代码复制
Servlet_第5张图片

<!-- 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>

然后我们打开pom.xml 文件 手动创建一个 标签 把刚才的坐标复制到这个标签内
此时IDEA就会自动通过maven从中央仓库来下载这里的依赖
一般第一次下载 可能会出现标红就是没下载玩需要耐心等待 或者点击右上角的重新下载 再不行就只能把maven源换回国内的(阿里云)会比较快
Servlet_第6张图片
Servlet_第7张图片
下载完成
Servlet_第8张图片
3. 手动创建一些必要的目录/文件
tomcat对于Servlet项目是有一些额外的要求的
Maven一个通用的工具 可以管理的不仅仅的是Servlet项目 还可以管理其他的项目
在这个基础上在按照Servlet项目的要求创建出一些特点的目录和文件
我们可以把IDEA生成的类删除
Servlet_第9张图片
然后按照这样创建目录和文件
Servlet_第10张图片
此处的目录机构 目录名字 都是固定的 不能写错
web.xml就是向tomcat说明现在目录里的东西就是一个webapp 要把它加载起来
web.xml里还需要写一些内容 这里的内容都是固定的内容
Servlet_第11张图片

<!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>

第三行会有标红 这是因为对于idea来说 只能保证java程序的提示是准确的 其他文件的提示(图一乐…) 这里的标红并非是有错 也不会影响代码运行 如果不想看见就可以alt+enter 把错误处理fetch或者ignore就可以了

这个文件是schema文件 里面描述了xml里面的格式是怎样的那些标签合法 那些不合法如何进行前台等等
IDEA拿到这些文件就可以针对xml代码进行补全了

  1. 编写代码
    我们创建一个HelloServlet的类并让它继承HttpServlet类 这个类就是前面Servlet的jar包 提供的父类
    编写Servlet程序一般都需要继承这个类 (如果此时这个类是红色就是前面没有下载好)
    Servlet_第12张图片
    继承这个类不是目的 我们的目的是重写这个父类的方法

Servlet_第13张图片
req 代表这次请求的http请求内容
resp 代表这次请求要返回的http响应内容

这个方法不需要自己手动调用 doGet本质上也是一个’回调函数’把这个方法写好之后 就会交给Tomcat
Tomcat在收到一个合适的GET请求的时候就会自动调用doGET调用doGET的时候
Tomcat就会解析这的HTTP请求生成一个HttpServletRequest对象(这个对象的属性和HTTP协议格式匹配的
相当于Tomcat帮我们把HTTP请求给解析好了)
同时Tomcat也会构造出一个空的HttpServletResponse对象(空指的不是null 而是一个new好的但是没有初始化属性的对象) 这个resp对象也会传递到doGet里面
doGet要做的事情 就是根据这次请求(req) 计算出响应(resp)
doGET里面的代码 就要根据req里面不同的参数的细节 生成一个具体的resp对象(往空对象里设置属性)
Tomcat就会根据这个响应对象 转换成符合HTTP协议的响应返回给浏览器了
总而言之doGet做的事就是根据请求计算响应

一个服务器 典型工作流程 就是三步

  1. 读取请求并解析
  2. 根据请求计算响应
  3. 把响应写回客户端

在Servlet 1,3都是Tomcat帮助我们完成 然后我们写代码只需要关注2 也就是doGET要完成的工作

而抛的两个异常
ServletException是Servlet程序中比较常见的异常
IOException是进行IO操作时候出现的异常

这一行是调用父类的方法 一定要删掉不然就会出现问题

super.doGet(req, resp);

Servlet_第14张图片
这打印的hello world是在服务器的日志中产生的(tomcat)

System.out.println("hello world");

这打印的hello world是返回给客户端

resp.getWriter().write("hellow world");

未初始化的空的响应对象doGet的目的就是为了把这个对象给设置好
通过getWriter得到resp里面内置的输出流对象(Wirter字符流)
使用write就可以把一个字符串写入到resp对象中(把数据写入到了HTTP响应的body中浏览器拿到body中的内容就可以显示到界面上了)

之后,我们还要在前面加上一个注解 就把当前这个Servlet类 和一个请求的路径关联起来了(配置路由)
Servlet_第15张图片
Tomcat会在合适的时机 自动调用doGET方法
什么合适的时机?
1.请求的方法 是否是GET
例如
GET=>doGet
POST=>doPost
PUT=>doPut
等等
2.请求的路径 url 后面带有层次结构的路径
一个Servlet程序里 可能由多个Servelt类的这些Servlet就需要不同的情况下执行
当请求的路径带有hello的时候才能执行到这个helloServlet的代码 不同的Servlet类 就可以关联到不同的路径

  1. 打包程序
    这个程序是放到Tomcat上运行的 就需要对于程序进行打包 打成一个Tomcat能识别的包
    打包是借助maven完成的
    Servlet_第16张图片
    Servlet_第17张图片
    在maven中 默认生成的包是jar包(常用的java的打包方式 jar就是一些class文件)
    但是Tomcat需要的是war包(包含一些前端的代码HTML CSS JSP 以及一些Tmocat配置文件) 而不是jar包
    所以我们要在pom.xml文件中加上标签
    Servlet_第18张图片

然后用标签 标签给包一个名称(可给可不给,描述了打包的名称是什么)

Servlet_第19张图片
然后我们进行打包
Servlet_第20张图片
此时,打包完成就可以把war包放到tomcat里面了
Servlet_第21张图片

  1. 部署
    写好的war包 放到tomcat上
    Servlet_第22张图片
    当复制进来之后 tomcat就能识别到有新的webapp来了就会自动对这个war包进行解压缩
    Servlet_第23张图片
  2. 验证程序 是否能够正常工作
    通过浏览器发起http get请求 触发刚才serlet的代码
    在这里插入图片描述

Context path/application path 用来区分一个webapp通常就是war包的名字解压之后目录的名字(HelloServlet)

servlet path 和之前的@WebServlet注解是对应
Servlet_第24张图片
通过第一级路径 确定一个webapp
通过第二级路径 确定是那个servlet
通过方法确定执行servlet中的那个方法
Servlet_第25张图片
然后访问就可以看到我们的网页了
这就完成了一个servlet程序!
Servlet_第26张图片

你可能感兴趣的:(servlet,java)