文章目录
- Servlet
-
- 写一个最简单的Servlet程序
-
- [1. 创建项目](#1. 创建项目)
- [2. 引入依赖](#2. 引入依赖)
- 3.创建目录
- 4.编写代码
- 5.打包程序
- [6. 部署程序](#6. 部署程序)
- [7. 验证程序](#7. 验证程序)
- 如果想修改代码怎么办呢
- [smart tomcat的使用](#smart tomcat的使用)
- 解决中文乱码的问题
- 编写Servlet代码中遇到的问题
- [Servlet API](#Servlet API)
Servlet
- Tomcat提供了一组api,这里面封装了HTTP协议 ,这样能够更好地编写动态网页了
- Spring对Servlet进行了进一步的封装,从而让我们编写网站更简单了,我们以后进行开发,都是以Spring为主的
- 我们学了Sevlet能够更好地理解Spring,除了使用API之外,更重要的是web开发的基本思路和流程
Sevlet主要做的工作:
就是让我们自己写一些类,然后把这些类给加载到Tomcat中,后续Tomcat收到HTTP请求(来自浏览器),就会执行到我们写的代码上,从而通过这些代码完成一定的业务逻辑
写一个最简单的Servlet程序
先写一个最简单的Servlet的 hello world 程序。
目标:编写Servlet代码,最终在浏览器上,能够展示出 hello world
这分为7个步骤:
1. 创建项目
了解:Maven是什么
Maven能干什么
Maven生成的目录结构是怎么样的
Maven解决依赖关系和编译打包工作
此处创建的是一种新的项目形式,称为Maven项目,Maven是Java中一个知名的构建工具(IDEA已经集成了Maven,可以直接使用),Maven是帮助你编译/打包代码的工具
在IDEA中创建一个Maven项目
maven项目在首次创建的时候,会自动从网站上下载一些依赖的组件(这个过程需要网络稳定,不然后续使用Maven会出错)
Maven的目录结构:
什么是业务?
高效率地解决实际问题,问题的详细情况,解决问题的具体过程也就是所谓的业务。
默认生成的Maven文件:
2. 引入依赖
1.接下来要写的程序,会使用Servlet。Servlet这个api是tomcat提供的。而不是jdk提供的(第三方库不是 jdk 自带的)这就需要我们手动安装引入(之前搞mysql的时候,搞了一个 mysql jdbc driver)
可以手动下载导入,比较麻烦。(在工作中涉及的项目,可能依赖的内容非常多),手动管理就非常麻烦了
使用maven就可以非常方便地解决上述问题了
(1) 打开maven中央仓库,找到需要的servlet的jar包
3.1是和Tomcat 8匹配的版本,Servlet的版本必须要和Tomcat版本匹配
(2) 借助maven,自动下载上述依赖
刚才的 jar 包被下载到哪里了呢?
maven 本地仓库
maven就会在你的机器上搞一个目录
这个目录就会保存你这边下载好的这些jar包
可以通过idea,找到你的maven的仓库位置
3.创建目录
maven 项目,是普适的。不仅仅局限于Tomcat。
对于Tomcat来说,对于项目的目录结构,还有一些额外的要求。
Tomcat要求的目录结构,必须是下面这样的:
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>
可能会出现标红的问题(以及解决办法):
4.编写代码
1.在java目录中,创建类
doGet方法中参数的含义:
这里就使用到了多态 :
多线程,网络,Servlet,都用到了多态机制。本质目的,都是为了能够给现有的代码流程中,插入一段咱们自定义的逻辑。
写一个服务器代码的主要三个步骤(只有业务逻辑是需要咱们自己写的):
通过路径找到这个类,然后在浏览器上执行代码
java
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 {
// 这个打印是显示到 tomcat 的控制台上的(服务器端)
System.out.println("hello world");
// 把内容显示到页面上,把 "hello world" 字符串作为 http响应的 body 部分
// 这个部分就会被浏览器显示到页面上
resp.getWriter().write("hello world");
}
}

5.打包程序
- 打包程序,把我们写的代码打成 war包。(Tomcat需要一个war包在上面)
maven 就可以完成打包操作
(1) 修改pom.xml,设置打包的类型和包名字
(2) 在右侧maven面板中,双击package这个按钮

首次打包,更容易出现问题,这些依赖下载好了之后,后续就不需要重新下载了
6. 部署程序
- 把war拷贝到webapps目录中即可,然后启动tomcat
找到war包
把war包拷贝到webapps目录下
7. 验证程序
- 通过浏览器,访问tomcat,获取到我们代码返回的hello world
上面的7个步骤需要我们多操作几遍,要能够非常熟悉才行
如果想修改代码怎么办呢
把hello world 修改成 hello java
(1) 修改代码 (现在不是我们一修改代码,就能立即生效的)
(2) 重新打包
(3) 重新部署
每次修改代码都需要重新打包,重新部署,并且我们修改代码是非常频繁的,这个过程是比较麻烦的
所以引入了IDEA的插件,把tomcat集成到IDEA中。此时,就可以通过IDEA一键式的重新打包部署了
什么是插件??
插件是在这个程序上的又扩展,并且可以按需使用扩展功能,不要就不装,需要就装
- Tomcat的插件是 Smart Tomcat

如果下载不了,可以到idea plugin中下载
下载好之后,得到jar包,把jar包拖到idea中,就会安装了
smart tomcat的使用
- 配置tomcat
现在点击三角形就能够跑起来了
tomcat跑起来之后,tomcat的日志就显示到idea的控制台上了
并且乱码问题也好了,因为idea的编码方式和tomcat的编码方式都是utf-8

出现报错的问题
点击链接是一级目录,我们需要两级目录才能访问
有了smart tomcat之后,修改代码的时候只需要重新点击运行即可
解决中文乱码的问题
- 乱码,意味着有多个环节,对于编码方式的理解是不一致的
比如构造数据按照utf8,解析数据按照gbk,就很容易出现乱码了。
1.梳理清楚,程序运行过程中,哪些环节涉及到对于编码的处理
2.每个环节的编码都是什么
(1) 构造数据
这里的你好两个字,是直接在idea的代码编辑器中,构造的。这个编码方式就要看idea的代码编辑器是什么编码,idea这里是utf-8
File -> Setting -> Encoding

(2) 解析数据
浏览器默认额解析方式,是跟随系统的。Windows 10 简体中文版,使用的字符集是 GBK
把gbk改成utf8。utf8才是主流
解决方法:在HTTP响应报文中,显示地告诉浏览器,返回的body字符集是什么
设置响应报文的body
java
resp.setContentType("text/html; charset=utf8");

编写Servlet代码中遇到的问题
404
404表示用户访问的资源不存在,大概率是url路径写的不正确
(1) url路径写错了
路径的正确写法:
(2) webapp 没有正确加载
比如,web.xml 内容不对
405
- 405 是方法没有被实现(GET请求,但是Servlet却没有重写doGet)
比如把方法名改为doPost,自然不是没有实现doGet了
- 还有一个原因,会引发405,写的代码中,没有删掉 super.doGet()
500
- 服务器内部错误,你的代码抛出异常了
在日志,或者响应中,会带有异常信息
出现空白页面
- 这个时候,就要检查,服务器是否真的返回了带有正文的响应报文,浏览器显示的内容,就是http响应的正文
出现无法访问此网站
- Tomcat没有正确运行
这个情况就需要检查tomcat是否是正常工作的。如果tomcat确实正常工作了,就需要检查,浏览器的ip和端口号是否正确,这两种都可能导致出现无法访问此网站的问题
Servlet API
Servlet的api主要学习的是三个类
1.HttpServlet
2.HttpServletRequest
3.HttpServletResponse
HttpServlet
- 写一个代码,往往都是要继承这个类,重写里面的方法
写的Servlet程序,没写main。我们写的这个程序,不是直接运行的,而是放到tomcat上运行的。tomcat这个程序里,有main的。tomcat就是火车头,写的webapp就是车厢
HttpServlet:继承这个类,重写里面的方法,目的就是为了把我们自己定义的代码,插入到 tomcat 中
- 在tomcat中,就有下面这样的代码
方法
- 方法
Servlet的生命周期(经典的面试题)
生命周期:什么时间点,做什么事情
最开始初始化都执行init
最终结束前都执行destroy
每次收到请求都执行service