> 文章列表 > ServletAPI详解(一)

ServletAPI详解(一)

ServletAPI详解(一)

目录

1.Tomcat简介

2.Servlet 是什么?

3.编写Servlet 程序步骤

1.创建一个Maven项目

2.引入依赖

3.创建目录

4.编写代码

5.打包程序

6.部署程序

7.验证程序

4.使用SmartTomcat插件部署


1.Tomcat简介

Tomcat是一个开源的,基于java实现的被广泛使用的web服务器.web服务器是一个应用程序,对HTTP协议进行封装,使得程序员不必直接对协议进行操作,让web开发更简洁高效

官网:https://tomcat.apache.org

我们这里下载的是Tomcat 8,下载完直接解压就可使用.卸载只需删除目录

我们来看一下Tomcat的目录

启动tomcat:bin\\startup.bat

控制台显示的日志默认是乱码的,是因为控制台默认字符集是GBC,而Tomcat中默认是UTF8的

更改配置后就不乱码了

 更改后保存

关闭tomcat

1.直接点X:强制关闭(无法保留数据)

2.bin\\shutdown.bat:正常关闭 

3.Ctrl+C:正常关闭

基本使用
1.修改启动端口号:conf/server.xml 

 

默认端口是8080,如果修改成80,将来访问tomcat则可省略端口号,HTTP协议默认端口号为80

2.启动tomcat可能出现的问题

端口号冲突:Address already in use:bind

找到对应的程序并关闭

启动框闪退:检查JAVA_HOME环境变量是否正确配置了 

使用tomcat部署项目:下文有详细介绍 

2.Servlet 是什么?

Servlet 是什么是一种实现动态页面的技术,是一组Tomcat提供给程序员的 API ,使得开发一个webapp简单高效

它是一个接口,将来我们需要定义Servlet类实现Servlet接口,并由Web服务器运行Servlet.

静态页面:内容始终固定的页面,即使用户不同/时间不同/输入参数不同,页面还是不会发生改变,除非页面的源代码被修改后,页面才会发生改变,只有静态页面效果显然是不科学的

动态页面:随着用户不同/时间不同/输入参数不同,页面内容会随之发生变化的页面

构建动态页面的技术有很多,每种语言都有一些相关的库/框架来做这件事,servlet就是Tomcat这个HTTP服务器提供给Java的一组API,来完成构建动态页面这个任务

3.编写Servlet 程序步骤

1.创建一个Maven项目

2.引入依赖

项目创建好后,会自动生成一个pom.xml文件,我们要在xml文件中引入Servlet API依赖的jar包

1. 在中央仓库 https://mvnrepository.com/中搜索 "servlet", 一般第一个结果就是

点击进去选择3.1.0版本,版本要和 Tomcat匹配

 2.复制这里的依赖

 可以查看版本对应关系:https://tomcat.apache.org/whichversion.html

3.把中央仓库的xml复制到xml中

注意写在

<dependencies></dependencies>标签之间

要在ieda中配置好Maven的路径 

3.创建目录

项目创建好之后,IDEA会自动生成一些目录

src表示源代码所在目录

main/java表示源代码的根目录,后续创建的.java文件也放在这个目录

main/resources表示项目的一些资源文件所在目录

test/java表示测试代码根目录

我们还需要创建一些其他目录

在main目录下创建webapp目录

在webapp目录下创建WEB-INF目录,并创建一个web.xml文件

在.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等,在这个目录中还有一个重要的文件 web.xml. Tomcat 找到这个文件才能正确处理 webapp 中的动态资源

 IDEA中开发中的MavenWeb项目的项目结构

4.编写代码

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;@WebServlet("/hello")
public class HelloWorld extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("hello world");resp.getWriter().write("hello world");}
}

先创建一个类HelloWorld类继承自HttpServlet

在这个类上方加上注解:@WebServlet("/hello")

表示 Tomcat 收到的请求中, 路径为 /hello 的请求才会调用 HelloWorld 这个类的代码. (这个路径未包含 Context Path)

重写 doGet 方法. doGet 的参数有两个, req表示收到的 HTTP 请求,resp表示构造的 HTTP 响应. 这个 方法会在 Tomcat 收到 GET 请求时触发

HttpServletRequest 表示 HTTP 请求. Tomcat 按照 HTTP 请求的格式把 字符串 格式的请求转成一个 HttpServletRequest 对象. 后续想获取请求中的信息(方法, url, header, body 等) 都是通 过这个对象来获取. HttpServletResponse 表示 HTTP 响应. 代码中把响应对象构造好(构造响应的状态码, header, body 等)

resp.getWriter() 会获取到一个流对象, 通过这个流对象就可以写入一些数据, 写入的数据会被 构造成一个 HTTP 响应的 body 部分, Tomcat 会把整个响应转成字符串, 通过 socket 写回给浏览器

我们的代码不再是通过main方法作为入口了,而是main方法已经被包含在Tomcat中,我们写的代码会在合适的时机被调用,我们写的程序只是Tomcat程序的一小部分逻辑

能被Tomcat调用的类满足三个条件:

1.继承自HttpServlet

2.@WebServlet 注解关联上一个 HTTP 的路径

3.实现doXXX方法

5.打包程序

打包成功

相当于把 artifactId 和 version 拼接起来了

我们看到这是一个jar包.jar 包并不是我们需要的, Tomcat 需要识别的是另外一种 war 包格式. 另外这个 jar 包的名字太复杂了, 可以设置简单一些

jar 包是普通的 java 程序打包的结果,里面会包含一些 .class 文件,war 包是 java web 的程序, 里面除了会包含 .class 文件之外, 还会包含 HTML, CSS, JavaScript, 图 片, 以及其他的 jar 包. 打成 war 包格式才能被 Tomcat 识别

打war包

在 pom.xml 中新增一个 packing 标签, 表示打包的方式是打一个 war 包

在 pom.xml 中再新增一个 build 标签, 内置一个 finalName 标签, 表示打出的 war 包的名字是 HWorld

<packaging>war</packaging><build><finalName>ServletHelloWorld</finalName></build>

完整的pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>ServletHelloWorld</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><!-- 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></dependencies><packaging>war</packaging><build><finalName>ServletHelloWorld</finalName></build>
</project>

重新打包可生成war包

6.部署程序

把war包拷贝到Tomcat的webapps目录下,启动Tomcat就会解压缩war包

看到这个日志说明 Tomcat 已经正确识别了 ServletHelloWorld 这个 webapp.

有的控制台这些日志信息是乱码的,是因为控制台默认字符集是GBC,而Tomcat中默认是UTF8的

更改配置后就不乱码了

 更改后保存

7.验证程序

注意: URL 中的 PATH 分成两个部分, 其中 ServletHelloWorld 为 Context Path, hello 为 Servlet Path

4.使用SmartTomcat插件部署

手动拷贝 war 包到 Tomcat 的过程比较麻烦. 我们使用 IDEA 中的 Smart Tomcat 插件完成这个工作

插件就是针对程序的一些特定的场景,做出一些特定功能的扩展

安装Smart Tomcat

安装完成后会提示重启IDEA

配置Smart Tomcat插件

ContextPath默认填写的是项目名称,会影响到后续的访问页面

点击绿色的三角号, IDEA 就会自动进行编译, 部署, 启动 Tomcat 的过程,此时 Tomcat 日志就会输出在 IDEA 的控制台中

然后访问页面

使用 Smart Tomcat 部署的时候, 我们发现 Tomcat 的 webapps 内部并没有被拷贝一个 war 包, 也没有看到解压缩的内容. Smart Tomcat 相当于是在 Tomcat 启动的时候直接引用了项目中的 webapp 和 target 目录