JavaEE ¶
简介 ¶
互联网通信流程 ¶
设计技术:
- 控制浏览器行为技术:HTML,CSS,JavaScript
- 控制硬盘上数据库行为技术:Mysql,JDBC规范
- 控制服务端java行为技术:http服务器,servlet,JSP
- 互联网通信流程开发规则:MVC
什么是互联网通信:两台计算机通过网络实现文件共享的行为
互联网通信过程中涉及角色:
- 客户端计算机:用于发送请求,来索要资源文件
- 服务端计算机:用于接收请求,并提供对应的资源响应
互联网通信模型
c/s通信模型 客户端软件安装在客户端计算机上;可以解析服务端返回的二进制信息 服务器软件安装在服务端计算机上;服务器用于接收特定的客户端软件发送的请求;收到请求会自动定位请求所要访问的资源文件;将定位的资源文件解析为二进制发送到客户端 适用场景:c/s通信模型普遍的用于个人娱乐市场(qq,视频,频,大型网络游戏…) 优缺点:安全性高、有效降低服务端计算机工作压力;增加客户获得服务的成本、更新较为繁琐
b/s通信模型 浏览器安装在客户端计算机软件;可以向任意服务器发送请求,索要资源文件;可以将服务器返回的二进制数据解析出来 服务器软件安装在服务端计算机上;服务器用于接收浏览器发送的请求;并定位资源文件,解析为二进制返回浏览器
适用场景:个人娱乐场所、企业日常活动
优缺点:不会增加用户获得服务成本、几乎不需要更新浏览器;几乎无法有效的对服务端计算机资源文件进行保护、服务端计算机工作压力极大【b/s高并发解决方案】
共享资源文件
可以通过网络进行传输的文件,都叫做共享资源文件(所有文件)
http服务器对共享资源文件分类
- 静态资源文件
- 动态资源文件
静态资源文件 文件内容固定(文档、图片、视频)
文件存放的是命令,只能在浏览器编译运行(html、js、css)
动态资源文件 文件存放是命令。并且命令只能在服务端计算机编译执行(.class)
静态资源文件与动态资源文件调用区别 静态资源文件:http服务器直接通过输出流将文件内容以二进制 形式推送给浏览器 动态资源文件:http服务器需要创建当前class文件的实例对象,通过实例对象调用对应的方法处理用户请求,通过输出流将运行结果以二进制 形式推送到发起请求的浏览器
http网络协议包 ¶
- 网络协议包
- 在网络中所传递信息都是以二进制数据方式传送
- 接收方接收到数据第一件事就是解析二进制数据为文字图片等
- 传递信息往往巨大,导致接收方很难在一组二进制得到对应的数据
- 网络协议包是一组有规律的二进制数据,在这组数据中有固定空间,每个空间存放特定信息;接收方在接收到网络协议包时可以到固定空间得到对应的数据,极大降低了接收方接受二进制编译难度
- 常见网络协议
- FTP网络协议包
- Http网络协议包
- Http网络协议包
- 基于b/s通信模型,传递的数据都是保存在网络协议包中
- 分类
- Http请求协议包
- Http响应协议包
- http请求协议包与响应协议包介绍
- http请求协议包:浏览器发送请求时,先创建http请求协议包,浏览器将请求信息以二进制形式保存在http协议包的各个空间,然后由浏览器发送
- http响应协议包:http服务器定位到被访问的资源时,会创建一个http响应协议包,将资源以二进制方式写入http协议包的各个空间,然后http服务器推送到浏览器
- http请求协议包内部空间(从上往下划分)
- 请求行:[url:请求地址 method:请求方法]
- 请求头:[请求参数信息(get)]
- 空白行:[没有任何内容,隔离作用]
- 请求体:[请求参数信息(post)]
- http响应协议包内部结构
- 状态行:[http状态码]
- 响应头:[content-type:指定浏览器以对应的编译器去编译的响应二进制数据]
- 空白行:[没有任何内容,隔离作用]
- 响应体:[可能被访问静态资源文件内容 可能被访问的静态资源文件命令 可能被访问的动态资源文件运行结果]
javaee ¶
是一种企业级java规范
规范了web项目必须有以下目录结构
src:存放动态资源java文件 web:存放静态资源文件 WEB-INF:依赖的jar[mysql驱动]/核心配置文件 classes:存放字节码文件 lib:存放开发过程需要使用的jar包 web.xml:存放网页的配置文件(可配置默认文档)
浏览器–>http<–服务器–>servlet<–服务端程序–>JDBC<–数据库
tomcat服务器 ¶
必须配置JAVA_HOME环境变量
目录结构
- bin:启动脚本等
- conf:配置文件,主要看server.xml文件
- lib:tomcat开发使用的包
- webapps:网站app目录,可以在server.xml配置文件中修改
- work:jsp转换为class文件的工作目录
web项目打包war
- jar -cvf nameweb.war . :打包到什么位置,打包哪儿
- war包放在webapps目录下,tomcat会自动解压部署
web所有项目管理 1.进入Tomcat首页,点击manager,配置用户名密码后登录
虚拟目录配置
- 在server.xml里面的<host …> 标签下配置,需要重启 <Context path="/test" docBase=“F:\virtualDIR” debug=“0” reloadble=“true”/>
- 在引擎目录下的虚拟主机目录下新建xml文件配置内容如下,不需要重启 <Context path="/test" docBase=“F:\virtualDIR” debug=“0” reloadble=“true”/>
虚拟主机配置 在server.xml目录下配置
xml1 <Host name="localhost" appBase="webapps" 2 unpackWARs="true" autoDeploy="true"> 3 <!--自动解包war 自动发布--> 4 </Host>
idea配置tomcat ¶
- 找到:file->setting->Build,Execution,Deployment->Application Servers
- 右侧窗口点击 + 号,添加tomcat服务器,找到tomcat安装地址,点击确定
- 找到:run->run/debug configurations(启动tomcat开关)
- 找到 + 号,添加tomcat启动开关
- Deployment:将网站交给tomcat发布,配置网站以及应用名
- 找到 + 号,添加tomcat启动开关
servlet规范 ¶
简介 ¶
- servlet规范来自于javaee规范中的一种
- 作用:
- 在servlet规范中,指定了动态资源文件开发步骤
- 在servlet规范中,指定了http服务器调用动态资源规则
- 在servlet规范中,指定了http服务器管理动态资源文件实例对象的规则
- servlet接口实现类
- servlet接口来自于servlet规范下的一个接口,这个接口存在于http服务器
- tomcat下lib文件夹有一个servlet-api.jar存放servlet接口(javax.servlet.Servlet接口)
- servlet规范中,http服务器能够调用的动态资源文件必须是Servlet接口的实现类
Servlet接口实现类开发步骤 ¶
- 创建一个java类,继承HttpServlet这个父类,使之实现Servlet接口 OneServlet—>(abstract)HttpServlet—>(abstract)GenericServlet—>Servlet(接口) GenericServlet抽象类实现了:init() destory() getServletInfo() getServletConfig();后面继承它的类,不需要实现这些;HttpServlet抽象类实现了service方法,所以其子类只需要重写doGet与doPost方法
- 重写HttpServlet父类的两个方法:doGet或者doPost;通过父类调用子类中的方法,被称为模板设计模式 tomcat实例化:Servlet a=new OneServlet() tomcat调用service方法:a.service() 父类service方法中调用:doGet或者doPost
- 将Servlet接口实现类信息注册到tomcat服务器 在web.xml中写入当前servlet信息
1<!--将Servlet实现类的路径地址交给tomcat-->
2<Servlet>
3 <!--声明一个变量存储servlet接口实现类类路径-->
4 <servlet-name>mm</servlet-name>
5 <!--sservlet接口实现类类路径-->
6 <servlet-class>com.lei.con.Test1</servlet-class>
7 <!--此时tomcat:String 变量="servlet接口实现类类路径"-->
8</Servlet>
9<!--简化用户访问servlet接口实现类难度,设置请求别名-->
10<servlet-mapping>
11 <!--上面设置的变量名-->
12 <servlet-name>mm</servlet-name>
13 <!--设置简短别名,'/开头'-->
14 <url-pattern>/test01</url-pattern>
15</servlet-mapping>
16<!--http://localhost:8080/test01-->Servlet对象生命周期 ¶
- 网站中所有Servlet实现类,只能由http服务器负责创建
- 默认情况下,http服务器收到当前Servlet接口实现类第一次请求时自动创建该Servlet接口实现类的实例对象 可以手动指定http启动时创建,在web.xml的servlet下配置 <load-on-startup>30<load-on-startup>
- http服务器运行期间,一个Servlet接口实现类只能被创建出一个实例对象
- http服务器关闭时,会自动销毁实例对象
HttpServletResponse接口 ¶
HttpServletResponse接口来自于Servlet规范中,在tomcat中存放在servlet.jar
HttpServletResponse接口实现类由http服务器负责提供
HttpServletResponse接口负责将doGet/doPost方法执行结果写入响应体交给浏览器
开发人员称HttpServletResponse修饰的对象称为响应对象
主要功能
- 将执行结果以二进制通过输出流写入响应体
- 设置响应头中[content-type]属性值,从而控制浏览器以对应的编译器将响应体中的二进制编译出来,以及使用指定编码
- 设置响应头中的[location]属性,将一个请求地址赋给location,从而控制浏览器向指定服务器发送请求(浏览器发现location属性时自动发送请求)
java1protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 2 String str1="black<br/>yellow<br/>white<br/>"; 3 String str2="唐磊<br/>你好世界<br/>"; 4 //设置响应头localtion属性,浏览器检测到这个属性会自动请求该地址 5 //response.sendRedirect("http://baidu.com"); 6 //在拿到输出流之前设置响应头中content-type属性,规定使用什么编码器以及字符集 7 response.setContentType("text/html;charset=utf-8"); 8 //通过响应对象向tomcat拿到输出流 9 PrintWriter out=response.getWriter(); 10 out.write(50); //浏览器输出2,write可以写入[字符、字符串、ASCLL码],所以输出为2 11 out.print(50); //浏览器输出50 12 out.print(str1); 13 out.print(str2); 14 }
HttpServletRequest接口 ¶
- HttpServletRequest接口来自于Servlet规范中,在tomcat中存放在servlet.jar
- HttpServletRequest接口实现类由http服务器负责提供
- HttpServletRequest接口负责在doGet/doPost方法运行时读取http协议包中信息
- 开发人员称之为请求对象
- 作用
- 可以读取http请求协议包中请求行信息
- 可以读取保存在http请求协议包中请求头或者请求体中请求参数信息
- 可以代替浏览器向http服务器申请资源文件调用
- uri:资源文件精准定位地址,实际上是一个截取字符串“/网站名/资源文件名”
- 浏览器发送请求
- 浏览器以get方式发送请求,请求参数保存在请求头中;http协议包到达服务器时,请求头中内容由tomcat负责解码,tomcat默认采用utf-8进行解码
- 浏览器以post方式发送请求,请求参数保存在请求体中;http协议包到达服务器时,请求体中内容由当前请求对象(request)负责解码,request默认使用[ISO-8859-1]字符集,此时中文会乱码
1 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
2 //获取请求行请求地址
3 StringBuffer url=request.getRequestURL();
4 //获取请求URI,资源文件精准定位
5 String uri=request.getRequestURI();
6 //获取请求行请求方法
7 String method=request.getMethod();
8 System.out.println(url+":"+uri+":"+method);
9 //获取请求头请求参数名,返回枚举对象
10 Enumeration<String> reqNs=request.getParameterNames();
11 while (reqNs.hasMoreElements()) {
12 String reqN=reqNs.nextElement();//获取请求参数名
13 String reqV=request.getParameter(reqN); //根据参数名获取值
14 System.out.println(reqN+":"+reqV);
15 }
16 }
17
18 @Override
19 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
20 //通知请求对象,采用解码方式,而get请求是由tomcat负责解码(默认uft-8)
21 req.setCharacterEncoding("utf-8");
22 //获取请求体请求参数名,返回枚举对象
23 Enumeration<String> reqNs=req.getParameterNames();
24 while (reqNs.hasMoreElements()) {
25 String reqN=reqNs.nextElement();//获取请求参数名
26 String reqV=req.getParameter(reqN); //根据参数名获取值
27 System.out.println(reqN+":"+reqV);
28 }
29 }请求对象与响应对象生命周期 ¶
- 在http服务器接收到浏览器发送的http协议包,就会立即生成一个请求对象与一个响应对象
- 在http服务器调用doGet/doPost方法时,负责将请求对象与响应对象作为实参传入
- 在http服务器准备推送http响应协议包时,负责将本次请求关联的请求对象和响应对象负责销毁
欢迎资源文件 ¶
网站默认首页
tomcat对于当前网站默认定位规则:/conf/web.xml文件里面配置
命令规则
xml1<welcome-file-list> 2 <welcome-file>index.html</welcome-file> 3 <welcome-file>index.htm</welcome-file> 4 <welcome-file>index.jsp</welcome-file> 5</welcome-file-list>设置当前网站的默认首页定位规则,直接在当前网站的/WEB-INF/web.xml配置文件中配置,设置了后,tomcat默认的首页定位规则设置就会失效
http状态码 ¶
介绍
- 由三位数字,组成的一个符号
- http服务器在推送响应包之前按,根据本次请求处理情况将http状态码写入到相应包中的状态行
- http针对本次请求,返回了对应的资源文件,通过http状态码通知浏览器应该如何处理这个结果 http针对本次请求,不能返回对应的资源文件,通过http状态码告诉浏览器不能提供的原因
分类
组成 100—599;分为5个大类
1xx: 最具特征 100;通知浏览器本次返回的资源文件并不是一个完整资源文件,需要浏览器在接收响应包后,继续向http服务器索要依赖的其他资源文件
2xx: 最有特征 200;通知浏览器本次返回的资源文件是一个独立完整的资源文件,浏览器接收到后不需要继续发送请求
3xx: 最具特征 302,通知浏览器本次返回不是资源文件,而是某个资源文件的地址,浏览器接收到后应该立即根据资源文件地址再次发送请求
4xx: 404:通知浏览器,由于服务端定位不到被访问的资源文件,因此无法提供服务
405:通知浏览器,服务端定位到资源文件(Servlet),但是方法不支持(访问方法不支持)
5xx: 500:通知浏览器,服务端定位到资源文件(Servlet),并且可以处理浏览器的请求方式,但是由于java异常导致处理失败
多个servlet调用规则 ¶
前提条件:某些浏览器发送请求,往往需要服务端都奥格servlet协同处理,但是浏览器一次只能访问一个servlet,需要浏览器多次发送请求
提高用户感受,浏览器只发送一个请求,servlet之间调用
多个servlet之间调用规则
- 重定向解决方案
- 请求转发方案
重定向解决方案
- 原理: 用户第一次请求时,OneServlet处理完成,将响应头localtion中写入TwoServlet请求地址,返回状态码302 浏览器发现localtion属性后,自动发送第二次请求
- 命令:response.sendRedirect("/myweb/towservlet")
- 特征
- 请求地址:可以是当前网站内部资源文件地址,也可以是其他网站外部资源文件地址
- 请求次数:重定向解决方案中,浏览器至少发送两次请求,浏览器只手动放松一次请求
- 请求方式:get
- 缺点:重定向解决方案,需要浏览器与服务器之间多次往返,浪费时间
请求转发方案
- 原理: 用户第一次请求时,OneServlet处理完成,通过当前请求对象代替浏览器向http服务器发送请求twoservlet,然后由twoservlet将执行结果返回给浏览器
- 命令:请求对象代替浏览器向http服务器发送请求
- 通过当前请求对象生成资源文件申请报告对象 RequestDispatcher report=request.getRequestDispatcher("/资源文件名") 以/ 开头
- 将报告对象发送给tomcat report.forward(当前请求对象,当前响应对象)
- 优点
- 无论业务涉及多少servlet,浏览器只用发送一次请求
- servlet之间调用在服务器之间进行,节省了浏览器与服务器往返次数,节约了时间
- 特征
- 请求次数:浏览器只发送一次请求
- 请求地址:只能向tomcat服务器申请调用当前资源文件地址
- 请求方式:在请求转发过程中,浏览器只发送一个请 求协议包,参与本次请求的所有servlet共享一个请求协议包,因此这些servlet接收的请求方式与浏览器发送请求方式保持一致
多个servlet之间数据共享实现方案 ¶
- 数据共享,一个servlet工作完后,将产生的数据交给另一个servlet来使用
- servlet规范中提供了四种数据共享方案
- ServletContext接口
- Cookie类
- HttpSession接口
- HttpServletRequest接口
ServletContext接口 ¶
介绍
- 来自于Servlet规范中的一个接口,在tomcat存在servlet-api.jar;在tomcat中负责提供这个接口实现类
- 如果两个Serclet来自于同一个网站,彼此之间通过网站的ServletContext实例对象实现数据共享
- 开发人员称ServletContext对象为全局作用域对象
工作原理 每一个网站都存在一个全局作用于对象,这个全局作用域对象相当于一个map,在这个网站中,一个servlet可以将数据以键值对方式放入这个全局作用域对象,此时其他servlet都可以从这个全局作用域对象得到这个数据进行使用
全局作用域对象生命周期
- 在http服务器启动过程中,会自动被当前网站在内存中创建这个全局作用域对象
- 在http服务器运行期间,一个网站只有一个全局作用域对象
- 在http服务器运行期间,全局作用域对象一直处于存活状态
- 在http服务器关闭时,负责将当前网站中全局作用域对象进行销毁
- 全局作用域对象生命周期贯穿于整个网站运行期间
命令实现:同一个网站OneServlet将数据共享给TwoServletlet
java1OneServlet{ 2 public void doGet(HttpServletRequest req,HttpServletResponse res){ 3 //通过请求对象向tomcat索要全局作用于对象 4 ServletContext application=request.getServletContext() 5 //将数据添加到全局作用域对象 6 application.setAttribute("key1",数据) 7 } 8} 9TwoServlet{ 10 public void doGet(HttpServletRequest req,HttpServletResponse res){ 11 //TwoServlet读取数据,同样先通过请求对象索要全局作用域对象 12 ServletContext application=request.getServletContext() 13 //TwoServlet读取数据 14 Object data=application.getAttribute("key1") 15 } 16}
Cookie类 ¶
介绍
- Cookie来自于Servlet规范中的一个工具类,存在于tomcat提供的servlet-api.jar中
- 如果两个Servlet来自于同一个网站,并且为同一个浏览器/用户提供服务,借助Cookie对象进行数据共享
- Cookie存放当前用户的私人数据,在共享工程中提高服务质量
原理 用户第一个向网站发送请求申请OneServlet,OneServlet运行时创建一个Cookie存储用户相关信息,在运行结束时将cookie写入到响应头中推送给浏览器 浏览器收到Cookie时,存储到浏览器缓存,用户第二次发送请求TwoServlet时,必须将上次获得Cookie信息写入请求头中发送请求 TwoServlet可以从请求头中得到浏览器推送过来的Cookie信息,实现了数据共享
实现命令:同一个网站OneServlet将数据共享给TwoServletlet
java1OneServlet{ 2 public void doGet(HttpServletRequest req,HttpServletResponse res){ 3 //创建cookie对象 4 Cookie card=new Cookie("key1","abc"); 5 //一个cookie相当于一个map,只能存放键值对,且key与value只能时String类型,key不能为中文 6 //将cookie写入响应头 7 res.addCookie(card) 8 } 9} 10TwoServlet{ 11 public void doGet(HttpServletRequest req,HttpServletResponse res){ 12 //调用请求对象,从请求头中得到浏览器发送过来的Cookie 13 Cookie cards[]=req.getCookies(); 14 //循环遍历数据的到每一个key与value 15 for(Cookie card:cards){ 16 String key=card.getName(); 17 String value=card.getValue(); 18 } 19 } 20}Cookie生命周期
- 默认情况下,cookie存放浏览器缓存中,当浏览器关闭时,cookie销毁
- 手动设置情况下,可以要求浏览器将收到的cookie存放在客户机硬盘上,同时要求cookie在硬盘上存活时间,此时cookie不会消失,直到存活时间到达才会被销魂 cookie.setMaxAge(60);//cookie在硬盘上存活60秒
HttpSession接口 ¶
介绍
- HttpSession接口来自一servlet规范下一个接口,存在于tomcat中servlet-api.jar;其实现类由http服务器提供,tomcat提供的实现类存在于servlet-api.jar下
- 如果两个Servlet来自于同一个网站,并且为同一个浏览器/用户提供服务,借助HttpSession对象进行数据共享
- 开发人员称HttpSession修饰对象为会话作用域对象
HttpSession与cookie区别
存储位置 Cookie对象存储在客户端浏览器上;HttpSession对象存储在服务器计算机内存
数据类型 Cookie对象存储共享数据只能时String;HttpSession对象可以存储任意类型共享数据
数据数量 一个Cookie对象只能存储一个共享数据;HttpSession使用map集合存储共享数据,所以可以存储任意数量的共享数据
参照物 Cookie相当于客户端在服务端的【会员卡】
HttpSession相当于客户端在服务端的【私人保险柜】
命令实现:同一个网站OneServlet将数据共享给TwoServletlet
java1OneServlet{ 2 public void doGet(HttpServletRequest req,HttpServletResponse res){ 3 //调用请求对象,向tomcat索要当前用户的私人储物柜 4 HttpSession session=request.getSession(); 5 //将数据添加到用户私人储物柜 6 session.setAttrbute("key1",共享数据) 7 } 8} 9//浏览器访问TwoServlet 10TwoServlet{ 11 public void doGet(HttpServletRequest req,HttpServletResponse res){ 12 //通过请求对象,获取当前用户的私人储物柜 13 HttpSession session=request.getSession(); 14 //从会话作用域中得到OneServlet提供的共享数据 15 Object data=session.getAttribute("key1"); 16 } 17}Http服务器通过cookie将用户与HttpSession关联起来
getSession()与getSession(false)
- getSession():如果当前用户已经拥有自己的私人储物柜,要求tomcat返回这个私人储物柜;如果当前用户没有自己的私人储物柜,则新建一个私人储物柜,然后返回
- getSession(false):如果当前用户已经拥有自己的私人储物柜,要求tomcat返回这个私人储物柜;如果当前用户没有自己的私人储物柜,则tomcat返回null
HttpSession销毁时机
- 用户与HttpSession关联时使用的Cookie只能存放在浏览器缓存
- 在浏览器关闭时,意味着用户与它的HttpSession关系被切断
- 由于tomcat无法检测浏览器是否关闭,导致浏览器关闭而HttpSession对象没有被销毁
- 为了解决,为每个HttpSession对象,设置空闲时间,默认30分钟;如果当前HttpSession对象空闲超过三十分钟,则销毁HttpSession对象
HttpSession空闲时间手动设置,在/WEB-INF/web.xml下
xml1<session-config> 2 <!--设置当前网站每一个HttpSession对象过期时间为5分钟--> 3 <session-timeout>5</session-timeout> 4</session-config>
HttpServletRequest接口实现数据共享 ¶
介绍
- 在同一个网站中,两个Servlet之间通过请求转发方式进行调用,彼此共享同一个请求协议包;而一个请求协议包只有一个请求对象,因此Servlet之间共享一个请求对象;此时可以利用这个请求对象在两个Servlet之间实现数据共享
- 通过请求对象实现两个Servlet之间数据共享时,开发人员称为请求作用域对象
命令实现:OneServlet通过请求转发申请调用TwoServlet时,需要给TwoServlet提供数据共享时
java1OneServlet{ 2 public void doGet(HttpServletRequest req,HttpServletResponse res){ 3 //将数据添加到请求作用域对象,attribute属性 4 //数据类型可以是任意类型Object 5 req.setAttribute("key1",数据); 6 //向tomcat申请调用TwoServlet 7 req.getRequestDispatcher("/two").forward(req,res); 8 } 9} 10TwoServlet{ 11 public void doGet(HttpServletRequest req,HttpServletResponse res){ 12 //从当前请求对象得到OneServlet写入的共享数据 13 Object 数据=req.getAttribute("key1"); 14 } 15}
servlet规范扩展监听器接口 ¶
介绍:
- 一组来自于Servlet规范下的接口,共8个,存在于tomcat中servlet-api.jar
- 监听器接口需要有开发人员亲自实现,http服务器提供的jar包并没有具体实现类
- 监听器接口用于监控作用域对象生命周期变化时刻可以及作用域共享数据变化时刻
作用域对象
在Servlet规范中,认为在服务端内存中,可以在某些条件下为两个Servlet数据共享方案的对象,被称为作用域对象
Servlet规范下的作用域对象
- ServletContext:全局作用域对象
- HttpSession:会话作用域对象
- HttpServletRequest:请求作用域对象
监听器接口实现类开发规范:三步
- 根据要监听的实际情况,选择对应监听器接口进行实现
- 重写监听器接口声明的监听时间处理方法
- 在web.xml文件将监听器接口实现类注册到http服务器
ServletContextListener接口
- 作用:通过这个接口合法的检测全局作用域对象被初始化时刻以及被销毁时刻
- 监听事件处理方法
java1public void contextInitlized();//全局作用域对象被创建时,自动执行 2public void contextDestory();//全局作用域对象被销毁时,自动执行ServletContextAttributeListener接口
- 作用:通过这个接口合法的检测全局作用域对象共享数据变化时刻
- 监听事件处理方法
java1public void contextAdd();//全局作用域添加共享数据时触发 2public void contextReplaced();//全局作用域更新共享数据时触发 3public void contextRemove();//全局作用域删除共享数据时触发 4 5//获取全局作用域对象 6ServletContext app=res.getServletContext(); 7//新增共享数据 8app.setAttribute("key1","data1"); 9//更新共享数据 10app.setAttribute("key1","data2"); 11//删除共享数据 12app.removeAttribute("key1");
通过监听接口提高程序运行 ¶
程序运行期间,耗时主要是获取数据库连接对象与关闭数据库连接对象;可以在全局作用域对象创建时,也就是tomcat启动时,直接创建20个连接对象;在需要数据库连接对象时,可以直接从全局作用域对象中获取;在全局作用域对象销毁时,也就是tomcat关闭时,进行数据库链接对象的销毁
部分代码如下
1//OneListenner类
2 @Override
3 public void contextInitialized(ServletContextEvent sce) {
4 //全局对象创建时机,创建20个数据库连接对象
5 Map<Connection,Boolean> conns=new HashMap();
6 for (int i=0;i<10;i++){
7 try {
8 Connection con= JdbcUtil.getConnection();
9 System.out.println(con+"我诞生了");
10 conns.put(con,true);
11 } catch (Exception e) {
12 e.printStackTrace();
13 }
14 }
15 //获取全局作用域对象
16 ServletContext app=sce.getServletContext();
17 app.setAttribute("conns",conns);
18 }
19
20 @Override
21 public void contextDestroyed(ServletContextEvent sce) {
22 //全局对象销毁时机,将20个数据库连接对象销毁
23 //获取全局作用域对象
24 ServletContext app=sce.getServletContext();
25 //从全局变量获取所有连接对象的一个Map
26 Map<Connection,Boolean> conns= (Map<Connection, Boolean>) app.getAttribute("conns");
27 //获得迭代器
28 Iterator<Connection> iterator=conns.keySet().iterator();
29 while (iterator.hasNext()){
30 Connection con=iterator.next();
31 JdbcUtil.close(con);
32 System.out.println("再见了,兄弟们,我"+con+"先走一步,你们跟上");
33 }
34 }
35
36//JdbcUtil类
37 public static void close(Connection conn,HttpServletRequest req){
38 ServletContext app=req.getServletContext();
39 Map<Connection,Boolean> connChi=(Map<Connection, Boolean>) app.getAttribute("conns");
40 connChi.replace(conn,true);
41 }
42 public static void close(Connection conn){
43 if (conn!=null){
44 try {
45 conn.close();
46 } catch (SQLException throwables) {
47 throwables.printStackTrace();
48 }
49 }
50 }
51
52//UserDao类
53 public int add(Users userInfo,HttpServletRequest req){
54 int res=0; //返回值
55 String sql="insert into users (userName,password,sex,email) values (?,?,?,?)";
56 Connection conn=null;
57 PreparedStatement statement=null;
58 try {
59 //获取数据库连接对象
60 conn= JdbcUtil.getConnection(req);
61 //获取数据库操作对象
62 statement=conn.prepareStatement(sql);
63 statement.setString(1,userInfo.getUserName());
64 statement.setString(2,userInfo.getPassword());
65 statement.setString(3,userInfo.getSex());
66 statement.setString(4,userInfo.getEmail());
67 res=statement.executeUpdate();
68 } catch (Exception e) {
69 e.printStackTrace();
70 }finally {
71 JdbcUtil.close(conn,req);
72 }
73 return res;
74 }
75
76//Servlet调用时
77 UserDao userDao=new UserDao();
78 int res=userDao.add(userInfo,request);servlet规范扩展Filter(过滤接口) ¶
介绍
- 来自于Servlet规范下的接口,存在于tomcat中servlet-api.jar
- Filter接口需要有开发人员亲自实现,http服务器提供的jar包并没有具体实现类
- Filter接口会在http服务器调用资源文件之间,对http服务器进行拦截
作用
- 拦截http服务器,帮助http服务器检测当前请求合法性
- 拦截http服务器,对当前请求进行增强操作
Filter接口实现类开发步骤:三步
- 创建一个Java类实现Filter接口
- 重写Filter接口中的doFilter方法
- 将Filter实现类通过web.xml注册到tomcat服务器
Filter拦截地址格式
xml1<filter-mapping> 2 <filter-name>OneFilter</filter-name> 3 <url-pattern>拦截地址</url-pattern> 4</filter-mapping> 5 6<!--1.要求tomcat在调用具体文件时,进行过滤器拦截时--> 7<url-pattern\>/img/mm.jpg</url-pattern> 8<!--2.要求tomcat在调用某一文件夹下所有文件时,进行过滤器拦截时--> 9<url-pattern\>/img/*</url-pattern> 10<!--3. 要求tomcat在调用任意文件夹下某种类型文件时,进行过滤器拦截时--> 11<url-pattern\>*.jpg</url-pattern> 12<!--4. 要求tomcat在调用任意文件时,进行过滤器拦截时--> 13<url-pattern\>/*</url-pattern>命令作用:通知tomcat在调用何种资源文件之前需要调用OneFilter过滤器进行过滤
代码示例
java1 @Override 2 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 3 //参数列表分别是:请求对象,响应对象,后续操作对象 4 servletRequest.setCharacterEncoding("utf-8");//增强操作,注册时所有Servlet文件访问都先进行处理 5 filterChain.doFilter(servletRequest,servletResponse);//放行操作 6 }
jsp规范 ¶
简介 ¶
- jsp可以方便将响应内容写入响应体,而不需要使用大量的out.print()语句
- jsp命令书写规则
1<%
2 int i=10;
3 int j=20;
4%>
5<table>
6<%
7 for(i;i<j;i++){
8%>
9 <tr>
10 <td><%=i%></td>
11 <td><%=j%></td>
12 </tr>
13<%
14 }
15%>
16 </table>
17//整个jsp网页,会将命令标识符中内容整合到一块,上面书写合法jsp内置对象 ¶
- request:请求对象HttpServletRequest
- session:会话作用域对象HttpSession
- appliation:全局作用域对象ServletContext
Servlet与jsp分工 ¶
- 分工
- Servlet:处理业务得到处理结果
- jsp:不负责业务处理,主要将Servlet中处理结果写入响应体
- Servlet与jsp调用关系,一般通过请求转发方式向tomcat申请调用jsp
- Servlet与jsp数据共享
- Servlet将处理结果添加到请求作用域
- jsp通过请求对象,来调用共享数据
jsp文件运行原理 ¶
http服务器调用jsp文件步骤 ¶
- http服务器将jsp文件内容编辑为一个Servlet接口实现类(.java)
- http服务器将Servlet接口实现类编译为class文件(.class)
- http服务器负责创建这个class的实例对象,这个实例对象就是Servlet实例对象
- http通过Servlet实例对象调用jsp_service方法,将jsp文件内容写入响应体中
http服务器编辑与编译jsp ¶
http服务器编辑与编译jsp文件生成相关java与class文件地址 work文件下
EL工具包 ¶
- java开发的一个jar包,用于jsp文件,存放在tomcat下/lib/er-api.jar
jsp文件作用 ¶
代替响应对象,将servlet中doGet和doPost方法执行结果写入响应体
jsp文件中主要开发步骤 ¶
- 将作用域对象中共享数据读取出来并写入响应体
- 将数据进行类型强转
- 将转换后数据写入到响应体
EL表达式 ¶
- ${作用域对象别名.共享数据名}
- 作用
- el表达式是EL工具包提供的一种特殊命令格式,称为表达式命令格式
- EL表达式在JSP文件上使用
- 负责将作用域对象共享数据读取出来并输出到响应体中
EL表达式-作用域对象别名 ¶
jsp文件中可以使用的作用域别名
- ServletContent application:全局作用域对象
- HttpSession session:会话作用域对象
- HttpServletRequest request:请求作用域对象
- PageContext pageContext:当前页作用域对象,jsp独有;在当前页作用域对象存放共享数据仅能在当前jsp文件中使用;主要用于JSTL标签与JSP文件之间数据共享 JSTL—>PageContext—?JSP
EL表达式提供作用域对象别名
JSP EL表达式别名 application ${applicationScope.共享数据名} session ${sessionScope.共享数据名} request ${requestScope.共享数据名} pageContext ${pageScope.共享数据名}
EL将引用对象属性写入响应体中 ¶
${requestScope.引用类型共享数据名.属性名};属性名必须和引用数据类中属性名一致
EL表达式没有提供遍历集合的方法,因此无法读取集合中数据
EL表达式简化版 ¶
- 命令格式:${共享数据名}
- 允许开发人员省略共享数据所在的作用域别名
- 工作原理: 由于没有作用域别名,所以在执行中,采用猜的算法 首先到pageContext中定位共享数据,存在则读取输出并结束执行;然后顺序依次为:pageContext–>request—>session–>application
- 存在隐患:容易降低程序执行速度;容易导致数据定位错误
- 应用场景 目的:简化从当前页pageContext读取共享数据并输出的难度
- 虽然存在隐患,但实际开发中,一般使用简化版
EL表达式–支持运算表达式 ¶
- 前提:jsp文件中,需要将读取到共享数据经过一番计算然后写入响应体中
- 运算表达式:
- 数学运算
- 关系运算:>(gt) >=(ge) ==(eq) <(lt) <=(le) !=
- 逻辑运算: && || !
EL表达式提供内置对象 ¶
命令格式:${param.请求参数名}
命令作用:通过请求对象读取当前请求包中请求参数内容
代替:request.getParamter(“参数名”)
命令格式:${paramValues.请求参数名[下标]}
命令作用:如果浏览器的请求参数是一个请求参数关联多个值,可以通过以上命令取出指定下标值
代替:request.getParrmenterValues(“参数名”),返回一个数组
Tomcat ¶
内嵌tomcat ¶
通过maven引入依赖
1<properties>
2 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
3 <maven.compiler.source>1.8</maven.compiler.sourc
4 <maven.compiler.target>1.8</maven.compiler.target>
5 <tomcat-version>9.0.26</tomcat-version>
6 </properties>
7<dependencies>
8 <!-- tomcat核心文件 -->
9 <dependency>
10 <groupId>org.apache.tomcat</groupId>
11 <artifactId>tomcat-catalina</artifactId>
12 <version>${tomcat-version}</version>
13 </dependency>
14 <!-- jsp -->
15 <dependency>
16 <groupId>org.apache.tomcat.embed</groupId>
17 <artifactId>tomcat-embed-jasper</artifactId>
18 <version>${tomcat-version}</version>
19 </dependency>
20</dependencies>创建启动方法
1public class Main {
2 public static void main(String[] args) throws Exception {
3 // 启动Tomcat:
4 Tomcat tomcat = new Tomcat();
5 tomcat.setPort(Integer.getInteger("port", 8080));
6 tomcat.getConnector();
7 // 创建webapp:
8 Context ctx = tomcat.addWebapp("", new File("src/main/webapp").getAbsolutePath());
9 WebResourceRoot resources = new StandardRoot(ctx);
10 resources.addPreResources(
11 new DirResourceSet(resources, "/WEB-INF/classes", new File("target/classes").getAbsolutePath(), "/"));
12 ctx.setResources(resources);
13 tomcat.start();
14 tomcat.getServer().await();
15 }
16}