JavaWeb ------- servlet
servlet规范介绍
- servlet规范来自于JAVAEE规范中的一种
- 作用:
1)在servlet规范中,指定[ 动态资源文件]开发步骤
2)在servlet规范中,指定Http服务器调用动态资源文件规则
3)在serv1et规范中,指定Http服务器管理动态资源文件实例对象规则
Servlet接口实现类:
- servlet接口来自于servlet规范下一个接口,这个接口存在Http服务器提供jar包
- Tomcat服务器下1ib文件有一个 servlet-api.jar存放servlet接口(javax. servlet.servlet接口)
- Servlet规范中任务,Http服务器能调用的[动态资源文件]必须是一个servlet接口实现类
Tomcat根据Servlet规范调用Servlet接口实现类规则:
- Tomcat有权创建Servlet接口实现类实例对象
Servlet oneServlet = new OneServlet(); - Tomcat根据实例对象调用service方法处理当前请求
oneServlet . service()
oneServlet----------> (abstract)Ht tpServlet----->(abs tract) GenericServlet----------> servlet接口
init
destory
getServletInfo
getServletConfig
Serv1et接 口实现类开发步骤
第一步:创建一一个Java类继承与Httpservlet父类,使之成为一一个servlet接口实现类
第二步:重写HttpServlet父类两个方法。doGet或 则doPost
get
浏览器-----》oneServlet . doGet()
post
浏览器------》oneServlet. doPost ()
第三步:将servlet接口实现类信息[注册]到Tomcat服务器 [网站] —> [web] —》[WEB-INF] —>web . xm1
<!--将servlet接口实现类类路径地址交给Tomcat-->
<servlet>
<servlet-name>mm</servlet-name> < !--声明-一个变量存储servlet接口实现类类路径-->
<servlet-class>com.bjpowernode.controller.oneServlet</servlet-class>
<!--声明servlet接 -->
</ servlet>
Tomcat
String mm = "com.bjpowernode.controller.OneServlet"
<!--为了降低用户访问Servlet接口实现类难度,需要设置简短请求别名-->
<servlet-mapping>
<servlet-name> mn</ servlet- -name>
<url-pattern>/one</url-pattern> <!--设 置简短请求别名,别名在书写时必须以"/"为开头-->
</servlet-mapping>
Servlet生命周期
-
网站中所有的Servlet接口实现类的实例对象,只能由Http服务器负责额创建。开发人员不能手动创建servlet接口实现类的实例对象
-
在默认的情况下,Http服务器接收到对于当前servlet接口实现类第一次请求时
自动创建这个servlet接口实现类的实例对象
在手动配置情况下,要求Http服务器在启动时自动创建某个Servlet接口实现类的实例对象<servlet> <servlet-name> mm</servlet-name> <!--声明一个变量存储servlet接口实现类类路径--> <servlet-class>com.bjpowernode.controller.OneServlet </servlet-class> <load-on-startup>30<load-on-startup><!--填写-一个大于0的整数即可--> </servlet>
HttpServletRespone接口
-
介绍:
- HttpServletResponse接口来自于servlet规范中,在Tomcat中 存在servlet-api. jar
- HttpServletResponse接口实现类由Http服务器负责提供
- HttpServletRe sponse接口负责将doGet/doPost方法执行结果写入到[响应体]交给浏览器
4)开发人员习惯于将HttpServletResponse接口修饰的对象称为[ 响应对象]
-
主要功能:
1)将执行结果以二进制形式写入到[响应体]2)设置响应头中【content-type】属性值,从而控制浏览器使用对应编译器将响应体二进制数据编译为[文字,图 片,视频,命令]
3)设置响应头中【location】 属性,将-一个请求地址赋值给location.从而控制浏览器向指定服务器发送请求
String result ="Hello World"; / /执行结果
//--------响应对象将结果写入到响应体-------------start
//设置响应头content-type,和字符解析
response . setContentType("Text/htmL;charset=utf-8" );
//设置响应头中【location】 属性
//1. 通过响应对象,向Tomcat索 要输出流
PrintWriter out = response. getWriter();
//2.通过输出流,将执行结果以二进制形式写入到响应体
out.write(result) ;
//使用print向浏览器输入
out.print(result);
//-----响应对象将结果写入到响应体--------------start
/*
浏览器在接收到响应包之后,如果
发现响应头中存在Location属性
自动通过地址栏向location指定网站发送请求
sendRedirect方法远程控制浏览器请求行为[请求地址,请求方式,请求参数]
**/
String result1 ="http:/www.baidu.com" ;
//通过响应对象,将地址赋值给响应头中Location属性
response . sendRedirect(result1);// [响应头location="http:/ /www . baidu. com" ]
HttpServletRequest接口
- 介绍:
- HttpservletRequest接口来自于servlet规范中,在Tomcat中存 在servlet-api. jar
- HttpServletRequest接口实现类由Http服务器负责提供
- HttpServletRequest接口负责在doGet/doPost方法运行时读取Http请求协议包中信息
4)开发人员习惯于将HttpservletRequest接口修饰的对象称为【请求对象】
- 作用:
1)可以读取Http请求协议包中【请求行】信息
2)可以读取保存在Hitp请求协议包中【请求头】或则【请求体】中请求参数信息
3)可以代替浏览器向Http服务器申请资源文件调用|
//1.通过请求对象,读取[请求行]中[urL]信息
string urL = request. getRequestURL () . toString();
//2.通过请求对象,读取[请求行]中[method]信息
String method = request.getMethod() ;
//3.通过请求对象,读取[请求行] 中uri信息
/*
URI:资源文件精准定位地址,在请求行并没有URI这个属性。
实际上URL中截取一个字符串,这个字符串格式" /网站名/资源文件名”
URI用于让Http服务器对被访问的资源文件进行定位
**/
String uri = request.getRequestURI();// substring
//4,通过请求对象,读取[请求体]参数信息
request.getParameter("userName ");
/*
问题:
以GET方式发送中文参数内容"老杨是正经人"时,得到正常结果
以POST方式发送中文参数内容"老崔是个男人",得到[乱码] "e????????????.???"
原因:
浏览器以GET方式发送请求,请求参数保存在[请求头] ,在Http请求协议包到达Http服务器之后,第一件事就是进行解码请求头二进制内容由Tomcat负责解码,Tomcat9. 0默认使用[utf-8]字符集,可以解释一切国家文字
浏览器以POST方式发送请求,请求参数保存在[请求体] ,在Http请求协议包到达Http服务器之后,第一件事就是进行解码请求体二进制内容由当前请求对象(request)负责解码。request默认使用[IS0-8859-1]字符集,一个东欧语系字符集此时如果请求体参数内容是中文,将无法解码只能得到乱码
解决方法:
//通知请求对象,使用utf- 8字符集对请求体二进制内容进行一次重写解码
request. setCharacterEncoding("utf-8");
**/
请求对象与响应对象的生命周期
1.在Http服务器接收到浏览器发送的[Http请求协议包]之后,自动为当前的[Http请求协议包]生成一一个[请求对象]和一个[响应对象]
2.在Http服务器调用doGet/doPost方法时,负责将[ 请求对象]和[响应对象]作为实参传递到方法,确保doGet/ doPost正确执行
3.在Http服务器准备推送Http响应协议包之前,负责将本次请求关联的[请求对象]和[响应对象]
销毁
[请求对象]和[响应对象]生命周期贯穿一次请求的处理过程中
[请求对象]和[响应对象]相当于用户在服务端的代言人
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N0ulFMCY-1645601666961)(C:\Users\无敌维\AppData\Roaming\Typora\typora-user-images\1645595879290.png)]
servlet在开发中的其他问题
欢迎资源文件
1.前提:
用户可以记住网站名,但是不会记住网站资源文件名
2.默认欢迎资源文件:
用户发送了-一个针对某个网站的[默认请求]时,此时由Http服务器自动从当前网站返回的资源文件
正常请求: http: //localhost: 8080/myWeb/index . html
默认请求: http://localhost: 8080/myweb/
3.Tomcat对于默认欢迎资源文件定位规则
1)规则位置:Tomcat安装位置/conf/web.xm1
2)规则命令:.
<welcome-file-list>
<welcome-file> index.html </welcome- file>
<welcome-file>index.html</welcome- file>
<welcome-fi1e>index.jsp</welcome- file>
</welcome-file-list>
4.设置当前网站的默认欢迎资源文件规则
1)规则位置:网站/web/WEB-INE/web . xml
2)规则命令
<welcome-file-list>
<welcome-file>login.html</welcome-file>
<welcome-file>user/find</welcome-file>< !--servLet作为默认欢迎资源时,开头斜线必须抹掉-->
</welcome-file-list>
<!-- 网站设置自定义默认文件定位规则,此时Tomcat自带定位规则将失效 -->
多个Servlet之间的调用规则
- 前提条件:
某些来自于浏览器发送请求,往往需要服务端中多个servlet协同处理。
但是浏览器一次只能访问一一个servlet,导致用户需要手动通过浏览器
发起多次请求才能得到服务。
这样增加用户获得服务难度,导致用户放弃访问当前网站[98k,ARM] - 提高用户使用感受规则:
无论本次请求涉及到多少个servlet,用户只需要[手动]通知浏览器发起
一次请求即可I - 多个servlet之间调用规则:
1)重定向解决方案
2)请求转发解决|
重定向解决方案
-
工作原理:用户第一次通过[手动方式]通知浏览器访问oneServlet.
Oneservlet工作完毕后,将TwoServlet地址写 入到响应头
location属性中,导致Tomcat将302状态码写入到状态行。
在浏览器接收到响应包之后,会读取到302状态。此时浏览器
自动根据响应头中location属性地址发起第二次请求,访问
TwoServlet去完成请求中剩余任务 -
实现命令:
response . sendRedirect (“请求地址”)
将地址写入到响应包中响应头中location属性 -
特征:
1)请求地址:
既可以把当前网站内部的资源文件地址发送给浏览器(/网站名/资源文件名)
也可以把其他网站资源文件地址发送给浏览器(http://ip地址:端口号/网站名)2)请求次数 浏览器至少发送两次请求,但是只有第一次请求是用户手动发送。 后续请求都是浏览器自动发送的。
3)请求方式:
重定向解决方案中,通过地址栏通知浏览器发起下一次请求,因此
通过重定向解决方案调用的资源文件接收的请求方式一定是[GET] -
缺点: .
重定向解决方案需要在浏览器与服务器之间进行多次往返,大量时间
消耗在往返次数上,增加用户等待服务时间
请求转发解决
-
原理:
用户第一次通过手动方式要求浏览器访问oneServlet。
OneServlet工作完毕后,通过当前的请求对象代替浏览器
向Tomcat发送请求,申请调用TwoServlet。
Tomcat在接收到这个请求之后,自 动调用TwoServlet来
完成剩余任务 -
实现命令:请求对象代替浏览器向Tomcat发送请求
//1.通过当前请求对象生成资源文件申请报告对象
RequestDispatcher report = request . getReques tDispatcher("/资源文件名")
//2.将报告对象发送给Tomcat
report .forward(当前请求对象,当前响应对象)| -
优点:
1)无论本次请求涉及到多少个servlet,用户只需要手动通过浏览器发送一次请求
2)Servlet之间调用发生在服务端计算机上,节省服务端与浏览器之间往返次数
增加处理服务速度 -
特征:
1)请求次数
在请求转发过程中,浏览器只发送一次请求
2)请求地址
只能向Tomcat服务器申请调用当前网站下资源文件地址
request. getRequestDispathcer("/资源文件名") 不要写网站名 3)请求方式
在请求转发过程中,浏览器只发送-一个 了个Http请求协议包。
参与本次请求的所有Servlet共享同一一个请求协议包,因此
这些servlet接收的请求方式与浏览器发送的请求方式保持一致
多个servlet之间数据共享实现方案
-
数据共享: OneServlet 工作完毕后,将产生数据交给TwoServlet来使用
-
Servlet规范中提供四种数据共享方案
- ServletContext接口【全局作用域对象】
- Cookie类
- HttpSession接口【会话作用域对象】
- HttpServletRequest接口【请求作用域对象】
ServletContext接口
介绍:Tomcat提供接口实现类,通过网站的servletcontext来实现数据共享
工作原理:相当于一个网站中的Map集合
生命周期: 在服务器启动时自动创建,服务器运行期间只有一个servletcontext对象,服务器关闭时进行销毁(贯穿整个网站的运行期间)
代码
//通过request获取全局对象
ServletContext application = request.getServletContext();
//向全局作用域对象中存入数据
application.setAttribute("key","value");
//获取数据
application.getAttribute("key");
Cookie类
介绍:Tomcat提供接口实现类,通过同一用户浏览器的Cookie对象来实现数据共享
工作原理:存储在本地浏览器中
生命周期: 默认情况下cookie对象是存在浏览器的缓冲当中,因此浏览器对象一关就销毁了
在手动设置下,可以使浏览器的cookie存放在硬盘中,并指定存放时间:setMaxAge(60),单位为秒
代码
//存放
Cookie cookie = new Cookie("a","b");
response.addCookie(cookie);
//取出
Cookie cook[] = request.getCookies();
for(Cookie c: cook){
String key = c.getName();
String value = c.getValue();
}
HttpSession接口
java代码
//写
HttpSession session = request.getSession();
session.setAttribute("a","b");
//读取session
session.getAttribute("a");
HttpSession销毁时机:
-
用户与HttpSession关联时使用的cookie只能存放在浏览器缓存中.
-
在浏览器关闭时,意味着用户与他的HttpSession关系被切断
-
由于Tomcat无法检测浏览器何时关闭,因此在浏览器关闭时并不会
导致Tomcat将浏览器关联的HttpSession进行销毁 -
为了解决这个问题,Tomcat为每一 -个HttpSession对象设置[空闲时间]
这个空闲时间默认30分钟,如果当前HttpSession对象空闲时间达到30分钟
此时Tomcat认为用户已经放弃了自己的HttpSession,此时Tomcat就 会销毁
掉这个HttpSession|
Cookie和session的区别
1)存储位置:—个在天上,-一个在地下
cookie:存放在客户端计算机(浏览器内存/硬盘)
HttpSession:存放在服务端计算机内存
2)数据类型:
cookie对象存储共享数据类型只能是string
HttpSession对象可以存储任意类型的共享数据object
3)数据数量:
-一个Cookie对象只能存储–个共享数据I
HttpSession使用map集合存储共享数据,所以可以
存储任意数量共享数据
4)参照物:
cookie相当于客户在服务端[会员卡]
HttpSession相当于客户在服务端[私人保险柜|]
HttpServletRequest接口
request.setAttribute("info","试题添加成功");
request.getAttribute("info");