Tomcat 是一个 HTTP 服务器,基于 TCP socket 实现的,可以处理 HTTP 请求也可以发送 HTTP 响应,基于Java实现的运行在JVM上
类似的 HTTP 服务器有很多,Tomcat 属于比较知名的一个。
Tomcat 会提供一组 API,让我们可以处理 HTTP 请求,
Tomcat 下载链接:Apache Tomcat® - Welcome! 下载 Tomcat 8.5.x,小版本号无所谓
目录结构
bin 二进制文件,可执行文件,服务器启动程序就在这里, windows startup.bat,linux startup.sh
conf 相关的配置文件
lib Tomcat 需要的一些库
logs 日志文件,记录中间状态
temp 临时文件
webapps 存放我们的代码,编译后的 class文件
work 会将 jsp 编译成 java文件,再编译成 class 文件存放在这儿
Tomcat 启动
双击 bin 目录底下的startup.bat,如果失败,将 startup.bat 托拽到 cmd 中启动,如果启动失败就会出现报错信息
在 webapps/ROOT 下放一个 html 文件 例如 文件名为 test.html,启动Tomcat之后,我们可以直接 127.0.0.1:8080/test.html,访问到该文件。在 ROOT 底下的文件访问的时候 URL 不用加 ROOT,在webapps 底下的其他目录则需要加上,例如 webapps 底下有个 test11 目录,test11 底下有一个 test.html,我们访问URL 应该是 test11/test.html
静态页面:页面结构和内容都是不变的
动态页面:页面结构不变,但是内容会改变
初识
Servlet 是 Tomcat 提供的一组 API,用于实现动态页面开发
七大步
创建 Maven 项目
什么是 Maven
Maven 是一个项目管理工具,管理代码中的依赖关系,从 Maven 中央仓库中下载项目所需要的库文件到本地仓库中并且
可以使用模板创建,也可以不使用
引入依赖
引入 Servlert 依赖
https://mvnrepository.com/ 进去后直接搜 servlet 因为 Tomcat 版本是 8.5.x,所以 servler API 版本选择 3.1.x
版本对应关系网址:Apache Tomcat® - Which Version Do I Want?
创建目录
main 底下创建 java 文件夹 和 resources 文件夹 和 webapp 文件夹
webapp 文件夹下创建 WEB-INF 文件夹
WEB-INF 底下创建 web.xml 文件
注意:java代码放在 java文件夹下,静态资源如 图片,html 文件,js 文件,css 文件放在 webapp 底下
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>
编写代码
Java 文件夹下创建类 继承自 HttpServlet,重写doGet,doPost 方法
@WebServlet("/hello1")
public class Demo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("我很好");
}
}
- HttpServletRequest 表示 HTTP 请求,Tomcat 会把 以字符串形式发送过来的 HTTP 请求 转换成一个 HttpServletRequest对象
- HttpServletResponse 表示 HTTP 响应
- resp.getWriter 获得 输出流,会将数据写入 响应的 Body 部分,Tomcat 会将响应以字符串的形式通过Socket 发送给浏览器
打包
会将代码进行编译,生成一个压缩包,后缀名是 jar 或者 war
Tomcat 会识别 war 包,所以我们需要将 打包格式者为 war,在 pom.xml 文件中新增 packaging 标签
修改包格式
<packaging>war</packaging>
修改包名
<build>
<finalName>name</finalName>
</build>
部署
将包拷贝到 Tomcat 的 wepapps 目录底下,启动 Tomcat 时,Tomcat 会自动将 包解压缩
验证程序
启动 Tomcat 后,打开浏览器进行验证
常见错误
- url 路径出错 404,少写 Context Path 或者 少写 Servlet Path
- 请求方法没有实现,路径是对的,但是没有相应方法,例如 只重写 doGet 方法,那么如果请求是 Post,那么就会报 405(方法未实现)
- 报 500(内部服务器错误),服务器代码运行中抛异常了
- 无法访问此网站,或许是 Tomcat 没有启动
Servlet API
HttpServlet 是 父类
HttpServlet
方法
- init HttpServlet 实例化之后调用此方法
- destroy HttpServlet实例销毁前调用
- service 每次收到 Http 请求时候调用
- doGet/doPost/doDelete...
注意
使用 ajax 发送 请求的时候 url 部分可以使用相对路径和绝对路径,如果使用绝对路径,需要包含 Context Path,因为 此处绝对路径从 域名后开始
HttpServletRequest
重要方法
方法 | 作用 |
String getProtocol() | 获取 Http 请求的协议名称和版本 |
String getMethod() | 获取 Http 请求的方法名称 |
String getRequestURI() | 假如请求是 http://localhost:8080/test1/hello1,则 返回值是 /test1/hello1 |
String getContextPath() | 获取 上下文路径 |
String getQueryString() | 返回 查询字符串 例如:http://localhost:8080/myapp/page.jsp?name=John&age=25 返回:name=John&age=25 |
String getParameter(String name) | 根据请求参数返回请求参数的值,如果没有参数不存在 返回 null |
String[] getParameterValues(String name) | 假如 请求路径是http://localhost:8080/myapp/page.jsp?color=red&color=blue&color=green,则执行request.getParameterValues("color")会返回一个字符串数组,其中包含"red", "blue"和"green" |
String getHeader(String name) | 根据请求头返回请求头的值 |
String getCharacterEncoding() String getContentType() | 返回请求的 body 部分使用的 编码格式 返回 MIME 类型 例如:请求头中包含Content-Type: application/json; charset=UTF-8,则执行request.getCharacterEncoding()会返回"UTF-8",而执行request.getContentType()会返回"application/json"。 |
InputStream getInputStream() | 获取 body 的输入流(字节流) |
Reader getReader() | 获取 输入流(字符流) |
获取 post 请求的参数
- 如果 Body 中的值是通过 form 表单构造的,可以通过 getParameter("String name")
- 如果 Body 中数据格式是 json,可以通过 Jackson 库来进行解析,首先需要写一个类,这个类的成员变量的名字需要跟 Json 中的 key 一致,然后 实例化一个 ObjectMapper(Jackson 核心类) 对象,使用这个对象的 readvalue 方法,传入 json 字符串 或者 Body 输入流 和 构造的类的类对象,readValue 方法会进行赋值然后返回构造的类的实例化对象
将对象转换成 json 字符串
使用 ObjectMapper 中的 writeValue() 方法
注意
如果要获得 Body 中的值,
设置 header 值时候,尽量在 body之前,不然可能导致 header 设置不生效
Tomcat 通过 Socket API 将 Http 请求(字符串),按照 Http 格式 将字符串解析成 HttpServletRequest 对象
URI 和 URL
URI:唯一资源标识符
URL:唯一资源定位符
假设 有个网页 URL 是 www.baidu.com/example/test.html,可以通过这个 URL 可以访问到这个网页。此时 UR
可以是 www.baidu.com/example/test.html,也可以是 urn:example:test,urn 是某个资源我们给他定的名字,
需要能唯一标识这个资源就行,不要求 定位
HttpServletResponse
重要方法
方法 | 作用 |
void setStatus(int st) | 设置响应状态码 |
void setHeader(String name, String value) | 设置 header 的值,会覆盖原有的 header 的值 |
void addHeader(String name, String value) | 增加 header,不会覆盖已有 header |
void setContentType(String type) | 设置 body 类型 |
void setCharacterEncoding(String type) | 设置编码类型 例如 utf8 |
void sendRedirect(String location) | 设置重定向 URL,响应增加一个 Location header |
PrintWriter getWriter() | 获取输出流(字符流) |
OutputStream getOutputStream() | 获取输出流(字节流) |
设置 响应 的 Refresh 字段可以控制浏览器的刷新时间,Refresh 的值的单位是 秒。Date 类的 getTime() 方法可以获取到当前时刻的毫秒级时间戳。System.currentTimeMillis() 也可以获取到毫秒级时间戳
Cookie 和 Session
出于安全的考虑,浏览器不让页面直接访问文件系统,而 cookie 是给 Http 协议提供的一套持久存储数据的方案
cookie 在客户端只能存储键值对,不能存储对象,只能存字符串,并且是按照域名进行分类的,意思就是百度有专门的cookie,谷歌有另外的cookie
服务器为用户分配 session 后会生成一个随机的 sessionId,类似于 hash表,然后将sessionId 发送给 客户端,以后客户端的请求中就会带上 sessionId,服务器就可以验证用户身份
误区
- session 和 cookie 经常会搭配使用但不是必须的
- sessionId 也不一定就非得要 cookie 传输
相关方法
HttpServletRequest
方法 | 作用 |
HttpSession getSession() | 当参数是 空 或者 true 时,如果没有会话会新建一个 当 参数是 false 如果没有会话会返回 null |
Cookie[] getCookies() | 根据请求中的 cookie,返回所有的 cookie 对象 |
HttpServletResponse
方法 | 作用 |
void addCookie(Cookie cookie) | 在响应报文中添加一个 cookie 对象 |
Cookie
方法 | 作用 |
String getName() | 获取 key |
String getValue() | 获取 value |
void setValue(String newValue) | 设置新的 value |
HttpSession
方法 | 作用 |
Object getAttribute(String name) | 根据 key 获取 sesson 中相应的 value |
void setAttribute(String name, String value) | 设置一组新的键值对 |
Boolean isNew() | 判断是否是新建的会话 |
上传文件功能
HttpServletRequest
方法 | 作用 |
Part getPart(String name) | 获取指定名字的文件,不是文件真实名字而是 form 表单的 name 属性的值 |
Collection<Part> getParts() | 获取请求中所有文件 |
Part
方法 | 作用 |
String getSubmittedFileName() | 获取文件真实名字 |
String getContentType() | 获取文件类型 MIME 类型,形如 image/jpeg |
long getSize() | 获取文件大小 |
void write() | 将文件写入磁盘 |
注意
要想使用 getPart() 方法需要在 类上加上注解 @MultipartConfig
JSP 文件存放位置
在 Servlet 中,JSP 文件通常放在 webapp 目录下的 jsp 文件夹中,而不是放在 java 文件夹下