一:什么是Servlet
(1)动态页面和静态页面
静态页面:是指在服务器上事先创建好的固定内容的网页。它的内容在用户请求时直接被发送给用户,无需进行额外的处理或计算。静态页面的内容对所有用户来说是一样的,无法根据用户的个性化需求进行动态变化。静态页面通常使用 HTML、CSS 和 JavaScript 等静态的网页语言来编写,这些文件保存在服务器上并直接被发送给客户端
例如Tomcat主页就是一个静态页面
动态页面:是在服务器上根据用户的请求和其他动态数据生成的网页。它的内容是根据用户的请求、用户信息、数据库查询等动态生成的,可以根据用户的不同需求呈现不同的内容。动态页面通常使用服务器端编程语言(如Java、PHP、Python等)编写,通过在服务器上运行程序来生成页面内容,然后将生成的内容发送给客户端
例如B站首页就是动态页面,不同用户看到都是个性化定制的内容
动态页面具有更强的交互性和个性化定制能力。它可以根据用户的登录状态、权限、输入参数等动态地生成页面内容,例如根据用户的搜索关键词显示相关的结果、根据用户的购物车内容生成结算页面等。通过动态页面,网站可以实现更丰富和灵活的功能,并提供更好的用户体验
(2)Servlet是什么
Servlet:Servlet 是一种 Java 编写的服务器端组件,用于处理请求和生成响应,而 Tomcat 是一个服务器软件,作为 Servlet 容器,用于管理和运行 Servlet。通过将 Servlet 部署到 Tomcat 中,可以创建动态的 Web 应用程序。Tomcat 提供了对 Servlet 的生命周期管理、请求处理和线程池等功能,使得开发者可以方便地构建和部署基于 Java 的 Web 应用。所以简单来说,Servlet就是Tomcat这个HTTP服务器提供给Java的一组API,来完成构建动态页面这个任务,这会使程序员无需关注Socet,HTTP协议格式、多线程等内容,大大降低了开发Webapp的难度,提高了开发效率
二:第一个Servlet程序
(1)创建项目
打开IDEA,创建一个Maven项目
- 之前我们写代码,都是直接在IDEA里,点击main方法前面的三角号后就自动编译运行了。这样做,针对一些比较简单的项目是可行的,但是对于一些复杂的程序就显得不那么合适了,尤其是面对有多个模块并且形成相互依赖的情况。因此像Maven这样的构建工具就出现了,能使我们在开发较为复杂的项目的时候,可以方便地进行编译和打包操作
- Maven 是一个项目管理工具,用于构建、发布和管理 Java 项目的软件工程工具。Maven 提供了一种统一的方式来管理项目的构建过程、依赖关系、文档生成、测试和部署等方面
- Maven有一个非常好用且核心的功能就是依赖管理,它可以帮助我们自动引入所需依赖,而省去繁杂的下载(中央仓库)、安装等操作
创建后目录结构如下图所示
src
:源代码所在目录main
:java
:源代码根目录,后面创建的.java
文件就放在此处resources
:项目的一些资源文件
test
java
:测试代码根目录
pom.xml
:项目中的“阵眼”,放置全局配置文件,写了很多关于项目的相关配置属性
(2)引入Servlet依赖
- 注意:Servlet不是Java标准库自带的,所以要想正常使用,就需要额外的下载安装,然后引入到项目中
进入Java中央仓库,然后搜索Servlet,选择第一个搜索结果
版本不要乱选,这里选择3.1.0(因为涉及一个版本配套问题)
点击进去后不要选择下载(没必要),下拉页面,选择Maven,然后将文本框中的内容复制
<!-- 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>
然后进入pom.xml
文件,创建一个<dependencies></dependencies>
,再将所复制内容粘贴在该标签内
上图中有部分内容IDEA标红,这表示IDEA未检测到本地存在这个依赖。一般来说,Maven会自动进行加载,但如果等待一段时间后下方还是没有进度条,那么可以手动刷新。方法是:点击右侧Maven面板上的刷新按钮
下载完毕
(3)创建目录结构
- 注意:虽然maven已经给我们创建出了一些目录,但这还远远不够。我们需要的是一个符号Tomcat的目录结构
①创建webapp
目录:在main
目录下创建一个和java
目录并列的webapp
目录
②创建web.xml
:在webapp
目录内部创建一个WEB-INF
目录,然后在该目录下创建web.xml
文件
由于Tomcat是依靠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>
(4)编写代码
现在可以正式编写代码了,在java
目录下创建一个类HelloServlet
(也可以先创建Package再创建该类)
接着我们编写代码,下面代码虽然只有寥寥几行,但是包含很多信息
- 创建一个类
HelloServlet
,让其继承HttpServlet
(HttpServlet
就来自刚才引入的依赖) - 然后重写
HttpServlet
的doGet
方法(在IDEA中输入doGet
然后按下Tab键即可快速生成,注意一定删除自动生成的super.doGet(req, resp)
)doGet
表示当前Tomcat在收到某些GET请求时,会调用此方法根据HTTP请求构造HTTP响应- 参数
req
和resp
分别表示收到的HTTP请求和要构造的HTTP响应 - Tomcat已经帮助我们把解析HTTP请求、构造HTTP响应等一些繁杂的操作代为完成了,而我们的重点关注对象就是业务逻辑
resp.getWriter()
会获取到一个流对象, 通过这个流对象就可以写入一些数据, 写入的数据会被构造成一个 HTTP 响应的 body 部分, Tomcat 会把整个响应转成字符串, 通过 socket 写回给浏览器@WebServlet("/hello")
的意思是Tomcat只会针对路径为/hello
的GET请求生效
另外需要注意,现在的代码并不是通过main
方法来作为入口,main
方法已经被包含在Tomcat里面了,我们写的代码在合适的时机被Tomcat调用。所以下面的代码并不是一个完整的程序,而是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;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 一定要删除下面自动生成的代码
// super.doGet(req, resp);
// Tomcat显示
System.out.println("Hello");
// 给客户端返回
resp.getWriter().write("hello");
}
}
(5)打包程序
- 注意:我们之前学习时所写的代码,都是带有
main
方法的,这就像一个“小汽车”,它是自己带有发动机的。刚才写的Servlet代码,相当于一个“车厢”,它并没有发动机,但是我们可以把这个车厢挂到车头后面,让车头拉着它跑,这里车头其实就是Tomcat。这便是打包操作
点击maven面板,展开lifecycle
目录,双击Pacage
即可打包
如果打包成功,就会看见下面的BUILD SUCCESS
字样
然后你就可以在target
目录下看见.jar
包
但是这样的.jar
包并不是我们所需要的,Tomcat需要识别的是另外一种.war
包
jar
包:是普通Java程序打包的结果,里面会包含一些.class
文件war
包:是Java web的程序,除了包含一些.class
文件外,还会包括HTML、CSS、JavaScript,图片等其他文件
要想打包成.war
包也非常简单,只需要修改pom.xml
,在project
标签内加入以下内容(finalName
可以指定包名)
<packaging>war</packaging>
<build>
<finalName>HelloServlet</finalName>
</build>
然后重新打包
(6)部署程序
现在将之前打包后的war
包拷贝至Tomcat的webapps
目录下
然后启动Tomcat,Tomcat就会自动进行解压缩
(7)验证程序
现在在浏览器中输入http://127.0.0.1:8080/HelloServlet/hello
构造出HTTP请求进行访问
三:Smart Tomcat插件使用
上面所涉及的步骤中,第(5)、(6)步是需要频繁使用的,因为只要你的程序改动(哪怕只有一行)就需要重新打包和步数,所以十分繁琐,这里介绍一个一键化部署插件Smart Tomcat的安装和使用
在Settings-Plugins中搜索“Smart Tomcat”,安装完毕后重启IDEA
然后点击Add Configuration,接着点击左侧加号,然后选择Smart Tomcat
进行如下配置,其中Context path本来应该是webapps
里面的war
包或目录名,但由于SmartTomcat并不是真的在拷贝war包,所以不会涉及到war
包名这样的概念,这里可以任意填写,但是一定要保证后面请求中的路径和这里的Context Path是一致的
配置完成后,点击上面的run,就可以一键启动
评论区