Servelt基础

一、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、可以使用请求作用域对象,提供共享数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值