什么是Servelt?
Servelt是一种实现动态页面的技术 是一组Tomcat提供给程序员的API 帮助程序员简单高效的web app
tomcat对于Java有一定的支持 提供了一系列的api接口 这些接口背后已经把一些基础的工作做好了(例如处理http协议重复性的工作)
程序员只需要调用上述的api通过少量的代码就可以完成基本的http服务器的核心功能 tomcat把这组api起了一个名字 称为’Servlet’
动手来编写一个Servelt的hello world程序!
- 创建一个Servelt的新项目
Maven是java中一个常用的’构建工具’
一个程序 编写过程中 往往需要涉及到第三方库的依赖 另外还需要针对这个写好的程序进行打包部署
Maven的意义 就是为了能够方便进行依赖管理和打包
创建后会生成这样的目录
src 放源码
main 业务代码
java java 代码
resources 依赖的资源(图片 视频等)
test 测试代码
pom.xml 这个文件就是maven项目的最主要的配置文件主要用来管理依赖和打包
- 引入依赖
当前的代码要用Servlet开发 而Servelt并不是Java标准库自带的 所以就需要让maven能够把Servlet的依赖给获取过来
我们先需要找到maven中央仓库点开以下连接
https://mvnrepository.com/ maven中央仓库连接
进入网站后搜索servlet 选择第一个
然后进入选择3.10版本 因为 Servlet的版本和Tomcat的版本 是一一对应的 而Tomcat使用8 Servlet是3.10其他Tomcat版本可自行查阅 (注意:如果Tomcat和Servlet不匹配就可能出现问题)
进去之后把这段代码复制
<!-- 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 文件 手动创建一个 <dependencies>
标签 把刚才的坐标复制到这个标签内
此时IDEA就会自动通过maven从中央仓库来下载这里的依赖
一般第一次下载 可能会出现标红就是没下载玩需要耐心等待 或者点击右上角的重新下载 再不行就只能把maven源换回国内的(阿里云)会比较快
下载完成
3. 手动创建一些必要的目录/文件
tomcat对于Servlet项目是有一些额外的要求的
Maven一个通用的工具 可以管理的不仅仅的是Servlet项目 还可以管理其他的项目
在这个基础上在按照Servlet项目的要求创建出一些特点的目录和文件
我们可以把IDEA生成的类删除
然后按照这样创建目录和文件
此处的目录机构 目录名字 都是固定的 不能写错
web.xml就是向tomcat说明现在目录里的东西就是一个webapp 要把它加载起来
web.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>
第三行会有标红 这是因为对于idea来说 只能保证java程序的提示是准确的 其他文件的提示(图一乐…) 这里的标红并非是有错 也不会影响代码运行 如果不想看见就可以alt+enter 把错误处理fetch或者ignore就可以了
这个文件是schema文件 里面描述了xml里面的格式是怎样的那些标签合法 那些不合法如何进行前台等等
IDEA拿到这些文件就可以针对xml代码进行补全了
- 编写代码
我们创建一个HelloServlet的类并让它继承HttpServlet类 这个类就是前面Servlet的jar包 提供的父类
编写Servlet程序一般都需要继承这个类 (如果此时这个类是红色就是前面没有下载好)
继承这个类不是目的 我们的目的是重写这个父类的方法
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做的事就是根据请求计算响应
一个服务器 典型工作流程 就是三步
- 读取请求并解析
- 根据请求计算响应
- 把响应写回客户端
在Servlet 1,3都是Tomcat帮助我们完成 然后我们写代码只需要关注2 也就是doGET要完成的工作
而抛的两个异常
ServletException是Servlet程序中比较常见的异常
IOException是进行IO操作时候出现的异常
这一行是调用父类的方法 一定要删掉不然就会出现问题
super.doGet(req, resp);
这打印的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类 和一个请求的路径关联起来了(配置路由)
Tomcat会在合适的时机 自动调用doGET方法
什么合适的时机?
1.请求的方法 是否是GET
例如
GET=>doGet
POST=>doPost
PUT=>doPut
等等
2.请求的路径 url 后面带有层次结构的路径
一个Servlet程序里 可能由多个Servelt类的这些Servlet就需要不同的情况下执行
当请求的路径带有hello的时候才能执行到这个helloServlet的代码 不同的Servlet类 就可以关联到不同的路径
- 打包程序
这个程序是放到Tomcat上运行的 就需要对于程序进行打包 打成一个Tomcat能识别的包
打包是借助maven完成的
在maven中 默认生成的包是jar包(常用的java的打包方式 jar就是一些class文件)
但是Tomcat需要的是war包(包含一些前端的代码HTML CSS JSP 以及一些Tmocat配置文件) 而不是jar包
所以我们要在pom.xml文件中加上<packaging>
标签
然后用标签<build>
<finalName>
标签给包一个名称(可给可不给,描述了打包的名称是什么)
然后我们进行打包
此时,打包完成就可以把war包放到tomcat里面了
- 部署
写好的war包 放到tomcat上
当复制进来之后 tomcat就能识别到有新的webapp来了就会自动对这个war包进行解压缩
- 验证程序 是否能够正常工作
通过浏览器发起http get请求 触发刚才serlet的代码
Context path/application path 用来区分一个webapp通常就是war包的名字解压之后目录的名字(HelloServlet)
servlet path 和之前的@WebServlet注解是对应
通过第一级路径 确定一个webapp
通过第二级路径 确定是那个servlet
通过方法确定执行servlet中的那个方法
然后访问就可以看到我们的网页了
这就完成了一个servlet程序!