- Tomcat
- 什么是Tomcat
- Tomcat的目录结构
- 启动Tomcat
- Maven
- Maven依赖管理流程
- 配置镜像源
- Servlet
- 主要工作
- 实现Servlet
- 添加依赖
- 实现
- 打包
- 分析
- 配置插件
Tomcat
什么是Tomcat
Tomcat 是一个 HTTP 服务器。前面我们已经学习了 HTTP 协议, 知道了 HTTP 协议就是 HTTP 客户端和 HTTP 服务器之间的交互数据的格式。HTTP 服务器可以通过 Java Socket 来实现,而 Tomcat 就是基于 Java 实现的一个开源免费, 也是被广泛使用的 HTTP 服务器。
Tomcat的目录结构
其中最关注的目录就是 webapps 目录。web applications 的简称, 意思是用来存放 web 应用的文件夹。 "web 应用"就是一个具有独立完整功能的 “网站”, 我们就可以称为一个 “web 应用”。
例如搜狗搜索实现了独立完整的 “搜索引擎功能”, 淘宝网 实现了独立完整的 “电商功能” 。
一个 Tomcat 服务器上是可以同时部署多个这样的 web 应用的。这些 web 应用以目录的形式被放到 webapps 目录中。
启动Tomcat
在 bin 目录中, 双击 startup.bat 即可启动 Tomcat 服务器。然后在浏览器中输入 127.0.0.1:8080 即可看到 Tomcat 的默认欢迎页面。
Maven
什么是Maven?
Maven 是一个项目构建工具,创建的项目只要遵循 Maven 规范 (称为Maven项目),即可使用Maven 来进行: 管理 jar 包、编译项目,打包项目等功能。
为什么学习 Servlet 之前要学 Maven?
因为 Servlet 是框架,要使用 Maven 进行iar 包管理和项目打包和发布。
Maven依赖管理流程
配置镜像源
在配置Maven的settings文件时,主要是需要配置国内镜像源。
Servlet
Servlet 是 Tomcat 这个 HTTP 服务器提供给 Java 的一组 API, 来完成构建动态页面这个任务。
主要工作
1.建立连接:客户端和程序的连接(当用户输入了请求URL之后,程序能够感知到用户的请求);
2.获取用户请求参数:处理request对象;
3.将服务器处理结果返回给客户端:返回response对象。
实现Servlet
添加依赖
新建空项目之后,在pom.xml中添加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>
其中,groupId表示组织Id,artifactId表示项目Id,version表示版本号,scope表示作用域。
作用域的类型:
compile: 默认作用域,在编译、运行、测试时均有效
provided: 在编译、测试时有效,但是在运行时无效。意味着打包的时候可以不用包进去,别的设施(WebContainer)会提供。
runtime: 在运行、测试时有效,但是在编译代码时无效。
test: 只在测试时有效,包括测试代码的编译,执行。例如: JUnit.
system: 在编译、测试时有效,但是在运行时无效。
这里的作用域是provided,也就是在运行时无效,此时用的是Tomcat内置的一套Servlet Api。
实现
1.创建webapp目录。在 main 目录下, 和 java 目录并列, 创建一个 webapp 目录 (注意, 不是 webapps)
2.创建 web.xml。然后在 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 中的一个重要的目录。当前我们可以往 webapp 中放一些静态资源, 比如 html , css 等。在这个目录中还有一个重要的文件 web.xml。Tomcat 找到这个文件才能正确处理 webapp 中的动态资源。
代码实现:
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取前端对象
String name = req.getParameter("name");
//将结果返回给前端
resp.getWriter().println("name=" + name);
}
}
• 创建一个类 HelloServlet , 继承自 HttpServlet
• 在这个类上方加上@WebServlet(“/hello”) 注解, 表示 Tomcat 收到的请求中, 路径为 /hello的请求才会调用HelloServlet 这个类的代码。(这个路径未包含 Context Path)
• 重写 doGet 方法。doGet 的参数有两个,分别表示收到的 HTTP 请求 和要构造的 HTTP 响应. 这个方法会在 Tomcat 收到 GET 请求时触发。
• HttpServletRequest 表示 HTTP 请求. Tomcat 按照 HTTP 请求的格式把 字符串 格式的请求转 成了一个HttpServletRequest 对象. 后续想获取请求中的信息(方法, url, header, body 等) 都是通过这个对象来获取。
• HttpServletResponse 表示 HTTP 响应。 代码中把响应对象构造好(构造响应的状态码,header, body 等)
• resp.getWriter() 会获取到一个流对象, 通过这个流对象就可以写入一些数据, 写入的数据会被构造成一个 HTTP 响应的 body 部分, Tomcat 会把整个响应转成字符串, 通过 socket 写回给浏览器。
打包
将程序打包放在Tomcat中运行。
使用 maven 进行打包。 打开 maven 窗口 (一般在 IDEA 右侧就可以看到 Maven 窗口) ,然后展开 Lifecycle , 双击 package 即可进行打包,得到一个.jar后缀的包。
但此时这样的 jar 包并不是我们需要的, Tomcat 需要识别的是另外一种 war 包格式,而且这个包的名字太复杂。此时需要在pom.xml文件中在新增一个 packing 标签, 表示打包的方式是打一个 war 包。还可以再新增一个 build 标签, 内置一个 finalName 标签, 表示打出的 war 包的名字是ServletHelloWorld。
<packaging>war</packaging>
<build>
<finalName>ServletHelloWorld</finalName>
</build>
war 包和 jar 包的区别:
jar 包是普通的 java 程序打包的结果。 里面会包含一些 .class 文件。 war 包是 java web 的程序, 里面除了会包含 .class 文件之外, 还会包含 HTML, CSS, JavaScript, 图片,以及其他的 jar 包。打成 war 包格式才能被 Tomcat 识别。
将打包好的Servlet项目放在前面提到的Tomcat的webapps的根目录下才能正常运行。
此时双击Tomcat的bin目录下的statup.bat文件启动Tomcat,在浏览器中输入localhost:8080/ServletHelloWorld/hello
,这样就简单实现了一个Servlet项目。注意,这里必须要输入完整的地址,ServletHelloWorld表示war包的名字,hello表示代码中的注解地址。
在这里可以发现,整个代码不是通过 main 方法作为入口了。main 方法已经被包含在 Tomcat 里, 我们写的代码会被Tomcat 在合适的时机调用起来。此时写的代码并不是一个完整的程序, 而是 Tomcat 这个程序的一小部分逻辑。
那随便写个类都能被 Tomcat 调用嘛? 满足啥样条件才能被调用呢?
主要满足三个条件:
a) 创建的类需要继承自 HttpServlet
b) 这个类需要使用 @WebServlet 注解关联上一个 HTTP 的路径
c) 这个类需要实现 doXXX 方法.
当这三个条件都满足之后, Tomcat 就可以找到这个类, 并且在合适的时机进行调用。
分析
通过开发者工具,可以看见通过浏览器访问的时候默认的是GET请求。
此时不能发送POST请求。我们使用postman发送POST请求来模拟接口。
Postman的使用:
当发送GET请求时:
而当发送post请求时,出现错误。
进而说明通过浏览器(URL)时默认GET请求。那如何让他支持post该怎么做呢?继续重写doPost方法。然后打包新程序,停止之前的Tomcat服务,将新程序的war包放到tomcat的webapps下,再启动tomcat服务。
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取前端对象
String name = req.getParameter("name");
//将结果返回给前端
resp.getWriter().println("name=" + name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//将请求转发到doGet方法中。
this.doGet(req,resp);
}
}
配置插件
上述整个流程中,每次更改程序之后都要重新打包,然后将其放在tomcat的目录下,非常不方便,我们需要一种方便的部署方式。可以通过下载smart Tomcat插件并重启IDEA(专业版忽略)。
设置好配置信息
将运行出的链接粘贴到浏览器并指定自己的注解即可。
继续加油~