Servlet的介绍与配置
Servlet 是 Java 语言官方推出一个 web 容器,是用来构建web应用程序的框架
Servlet 编写的代码是需要运行在web服务器上的, 不能通过main方法进行调用
Web 服务器
tomcat: 是一个非常轻量级的服务器、通常用来部署java的中小型web应用型,普通被企业认可
jboss : 是一个商用的 web应用服务器,主要应用与大型java应用程序
weblogic : 是Oracle提供的基于java的web应用服务器、支持大型的java应用程序、多用于银行、政府项目
apache : 是一个开源的优秀的web服务器,不能直接部署java服务,主要可以做 web代理服务器来使用
IIS : 是微软提供的一个基于 .net 的 web服务器
安装与配置Tomcat
Tomcat 官方下载解压后的目录结构
apache-tomcat-9.X
bin : 内置了tomcat的一些命令
conf : 内置了tomcat 的配置文件
lib: 存放tomcat 需要的第三方库依赖库
logs : 存放tomcat 运行产生的日志(通过分析日期、可以解决项目中的问题)
temp : 存放系统运行产生的临时文件
webapps : 存放多个java web项目, 用来做项目部署
work : web应用程序在运行过程中jsp转换后的java字节码文件
修改 tomcat端口号
tomcat 端口号默认是 8080
配置文件是 conf/server.xml
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8"/>
URIEncoding="UTF-8"是解决WEB服务器在进行GET请求传入中文参数乱码的、在Tomcat8之后的版本可以不在设置
搭建一个基于 Servlet的 web 项目
怎么编写一个 Servlet 类
- 引入 Servlet 相关的依赖包
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-servlet-api</artifactId>
<version>9.0.65</version>
</dependency>
-
编写一个 java 类 、继承 HttpServlet
-
重写 HttpServlet 中的 service 方法
-
在 类上使用 @WebServlet 设置请求路径
Servlet 的生命周期
- init() : 初始化Servlet , 该方法中编写的代码只会被执行一次,且在第一次使用servlet的时候,加载
可以给 Servlet 初始化一些数据、如果想让 init 在 tomcat 启动完成后就执行, 那么需要在该Servlet添加一个配置
@WebServlet(value = “/xxx”, loadOnStartup = 1) , loadOnStartup默认值 -1
-
service() : 提供服务的方法,每次请求 都会被 执行的代码
-
doXxx() : (doGet, doPost, doPut, doDelete) : 和请求方式相关的方法、如果是 get 请求,则会在调用service之后,自动调用 doGet
-
destroy() : 销毁, 当销毁(web服务关闭的时候)servlet对象的时候,会执行的代码,只会被执行一次
HttpServletRequest 请求对象
浏览器 -> 服务器 封装的 对象 就被称为 请求对象
请求对象 通常可以用来 获取 从浏览器 携带的 信息
- getScheme() :获取请求的协议, 例如返回 http
- getServerName() : 获取服务的域名、例如返回 localhost
- getServerPort() : 获取服务的端口、例如返回 8080
- getContextPath() : 获取项目名,例如返回 /servlet
- getRequestURI() : 获取请求地址(端口号后面的内容,问号前面的内容)
- getRequestURL() : 获取网址(不包含请求参数)
- getHeaderNames() : 获取所有的请求头、返回一个枚举对象
- getHeader(name) : 根据请求头、获取请求头的值,请求头信息的键都是小写的
- getCookies() : 获取浏览器存储的所有Cookie, 如果没有,返回 null
- getMethod() : 获取请求的方法(大写表示),例如返回 GET, POST
获取页面请求的参数
- getParameter(String key) : 根据请求参数的名 获取 请求参数值(单值)
如果 传入 key ,则 返回一个 字符串, 如果没有传 key, 则返回 null
如果 key 传入了多个,只会获取到第一个值
-
getParameterValues(String key) : 根据请求参数的名、获取请求参数值(多值)
-
request.getParameterNames() : 获取所有的请求参数名,返回一个枚举对象 (了解)
-
request.getParameterMap() : 获取所有的请求参数,返回一个 Map<String, String[]> 对象
乱码解决访问
POST 传参中文乱码解决方案
request.setCharacterEncoding("UTF-8")
Idea 控制台输出的内容乱码解决方案
-Dfile.encoding=UTF-8
GET 参数中文乱码解决方案
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8"/>
响应的数据在浏览器中乱码解决方案
response.setCharacterEncoding("UTF-8")
// 响应 网页 乱码解决方案
response.setContentType("text/html;charset=UTF-8");
// 响应 JSON 乱码解决访问
response.setContentType("application/json;charset=utf-8");
JSP 页面乱码解决方案
<%@page pageEncoding="UTF-8" contentType="text/html; utf-8" %>
页面跳转
- 转发 forward
- 重定向 redirect
使用 request 实现 页面的 转发 跳转
request.getReqeustDispatcher(urlpattern).forward(request, response);
整个跳转是 1 次请求
地址栏的地址不会发生变化(从请求开始的地址 — > 响应的结束地址 地址没有发生改变)
可以通过 request 向页面传递 数据 request.setAttribute(key ,val)
可以在跳转的页面中,通过 request.getAttribute(key) 来获取数据
request 只能在 自身服务器提供的 服务中 进行跳转
转发到的请求 和 原请求的 请求方式 是一致的
jsp页面通常不允许直接访问,转发的操作通常推荐跳转到jsp页面中
使用 response 实现 页面的 重定向 跳转
response.sendRedirect(requestURI|URL);
整个跳转是 2次 请求
地址栏的地址发生了变化(从请求开始的地址 — > 响应的结束地址 地址没有发生改变)
不能通过 request 向页面传递数据
可以跳转到任意的网址
重定向的请求地址 一定是采用 GET 请求访问的
将 JSP 页面 进行保护
在 web开发中,通常不允许用户直接访问到 jsp 页面,1.会暴露网站的开发技术、2.经过转发可以携带数据,更方便网页的展示、3.路径更优雅
WEB-INF 是一个非常特殊的目录、该目录下存储的所有内容不能直接访问,但可以通过转发来获取
Servlet 三大作用域容器
可以进行数据存储
数据的格式是键值对格式的数据,键是字符串格式、值是任意数据类型
可以在JSP页面中获取对应的数据
setAttribute(key, val) : 用来存储数据
getAttribute(key) : 获取存储的数据
removeAttribute(key) : 移除存储的数据
- request (HttpServletRequest)
- session (HttpSession)
request.getSession() ;
- application (ServletContext)
request.getSession().getServletContext()
存储在request作用域中的数据 只能在同一个请求中才能够使用,会随请求的结束而销毁
存储在session作用域中的数据 当 session没有过期(默认30分钟) 或者 浏览器没有关闭 的时候,可以在任何位置使用,可以跨请求传递数据
session是基于用户(浏览器) 的、所以存储在session中的数据在不同用户间是隔离的
存储在application作用域中数据 整个 web应用程序都可以访问和使用、会随web应用程序的关闭而销毁。
Session 的工作原理
Cookie : 是存储在浏览器中的一段字符串、Cookie可以用来做登录的标识 , Cookie是基于浏览器的技术
Session : 是存储服务器中的数据的、也是用来存储登录的标识、Session是基于服务器的技术
当用户访问session的时候、服务器会获取浏览器中的Cookie信息找到一个 Cookie的键为 jsessionid 的Cookie
如果找不到 jsessionid 对应的Cookie , 那么 服务器 会创建一个 Session对象,并将 session对象的唯一标记ID 存储到 浏览器的Cookie中
键是 jsessionid , 值 为 session的唯一标记ID
如果找到了jsessionid对应的Cookie, 则 获取 对应的 Cookie value值(session的ID) , 并根据 value 值 从 SessionStore 容器中,获取管理的
session对象, 并返回 session对象
如果浏览器禁用了Cookie、 那么要使用session的时候,需要在地址上拼接一个 ;jsessionid=XXXXXXXXXXXXXXXXXXX
在 JSP 中使用 脚本指令
-
<% … %> : 可以编写 java 代码,支持多行代码, 每行代码必须以 ; 结尾
-
<%= … %> : 输出结果、= 后面只能写 java 表达式 、且 不用使用
;
结果
on对象, 并返回 session对象
如果浏览器禁用了Cookie、 那么要使用session的时候,需要在地址上拼接一个 ;jsessionid=XXXXXXXXXXXXXXXXXXX
在 JSP 中使用 脚本指令
-
<% … %> : 可以编写 java 代码,支持多行代码, 每行代码必须以 ; 结尾
-
<%= … %> : 输出结果、= 后面只能写 java 表达式 、且 不用使用
;
结果 -
<%! … %> : 用来定义 内部类 、 成员变量和方法