Servlet入门到精通 动力节点(动力节点 14h)
博主在经历了一段时间的学习Servlet后,果断停止了这个网课(见标题)。您可以看看这个笔记大纲,是真的不行,乱的一匹,就是不知道为什么播放量这么高。
一,Servlet规范介绍:
- 作用
- Servlet规范来自于JavaEE规范中的一种
- 在Servlet规范中,指定Http服务器调用动态资源文件规则
- 在Servlet规范中,指定Http服务器管理动态资源文件实例对象规则
二,Servlet接口实现类
-
Servlet接口来自于Servlet规范下一个接口,这个接口存在Http服务器
-
Tomcat服务器下lib文件有一个servlet-api-jar存放Servlet接口(javax.servlet.Servlet接口)
-
Servlet规范中任务,Http服务器能调用的[动态资源文件] 必须是一个Servlet接口实现类
class Student { // 不是动态资源文件,Tomcat无权调用 } class Teacher implements Servlet { // 合法动态资源文件,Tomcat有权利调用 Servlet obj = new Teacher(); obj.doGet(); }
三,Servlet接口实现类开发步骤
-
创建一个Java类继承与HttpServlet父类,使之成为一个Servlet接口实现类
-
重写HttpServlet父类两个方法,doGet或者dpPost
- 浏览器 ------> oneServlet.doGet();
- 浏览器-------》oneServlet.doPost();
-
将Servlet接口实现类信息[注册]到Tomcat服务器
-
【网络】 ----》[web] —》【web-inf】----> web.xml
<!--将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>mm</servlet-name> <url-pattern>/one</url-pattern> <!--设置简短请求别名,别名在书写时必须以"/"为开头--> </servlet-mapping> 如果现在浏览器向Tomcat索要OneServlet时地址 http://localhost:8080/myWeb/one
/* 抽象类作用: 降低接口实现类对接口实现过程难度,将接口中不需要使用抽象方法交给抽象类进行完成,这样接口实现类只需要对接口需要方法进行方法重写
servlet接口:
init
getServletConfig
getServletInfo
destory------------四个方法对于Servlet接口实现类没有
service()-----有用
Tomcat根据Servlet规范调用Servlet接口实现那类规则:
1.Tomcat有权创建Servlet接口实现类实例对象Servlet oneServlet = new OneServlet();
2.Tomcat根据实例对象调用service方法处理当前请求
oneServlet.service(), 此时service方法中 this ==== oneServlet
extends extends implements
oneServlet-------------->(abstract)HttpServlet-------->(abstract)GenericServlet-------->servlet接口
init
destory
getServletInfo
getServletConfig
通过父类决定在何种情况下调用子类中方法------[设计模式]----模板设计模式
HttpServlet: service() {
if (请求方式 == GET) {
this.doGet
} else if (请求方式 == POST) {
this.doPost
}
}
OneServlet: doGet doPost
Servlet oneServlet = new OneServlet();
oneServlet.service()
复习:
重写规则
抽象类作用
子类实现接口规则
this指向
继承规则
*/
四. 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>
-
在Http服务器运行期间,一个Servlet接口实现类只能被创建出一个实例对象
-
在Http服务器关闭时刻, 自动将网站中所有的Servlet对象进行销毁
五,HttpServletResponse接口
- 介绍
1.介绍: HttpServletResponse接口来自于Servlet规范中,在Tomcat中存在servlet-api.jar
2. HttpServletResponse接口实现类由Http服务器负责
3. HttpServletResponse 接口负责将doGet/doPost方法执行结果写入到[响应体]交给浏览器
4.开发人员习惯于将HttpServletResponse接口修饰的对象称为[响应对象]
- 主要功能
- 将执行结果以二进制形式写入到[响应体]
- 设置响应头中[content-type]属性值,从而控制浏览器使用对应编译器将响应体二进制数据编译为[文字,图片,视频,命令]。
- 设置响应头中[location]属性,将一个请求地址赋值给location,从而控制浏览器向指定服务器发送请求。
六,HttpServletRequest接口
1.介绍:
1) HttpServletRequest接口来自于Servlet规范中,在Tomcat中存在servlet-api.jar
2) HttpServletRequest 接口实现类由Http服务器负责提供
3) HttpServletRequest接口负责在doGet/doPost方法运行时读取Http请求协议包中信息
4) 开发人员习惯将HttpServletRequest接口修饰的对象称为[请求对象]
2.作用
1)可以读取Http请求协议包中[请求行]信息
2) 可以读取保存在Http服务请求协议包中,[请求头] 或则[请求体]中请求参数信息
3) 可以代替浏览器向Http服务器申请资源文件调用
/**
问题:
以get方法发送中文参数内容得到正确结果
以post方法发送中文参数内容“老崔是个男人"得到[乱码]"e????????...???"
原因:
浏览器以get方式发送请求,请求参数保存在[请求头],在Http请求协议包到达Http服务器之后,第一件事就是进行解码,请求头以二进制内容由Tomcat负责解码,Tomcat9.0默认使用[utf-8]字符集,可以解释一切国家文字
浏览器以post方式发送请求,请求参数保存在[请求体],在Http请求协议包到达Htpp服务器之后,第一件事是进行解码,请求体二进制内容由当前请求对象(request)负责解码,request默认使用[ISO-8859-1]字符集,一个东欧字符集
解决方案:
在Post请求方式下,在读取请求体内容之之前,因该通知对象使用utf-8字符集对请求体内容进行一次重新解码。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws Servletexception, IOException {
//通知请求对象,使用utf-8字符集对请求体二进制内容进行一次重写解码
request.setCharacterEncoding("utf-8");
// 通过请求对象,读取[请求体]参数信息
String value = request.getParameter("userName");
system.out.println("请求体得到参数值" + value);
}
***/
七, 请求对象和响应对象生命周期
1.在Http服务器接收到浏览器发送的【Http请求协议包】之后,自动为当前的【Http请求协议包】生成一个【请求对象】和一个【响应对象】
2.在Http服务器调用doGet/doPost方法时,负责将【请求对象】和【响应对象】作为实参传递到方法,确保doGet/doPost正确执行
-
在Http服务器准备推送Http响应协议包之前,负责将本次请求关联的【请求对象】和【响应对象】销毁
-
【请求对象】和【响应对象】生命周期贯穿一次请求的处理过程
-
【请求对象】和【响应对象】相当于用户在服务端的代言人
-