赞
踩
在浏览器中搜索Tomcat,打开官方网页.Tomcat官网
点击下载Tomcat8.
点击下载压缩包.
下载好后解压缩.
解压缩后得到的目录:
下面对上述关键文件做部分解释:
bin
:可执行的程序/脚本.启动Tomcat就在这里.conf
:配置,用xml格式表示服务器的配置,比如像修改tomcat的绑定的端口号就需要修改这里的内容.lib
:tomcat依赖的一些库.(暂时不考虑)logs(重要)
:日志,tomcat运行的日志都在这里.如果程序出问题了,如何排查?就看这个日志.webapps
:每个webapp都是一个"网站",一个tomcat上可以部署多个网站,此处就叫做"webapps". 这里包含很多目录,每个目录都视为一个独立的网站,后面我们所学习的代码也是部署到这个webapps里的.Tomcat的启动:
启动后,我们可以看到:
Server startup in xxx ms
即为启动成功.
新建网页标签页,输入127.0.0.1:8080
进入Tomcat欢迎页面.(此时Tomcat必须处于运行状态)
8080
是Tomcat默认的端口号.就像MySQL的默认端口号是3306
一样.
接下来我们尝试在Tomcat中部署前端代码:
以我们前面学习过的博客系统代码为例:
将blog系统拷贝至webapps这个文件夹中(部署):
在导航栏中输入http://127.0.0.1:8080/blog/blog_list.html
通过网络来访问.
第一级路径(blog),也起了个名字,叫做application path/context path
这个页面和之前的不同,这个是通过网络来访问的.而之前的页面则是通过文件路径来访问的.
通过网络访问可以跨主机访问,通过路径只可以访问自己主机上的页面.
Servlet
: 是一种实现动态页面的技术.是Tomcat给java提供的原生的进行web开发的api.
网页分为两类:
静态页面:页面内容始终是固定不变的.(百度主页)
动态页面:页面内容随着输入参数不同而改变.(百度结构页)
我们先写一个hello world程序:预期写一个Servlet程序 部署到Tomcat上,通过浏览器访问,得到hello world字符串.
一共有七个步骤:
- 创建项目
- 引入依赖
- 创建目录结构
- 编写代码
- 打包程序
- 部署程序
- 验证
maven
项目.maven是个"工程管理"工具.它可以:
- 规范目录结构
- 管理依赖
- 构建
- 打包
- 测试
…
打开idea:
注意:首次使用maven,项目创建好之后,会在下面读条,从中央仓库加载一些maven的依赖.时间较久.
注意此处的目录:
2. 引入依赖
打开maven中央仓库,搜索Servlet.
此处选择3.1.0
版本.
拷贝maven代码至pom.xml
中.
注意添加 标签!如果有多个依赖,都往里面拷贝即可.
如果长时间标红,刷新:
3. 创建目录结构
虽然maven已经帮我们自动创建了一些目录,但是还不够.此处是需要使用maven开发一个web程序,还需要别的目录.
(1) 在main
目录下,创建一个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>
我们写的Servlet程序就相当于是车厢.Tomcat相当于是车头.我们把写好的Servlet程序放到webapps 目录下,就相当于把车厢挂到车头上.Tomcat如何识别webapps目录下哪些是需要拉着跑的车厢,哪些不是. 就需要靠我们复制粘贴的代码来识别.(WEN-INF/web.xml).
相当于投名状.
(1)HttpServlet
是Servlet api里提供的现成的类.写Servlet代码一般都是继承这个HttpServlet.
(2)重写doGet
方法
我们写的doGet
方法,不需要我们手动调用,而是交给Tomcat
来调用.Tomcat收到get
请求,就会触发doGet
方法.Tomcat会构造好两个参数,req
和resp
. 其中req
就是TCP socket 中读出来的字符串,按照HTTP协议解析得到的对象. 其中resp
是个空对象(程序猿在doGet,根据请求req,结合业务逻辑构造出resp) resp是输出型参数.
doGet
:根据请求计算响应.
super.doGet();
父类的这个方法只是返回一个错误页面,需要删掉.
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; //注解是java中特殊的类,Java专门定义了一种"语法糖"来实现注解 //注解的作用,针对一个类/方法,进行额外的"解释说明" //赋予了这个类.方法额外的功能/含义 //Tomcat实现的 //此处 @WebServlet("/hello") 的作用是: //把当前的类,和一个HTTP请求的路径关联起来 @WebServlet("/hello") public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //在服务器的控制台里打印 System.out.println("hello world"); //将helloworld返回到客户端. //getWriter()会创建一个 write 对象 //此处的 write 操作其实是往resp的body部分进行写入. //等resp对象整个构造好了,tomcat会统一转成 HTTP 相应的格式再写 socket resp.getWriter().write("hello world"); } }
doGet 是 Tomcat 收到Get 请求的时候就会调用,具体要不要低啊用doGet,还得看当前GET请求的路径是什么.不同的路径可以触发不同的代码.(关联到不同的类上)
一个Servlet程序中,可以有很多Servlet类,每个Servlet类都可以关联到不同的路径(对应到不同的资源).因此此处的多个Servlet就实现了不同的功能.
.class
文件,再将这些.class打成压缩包.war
拷贝到tomcat
的webapps
中即可.http://127.0.0.1:8080/hello_servlet/hello
小结:在浏览器中输入url之后,浏览器就构造了一个对应的HTTP GET请求,发送给tomcat. tomcat就根据第一级路径,确定了具体的webapp,根据第二级路径,确定了调用哪个类. 再然后通过GET/POSE方法确定调用HelloServlet的哪个方法(doGET,doPost)
在上述过程中,5打包,6部署程序两个过程可以使用IDEA的Tomcat插件把Tomcat 集成到IDEA中.就省去了我们手动打包的过程.手动部署的过程,只需要按一下运行,就可以自动打包部署.
基于tomcat插件自动打包部署,适用于开发阶段,频繁修改代码验证. 手动打包部署,适用于上线阶段,发布程序.
使用tomcat插件:
插件:功能的扩展.IDEA提供了一些API,可以让程序员开发插件,对IDEA现有功能进行扩展.
首次使用smart tomcat
需要配置一下.
设置tomcat
所在路径
但是我们可以看到,启动失败了.
8080端口被占用.可以打开cmd输入以下:可以看到
此时我们只需要关闭Tomcat即可.
重新启动成功.
smart tomcat工作原理:
不是自动拷贝war包(webapps中不变),是通过另一种方式来启动tomcat的.tomcat支持启动的时候显示指定一个特定的webapp目录,相当于是让tomcat 加载单个的webapp运行.
IDEA直接调用tomcat,让tomcat加载当前项目中的目录.
http://127.0.0.1:8080/后面跟的是context path
如果是直接拷贝war包的方式部署,context path就是war包名(目录名)
如果是smart tomcat的方式部署,此时这里是可以配置的.默认是项目名.
这两种部署,其实是两种tomcat的运行方式,对于context path的理解不同,在使用时需要特别注意.
4. 常见错误4: 出现空白页面
方法中逻辑没有写类似resp.getWriter().write()这样的代码
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。