之前有介绍到 Tomcat支持静态页面,所谓
静态页面
就是
页面内容始终固定不变的页面
,Tomcat 也支持动态页面,
动态页面
就是
会随着用户输入的不同,时间的不同,用户的不同,页面的内容也会相印的发生变化
。
主要就是通过程序员代码的不同,读取用户的不同输入,进行相关计算,得到不同结果,然后生成页面返还给浏览器的过程。
为方便对用户的请求进行处理,方便返回计算结果,完成构建动态页面请求这个任务。Tomcat 提供了一组 API工程序员直接使用,这组 API 就是 Servlet
接下来就将写第一个Servlet 程序,熟悉创建项目的过程。
一、创建项目
- 使用 IDEA 创建一个 Maven 项目(Maven是一个知名构建工具)
- 填写项目名字和保存的目录
创建好项目后,IDEA中产生了一些目录
可以看见pom.xml
文件的格式和HTML类似,都是标签形式,在这里就可以引入项目所依赖的第三方库,来配置一些属性
二、引入依赖
因为这是一个 Servlet 程序,所以需要在pom.xml 中引入Servlet 第三方库
- 在中央仓库中搜索 Servlet ,选择第一个
- 选择 3.1.0 版本(该版本需要和Tomcat的版本相匹配,这里对应的是Tomcat 8系列)
- 将如下代码片段进行拷贝,粘贴到 pom.xml 中(项目中可能会有很多的依赖,每个依赖都被<denpendency>包裹,这些依赖都需要放在<dependencies>标签中)
首次粘贴进来,Maven就会自动从中央仓库下载依赖的jar包到本地,同时引入到项目中,未下载完毕时,代码会呈现红色。如果一直呈现红色,可以在右上角用如下方式进行刷新。
下载完毕后可以查看第三方库下载的地址,可以在这里查看是否下载成功,如果没有成功,可以将 3.1.0 这个文件删除,保持网络通畅,在重新下载一次
三、创建目录结构
-
在main目录下创建
webapp
目录(和java目录同级) -
在webapp目录下创建
WEB-INF
目录 -
在WEB-INF目录下创建
web.xml
文件
在 web.xml 文件中复制粘贴以下代码,该文件是 Tomcat 能够识别动态页面的入口文件,切记不可粘贴错误,否则就会无法部署程序
<!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>
四、编写代码
- 在 Java目录下,创建一个Java文件(HelloServlet.java),写代码
-
创建出的 HelloServlet 类继承 HttpServlet,如果没有办法继承,说明第三方库下载出问题了
-
在该类中重写 doGet 方法,需要删除
-
在该类的前面加上注解,这里的注解为
@WebServlet("/hello")
,表示 Tomcat 收到的路径为 /hello 的请求才会调用 HelloServlet 这个类的代码@WebServlet("/hello") public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=utf-8"); resp.getWriter().write("你好 Servlet!!!"); } }
- 重写的doGet方法是HttpServlet 的方法,在这里重写了父类的doGet方法来实现多态。其中第一个参数req表示Tomcat收到的HTTP请求,第二个参数resp表示构造成的HTTP响应。当Tomcat收到GET请求是会自动触发该方法
- HttpServletRequest 类就是Tomcat 收到的请求解析成的对象,HTTP请求中有啥这里面就有啥
- HttpServletResponse 类就是Tomcat 要给浏览器返回的响应所对应的对象,HTTP响应中有啥这里面就有啥
- resp.getWriter():获取流对象,通过此来写入数据,数据会被构成HTTP响应中的body部分
- resp.setContentType:进行编码方式的统一,避免出现乱码
五、打包程序
- 首先修改pom.xml中的部分,指定打包的包的类型,包的名字
<packaging>war</packaging>
<!-- 包的类型为war -->
<build>
<finalName>javaServlet</finalName>
<!-- 包的名字为javaServlet -->
</build>
- 执行打包操作:Maven->Lifecycle->package,双击package
打包成功后
六、部署程序
- 在左侧的目录栏中打开打好的war包的文件目录
- 复制文件目录中的javaServlet.war,粘贴到Tomcat的webapps目录下
粘贴好后,Tomcat 能自动识别出war包,并对其解压缩和部署
七、验证程序
- 启动Tomcat
- 在浏览中输入127.0.0.1:8080/javaServlet/hello,即可成功访问自己写的 Servlet 程序
注意目录的书写,JavaServlet 是打好的war包的名字,hello是注解指定的(@WebServlet("/hello")),前者路径称为 Content Path
,表示一个webapp,后者路径称为 Servlet Path
,表示这是该网站中的一个页面
八、Smart Tomcat 简化打包部署
在上述的过程中,打包和部署这一过程显得比较繁琐,一旦代码有所改动,想要看一下效果,就需要对程序进行打包,粘贴,复制,会使得webapps的目录下出现很多冗余的文件,也很费时间,因此Smart Tomcat这个插件就可以解决以上的问题(社区版IDEA)。
- File->Settings->Plugins->选择Marketplace->搜索
"Smart Tomcat"
->点击Installed(没有下载的状态是绿色的,此处已经下载过),下载完后重启IDEA
- 使用 Smart Tomcat
此时页面右上角处有了绿色的小三角,点击进行打包部署
- 此时启动 Tomcat,在浏览器中输入127.0.0.1:8080/javaServlet/hello就同样可以看见结果。
实际上,用该方法进行打包部署相当于在 Tomcat 启动的时候直接引用了项目中的 webapp 和 target 目录
如果用 Smart Tomcat 进行打包部署的话,那么pom.xml 中写的什么war包,及其名字就不再重要。
九、访问出现错误
- 404
错误原因:
Content Path
或者Servlet Path
路径没写或者写错- webapp 加载失败,比如
web.xml
中的内容出错
关于路径:
- Content Path :
- 没使用 Smart Tomcat,Content Path 就是打包时war包的名字
- 如果使用 Smart Tomcat,Content Path 就是配置路径时的命名的名字
- Servlet Path :在类上面写的注解的内容
- 405
表示对应的HTTP请求没有实现。
错误原因:
- 当GET方法访问服务器时,但是写的Servlet中并没有实现doGet方法,就默认为父类的doGet方法,即返回一个405错误页面
- 重写doGet方法,但是没有删除
- 500
错误原因:
- Servlet 代码中抛出异常,出现500后,在页面上会显示代码的调用栈,指出出现问题的位置
- 空白页面
错误原因:
- 说明没有正确的写入数据,比如去掉 resp.getWritter().write() 操作
- 无法访问此网站
错误原因:
- 注解写错了,比如少写了/
- Tomcat 没启动
- IP/端口号写错
完!