服务器
web应用的演变
俩层CS架构
特点:数据库作为server,使用其特定的编程语言,编写业务逻辑,客户端提供操作页面和少量的业务逻辑
缺点:移植性较差,更换数据库时需要重新编程,不适合大型应用
三层CS架构
特点:数据库只负责数据的管理;应用服务器提供所有的业务逻辑处理;客户端只负责操作界面
优点:移植性好,适合大型应用
缺点:客户端需要单独安装(限制),开发复杂(需要自定义协议,编写客户端和服务器的通信模块)
BS架构
特点:数据库只负责数据管理;应用服务器提供所有的业务逻辑处理;客户端只负责操作界面
优点:不需要单独安装客户端,开发相对于CS简单,客户端与服务端都是使用标准的HTTP协议
Servlet
Sun(Oracle)公司制定的一种用来扩展web服务器功能的组件规范
扩展web服务器功能:
早期的web服务端只能处理静态资源请求,无法根据请求计算后生成相应的HTML页面,但是Servlet可以完成这一个需求,Servlet需要满足一种规范(Servlet运行环境)Tomcat就是一个容器(服务器),提供了Servlet的运行环境
组件规范:
Servlet是一个组件,符合一定的规范,实现部分的功能,并且需要部署到容器中才能运行的软件模组
容器:符合一定规范,提供组件运行环境的一个程序
Servlet工作流程
文字总结:浏览器根据IP建立与容器的连接,浏览器将请求数据打包发送给服务器,服务器接收到后进行拆包,解析请求数据包,封装对象,容器依据路径找到Servlet路径创建对象,然后调用Servlet的service()方法,从respose中获取结果,然后将其进行打成响应数据包,然后通过HTTP协议发送给浏览器,浏览器进行解析执行在客户端进行显示
Servlet运行中常见的错误以及解决方法:
数字错误是服务器执行完客户端的请求后,返回给客户端执行结果的状态编码,当执行正确时也会返回数字200;
404错误:
产生原因:web服务器根据请求地址找不到对应的资源
可能情况:
- 地址写错,拼写错误
- web.xml文件中的俩个的名字不一致
- 工程没有部署
- web应用程序结构没有遵循Servlet规范
405错误:
产生原因:web服务器找不到service()方法
可能情况:
- Service方法名称写错
- Service方法参数类型与标准不一致
- Service方法异常,返回值类型与标准不一致
500错误:
可能原因:程序运行过程中出错
可能情况:
- servlet类没有继承HttpServlet或实现servlet接口
- web.xml中的写错
- service方法代码运行时抛出异常
地址格式
请求地址格式:
http://ip:port/project_name/url-pattern
http://localhost:8088/Servlet2008/demo1
请求资源路径:
/project_name/url-pattern
/Servlet2008/demo1
Servlet路径:
/url-pattern
/demo1
HTTP协议(Hyper Text Transfer Protocol):
由W3C制定的一种应用层协议,用来定义浏览器和服务器之间如何通信以及通信的数据格式
请求数据包:
请求行:请求方式+请求资源路径+协议版本
消息头:是一些键值对,通讯的双方通过消息头来传递一些特定的含义
实体内容:只有当请求为post时,实体内容才会有数据(请求参数)
响应数据包:
状态行:协议版本+状态码+状态描述
消息头:web服务器返回一些消息头给客户端,例如返回content-type告诉浏览器,服务器返回的数据类型以及字符集
实体内容:程序处理的结果
Servlet如何处理HTTP协议:
Servlet如何控制通信数据:
当web服务器收到HTTP请求时,通信数据由web容器负责封装和提供这些信息被解释成俩个对象
-
与请求数据对应的是HttpServletRequest对象
当客户端通过Http协议访问服务器时,请求中的所有消息都能封装到这个对象中
作用:读取或写入Http请求数据;获取和设置cookie;取得路径信息;标识Http会话;实现请求转发
-
与响应数据对应的是HttpServletResponse对象
当服务器通过http协议提供给客户端时,响应中的所有消息都会封装到对象中
作用:设置对客户端的输出内容;设置响应的状态码;设置浏览器的解码方式;设置cookie;实现重定向
Servlet如何接收请求参数:
getParameter()方法:
常用于传入的参数中,一个名字对应一个值的形式
String request.getParameter(String name);
getParameterValues()方法:
当需要获取参数名相同的多个参数值时使用该方法,用于获取提交表单中的复选框的值,如参数名写错,会产生null
String[ ] request.getParameterValues(String name);
请求方式:get、post
get请求:当需要向服务器请求指定的资源时使用的方法
什么情况下浏览器发送get请求:在浏览器地址栏输入一个地址;点击连接(类似于超链接)
post请求:向服务器提交需要处理的数据,这些数据写在请求数据包的实体内容中
表单:
向服务器提交需要处理的数据,表单的默认请求方式为get请求,会将请求数据添加到请求资源的后面,只有提交少量数据,并显示在浏览器地址栏上,不安全
只有将表单的method属性改为post,才会发送post,请求参数添加到实体内容中,可提交大量数据,不会将请求参数显示在地址栏上,相对安全
Servlet如何处理中文参数:
为什么表单提交中会出现乱码:当表单提交时,浏览器会对中文参数值进行编码(会使用打开表单所在页面时的字符集进行编码)服务器在默认情况下会使用ISO-8859-1去解码,当编码和解码不一致时会出现乱码
解决post方式时的乱码问题:
-
确保表单所在的页面按照指定的字符集打开
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-
在服务端继续按照这个编码格式去解码,必须添加在读取数据之前,只针对post有效
request.setCharacterEncoding("utf-8")
解决get方式时的乱码问题:
-
确保表单所在页面按照制定的字符集打开
-
进行转译
String name = request.getParameter(“name”); name = new String(name.getBytes(“iso-8859-1”),”utf-8”);
如何输出中文:
response.setContentType(“text/html;charset=utf-8”)
Servlet容器如何处理请求资源路径(/projectName/xxx):
服务器对请求地址的处理过程:
- 浏览器根据IP建立与Servlet容器之间的连接,然后将请求资源路径发送给容器
- 容器根据应用名(projectName)找到应用所在的文件,容器默认为请求为一个Servlet,会去在web.xml中查找所有的Servlet配置中的节点看是否有匹配的servlet,若没有则在当前应用下查找是否存在对应页面
匹配规则:
优先级:精确匹配 > 后缀匹配 > 通配符匹配
-
精确匹配
通过将请求资源路径中的具体名称与web.xml中的进行比对,严格匹配相等后找到对应的资源并执行;尽管应用中有当前所需的页面,但是也会执行的servlet
-
通配符匹配
使用"/*"来匹配0或者多个字符
<url-pattern>/*</url-pattern> /ServletEmp/addEmp.html // 匹配成功 /ServletEmp/abc/a/f/gg/hh/kk/addEmp //匹配成功
-
后缀匹配
不能使用/开头,使用“*.xx”开头的任意多个字符
<url-pattern>*.do</url-pattern> //会匹配所有以.do结尾的请求
-
无匹配
如果精确匹配,后缀匹配,通配符匹配都未匹配成功,容器会查找到对应的文件后返回,若找不到则返回404错误
一个Servlet如何实现多请求(mvc思想):
为什么要合并多个Servlet:
一般情况下Servlet的主要作用是充当控制器的角色即接收请求并分发给不同的资源,这时servlet只要有 一个就可以完成分发请求的过程
实现合并的步骤:
- 使用后缀或者通配符匹配模式修改web.xml
- 获取请求资源路径(uri)分析具体的请求资源后,依据分支结构的不同调用不同的分支进行处理
重定向
服务器向浏览器发送一个302状态码以及一个location消息头(该消息头的值是一个地址,称之为重定向的地址),浏览器收到后立即向重定向的地址发送请求
如何进行重定向:
response.sendRedirect(String url)
重定向的特点:
- 重定向的地址是任意地址
- 重定向后地址栏发生改变
- 重定向过程中涉及的web组件不会共享一对request和response对象
- 重定向的过程中发送俩次请求
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZdrsHPfJ-1613106133522)(C:\Users\Melody\AppData\Roaming\Typora\typora-user-images\image-20210208153141422.png)]
Servlet生命周期
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dWwyZuTh-1613106133529)(C:\Users\Melody\AppData\Roaming\Typora\typora-user-images\image-20210208160305179.png)]
生命周期的四个阶段:
第一阶段:实例化(Servlet构造方法):
什么是实例化:容器调用Servlet构造器,创建一个Servlet对象
什么适合实例化:
- 开始时容器中并没有Servlet对象,只有收到请求后才会创建Servlet对象
- 当在中加入1更改优先级后,容器会在启动之后立即创建servlet对象
第二阶段:初始化(init方法):
什么是初始化:容器在创建好servlet对象后会立即调用对象的init方法,一般情况下不用写init方法,它会自己实现,init方法只会执行一次
容器在创建好Servlet对象后还会创建一个ServletConfig对象,用来读取在web.xml中内部配置的内的初始化信息,然后将ServletConfig对象作为参数传递给init方法,从而进行初始化操作
第三阶段:就绪(调用Service()方法)
实例化,初始化结束后,Servlet容器调用Service()方法,进行业务处理
第四阶段:销毁(destroy()方法):
处理结束后,容器根据自身算法删除Servlet对象,删除前会调用destroy()方法,并且只会执行一次
ServletContext:
什么是Servlet上下文:
容器启动后会为每一个web应用创建唯一的一个符合ServletContext接口要求的对象,该对象就是servelt上下文
特点:
- 唯一性:一个web应用对应一个Servlet
- 一直存在:只要容器不关闭,应用没有卸载,Servlet上下文就一直存在
如何获得Servlet上下文:
- 通过ServletConfig提供的getServletContext();
- 通过HttpSession提供的getServletContext();
- 通过FilterConfig提供的getServletContext();
Servlet上下文的作用及特点:
- 使用setAttribute()绑定数据
- 使用removeAttribute移除绑定的数据
- 使用getAttribute获取绑定的数据
特点:Servlet上下文绑定的数据可以被整个应用上的所有组件共享,并且可以一直访问
//获取全局上下文对象
ServletContext application = getServletContext();
Object count = application.getAttribute("count");
if(count == null){
//application.setAttribute("count",1);
application.setAttribute("count",
application.getInitParameter("count"));
}else{
application.setAttribute("count",Integer.parseInt(count.toString())+1);
}
out.println("<h1>当前浏览量为:"+application.getAttribute("count")+"</h1>");
JSP的由来:Servlet技术产生之后再使用时最大的麻烦在于使用大量的out.println()语句输出页面,这样的形式再系统变更,维护,预览效果时都不能方便快捷的完成任务,于是JSP应用而生,用来将Servlet中负责显示的语句抽离出来
什么是JSP?
SUN(Oracle)公司制定的一种服务端动态页面技术的组件规范,JSP是以.jsp为后缀的文件,在读文件中,主要是以HTML和少量的JAVA代码,JSP文件会被容器转换为一个Servlet类,然后执行,JSP的本质上依据是Servlet
JSP语法规范:
如何编写JSP:
- 写一个以.jsp为后缀的文件
- 该文件中可以包含:HTML(css,javascript),注释,JAVA代码,指令,隐含(内置)对象
JSP页面中的HTML代码:
HTML标记,CSS,javascript在jsp中编写方式与HTML中的一样
作用:控制页面在浏览器中的显示效果
转译成Servlet的规则:成为Servlet中service()方法的out.println()方法
JS页面中的注释:
HTML注释
注释的内容如果包含java代码,这些代码不会被注释
语法规则:
JSP特有的注释
其中若有Java代码,则会被注释,不会编译
语法规则:<%-- 内容 – %>
JSP页面的Java代码:
三种表示:JSP表达式,JSP小脚本,JSP声明
编写位置:页面的任意位置
作用:控制页面中可变内容的产生
JSP表达式
语法规则:<%= 内容 %>
合法内容:变量,变量加运算符组成的表达式,有返回值的方法
转译成Servlet的规则:在Service()方法中用out.println()
语句输出的该变量,表达式以及方法的返回值
JSP小脚本
语法规则:<% 内容 %>
合法内容:能够写在方法里的Java代码都可以作为小脚本
转译成Servlet规则:原封不动成为Servlet中的Service()方法里的一段代码
JSP声明
语法规则:<%! 内容 %>
合法内容:成员属性以及成员方法的声明
转译成Servlet规则:成为Servlet类中的成员属性或成员方法
JSP页面中的指令:
语法规则:<%@ 指令名 属性=值%>
常用指令:page,include,taglib指令
作用:控制JSP在转译成Servlet类时生成的内容
Page指令:
用于导包,设置页面属性
语法:<%@ page import=”url”%>
Include指令:
在JSP页面转译成Servlet时,能够将其他文件包含进来,可以包含动态的jsp文件,也可以是静态的HTML文件
语法:<%@ include file =”url”%>
隐含对象(内置对象)
在启动时容器自动创建,在JSP文件中可以直接使用的对象
作用:JSP预先创建的这些对象可以简化为对HTTP对象,响应信息的方法
输入输出对象 | request,response,out |
---|---|
作用域通信对象 | Session,application,pageContext |
Servlet | page,config |
异常对象 | exception |
内置对象 | 类型 | 说明 |
---|---|---|
request | HttpServletRequest | 请求信息 |
response | HttpServletResponse | 响应信息 |
out | JspWriter | 输出数据流 |
Session | HttpSession | 会话 |
pageContext | pageContext | 页面上下文 |
application | Application | 全局上下文 |
config | ServletConfig | Servlet配置对象 |
Exception | Throwable | 捕获网页异常 |
JSP运行原理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NSVrnr39-1613106133533)(C:\Users\Melody\AppData\Roaming\Typora\typora-user-images\image-20210209110444374.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KRyZSvzD-1613106133537)(C:\Users\Melody\AppData\Roaming\Typora\typora-user-images\image-20210209110536171.png)]
如何将静态页面转为动态页面
- 拷贝静态页面代码到JSP
- 添加page指令
- 修改页面内容与目标页面一致
- 将需要动态生成的内容删除转为Java代码
转发
什么是转发?
一个web组件(Servlet/jsp)将未完成的处理通过容器转交给另一个组件继续完成
常规情况:
一个servlet组件获取数据之后(比如调用dao)将这些数据转发给一个JSP,由这些JSP展现这些数据的页面
如何实现转发?
-
绑定数据到request对象
实现绑定:request.setAttribute(String name,Object obj) 读取绑定:Object request.getAttribute(String) 其绑定后结果返回值是object类需要进行强转为所转换的类型 若绑定名不存在,返回为null
-
获得转发器
RequestDispatcher rd = request .getRequestDispatcher(String uri) uri:为转发的目的地,将未完成的处理继续下去的另一个组件
-
转发
rd.forward(request,response)
通常情况下2,3步可以合并
request.getRequestAttribute(String uri).forward(request,respons)
转发的特点:
- 转发之后浏览器地址栏发生不发生改变(原因:转发过程发生在服务器内部,并没有跟浏览器进行交互,浏览器不知情)
- 转发的目的地必须是同一应用(同一工程)内的某个位置
- 转发所涉及的多个web组件共享一对request,response对象
转发与重定向的区别:
- 重定向是浏览器发出请求并收到响应后再次向一个新的地址发送请求;转发是服务器收到请求后为了完成响应转发到一个新的地址
- 重定向中有多次请求对象,不共享数据;转发则只产生一次请求对象且在组件内共享数据
- 重定向后浏览器的地址栏发生改变,转发不会改变
- 重定向的新地址可以是任意地址,转发的新地址则必须是同一个应用内的某个地址
异常处理
编程式异常处理
使用转发进行跳转指定页面提示说明
在try-catch块中,当catch块中出现异常时跳转到指定页面,而不会出现报错界面,比如500错误等等
容器声明式异常处理
-
将异常抛给容器
-
在web.xml中配置错误处理的页面节点
<!-- 配置错误处理页面 --> <error-page> <exception-type>javax.servlet.ServletException </exception-type> <location>/error.jsp</location> </error-page>
-
Notice:异常只允许抛出service()方法指定的ServiceExecption和IOExecption异常,不能抛出指定范围以外的异常
不同异常处理方式的应用场景
对于程序本身的异常最好使用编程式的处理方法,如空指针异常
对于系统级别的异常最好使用容器声明式的方式,如数据库连不上
路径
什么是路径?
链接地址<a href="url">
表单提交:<form action="url">
重定向:response.sendReadirect(url)
转发:reuqest.getRequestDispatcher(url)
什么是相对路径?
从当前文件出发到达目的地文件所经过的路径称为相对路径
书写格式不以“/”开头,返回上一级目录以“…/”开头
什么是绝对路径?
以“/”开头的路径是绝对路径,不以当前位置做起始,而是以一个固定的位置作为起始到达目标文件所经过的路径
路径的使用技巧
在使用绝对路径时:链接地址,表单提交,重定向从应用名开始写,转发则是从应用名之后开始写
状态管理
为什么要状态管理?
Web应用程序使用的是HTTP协议,而HTTP协议是“无状态”协议,即服务器一旦响应完客户的请求之后,就断开连接,而同一个客户的下一次请求将重新建立网络连接,服务器应用程序有时是需要判断是否为同一个客户发出的多次请求
什么是状态管理?
将客户端与服务器之间的多次交互(一次请求一次响应)当作一个整体并且将多次交互所涉及的数据即状态保存下来
状态指的是数据
管理指的是多次交互产生的对数据的修改
状态管理常见的俩种技术
客户端的状态管理技术:将状态保存在客户端,例如Cookie
服务器的状态管理技术:将状态保存在服务端,例如Session
Cookie
浏览器向web服务器发送请求时,服务器将少量的数据以set-cookie的形式发送给浏览器,浏览器将这些保存下来
当浏览器再次访问服务器时,会将这些数据以cookie消息头的方式发送给服务器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rGjXvrwh-1613106133541)(C:\Users\Melody\AppData\Roaming\Typora\typora-user-images\image-20210209113443339.png)]
如何创建Cookie
Servlet API提供了javax.servlet.http.Cookie
Cookie c = new Cookie(String name , String value);
response.addCookie(c);
如何查询Cookie
获取客户端的所有Cookie对象 Cookie[] request.getCookie()
获取一个或多个Cookie对象的名称和值 String cookie.getName(); String cookie.getValue();
如何修改cookie?
- 获取客户端发送的所有cookie
- 根据name找到要修改的cookie
- 调用cookie的setValue(String newValue)方法修改该cookie 的值
- 将修改后的cookie添加到response.addCookie()中
Cookie的生存时间
默认情况下,浏览器会将cookie保存在内存中,只要浏览器不关闭,cookie就一致存在
若希望关闭浏览器cookie仍存在,则需要设置过期时间
void cookie setMaxAge(int seconds) 单位为秒
seconds>0, cookie保存的指定时间
seconds=0,删除cookie
seconds<0,相当于默认情况
Cookie编码
只能保存合法的ASCII字符,如需要保存中文,则需要将其转成ASCII字符,即编码
Cookie c =new Cookie(“city”,URLEncoder.encode(“北京”,“utf-8”))
Cookie解码
编码后的Cookie为看到实际中文,需要还原后在现实
URLDecode.decode(value,”utf-8”);
Cookie的路径问题
浏览器在访问服务器上的某个地方时,会比较cookie的路径与该路径是否匹配,只有匹配的cookie才能发送给服务器
Cookie的默认路径等于添加这个cookie的web组件路径
–如:/appName/file/addCookie.jsp添加了一个Cookie。此时Cookie的路径等于/appName/file
发送cookie的条件:要访问的地址必须是cookie的路劲或者其子路径,浏览器才会发送cookie
如何设置cookie路径:
Cookie c = new Cookie(“unane”,jack)
c.sePath(“/appname”)
respnse.addCookie(c)
Cookie的限制:
Cookie可以被用户禁止
Cookie会将状态保存在浏览器端,不安全,对于敏感的数据需要加密之后在使用cookie保存
Cookie只能保存少量数据,大约4kb
Cookie的个数是有限制的
Cookie只能保存字符串
Session
什么是Session(会话)?
浏览器访问web服务器时,服务器会为每一个浏览器在服务器的内存中分配空间,单独创建一个Session对象,该对象有一个ID属性,其值唯一,一般称之为SessionId,并且服务器将这个SessionId(使用cookie方式)发送给浏览器,浏览器再次访问服务器时,会将SessionID发送给服务器,服务器根据SessionID找到对应的Session对象
如何获取Session?
HttpSession request.getSession(boolean flag)
HttpSession是一个接口,后面返回的是符合接口规范的对象
当flag=true,先查看请求,若没有SessionID,服务器会创建一个新的Session对象;若有SessionID,依据其SessionId可以找到对应的Session对象,则返回,若根据SessionID找不到Session对象,则立即创建,即flag=true时,一定能得到一个Session对象
当flag=false时,没有SessionID或有SessionID但是找不到Session对象,均返回为null,找到则返回
requset.getSession()
等价于request.getSession(true)
,提供该方法是为了书写方便,无论找到或者没找到,都需要返回一Session对象
如何使用Seesion来绑定对象
绑定: void Session.setAttribute(String name,Object obj)
获取: Object Session.getAttribute(String name)
移出: void Session.removeAttribute(String name)
如何删除Session对象
立即删除: Session :Session.invalidate()
Session验证
用户访问需要保护的资源时,可以使用Session验证的方式来保证其安全性,比如登陆验证,首先使用Session.setAttribute()绑定数据,然后使用Session.getAttribute()方法来读取绑定值,如没有则返回登陆页面
Session超时
Web服务器会将空闲时间长的Session对象删除,以便节省服务器内存空间,默认空闲时间为30min
如何修饰Session的有效时间
-
容器声明式配置:在web.xml内进行配置
<session-config> <session-timeout>30</session-timeout> 分钟 </session-config>
-
编程式配置:利用代码进行配置
Session.setMaxInactiveInterval(60)秒
浏览器禁用cookie的后果
如过浏览器禁用cookie后,Session还能用么?
答:不能用,但是有其他解决办法,服务器默认情况下会使用cookie的方式将SessionId发送给浏览器,如果禁用 cookie,则Sessionid不会被浏览器保存,此时服务器可以使用URL重写的方式发送Sessionid
什么是URL重写?
浏览器在访问服务器上的某个地址时,不在按原来的那个地址而是使用经过重写的地址(即在原来的地址后加上SessionId)
如何重写URL?
若是链接地址和表单提交:response.EncodeURL(String uri)
若是重定向:response.encodeReadirectURL(String url)
Session的优缺点
优点:
- 安全性(将状态保存在服务器)
- Session能够保存的数据类型更加丰富,cookie只能是字符串
- Session能够保存更多的数据,cookie大约只能保存4kb
缺点: Session将状态保存在服务端,占用服务器的内存,如果用户量过大,严重影响服务器的性能
过滤器
什么是过滤器?
过滤器是Servlet规范定义中定义的一种小型的可插入的web组件,用来拦截Servlet的请求和响应过程以便查看,提取或以某种方式操作操作正在客户端和服务端之间交互的数据
过滤器通常是封装了一些功能的web组件,这些功能很重要,但是对于客户端请求或发送响应来说不是决定向的
如何编写过滤器?
- 编写一个Java类,实现Filter接口
- 在doFilter方法中实现过滤(拦截)处理逻辑,将过滤器添加到web程序中
- 然后将过滤器和web组件一起打包部署
多个过滤器
如果有多个过滤器都满足过滤请求,则容器依据<filter-mapping>
的先后顺序,来调用各个过滤器一次执行
<filter>
<filter-name>MyFilter1</filter-name>
<filter-class>org.oracle.filter.MyFilter1</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter1</filter-name>
<url-pattern>/conment</url-pattern>
</filter-mapping>
过滤器的优点
实现代码的“可插拔性”,即增加或减少某个功能模块,不会影响程序的正常执行,可以将多个相同处理逻辑的模块集中写在过滤器里面,方便代码维护
监听器
什么是监听器?
Servlet规范中定义的一种特殊组件,用来监听Servlet容器产生的事件并进行相应的处理
容器产生的俩大类事件:生命周期相关事件,绑定数据相关事件
生命周期相关事件
在创建,销毁request,session,ServletContext时产生的事件
ServletRequestListener:
创建:requestInitlized(ServletRequestEvent sre)
销毁:requestDestoryed(ServletRequestEvent sre)
HttpSessionListener
创建:sessionCreated(HttpSessionEvent se)
销毁:sessionDestoryed(HttpSessionEvent se)
ServletContextListener
创建:contextInitlized(servletContextEvent sce)
销毁:contextDestoryed(servletContextEvent sce)
绑定数据相关事件
容器调用request,session,ServletContext对象的setAttribute,removeAttribute方法时产生的事件
ServletRequestAttributeListener
AttributeAdded(requestAttribute srae)
如何编写监听器?
编写一个java类,在依据监听事件类型选择实现相应的监听接口,在监听器的接口方法中,实现相应的监听处理逻辑,在web.xml中注册监听器
web.xml中配置
<listener>
<listener-class>org.oracle.listener.CountSessionListener</listener-class>
</listener>
EL与JSTL
为什么需要EL表达式和JSP标签?
JSP中嵌套大量的JAVA代码增加了页面的复杂度,使页面不够整洁,不方便代码维护,为此Sun公司(Oracle)指定JSP标签(类似HTML标签)代替JAVA代码
Apache组织开发的一套标签被Sun公司整合,称之为标准标签库(JSTL)配合EL表达式,以达到减轻JSP文件的复杂度,方便维护JSP文件的目的
什么是EL表达式?
是一套简单的计算规则,用于给JSP标签赋值,也可以直接用来输出,其也可以单独使用
EL表达式的作用:访问Bean的属性;输出简单的运行结果;获取请求参数
使用EL访问Bean属性
方法一:${对象名.属性名}
方法二:${对象名[“属性名”]}
执行过程:容器会依次从pageContext
,request
,Session
,application
中查找绑定名称为“user”对象,找到后调用“getName”方法输出
即${user.name}
等价于pageContext/request/session/application.getAttributr(“user”)
User.getName()
;若上面没有user对象,会报500错误,若找到但未给name赋值,则输出为null
指定对象的查找范围
在编写EL表达式时,可以指定查找对于绑定名对象的范围,一旦制定了范围,那么在该范围内没有找到对象时,则不会去其他区域找
即${sessionScope.user.name}
在指定的session中寻找
使用EL表达式获取请求参数值
${param.name}
等价于request.getParameter(“name”)
;
${paramValues.city}
等价于request.getParamenterValues(“city”)
;
使用EL表达式进行运算
EL表达式可以做一些简单计算,可以将结果直接输出
算数运算(“+”只能求和,不能做字符串拼接),逻辑运算,关系运算
JSTL
JSP的标准标签库,JSP标签是sun公司定义的一套标准,后将Apache整合
如何使用JSTL?
将JSTL标签对应的jar文件引入当前环境,使用taglib指令导入要使用的JSP标签
<% taglib uri=”” prefix=”” %>,其中uri:jsp标签的命名空间;prefix:命名空间的前缀
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
核心标签
①语法:<c:if test=”” var=”” scope=”” ></c:if>
当test属性值为true时,执行标签体的内容,test属性可以使用EL表达式赋值;var属性:指定一个绑定名称;scope属性:指定绑定的范围(pageContext,request,session,application);var和scope联合进行使用
②语法:
<c:choose>
<c:when test=””></c:when>
...
<c:otherwise></c:otherwise>
</c:choose>
when表示一个处理分支,当test属性为true时,执行该分支,可出现一次或者多次;otherwise:表示列外,可出现0次或一次
③用来遍历集合或数组
语法:<c:forEach items=” ” var=””></c:forEach>
<c:forEach var="emp" items="${list }">
<tr>
<td>${emp.id }</td>
<td>${emp.name }</td>
<td>${emp.age }</td>
</tr>
</c:forEach>
Items:指定要遍历的数组和集合,使用EL表达式赋值
Var:指定一个绑定名称,容器每次从集合中取出一个对象,绑定到pagaContext中
Varstatus:指定一个绑定名称,绑定值为一个容器创建的对象,该对象分装了当前的迭代状态
Index:返回被正在迭代对象的下标,下标从0开始
Count:返回第几次迭代,从1开始
AJAX
Ajax属于客户端和服务端交互的一种技术,全称为Asynchronous JavaScript and XML(JSON),即异步的javascript和xml
原有的交互模式:(整个页面响应+请求响应)
浏览器发送请求 --> Tomcat服务器 --> Tomcat将将响应信息给浏览器 --> 浏览器显示响应结果
Ajax交互模式:(局部刷新+异步加载)
浏览器发送请求 --> XMLHttpRequest发送 --> Tomcat服务器 --> Tomcat返回结果 --> XMLHttpRequest接受结果 --> 将结果显示到浏览器页面
XMLHttpRequset属性
①readyState:0,1,2,3,4
0:未初始化 – 尚未调用.open()方法;
1:启动 – 已经调用.open()方法,但尚未调用.send()方法;
2:发送 – 已经调用.send()方法,但尚未接收到响应;
3:接收 – 已经接收到部分响应数据;
4:完成 – 已经接收到全部响应数据,而且已经可以在客户端使用了
创建-初始化请求-发送请求-接收数据-解析数据-完成
②responseText:获取服务器返回的文本信息
③responseXML:获取服务器返回的XML信息
④status:Http的响应状态:200 请求成功 ;202 请求被接受但处理未完成 ;400 错误请求 ;404 请求资源未找到 ;500 内部服务器错误
JQuery·Ajax
$ajax({}) --> XMLHttpRequset
$ajax({
Url:请求地址,
Type:请求类型get/post,
Data:提交的数据,
Async:同步或异步处理true/false,
DataType:预期服务器返回的数据类型,
Success:成功回调函数,
Error:失败回调函数,
BeforeSend:请求发送回调函数 });
面对需求考虑思维:触发事件源 → 触发事件时机 → 执行什么操作
返回第几次迭代,从1开始
AJAX
Ajax属于客户端和服务端交互的一种技术,全称为Asynchronous JavaScript and XML(JSON),即异步的javascript和xml
原有的交互模式:(整个页面响应+请求响应)
浏览器发送请求 --> Tomcat服务器 --> Tomcat将将响应信息给浏览器 --> 浏览器显示响应结果
Ajax交互模式:(局部刷新+异步加载)
浏览器发送请求 --> XMLHttpRequest发送 --> Tomcat服务器 --> Tomcat返回结果 --> XMLHttpRequest接受结果 --> 将结果显示到浏览器页面
XMLHttpRequset属性
①readyState:0,1,2,3,4
0:未初始化 – 尚未调用.open()方法;
1:启动 – 已经调用.open()方法,但尚未调用.send()方法;
2:发送 – 已经调用.send()方法,但尚未接收到响应;
3:接收 – 已经接收到部分响应数据;
4:完成 – 已经接收到全部响应数据,而且已经可以在客户端使用了
创建-初始化请求-发送请求-接收数据-解析数据-完成
②responseText:获取服务器返回的文本信息
③responseXML:获取服务器返回的XML信息
④status:Http的响应状态:200 请求成功 ;202 请求被接受但处理未完成 ;400 错误请求 ;404 请求资源未找到 ;500 内部服务器错误
JQuery·Ajax
$ajax({}) --> XMLHttpRequset
$ajax({
Url:请求地址,
Type:请求类型get/post,
Data:提交的数据,
Async:同步或异步处理true/false,
DataType:预期服务器返回的数据类型,
Success:成功回调函数,
Error:失败回调函数,
BeforeSend:请求发送回调函数 });
面对需求考虑思维:触发事件源 → 触发事件时机 → 执行什么操作