Tomcat的下载安装及静态部署
Linux 入门——基础使用及常见命令
目录
2.IDEA smart tomcat:插件plugin:一键打包部署
1.Servlet初识
Servlet 是一种实现动态页面的技术. 是一组 Tomcat 的 API, 帮助简单高效的开发一个 Web App.
静态页面:内容始终固定的页面. 即使用户不同/时间不同/输入的参数不同 , 页面内容不发生变化.
动态页面:用户不同/时间不同/输入的参数不同, 页面内容会发生变化.
Servlet 就是 Tomcat 这个HTTP服务器提供给 Java 的一组 API, 来构建动态页面
Servlet不必关注 Socket, HTTP协议格式, 多线程并发等技术细节, 降低了 web app 的开发门槛, 提高了开发效率.
Servlet 主要做的工作:
1.初始化:允许程序猿创建一个类到Tomcat中, 在 Tomcat 收到某个特定的 HTTP 请求的时候, 执行这个类中的一些代码.
2.进入循环:循环处理很多请求
- 读取HTTP请求,servlet解析这个请求字符串,生成一个HttpServletRequest对象
- 根据请求对象生成一个HttpServletRequest对象(表示响应)
- 把HttpServletRequest对象转换成HTTP响应,返回给浏览器
TCP服务器的工作:
1.初始化
2.进入循环
- 读取请求
- 根据请求计算响应
- 把相应返回
1.1创建maven项目
步骤:
- 创建maven项目
- 引入依赖到pom.xml文件(注意servlet版本和Tomcat版本的对应关系)
- 在main目录下创建webapp目录,webapp下创建WEB-INF/web.xml
- web.xml 内容代码编写
- 主文件代码编写
- 打包成war文件并重命名(在 pom.xml 中新增一个 build 标签, 内置一个 finalName 标签, 重命名)
- 使用Tomcat部署程序(war文件放到Tomcat目录的webapps下,启动Tomcat的startup.文件会自动解压war到当前目录)
- 验证程序:浏览器输入127.0.0.1:8080/hello即可(hello为注解中的路径)
或者使用smart Tomcat插件进行简化完成打包+部署
(1)创建maven项目
使用Maven方便进行依赖管理,直接在pom.xml中添加依赖,即可导入
(2)引入依赖,servlet API的jar包
1)servlet版本需要和Tomcat对应,我的Tomcat版本是Tomcat8,对应servlet3.1
2)依赖导入到文件,<dependencies> 标签内部放置项目依赖的 jar 包,maven 会自动下载依赖到本地(若有多个依赖也需要放在<dependencies> 标签内,<dependencies> 标签只能有一个)
导入成功颜色恢复正常
<scope> 标签表示当前jar包只在开发阶段使用,而不需要打包到最终的发布包中
Tomcat内置了servlet,把程序部署到Tomcat时,就有了servlet
1.2创建必要的目录和文件
在main目录下创建webapp目录,在webapp目录创建WEB-INF/web.xml
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>
webapp 目录是未来部署到 Tomcat 中的一个重要目录. 可以放一些静态资源(如 html , css 等). Tomcat 找到web.xml才能正确处理 webapp 中的动态资源.
Alt+enter出现如下显示,选中Ingore external resource 忽略即可报错消失
1.3代码编写
在 java 目录中创建一个类classServlet, 代码如下:
创建的类classServlet 需要继承 HttpServlet类,才能让这个类classServlet 被Tomcat给调用到,若之前的maven依赖下载失败,此时的父类HttpServlet是不能被补全的;若导入成功,HttpServlet仍报红,说明依赖未刷新,此时刷新右侧maven工具栏即可
代码编写步骤:
- 创建一个类classServlet, 继承自 HttpServlet
- 加 @WebServlet("/hello") 注解, Tomcat 收到路径为 /hello的请求才会调用该类的代码
- 重写 doGet 方法. 在 Tomcat 收到HTTP的 GET 请求时触发(调用doGet方法)(do为处理,Get对应到HTTP的GET方法)
- 1)HttpServletRequest 表示 HTTP 请求:Tomcat 根据 HTTP 请求的格式把 字符串 格式的请求转成了一个 HttpServletRequest 对象. 后续通过HttpServletRequest 对象获取请求中的信息(方法, url, header, body 等)
- 2)HttpServletResponse 表示 HTTP 响应:代码中把响应对象构造好
4.resp.getWriter() .write返回一个write对象(流对象), 通过write往HTTP响应的body中写入数据, , Tomcat 把整个响应转成字符串, 通过 socket 写回给浏览器.
一个服务器的工作流程:
- 接受请求并解析(Tomcat完成)
- 根据请求计算响应(自己需要实现的逻辑,也即是doGet要实现的内容)
- 构造响应函数,返回给客户端(Tomcat完成)
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;
//当Tomcat收到路径为/hello的请求,就会调用classServlet的代码
//HttpServlet若此处HttpServlet报红,说明以来导入不成功,此时刷新右侧maven工具栏即可
//当Tomcat收到路径为/hello的请求,就会调用classServlet的代码
// 若请求是get请求,则调用classServlet.doGet方法,若是post请求,调用classServlet.doPost
@WebServlet("/hello") //注解,给入路径
public class classServlet extends HttpServlet {
//doGet方法是父类HttpServlet的方法,因此子类classServlet需要重写doGet方法才能使用
// doGet(req, resp):doGet方法根据请求生成响应
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// super.doGet(req, resp); //不能使用此方法,super.方法是调用父类的方法,也即是调用HttpServlet的doGet方法
System.out.println("hello world"); //在控制台显示输出内容
resp.getWriter().write("hello world"); 在浏览器页面显示字符串
}
}
servlet代码不是通过 main 方法作为入口. main 方法被包含在 Tomcat 里, Tomcat 在合适的时机调用,我们写的代码不是一个完整的程序, 而是 Tomcat 这个程序的一小部分逻辑.
Tomcat 什么时候调用? 满足啥样条件才能被调用呢?
主要满足三个条件:
a) 创建的类需要继承自 HttpServlet
b) 这个类需要使用 @WebServlet 注解关联上一个 HTTP 的路径
c) 这个类需要实现 doXXX 方法.当这三个条件都满足之后, Tomcat 就可以找到这个类, 并且在合适的时机进行调用.
1.4打包程序
基于maven打包
注意!!! tomcat不能识别jar包(java-jar命令运行),只能识别war格式
war 包和 jar 包的区别:
1.jar 包是普通的 java 程序打包的结果. 会包含一些 .class 文件.
2.war 包是 java web 的程序, 会包含 .class 文件, 还包含 HTML, CSS, JavaScript, 图片等 以及其他的 jar 包. 打成 war 包格式才能被 Tomcat 识别.
因此,需要修改pom.xml配置,在添加依赖的下方添加标签,修改打包的类型为war(可被Tomcat识别),先删除原先的jar包(不删会报错,无法生成war包),再次重复打包操作生成war包
<packaging> war </packaging>
war包部署到Tomcat上会自动解压缩,生成同名的目录;通过浏览器URL访问webapp时,要在URL中带目录的名字。由于生成的war包名字较长,可以rename:此时也需先删除生成的war包
在 pom.xml 中再新增一个 build 标签, 内置一个 finalName 标签, 重命名为:classServlet
<packaging>war</packaging>
<build>
<finalName>classServlet</finalName>
</build>
得到最后重命名的classServlet.war:
1.5部署程序
将classServlet.war包放入到Tomcat/webapps目录下,然后启动Tomcat/bin/startup.bat
1.6验证程序
浏览器输入127.0.0.1:8080/classServlet/hello (hello为注解中的路径)
访问Tomcat需要指定两级目录(文本路径也即是war包名、注解路径servlet路径)
2.IDEA smart tomcat:插件plugin:一键打包部署
2.1下载smart tomcat
2.2配置smart tomcat
点击绿色的三角号(add configuration处), IDEA 就会自动进行编译, 部署, 启动 Tomcat 的过程.
(此时不需要手动启动Tomcat,一键部署会自动在控制台启动;若手动开启了会导致控制台启动Tomcat出错,无法完成一键部署)
2.3验证:访问页面
使用127.0.0.1:8080/servlet/hello 访问页面.(此处的servlet指上图中6中Context Path的路径)
使用 Smart Tomcat 部署的时候, Tomcat 的 webapps 内部并没有被拷贝一个 war 包,也无解压缩的内容.Smart Tomcat 相当于是在 Tomcat 启动的时候直接引用了项目中的 webapp 和 target 目录.
3.Servlet出现错误的几种形式
(1)出现 404:表示用户访问的资源不存在. 大概率是 URL 的路径写的不正确.(可能是少写了 Context Path或Servlet Path的问题;web.xml内容有问题时,Tomcat不能正确加载到webapps)
(2)出现 405:表示对应的HTTP请求没有实现(没有实现 doGet 方法/没有注释super.doGet)
(3)出现 500:往往是 Servlet 代码中抛出异常导致的
(4)出现 "空白页面":没有 resp.getWritter().write() 操作,没有写入内容
(5)出现 "无法访问此网站":一般是 Tomcat启动失败
浏览器发出GET请求:
1.直接在地址栏输入URL
2.通过<a>标签跳转
3.通过<img>/<link><script>标签
4.通过form表单,method指定为GET
5.通过ajax,type指定为GET
浏览器发出POST请求:
1.通过form表单,method指定为POST
2.通过ajax,type指定为POST