Servlet笔记
JavaWeb开发核心知识点
一、什么是Web开发
Web通信,指的是两台计算机通过网络进行资源文件共享活动,Web开发确保本次通信顺利执行
二、Web通信过程中两台计算机之间角色
1.客户端计算机:用于发送请求
2.服务端计算机:提供共享资源文件
三、资源文件:
1.理论上来说,计算机上所有的文件都是资源共享文件
2.分类:
1.静态资源文件:
定义:文件内容是固定的,不能随着需求的变化而发生变化
例子:图片 html doc xls
特点:服务端计算直接将【静态资源文件】推送给【客户端计算机】所有被共享的【静态资源文件】最终是在客户端计算机运行的
2.动态资源文件
定义: 文件内容可以根据用户提供需求变化而产生不同内容
例子:java文件
特点:服务端计算机会调用执行【动态资源文件】。服务端计算机将【动态资源文件的运行结果】交给客户端计算机
四、WEB通信过程中,两台计算机如何进行通信:
1.C/S结构通信方式:
【介绍】:C:client,客户端极端安装特定【客户端程序】可以帮助客户端计算机像指定服务端计算发送请求
S:server:在服务端计算机安装一种特定【资源调度软件】接收特定客户端程序发送请求,将请求需要资源文件推送回客户端机上【客户端程序】
【例子】:微信,qq,所有大型网络游戏
【优缺点】
优:
1.可以有效地保护服务端计算机
2.可以分摊服务端计算机工作压力
缺点:
1.增加客户获得服务的成本
2.增加服务端维护成本.
【针对用户】:个人用户
2.B/S结构通信方式:
介绍:B:browser:可以帮助计算机向任意服务器发送请求
S:server:在服务端计算机安装一种特定【资源调度软件】可以接收所有浏览器发送请求,将请求的资源文件推送客户端计算机浏览器上
【优缺点】:
1.不会增加客户获得服务的成本
2.不会增加服务端维护的成本
【针对客户群体】:企业用户
五、网络协议包:
1.【定义】:用于包裹在网络中传输【二进制数据】,网络协议包存在【固定空间】用于存放【特定数据】便于接收方分析得到数据
2.【分类】:ftp http
3.【B/S通信方式中】:到目前为止B/S通信中只使用http网络协议包
六、Http网络协议包内部结构:
1.Http请求协议包:
1.是浏览器在发送请求,负责创建的,
2.是浏览器负责将请求信息,写入到请求协议包
3.Http请求协议包内部自上而下有四层结构
【请求行】:{
url: 请求的资源文件地址
method: 浏览器采用的请求方式
}
【请求头】:{
浏览器希望获得资源文件类型【html/png】
浏览器希望获得资源文件内容依赖字符集
如果浏览器采用【GET方式发送请求】,本次关联请求参数需要保存在请求头
}
【空白行 】:{
隔离层
}
【请求体】:{
如果浏览器采用【POST方式发送请求】本次关联请求参数需要保存在请求体中
}
2.Http响应协议包:
1.在服务端计算机的【资源调度软件】准备推送文件时,负责创建的。
2.【响应协议包内容】可以由拍【资源调度软件】写入,可以由Java命名(response)写入
3.Http请求协议包内部自上而下有四层结构
【状态行】:{
状态码
}
【响应头】:{
返回文件内容类型(doc,text,html,text/html)
返回文件内容依赖字符集,浏览器需要使用这个字符集
对接受内容进行解码
}
【空白行】:{
}
【响应体】:{
静态资源文件也可能是动态资源文件
运行结果(二进制形式)
}
客户端计算机上浏览器管理
一、如何命令浏览器向指定网站发送请求:
1.通过FORM表单命令
2.通过超链接命令< a href=“http://baidu.com”>
3.浏览器的地址栏对象 window.location=“http://baidu.com”
二、请求方式【POST/GET】
1.GET方式:
1.要求浏览器发送请求时,携带请求参数数量不能超过4k
2.要求浏览器将请求参数写入到【请求头】
3.要求浏览器将请求信息在地址栏上显示出来
4.要求浏览器对接收的资源文件必须缓存到内存
2.POST方式:
1.不会限制浏览器发送请求时,携带请求参数数量
2.要求浏览器将请求参数写入到【响应体】
3.要求浏览器将请求参数信息在地址栏隐藏
4.要求浏览器对接受的文件不能保存到缓存【阅后即焚】【动态变化】
一般默认都是GET,但有些每次请求信息都可能不一样,所以必须要用POST.
三,如何控制浏览器采用的请求方式
1.让浏览器发送请求时,采用【GET方式】
1.超链接命令,一定会要求浏览器采用【GET】
2.location对象,一定会要求浏览器采用【GET】
3.FORM标签命令中method属性可以控制浏览器采用GET方式发送请求
2.让浏览器发送请求时,采用【POST方式】
1.设置FORM标签中method属性等于“POST”
四、如何命令浏览器在发送请求时,携带指定请求参数
1.超链接标签命令,可以命令浏览器携带请求参数
< a href=“http://baidu.com?uname=mike&age=33”>
2.location对象,可以命令浏览器携带请求参数
window.location=“http://baidu.com?uname=mike&age=33”
以上两种方式存在弊端,请求参数内容是固定,无法根据客户具体要求来改变
3.表单域标签可以接受用户输入的内容,作为请求参数内容
1.[表单域标签分类]: INPUT select textarea
2.【表单域标签作为请求参数条件】
第一个条件:表单域标签必须声明在当前FORM标签内部
第二个条件:表单域标签必须声明【name属性】,这个属性作为【请求参数名】
第三个条件:针对checkbox和radio,只有被选中情况下,才可以作为请求参数
Http服务器
一【介绍】
1.安装在服务端计算机上的一种软件
2.可以解析来自于浏览器发送的【请求协议包】
3.调用服务端上的被请求的【共享资源文件】
4.负责生成一个【响应协议包】
5.负责将【文件内容】或者【文件运行结果】写入到【响应体】
6.负责将【响应协议包】推送给【当前浏览器】-------很多人会忘记?-----
二、【Http服务器分类】
1.德国SAP;
2.IBM:weblogic
3.JBoss;
4.Apache:Tomcat
三【Tomcat介绍】
1.是一个由Java应用程序编写的资源文件调度器
2.可以调用服务端静态资源文件和【动态资源文件】
3.Tomcat负责生成响应协议包,负责将响应协议包推送到浏览器上
4.Tomcat属于Apache
四【Tomcat端口号】
1.Tomcat端口号存储位置:Tomcat安装目录下/conf/server.xml
<Connector port=“8080” protocol=“HTTP/1.1”
connectionTimeout=“20000”
redirectPort=“8443”/>
改port就可以
五【网站】
1.全称:网络中的资源站点
2.作用:仓库,存储可以共享【静态资源文件】和【动态资源文件】
3.文件管理:由Http服务器来调用内部共享资源文件
4.本质:就是一个文件夹
六【网站分类】
1.静态资源网站:存储的都是静态资源文件(图片,html)
2.动态资源文件:存储是静态资源文件和动态资源文件
七、【如何创建一个静态资源网站】
1.Tomcat安装目录/webapps/ 创建一个文件夹,这个文件夹就是【网站】
2.【网站】存入静态资源文件
3.启动Tomcat
八、【动态网站结构】
1.src:存放java文件
2.web:静态资源文件和配置文件
WEB-INF/web.xml
九、【指定Tomcat管理的网站】
【RUN】–>【Edit Configuration】–>tomcat管理通道–【Deployment】–>添加需要被管理的网站
Servlet规范
一、JAVASE和JAVAEE区别:
1.JAVASE:Java开发基本规范
2.JAVAEE:Java企业级开发规范,指定了JVM管理系统与13类系统之间交流规则,因此JAVAEE规范
有13种JDBC就是JAVAEE规范中一种,用于设置JVM与所有【关系型数据库管理系统】进行交流规则
二、Servlet规范:
1.Servlet规范是JAVAEE规范中一种
2.Servlet规范中设置JVM与Http服务器之间的交流规则
3.交流规则
1.定义何种Java类可以被Http服务器来调用的(何种Java类可以作为动态资源文件)
2.Http服务器应该如何管理【动态共享资源文件】
三、何种Java类可以被Tomcat调用,可以作为网站的【动态共享资源文件】
1.Servlet规范中、认为只有【Servlet接口实现类】有资格作为【动态共享资源文件】
2.【Servlet接口实现类】必须由开发人员负责创建
四,如何开发一个Servlet接口实现类 --哔哩哔哩p17左右—
1.创建一个实现类,需要继承与【HttpServlet】
2.【HttpServlet】存放在Tomcat中lib/servlet-ap.jar ; javax.servlet.http.HttpServlet
3.根据来访的浏览器采用的请求方式,重写对应doGet或者doPost
4.在/WEB-INF/lib中web.xml
注册Servlet接口实现类,通知Tomcat当前网站存在了一个动态资源文件。
五、Tomcat调用Servlet接口实现类流程
- 浏览器向服务器发送了一次请求
- Tomcat接受到这个请求,首先将请求资源文件作为动态资源文件,到web.xml进行文件定位。如果有调用如果没有找到对应的动态资源文件。此时Tomcat认为本次请求的是一个静态资源文件,从web下进行定位。如果有返回,如果还没有此时返回404状态码
- Tomcat到web.xml根据进行定位
- 定位找到本次请求调用Servlet
- Tomcat根据浏览器采用的请求方式,调用Servlet中doGet或doPost
- 在doGet或doPost方法调用完毕后,Tomcat负责将响应包推送给浏览器
六.Servlet请求写法路径规则
-
具体请求路径:
如果浏览器请求【资源文件地址】与当前Servlet中的内容完全一致,Tomcat才会调用当前Servlet
例子:/one.do
http://localhost:8080/newWeb/one.do OneServlet会被调用
http://localhost:8080/newWeb/abc/one.do 不会被调用
注意:具体请求路径必须以【/】开头
-
前置条件请求路径
如果浏览器请求【资源文件地址】与当前Servlet中的内容为开头,
Tomcat才会调用当前Servlet
例子:/abc/*
【*】是一个通配符,描述的是一个任意长度的字符串
如果当前【资源文件地址】是以"/abc/"为开头,就表示调用的资源OneSevlet
http://localhost:8080/newWeb/abc/one.do OneServlet会被调用
http://localhost:8080/newWeb/abc/one.do.html OneServlet会被调用
-
后置条件请求路径
如果浏览器请求【资源文件地址】与当前Servlet中的内容为结尾,
Tomcat才会调用当前Servlet
例子:*.do
【*】是一个通配符,描述的是一个任意长度的字符串
如果当前【资源文件地址】是以".do"为结尾,就表示调用的资源OneSevlet
http://localhost:8080/newWeb/abc/one.do OneServlet会被调用
http://localhost:8080/newWeb/abc/one.do OneServlet会被调用
http://localhost:8080/newWeb/five.do?uname=mike OneServlet会被调用
请求行:【
url: http://localhost:8080/newWeb/five.do
method:get
】
请求头:【
uname:mike
】
【注意】不能以【/】开头,必须以"*"开头
-
通配符:
当前Servlet可以接受当前网站所有的请求
例子 :/*
5.请求路径优先级:
具体请求路径>前置请求路径>前置条件>后置条件
七.Servlet实例对象的生命周期
1.项目中,所有Servlet的实例对象都是由Tomcat创建的,开发人员没有权利创建Servlet的实例对象
2.【创建时机】
默认情况:当第一个用户来访问这个Servlet时,Tomcat负责创建它的实例对象
人工干预:要求Tomcat在启动时,创建Servlet的实例对象
<servlet>
<servlet-name>xiaohong</servlet-name>
<servlet-class>com.bjpowernode.controller.xiaohong</servlet-class>
<load-on-startup>890</load-on-startup>
</servlet>
3.在Tomcat运行期间,一个Servlet实现类只能被创建一个实例对象
4.在Tomcat关闭时,由Tomcat负责销毁所有的Servlet实例对象
八.Servlet在开发时需要使用5种工具对象
-
HttpServrletResponse接口:负责将运行结果写入到响应包
-
HttpServletRequest接口:负责读取请求协议包信息
-
ServletContext接口:可以为当前网站中所有的Servlet提供【共享数据】
-
Cookie:在一次会话过程中,存储浏览器在服务端产生的私人数据
-
HttpSession接口:再一次会话过程中,存储浏览器在服务端产生的私人数据
HttpServletResponse:
一、介绍:
- 一个来自于Servlet规范中的接口,由Tomcat负责提供这个接口实现类
- 负责早Servlet运行完毕后,将相关的数据写入到响应头和响应体
- 开发人员习惯于将HttpServletResponse接口修饰对象,称为响应对象
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setCharacterEncoding("GBK");//响应头
PrintWriter out = response.getWriter();
out.print("你好呀");//向响应体中写入对象
}
1.在获得输出流对象之前,设置响应头中的字符集
2.从响应对象获得一个输出流
3.输出流通过方法将英文字符串写入到响应体
out.print():可以将任意类型数据写入到【响应体】并保持原有的特征
out.write():只能将“字符串”或者【unicode码】写入到响应体
out.write(50):一个值为50的unicode写入到响应体值为50的unicode码对应的字符串“2”
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset = GBK");//中间用;隔开
String str = "中国<br/>美国<br/>法国<br/>";
PrintWriter out = response.getWriter();
out.write(str);
}
浏览器根据响应头的内容类型处理接受结果,默认情况下响应头的内容类型是“text”,告诉浏览器响应体存放的都是文字内容
导致浏览器将所有内容文字输出到页面上
3.如果返回内容包含了html标签,需要通知浏览器
4.应该重新设置响应头内容类型
response.setContentType(“text/html;charset = GBK”);//设置响应头类型和字符集,中间用;隔开
三。HttpServletRequest接口:
1.【介绍】
1.一个来自于Servlet规范中的接口,由Tomcat负责提供这个接口实现类
2.由HttpServletRequest接口修饰对象,可以帮助开发人员读取【请求协议包】信息相当于【scanner】
3.一般习惯于将HttpServletRequest接口修饰对象称为【请求对象】
2.【作用】
1.读取【请求行】信息
Sting url = request.getRequestURL();
String method = request.getMethod();
2.读取【请求头】或者【请求体】中所有【请求参数名】
request.getParameterNames();
//http://localhost:8080/web1/second.html?sex=man&name=man
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Enumeration e = request.getParameterNames();
while (e.hasMoreElements()){
String str = e.nextElement().toString();
System.out.println("参数名称:"+str);
}
3.读取请求头或者请求体中【参数内容】
- request.getParameter(参数名); 获得单个参数
- request.getParameterValues(参数名);获得多个参数值
http://localhost:8080/web1/second.html?name=man&id=1&id=2
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String str = request.getParameter("name");
System.out.println("浏览器发送name参数:"+str);
String arr[] = request.getParameterValues("id");
for(String sr:arr){
System.out.println("id参数内容:"+sr);
}
}
四、请求对象与响应对象生命周期:
- 都是由Tomcat负责创建的。
- 每当Tomcat收到一个【请求协议包】时,就会为这个请求协议包创建一对【请求对象】和响应对象。
- 一次请求对应一对【请求对象和响应对象】。
- 在Tomcat调用被请求的Servlet中服务方法(doGet和doPost)时,负责将本次【请求对象和响应对象】作为参数传入到服务方法
- 在服务方法工作完毕后,Tomcat销毁本次请求相关的request和response
- Tomcat负责将【响应包】推送到浏览器上
五。中文请求参数乱码问题:
1.【原因】:跟浏览器采用【请求方式】
如果浏览器以【GET方式】发送请求,【请求参数】在【请求头】存放
在请求协议包到达服务端之后,【请求头】内容是由Tomcat负责解析
Tomcat9.0在解析数据时,默认采用的字符集【utf-8】。
所以如果浏览器以【GET】方式发送中文参数,此时服务端不会出现中文乱码问题
2.【解决方案】:在request对象解析数据之前,重新设置request对象字符集【utf-8】;
request.setCharacterEncoding(“utf-8”);
String value = request.getParameter("参数");
六。ServletContext接口
1.【介绍】:
1.Servlet规范中一个接口,接口实现类有Tomcat负责提供
2.负责为当前工程中所有Servlet提供【共享数据】
3.开发人员习惯于将ServletContext接口修饰对象称为【全局作用域对象】。
2.【生命周期】
1.【全局作用域对象】在Tomcat启动时,由Tomcat为当前网站来创建的
2.一个网站中只能有一个全局作用域对象
3.从网站启动开始一直到网站关闭时,由Tomcat负责销毁当前网站的全局作用域对象
3.【使用】
1.如何得到当前工程中【全局作用域对象】
ServletContext application = request.getServletContext();
向Tomcat索要当前工程的全局作用域对象
4.【共享数据来源方式一】
在网站启动之前,开发人员可以将网站中绝大多数Servlet需要使用的数据添加到web.xml
共享数据名称
共享数据内容
在网站启动时,Tomcat首先为当前网站创建一个【全局作用域对象】
Tomcat然后将web.xml配置共享资源数据添加到【全局作用域对象】
在网站运行时,当前某一个Servlet需要使用【共享数据】时可以从全局作用域对象索要数据
共享数据内容=application.getInitParameter(“共享数据名称”);
------------------------------------------此时共享数据只能读取使用,但是不能修改-------------------
5.【共享数据来源方式二】
在Tomcat运行期间,可以将某一个Servlet提供的数据保存到全局作用域对象中 ,供当前网站中其他Servlet使用
AServlet:提供共享数据
application.setAttribute(“共享数据名”,共享数据数据): 返回值object
BServlet:
共享数据数据 = application.getAttribute(“共享数据”);
------------------------------------------------由Servlet存入共享数据可以被修改-------------------------
七 会话:
这个脑图里忘了,注意一下
1.【定义】:一个;浏览器与一个服务端的一次完整的交流
2.【特点】:
1.在一次会话过程中,经历多次请求与响应
2.在一次会话过程中,同一个浏览器往往访问多个Servlet
3.【需求】:在一次会话过程中,在浏览器要访问的Servlet之间进行数据共享
4.【解决方案】:Cookie 和 HttpSession
八 Cookie
1.【介绍】:
1.Cookie是Servlet规范提供的一个工具类
2.在参与一个会话过程中Servlet之间,进行【数据共享】
3.Cookie存储在浏览器上,保存本次会话的【共享数据】
2.【工作原理】
1.在浏览器访问【OneServlet】时
【OneServlet】负责将当前浏览器产生的私人数据保存到Cookie
然后【OneServlet】负责将Cookie推送到当前浏览器上,
2.在浏览器再次来访问当前网站【TwoServlet】时,需要无条件的将服务端之前推送过来的【Cookie】再推送回去
这样TwoServlet得到【OneServlet】提供的共享数据
3.【cookie使用】:
1.如何创建一个Cookie对象,来保存共享数据
Cookie c1 = new Cookie (“key”,“共享数据”);
—一个Cookie对象只能有一个键值对
—cookie对象只能存储String类型共享数据
2.如何将Cookie写入到响应包【响应头】
response.addCookie(c1);
3.如何从请求协议包的【请求头】读取浏览器返回的cookie
Cookie array 【】 = request.getCookies()
4.【cookie对象的生命周期】
1.默认情况:cookie是保存在浏览器的内存中。
所以在浏览器关闭时,cookie会被windows进行销毁
2.人工干预:要求将Cookie保存到客户端计算机的【硬盘上】同时制定cookie在硬盘上存活时间。在存活时间范
围内,关闭浏览器甚至关闭计算机,都不会导致cookie被销毁
setMaxAge();(以秒为单位计算)
5.【cookie缺点】:
1.一个cookie对象只能存放一个键值对,如果存储的数据较多,需要管理多个Cookie
2.cookie只能存放String类型数据,无法存放【高级Java数据类型,比如List,Map】
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>小赵水果店</title>
</head>
<body>
<center>
<form action="/newWeb/f.do">
<h1>这是个啥水果店</h1>
你的名字:<input name="username">
<br>
你要吃的种类:<input type="radio" value="orange" name="sc">橘子
<input type="radio" value="apple" name="sc">苹果
<input type="radio" value="mang" name="sc">芒果
<br>
<input type="submit" value="提交" name="tijiao">
</form>
<h1>VIP通道</h1>
<a href="/newWeb/s.do">贵客里面请</a>
</center>
</body>
</html>
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String s1 = request.getParameter("sc");
Cookie c1 = new Cookie("key1",username);
Cookie c2 = new Cookie("key2",s1);
//c1.setMaxAge(60);
response.addCookie(c1);
response.addCookie(c2);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//读取当前来访浏览器的cookie地址
Cookie arr[] = request.getCookies();
System.out.println("运行到这了");
for(Cookie co:arr){
String name = co.getName();//读取cookie关键字名字
String value = co.getValue();//读取cookie关键字数据
System.out.println("cookie关键字名字:"+name);
System.out.println("关键字数据:"+value);
if("key1".equals(name)){
System.out.println(value+"客人您又来了");
}else if("key2".equals(name)){
System.out.println("我们给你准备了"+value);
}
}
System.out.println("运行完了");
}
九,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对象
1.HttpSession session = request.getSession();
2.HttpSession session = request.getSession(true);
3.HttpSession session = request.getSession(false);
4.getSession()与request.getSession(true);与getSession(false)区别
1.getSession():如果当前浏览器在服务端中已经拥有了一个Session对象此时Tomcat需要将这个Session对象进行返回,如果当前浏览器在服务端中尚未拥有Session对象此时Tomcat需要创建一个全新的session对象返回
2.getSession(true):与getSession()完全一致;
3.getSession(false):如果当前浏览器在服务端已经拥有一个Session对象,此时Tomcat需要将这个session对象进行返回如果当前浏览器在服务端中尚未拥有session对象,此时返回一个null
------------------------如果来访的用户身份已经确认合法了,此时可以使用getSesson()或者getSession(true)如果来访的用户身份未确认,此时只可以使用getSession(false)
5.Tomcat是如何将浏览器与Session对象关联
在Tomcat创建了一个Session对象时,为Session对象生成一个唯一编号
然后将这个编号保存到cookie中,推送到当前的浏览器内存中
等到浏览器再次发送请求时,Tomcat就可以通过读取浏览器返回cookie来判断浏览器在服务端中是否有session对象
6.如何使用HttpSession对象
在本次会话过程中 AServlet需要为本次会话中其他Servlet提供共享数据
session.setAttribute(“key”,共享数据);
在本次会话过程中,BServlet需要得到当前浏览器session的数据
HttpSession练习:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String goodsName = request.getParameter("name");
HttpSession session = request.getSession();
Integer goodsNum = (Integer) session.getAttribute(goodsName);
if(goodsNum==null){
session.setAttribute(goodsName,1);
}else{
session.setAttribute(goodsName,goodsNum+1);
}
}
--------------------------------------------------------------------------------------------------------
html页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>零食店购物</title>
</head>
<body>
<center>
<h1>零食店购物</h1>
<table border="3" >
<tr>
<td>面包</td>
<td>15.00</td>
<td><a href="/newWeb/one.do" name="m">放入购物车</a></td>
</tr>
<tr>
<td>啤酒</td>
<td>25.00</td>
<td><a href="/newWeb/one.do" name="p">放入购物车</a></td>
</tr>
<tr>
<td>奶酪</td>
<td>150.00</td>
<td><a href="/newWeb/one.do" name="n">放入购物车</a></td>
</tr>
<tr>
<td>牛奶</td>
<td>105.00</td>
<td><a href="/newWeb/one.do" name="ni">放入购物车</a></td>
</tr>
</table>
</center>
</body>
</html>
①这个没有完
Servlet开发过程中涉及的两个常用小点
一、Http状态码
1.【介绍】:
1.http状态码是由一个三位数字组成符号
2.Http状态码由Tomcat负责创建生成
3.Http状态码由Tomcat写入到【状态行】
4.Http状态码通知浏览器在接受到响应包之后的行为Http状态码通知浏览器,服务端无法提供本次的原因
2.【分类介绍】5类
1.1xx:通知浏览器本次返回的资源文件并不完整,需要浏览器继续向服务端发送申请
2.2xx:通知浏览器,服务端将一个完整的文件推送给浏览器。200,浏览器与服务端进行了一次完美通信
3.3xx:服务端推送给浏览器的是一个【网址】,要求浏览器在接收到这个网址后,立刻自动向这个网址发送请求
response.sendRedirect(“地址”);
4.4xx:通知浏览器,服务端本次未能提供服务的原因,是由于服务端没有对应的资源文件
404:服务端没有对应的资源文件
405:服务端由本次请求对应的Servlet,但是Servlet.不负责处理浏览器当前的请求方式
浏览器使用doGet方式请求,但是Servlet只接受doPost方式的请求
报错:Http Status 405 - HTTP method GET is not supported by this URL
浏览器使用GET方式发送请求,但是对应Servlet中没有重写doGet方法
5.5xx 通知浏览器,服务端本次未能提供服务的原因,被调用Servlet在运行时抛出了异常
二、默认欢迎资源文件:
1.【定义】:Http服务器在接受到一个【默认请求时】返回的资源文件
2.【默认请求】:浏览器向某一个网站发送请求时,并没有指定索要的文件的情况,
http://localhost:8080/web 默认请求
http://localhost:8080/web/one.html 具体请求
3.【默认欢迎文件配置】:
第一种方式:手动在web.xml配置
one.html</welcomt.file>
第二种方式:由Tomcat自行确认
如果Tomcat在当前网站中没有找到标签此时Tomcat回到自己的config文件夹下寻找一个web.xml文件,在这个web.xml寻找标签,来获得默认欢迎文件地址
4.【默认欢迎资源文件分类】
1.首选, html文件或者jsp文件
2.也可以是一个Servlet,但是这个Servlet应该是一个查询Servlet并且在运行时不需要得到浏览器发送的请求参数
多个Servlet来处理同一次请求方案
一、【前提】
1.一个Servlet只负责实现一个功能
2.浏览器在一次请求时,只能请求一个资源文件
3.如果浏览器的请求需要由多个Servlet来协同完成,需要用户多次通过【手动提交请求】来完成任务,这样降低服务质量
二、【方案分类】:只需要用户手动通过浏览器发送一次请求,就可以将与本次请求相关的Servlet来依次调用
1.重定向方案
2.请求转发方案
三、【重定向方案原理】:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i1LGyoc8-1602927656924)(C:\Users\zhoushuai\Desktop\10172.png)]
1.在第一个Servlet工作完毕后,将【第二个Servlet地址】推送给用户浏览器,由用户浏览器根据这个地址来【自动的】向第二个Servlet发送请求
四、【重定向方案设计命令】
response.sendRedirect(第二个Servlet地址)将一个地址写入到【响应头】中location浏览器接受大响应包之后,自动根据location地址发送第二次请求,这样好处避免用户多次手动发送请求。
五【重定向方案特征】:
1.发生位置:在客户端的浏览器上
2.浏览器发送的请求次数:多次
3.地址栏内容是否会发生变化:会发生变化,内容是浏览器第二次需要访问的资源地址
4.【重定向时,浏览器采用的请求方式】:由于此时通过地址栏命令浏览器发送请求所以浏览器采用请求方式一定是GET
5.【重定向时,访问的资源文件范围】:可以访问的资源文件可以是一个网站的资源也可以生死其他网站的资源
六、【重定向方案适用场景】
1.添加功能Servlet 调用 查询功能Servlet
2.删除功能Servlet 调用 查询功能Servlet
3.更新功能Servlet 调用 查询功能Servlet
七【请求转发原理】:
在第一个Servlet工作完毕后,待敌当前浏览器向Tomcat申请调用第二个Servlet
Tomcat在接受到申请后,调用第二个Servlet来完成本次请求中剩余任务
八、【请求转发涉及的命令】:
OneServlet
//创建一个资源申请对象
RequesDispatcher report = request.getRequestDispatcher(“第二个Servlet地址”);
//将申请报告推送给Tomcat,同时将OneServlet拥有的【request和response】一并交给Tomcat
report.forward(request,response)
//3.Tomcat在接受到报告之后,就会调用第二个Servlet来完成剩余任务
九【请求转发时为什么将第一个Servlet中request和response交给Tomcat】
1.Tomcat在接受到请求后,需要调用第二个Servlet。
2.Tomcat此时需要为第二个Servlet提供运行时需要的【request和response】
3.但是,本次请求是由第一个Servlet来发送的,没有对应的【请求协议包】因此导致Tomcat在接受到请求后,不会创建request和response
4.为了解决这个问题,需要将第一个Servlet使用的request和response通过Tomcat交给第二个Servlet来使用
十、【请求转发特征】
1.发生位置:发生在服务端
2.浏览器发送请求次数:浏览器只向服务端发送了一次请求
3.地址栏内容是否会发生变化:由于请求转发发生在服务端,因此浏览器地址内容保持在一次请求内容
4.调用资源文件范围:只能访问同一个访问内部的资源文件
5.通过请求转发调用的Servlet接受的请求方式:与浏览器第一次发送请求时,使用的请求方式保持一致,参与同一次请求转发的所有Servlet接受的请求方式时一样的。
6.参与同一次请求转发的所有Servlet之间如何进行数据共享:
1.可以使用全局作用域对象:提供共享数据
2.可以使用会话作用域对象,提供共享数据
3.可以使用请求作用域对象,提供共享数据
十一、【请求转发不适合场景】:
1.添加功能Servlet 调用 查询功能Servlet
2.删除功能Servlet 调用 查询功能Servlet
3.更新功能Servlet 调用 查询功能Servlet
视频中说:如果执行添加操作,用户刷新后就又添加,然后如果使用框架可以屏蔽这种操作
十二、【请求转发适合场景】:查询Servlet调用JSP时。
视频链接:https://www.bilibili.com/video/BV1ut411K7Ey?p=63
视频p30有两个接口没有实现,
视频p63对表的增加与删除没有实现
视频p52、53debug没有弄
还有一个增加到表,然后请求转发到查询没有做