一、web.xml中请求路径规则
1、前置条件请求路径:
如果浏览器请求的【资源文件地址】以当前servlet中的内容为开头的,
Tomcat才会带调用当前Servlet程序
例子:<url-pattern>/first/*</url-pattern>
http://localhost:8080/myweb/first/asdasda
Servlet程序会被调用
2、前置条件请求路径:
如果浏览器请求的【资源文件地址】以当前servlet中 的内容为开头的,
Tomcat才会带调用当前Servlet程序
例子:<url-pattern>/first/*</url-pattern>
http://localhost:8080/myweb/first/asdasda Servlet程序会被调用
3、后置条件请求路径
如果浏览器请求的【资源文件地址】以当前Servlet中的内容为结尾的,Tomcat才会调用当前Servlet程序。
例子: <url-pattern>*.abc</url-pattern>
http://localhost:8080/myweb/abcdef.abc Servlet程序会被调用
http://localhost:8080/myweb/abcdef.abc?name=user
请求行:[
url:http://localhost:8080/myweb/abcdef.abc
method:get
]
请求头:[
name:user
]
注意:不能以斜线"/"开头
4、通配符请求路径:
当前Servlet可以接收对当前网站所有的请求
例子:<url-pattern>/*</url-pattern>
http://localhost:8080/myweb/abcdef.abc Servlet程序会被调用
http://localhost:8080/myweb/a Servlet程序会被调用
5、请求路径的优先级:[具体请求路径] > [前置条件] > [通配符] > [后置条件]
http://localhost:8080/myweb02/abc/abc.com
二、Servlet对象的生命周期
1、项目中所有Servlet实例对象都是由Tomcat负责创建的;开发人员没有权利创建Servlet实例对象
2、创建时机:
(1)、【默认创建】:当第一个用户来访问这个Servlet时,Tomcat负责创建它的实例对象
(2)、【人为干预】:要求Tomcat在启动时,创建Servlet的实例对象
<servlet>
<servlet-name>OneServlet</servlet-name>
<servlet-class>OneServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
3、在Tomcat运行期间,一个Servlet实现类只能被创建一个实例对象
4、在Tomcat关闭时,由Tomcat负责销毁所有的Servlet实例对象
三、Servlet开发需要使用的五种工具对象
1、HttpServletResponse接口:负责将运行结果写入到响应包
2、HttpServletRequest接口:负责读取请求协议包信息
3、ServletContext接口:可以为当前网站中所有的Servlet提供【共享数据】
4、Cookie:在一次会话过程中,存储浏览器在服务端产生的私人数据
5、HttpSession接口:在一次会话过程中,存储浏览器在服务端产生的私人数据
【HttpServletResponse介绍】:
1、一个来自于Servlet规范中的接口:由Tomcat负责提供这个接口实现类
2、负责在Servlet运行完毕后,将相关的数据写入到【响应头】和【响应体】
3、HttpServletResponse接口修饰的对象成为【响应对象】
protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
int i = 50;
response.setCharacterEncoding("GBK");//设置响应头中的字符集
PrintWriter out = response.getWriter();
//out.print(i);
out.write(i);
}
(1)、out.write():只能将字符串或者【unicode码】写入到响应体
(2)、out.write(50):一个值为50的unicode码写入响应体
值为50的unicode码对应字符串2
(3)、out.print():可以将人员类型数据写入响应体,并保持该数据类型
总结:如果需要输出字符串则使用writer()方法,如果需要保留数据类型则使用print()方法;
(4):
a、浏览器根据【响应头】的内容类型处理接收结果
b、默认情况下【响应头】的内容类型是“text”
告诉浏览器响应体内的内容都是文字内容,
导致浏览器将所有文字内容输出
c、如果响应体内是html标签,则需要通知浏览器
d、设置响应体内的内容类型:
response.setContextType(“html/text”);
【HttpServletRequest接口】:
1、概述:
a、来自于Servlet规范中一个接口,接口实现类由Tomcat负责提供
b、由HttpServletRequest接口修饰对象,可以帮助开发人员读取请求协议包信息,类似于Scanner
c、一般习惯于将HttpServletRequest接口修饰对象称为【请求对象】
2、读取【请求行】信息:
String url = request.getRequestURL();
String method = request.getMethod();
3、读取【请求头】或者【请求体】重所有【请求参数名】
request.getParameterName();
//http://localhost:8080/myweb/one.com?name=mike&age=22
Enumeration paramNames = request.getParameterNames();
while(paramNames.hasMoreElements()){
String paramName =(String) paramNames.nextElement();
System.out.println("请求参数:"+paramName);
}
4、读取请求头或者请求体中的【参数内容】
http://localhost:8080/myweb/one.com?name=mike
String value = request.getParameter(“请求参数名”);
http://localhost:8080/myweb/one.com?name=mike&name=jack&name=mith
String array[] = request.getParameterValues(“请求参数名”);
示例:
//http://localhost:8080/myweb/one.com?name=mile
String value = request.getParameter("name");
System.out.println("value="+value);//value=meki
示例:
//http://localhost:8080/myweb/one.com?name=mile&name=jack&name=mith
String values[] = request.getParameterValues("name");
for(String value:values){
System.out.println("value="+value);
}
四、【请求对象】和【响应对象】的生命周期
1、都是由Tomcat负责创建
2、每当Tomcat收到一个【请求协议包】时,就会为这个请求协议包创建一对【请求对象】和【响应对象】
3、一次请求对应一对【请求对象】和【响应对象】
4、在Tomcat调用被请求的Servlet中服务方法(doGet/doPost)时,负责将本次【请求对象】和【响应对象】
作为参数传入到服务方法
5、在服务方法工作完毕后,Tomcat销毁本次请求相关的request和response
6、Tomcat负责将【响应包】推送到浏览器上
五、乱码问题:
1、【原因】:跟浏览器采用的请求方式有关
如果浏览器以【GET】方式发送请求,请求参数在请求头内存放,在请求协议包到达服务器之后,
【请求头】内容是由Tomcat负责解析,Tomcat9.0在解析数据时,默认采用字符集[UTF-8],所以
如果浏览器以【GET】方式发送中文参数时不会出现乱码问题
如果浏览器以【POST】方式发送请求,【请求参数】在【请求体】存放,在请求协议包到达服务
端之后,【请求体】内容是由对应【请求对象request】负责解码的,request对象默认使用
【ISO-8859-1】字符集解码
如果浏览器以【POST】方式发送中文参数时,服务端会出现乱码问题
2、【解决方案】:在request对象解析数据之前,重置设置request对象字符集【utf-8】
request.setCharacterEncoding(“utf-8”);
String parameter = request.getParameter(“参数名”)
六、ServletContext接口:
1、介绍:
Servlet规范中的一个接口,接口实现类由Tomcat提供;
负责当前工程中的所有serlvet对象提供共享数据
开发人员习惯于将ServletContext接口修饰的对象成为【全局作用域对象】
2、生命周期:
【全局作用域对象】在Tomcat启动时,由Tomcat为当前网站来创建
一个网站中只能有一个全局作用域对象
从网站开启到网站关闭,由Tomcat负责销毁当前网站的全局作用域对象;
3、使用:
如何得到当前工程中【全局作用域对象】:
ServletContext application = request.getServletContext();
向Tomcat索要当前工程的全局作用域对象
4、共享数据来源方式一:
在网站启动之前。可以将网站中绝大多数Servlet需要使用的数据添加到web.xml
共享数据名称 共享数据内容在网站启动时,Tomcat首先为当前网站创建一个【全局作用域对象】
然后Tomcat将web.xml配置共享数据添加到【全局作用域对象】
在网站运行时,当前某一个Servlet需要使用【共享数据】时,可以从全局作用域对象索要数据
共享数据 = application.getInitParamenter(“共享数据名称”);
******此时共享数据只能读,不能修改
5、共享数据来源方式二:
在Tomcat运行期间,可以将某一个Servlet提供的数据保存到全局作用域中
供当前网站中其他的Servlet来使用
放入:servletContext.setAtteibute(“共享数据名”,共享数据数据);其中共享数据数据可以是Object
//获得共享作用域对象
ServletContext servletContext = request.getServletContext();
//添加共享数据
servletContext.setAttribute(“money”,100);
取出:共享数据数据 = application.getAttribute(“共享数据”)
取出:
ServletContext servletContext = request.getServletContext();
Object money = servletContext.getAttribute("money");
System.out.println(money);
****由Servlet存入共享数据可以被修改
七、会话
1、定义:一个浏览器一个服务端的一次完整的交流
2、特点:
在一次会话过程中,经历多次请求与响应
在一次会话过程中同一个浏览器往往访问多个Servlet
3、需求:在一次会话过程中,浏览器要访问的Servlet之间进行数据共享
4、解决方案:Cookie 和 HTTPSession
Cookie:
(1)【描述】
a、Cookie是Servlet规范提供的工具类
b、在参与一个会话过程中Servlet之间,进行【数据共享】
c、Cookie存储在浏览器上,保存本次会话的【共享数据】
(2)【工作原理】
1、在浏览器访问OneServlet时,OneSerlvet负责将当前浏览器产生
的私人数据保存在Cookie,然后OneServlet负责将Cookie推送到当
前浏览器上
//获取请求体内的请求参数名
String username = request.getParameter(“username”);
String value = request.getParameter(“jiaozi”);
//创建Cookie对象
Cookie c1 = new Cookie(“name”,username);
Cookie c2 = new Cookie(“value”,value);
//把Cookie对象存入响应头,发送至浏览器
response.addCookie(c1);
response.addCookie(c2);
2、在浏览器再次访问当前网站的TwoServlet是,需要无条件将服务端
之前推送过来的Cookie再推送回去,这样TwoServlet就得到OneServlet
提供的共享数据
Cookie[] cookies = request.getCookies();
for(Cookie cookie:cookies){
if("name".equals(cookie.getName())){
System.out.println("名字"+cookie.getValue());
}else if("value".equals(cookie.getName())){
System.out.println("饺子"+cookie.getValue());
}
}
(3)【Cookie使用】
(1)、如何创建一个Cookie对象,来保存共享数据
Cookie cookie = new Cookie("key","共享数据");
****一个Cookie对象只能有一个键值对
****Cookie对象只能存储String类型共享数据
(2)、如何将Cookie写入响应包【响应头】
response.addCookie(Cookie对象);
(3)、如何从请求协议包的【请求头】读取浏览器返还的Cookie
Cookie array[] = request.getCookie();
(4)、Cookie的生命周期:
默认情况:cookie保存在浏览器内存中,关闭浏览器cookie就会被销毁
人工干预情况:将cookie保存至客户端计算机硬盘上,同时指定cookie
在硬盘上的存活时间,在存活时间范围内,关闭浏览器都不会导致cookie销毁
语句:cookie.setMaxAge(以秒为单位时间);
(5)、cookie缺点:
一个cookie对象只能存放一个键值对,如果存储的数据较多,需要管理多个cookie
cookie只能存放String类型数据,无法存放【高级类型java数据,比如List,Map】
八、HttpSession接口
1、【概述】
(1)、来自于Servlet规范中的接口,接口实现类来自于Tomcat
(2)、作用为参与同一个会话的servlet之间提供共享数据
(3)、通常称HttpSession接口修饰的对象称为【会话作用于对象】或【session对象】
2、【HttpSession与Cookie的区别】
相同点:作用都是为参与同一个会话的Servlet之间提供共享数据
不同点:
【存储位置】:Cookie存储在客户端浏览器内存或硬盘上
HttpSession存储在服务端计算机的内存中
【存储内容】:Cookie只能存储String类型,
HttpSession可以存储任意数据类型
【存储数量】:一个Cookie只可以存储一个键值对
一个HttpSession对象可以存储任意个键值对
3、【使用】
(1)、在浏览器来访时,Tomcat不会主动为当前浏览器创建对应HttpSession对象
(2)、只有浏览器所访问的Servlet向Tomcat提出要求时,Tomcat才会为当前浏览器
创建一个HttpSession对象
(3)、如何在Servlet为当前浏览器在服务端申请HttpSession对象:
方式一:HttpSession session = request.getSession();
方式二:HttpSession session = request.getSession(true);
方式三:HttpSession session = request.getSession(false);
区别:
getSession():如果当前浏览器在服务端已经有一个Session对象
则Tomcat直接返还这个Session对象,如果当前浏
览器在服务端不存在Session对象时,Tomcat需要
创建一个全新的Session对象
getSession(true):与getSession()一样
getSession(false):如果当前浏览器在服务端已经拥有一个Session
对象,Tomcat直接将这个Session对象返回,
如果当前浏览器在服务端没有Session对象,
则返回一个null
****如果来访用户身份已经确认合法了,此时可以使用getSession()或
者getSession(true);
如果来访用户身份尚未确认,此时只可以使用getSession(false);
4、Tomcat是如何将浏览器与Session对象关联:
在Tomcat创建了一个Session对象时,为Session对象生成一个唯一编号,然后将这个
编号保存到Cookie中,推送到当前浏览器内存中。
等到浏览器再次发送请求时,Tomcat就可以通过读取浏览器返回的Cookie来判断在
服务端中是否有Session对象,
5、如何使用HttpSession对象
在本次会话过程中OneServlet需要为本次会话中其他Servlet提供共享数据
session.setAttribute(“key”,共享数据);
在本次会话过程中,TwoServlet需要得到当前浏览器session数据
session.getAttribute(“key”);
九、Http状态码
1、http状态码是由一个三位数组成的符号,由Tomcat负责生成并写入状态行
2、Http状态码通知浏览器在接收到响应包之后的行为,Http状态码通知浏览器,服务端无法提供
本次服务的原因
3、状态码有五种:
(1)、1xx:通知浏览器本次返回的资源文件不完整,需要浏览器继续往服务端发送申请
(2)、2xx:通知浏览器服务端将一个完整的文件推送给浏览器,
200:浏览器与服务端进行了一次完美的通信
(3)、3xx: 服务端推送给浏览器的是一个网址,要求浏览器在接收到这个网址后,立刻自动向
这个网址发送请求
response.sendRedirect(“地址”);
(4)、4xx:通知浏览器本次未能提供服务,原因是因为缺少对应的资源文件
404:服务端没有对应的资源文件
405:服务端有对应的Servelt,但缺少对应的doGet或doPost方法
(5)、5xx:通知浏览器服务端的Servelt在执行时出现异常;
十、默认欢迎资源文件
1、【定义】:http服务器在接收到一个【默认请求时】返回的资源文件
2、【默认请求】:浏览器向某一个网站发送请求时,并没有指定索要的文件的情况
3、【默认欢迎文件配置】:
第一种方式:手动配置web.xml文件
welcome.html第二种方式:由Tomcat自动确认
如果Tomcat在当前网站中没有找到<welcome-file-list>标签
此时Tomcat回到自己的config文件夹下寻找一个web.xml文件
在这个web.xml寻找<welcome-file-list>标签,来获得默认
欢迎文件
4、默认欢迎资源文件分类:
首选html文件或者jsp文件
也可以是一个Servlet,但是这个Servlet应该是一个查询Servlet并且是运行在
不需要得到浏览器的请求参数的
十一、多个Servelt处理同一次请求方案
1、【前提】:
一个Servlet只负责实现一个功能
浏览器在一次请求时,只能请求一个资源文件
如果浏览器的请求需要由多个Servlet来协同完成,需要用户多次通过
【手动提交请求】来完成任务,这样会降低服务质量
2、【方案分类】:只需要用手动通过浏览器发送一次请求,就可以将本次请求相关的Servlet
来一次调用
1、重定向方案
2、请求转发方案
【重定向方案原理】:
在第一个Servlet工作完毕后,将【第二个Servlet地址】推送给用户浏览器
由用户浏览器根据这个地址来【自动的】向第二个Servlet发送请求
【重定向方案涉及命令】:
request.sendRedirect(第二个Servlet地址);
将一个地址写入到【响应头】中location
浏览器接受到响应包之后,自动根据location地址发送第二次请求
这样可以有效避免用户多次手动发送请求
【重定向方案特征】:
发生位置:客户端
浏览器向服务器发送多次请求
地址栏内容会发生变化内容是第二次需要访问的资源
浏览器采用的请求方式一定是get,因为第二次是通过地址栏访问的
可以访问的资源可以是同一个网站的资源也可以是不同网站的资源
【请求转发方案原理】:
在第一个Seervlet工作完毕后,代替当前扣篮器向Tomcat申请调用第二个Servlet
Tomcat在接受到申请之后,调用第二个Servelt来完成本次请求中剩余任务
【请求转发方案涉及命令】:
OneServlet对象中:
//创建一个资源申请报告对象
RequestDispatcher report = request.getRequestDispatcher(第二个Servlet地址);
//将申请报告推送给Tomcat,同时将OneServelt用有的【request和response】一并交给Tomcat
report.forward(request,response);
//Tomcat在接受到报告之后就会调用第二个Servlet来完成剩余任务
【请求转发特征】:
发生位置:发生在服务器
浏览器发送请求次数:浏览器只发生一次请求
由于发生请求发生在服务端,所以浏览器端地址栏不发生改变
只能访问同一个访问内部的资源文件
请求方式和浏览器发送的请求方式相同,参加同一此请求转发的所有Servlet的请求方式都想同
参与同一次请求转发的所有Servelt之间如何进行数据共享
1、可以使用全局作用域对象,提供共享数据
2、可以使用会话作用域对象,提供共享数据
3、可以使用请求作用域对象,提供共享数据