咱们最核心的目标是基于tomcat编程, 做出网站来 ~~ 基于tomcat进行网站后端的开发.
网站后端, http服务器,肯定是需要针对http 协议进行一系列操作的.
幸运的是, tomcat,已经把这些http相关的底层操作,封装好了只需要调用tomcat给咱们提供的api即可
Servlet 就是Tomcat给java提供的原生的进行web开发的api
Servlet 是一种实现动态页面的技术. 是一组 Tomcat 提供给程序猿的 API, 帮助程序猿简单高效的开发一
个 web app.未来咱们可能还要接触一些框架(Spring全家桶)Spring MVC也是进行web开发的api
(这组api也是基于servlet的,相当于对servlet的封装).企业中已经几乎不会使用servlet,学习它的原因是这个东西是未来学习的框架的基础
网页分成两类:
静态页面: 页面内容始终是固定不变的,比如百度主页
动态页面: 页面内容随着输入参数的不同而改变,比如搜索结果页
静态页面就只是单纯的html,动态页面,则是html+ 数据
先写个 hello world
预期写个 servlet 程序,部署到tomcat上,通过浏览器访问,得到hello world 字符串
让我们学习编程以来的最难的 hello world 编写
有以下步骤:
1.创建项目 2.引入依赖 3.创建目录结构
4.编写代码 5.打包程序 6.部署程序
7.验证
此处要创建一个maven项目了.
maven是个"工程管理"工具,它的作用有
注: 目前主要就是使用管理依赖和打包功能
开始创建项目
如果你首次使用maven,项目创建好了之后,会在下面读条,从中央仓库加载一些maven的依赖.
需要联网
maven 仓库在国外,网络不一定稳定,这里的读条可能会比较久.(长的可能要读1个小时)[(只是第一次使用会这样,读完之后,后面就好了,如果报错失败没事,过两天再试试~
怎么修改成国内镜像?
(不建议改成国内镜像,后面如果你要学spring还得改回来,国内镜像很多东西没有,比官方的源缺东西!!!)
maven不是个独立的程序吗, 为什么不需要单独下载安装嘛?
maven是独立的程序,但是不需要单独下载安装.IDEA已经自带了(天生的,不需要安装任何额外的插件)
maven项目的目录结构
src: 存放源代码
引入servlet 对应的jar包
从中央仓库下载jar包
https://mvnrepository.com/
如果页面一直显示在加载中,可以使用加速器Watt Toolkit(steam++),它在Windows自带的Microsoft Store就有.
正式开始下载
上述复制粘贴的被称为该依赖在maven仓库的坐标.
虽然maven已经帮我们自动的创建了一些目录,但是还不够.此处是需要使用maven开发一个 web程序,还需要别的目录
1)在main目录下(和java, resources并列),创建一个webapp目录
2)在webapp下创建WEB-INF目录
3)再在WEB-INF目录下创建一个web.xml 文件
注: 此处的目录名字和结构,都不能错.
4)给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>
web.xml的作用
当前写的servlet程序和以往写的别的代码相比,有一个非常大的区别:就是没有main方法.
main方法可以视为是汽车的发动机,有发动机,汽车才能跑,如果现在有辆车,没有发动机,能不能有办法跑???
答案是有办法的!挂个车头,让车头拽着它跑就行了.比如地铁,一节一节的,每一节车厢,自己没有发动机,车头才有.咱们写的servlet程序就是车厢,tomcat就是车头!
把咱们写好的servlet程序扔到webapps目录下就相当于把车厢给挂到车头后面了.
tomcat 如何识别 webapps目录下,哪些是需要拉着跑的车厢?哪些是普通的不需要拉着跑的目录呢?
就是靠目录下有个WEB-INF/web.xml.此时tomcat就把我们写的代码加载并运行起来了.
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 父类里的这个方法只是返回了一个错误页面,需要注释掉
// super.doGet(req, resp);
//这个是在服务器的控制台里打印.
System.out.println("hello world");
//要想把 hello world返回到客户端,需要使用下面的代码.
//getWriter会得到一个 Writer 对象.
resp.getWriter().write("hello world");
// 此处的writer对象是从属于resp对象的,此时进行的write操作其实是往resp的 body部分进行写入
// 等resp对象整个构造好了,tomcat 会统一的转成HTTP响应的格式,再写socket.
}
}
HttpServlet
: servlet api里提供的现成的类写servlet 代码一般都是继承这个HttpServlet的.
HttpServletRequest req
: 这个参数表示一个HTTP请求.
HttpServletResponse resp
: 这个参数表示一个HTTP响应,一个空的对象.
doGet
: 写的这个doGet方法,不需要我们自己手动调用,而是交给Tomcat来调用.
Tomcat收到 get请求,就会触发doGet方法,此时Tomcat会构造好两个参数req
和resp
.
req
: 从TCP socket中读出来的字符串,按照HTTP协议解析得到的一个对象,这个对象里的属性和HTTP请求报文格式相对应的!
resp
: 就需要我们在doGet根据请求req,结合我们自己的业务逻辑构造出一个resp对象来.
字符流: ReaderWriter,Writer
字节流: lnputStream,OutputStream
resp.getWriter().write("hello world");
此处的writer对象是从属于resp对象的,此时进行的write操作其实是往resp的 body部分进行写入,等resp对象整个构造好了, tomcat会统一的转成HTTP响应的格式,再写socket.
流对象,不一定非得是写入网卡,也不一定非得是写入硬盘,也可以写到内存缓冲区里(关键是看你代码实现的细节).
@WebServlet("/hello")
注解是 Java 中的特殊的类, Java专门定义了一种"语法糖"来实现注解.
注解的作用,针对一个类/方法,进行额外的“解释说明",赋予这个类/方法额外的功能/含义.
此处这个@WebServlet
注解的作用是把当前的类,和一个HTTP请求的路径送联起来.
doGet
在``Tomcat收到GET请求的时候就会调用,这个说法其实并不准确!!!具体要不要调用
doGet`,还得看当前GET请求的路径是什么.
不同的路径可以触发不同的代码(关联到不同的类上).
例子: 我去餐馆吃饭
早上我发起请求:老板,来份油泼面.
http://ip:port/油泼面?辣椒=少放
老板收到请求之后,就需要按照"制作油泼面"的流程来做饭(根据请求计算响应)
中午我来发起请求:老板,来个蛋炒饭.
http://ip:port/蛋炒饭?葱=多放
老板收到请求之后,就需要按照"制作蛋炒饭”的流程来做这份饭
晚上我来发起请求:老板,来份抄手.
http://ip:port/抄手?辣椒=微辣
老板收到请求之后,就需要按照"制作抄手”的流程来做这份饭
上述三个不同的流程,相当于是三个不同的类/方法
一个Servlet程序中,可以有很多的Servlet类.每个Servlet类都可以关联到不同的路径(对应到不同的资源)
因此此处的多个Servlet就实现了不同的功能.
把程序编译好(得到一些.class文件),再把这些.class打成压缩包.
jar就是一种.class 构成的压缩包,不过此处要打的是war包.
jar只是一个普通的java程序, war则是tomcat专属的用来描述webapp的程序,可以认为-个war就是一个webapp.
借助maven直接一点击即可
微调 pom.xml
再次打包
打包的作用; 开发环境(自己写代码的电脑)和运行环境(另外一个服务器)很可能不是一个环境!!
直接使用IDEA的三角号运行是本地运行,而不是在另一个服务器上运行.
把刚才打包好的war拷贝到tomcat的 webapps目录中即可!
注: 无论tomcat是在你同一个电脑上还是不同电脑上,都是这样拷贝.
启动tomcat
打开浏览器,输入url,访问写好的这个代码.
URL: http://127.0.0.1:8080/hello_servlet/hello
这个url的路径的写法
务必保证这两级路径都是正确的!!!稍微错一点,就很容易出现404.
小结:
刚才在浏览器地址栏中输入url之后,浏览器就构造了一个对应的HTTP GET请求,发给了tomcat.
tomcat就根据第一级路径,确定了具体的 webapp.根据第二级路径,确定了是调用哪个类.
再然后通过GET/POST方法确定调用HelloServlet的哪个方法(doGet, doPost…)
此时Tomcat 就执行对应的代码,完成对应工作.