什么是Servelt?
Servelt是一种实现动态页面的技术 是一组Tomcat提供给程序员的API 帮助程序员简单高效的web app
tomcat对于Java有一定的支持 提供了一系列的api接口 这些接口背后已经把一些基础的工作做好了(例如处理http协议重复性的工作)
程序员只需要调用上述的api通过少量的代码就可以完成基本的http服务器的核心功能 tomcat把这组api起了一个名字 称为’Servlet’
动手来编写一个Servelt的hello world程序!
src 放源码
main 业务代码
java java 代码
resources 依赖的资源(图片 视频等)
test 测试代码
pom.xml 这个文件就是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 文件 手动创建一个
标签 把刚才的坐标复制到这个标签内
此时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代码进行补全了
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类 就可以关联到不同的路径
标签然后用标签
标签给包一个名称(可给可不给,描述了打包的名称是什么)
然后我们进行打包
此时,打包完成就可以把war包放到tomcat里面了
Context path/application path 用来区分一个webapp通常就是war包的名字解压之后目录的名字(HelloServlet)
servlet path 和之前的@WebServlet注解是对应
通过第一级路径 确定一个webapp
通过第二级路径 确定是那个servlet
通过方法确定执行servlet中的那个方法
然后访问就可以看到我们的网页了
这就完成了一个servlet程序!