目录
1 Tomcat
1.1 目录结构
1.2 启动服务器
1.3 部署
2 Servlet
2.1 创建项目
(1)创建Maven项目
(2)目录结构
(3)引入依赖
(4)创建必要的目录结构
(5)编写代码
(6)打包
(7)部署
(8)访问
1 Tomcat
Tomcat是一种http服务器,让我们实现服务器不必从Java的TCP Socket来从头搭建服务器,而是基于Tomcat提供的API来处理请求和响应,实现业务逻辑的代码。
1.1 目录结构
下载安装好Tomcat后,其目录结构如下:
bin:包含了许多可执行程序,比如启动服务程序startup.bat和startup.sh,bat后缀是Windows的可执行程序,sh后缀是Linux的可执行程序,而Tomcat运行在JVM上,JVM已经实现了跨平台的特性,因此Tomcat的命令也是跨平台的多种格式。
conf:相关配置文件,通过修改配置文件可以满足不同模式需求。
lib:相关依赖库,Tomcat是基于Java实现的,运行时必须依赖相应的实现类库。
logs:运行时的日志文件,帮助排除异常。
temp:临时文件夹,不关心。
webapps:存放要运行的web application的文件夹,要部署网站就要把相关的web文件放入其中。
work:Tomcat内部进行预编译的文件夹。
1.2 启动服务器
双击bin目录下的startup.bat命令,出现下述字样说明启动成功:
如果启动失败,打开cmd,把startup.bat可执行程序拖拽到命令行中敲回车,即可查看启动日志,根据错误信息排查。
启动成功后,在浏览器地址栏输入localhost:8080(Tomcat默认使用8080端口号),出现如下界面也说明启动成功:
1.3 部署
Tomcat支持静态页面和动态页面的部署,静态页面是写死的页面,动态页面可以根据用户的输入动态变化。
所谓部署,就是把web文件复制粘贴到Tomcat的webapps文件夹下,比如把博客前端页面放入该文件夹下:
此时就可以通过ip+端口号+blog_web+页面来访问某个页面了,但是部署到本机上,没有公网ip,只有私网ip,那只能同一个局域网才能访问到页面。有公网ip就可以全网访问到页面。
如果要部署动态页面,就需要Servlet(Tomcat提供的后端API)来实现后端代码。
2 Servlet
2.1 创建项目
(1)创建Maven项目
(2)目录结构
java目录就是放java代码的地方。
resources目录放入项目依赖的资源。
webapp目录是手动创建(格式必须一模一样)的,内部放入前端资源的代码:html、css和js等等,这是项目部署到Tomcat的重要目录,而内部web.xml文件时Tomcat可以正确处理webapp中动态资源的重要依赖。
test目录则是放测试代码的地方。
pom.xml文件是Maven项目最重要的配置文件,内部除了一些重要的项目配置信息,还有自动引入依赖的作用。
(3)引入依赖
Maven中央仓库的地址在https://mvnrepository.com/,在中央仓库中搜索servlet,引入servlet 3.1版本(注意:servlet 3.1、Tomcat 8.5和Java 8是兼容的版本,选择其他版本可能出现不兼容问题)。
<!-- 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>标签中,多个依赖都要粘到这个标签里面。
当前依赖还没有下载到本地,一般会自动下载,如果没有自动下载,就手动刷新(点击Maven框中的左上角)。如果没有红色,就说明依赖已经导入。
(4)创建必要的目录结构
按照(2)所示的目录依次创建必要的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>
(5)编写代码
@WebServlet("/hello")public class HelloServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("hello");resp.getWriter().write("hello");}}
1.必须继承HttpServlet,这个抽象类来源于servlet的依赖。
2.@WebServlet("/hello")注解表示只有收到/hello的请求才会执行这个类的代码(必须以
"/hello"结尾,不能作为中间路径)。
3.重写doGet方法。doGet的参数有两个,HttpServletRequest表示收到的HTTP请求,Http
ServletResponse表示要构造的HTTP响应。这个方法会在Tomcat收到GET请求时触发。
4.HttpServletRequest表示HTTP请求。Tomcat按照HTTP请求的格式把字符串格式的请求转成了一个HttpServletRequest对象。后续想获取请求中的信息(方法,url,header,body等)都是通过这个对象来获取。
5.HttpServletResponse表示HTTP响应。代码中把响应对象构造好(构造响应的状态码,head
er,body等)
6.resp.getWriter()会获取到一个流对象,通过这个流对象就可以写入一些数据,写入的数据会被构造成一个HTTP响应的body部分,Tomcat会把整个响应转成字符串,通过socket写回给浏览器。
7.没有main方法。main方法已经被包含在Tomcat里,在合适的时间执行。
(6)打包
点击package,再点击上栏绿色的运行,就可以把web程序打成包,包的名称是由把artifactId和version拼接组成:
打包成功:
默认是打成jar包(普通Java程序,只包含.class文件),而web程序需要打成war包(除了.class文件,还包含页面代码等)。
在pom.xml文件使用packaging标签指明打的是war包,finalName标签可以指明包名。再次打包:
如果出现打包失败,并且错误是Cannot access defaults field of Properties,可以尝试添加如下插件在pom.xml中:
<build><finalName>ServletHelloWorld</finalName><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.2.0</version><configuration><failOnMissingWebXml>false</failOnMissingWebXml></configuration></plugin></plugins></build>
(7)部署
把war包拷贝到Tomcat的webapps目录下,启动Tomcat就会自动把war包解压缩。
启动Tomcat,发现war包自动解压缩为:
注意:如果修改了代码,就要重新打包部署,并且还要重启Tomcat。
(8)访问
访问http://127.0.0.1:8080/ServletHelloWorld/hello,就会给端口号为8080的Tomcat发送GET请求,从而触发doGet方法,返回hello的HTTP响应。
注意:路径的写法,8080/后ServletHelloWorld即webapps中的目录,而/hello就是doGet方法注解标识的路径。而这种直接输入URL的方式发送的GET请求,接收到的响应就会直接把body的数据渲染到页面上。要想不渲染,就需要用更灵活的方法处理请求和响应(ajax)。
下篇文章:
Tomcat与Servlet(2)https://blog.csdn.net/sniper_fandc/article/details/147278951?fromshare=blogdetail&sharetype=blogdetail&sharerId=147278951&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link