十四 request/response/cookie/session
14.1 Request
Request对象:为脚本提供了当客户端请求一个页面或者传递一个窗体时,客户端提供的全部信息。这包括能指明浏览器和用户的HTTP变量,在这个域名下存放在浏览器中的cookie,任何作为查询字符串而附于URL后面的字符串或页面的<FORM>段中的HTML控件的值。也提供使用Secure Socket Layer(SSL)或其他加密通信协议的授权访问,及有助于对连接进行管理的属性。
Request(中文“请求”的意思):可以理解为客户端向服务器请求的信息,就是客户端向服务器请求时,把自己的浏览器信息、HTTP变量和保存在客户端的Cookie告诉服务器,这样服务器就可以根据这些信息判断是谁请求的,之前有没有请求过,对应客户端的Session是什么等等。
A)转发和重定向的区别
重定向:每次发送一个新的请求(新的request对象),地址栏显示新的地址
response.sendRedirect(“请求地址”);
转发:服务器内部转,地址栏看到的地址是上一次的地址,请求对象是同一个request对象
request.getRequestDispatcher(“请求地址”).forward(request,response);
常见应用:一个页面跳转到另外一个页面[必须携带数据]
B) 请求提交给服务器的两种方式get/post
get/post表单提交方式
1)哪一些是get请求
a,在浏览器地址栏直接输入一个地址
http://localhost:9999/web01/login?name=张三&password=1234&…
b,表单默认的提交方式
c,点击超链接
2)哪一些是post请求
a,给表单设置method=“post”。
3)get/post方式的区别
a,get方式,会将请求参数及参数值放在请求资源路径里面,携带的数据大小有限 制,
不适合提交大量的数据。2M
而post方式会将请求参数及参数值放在实体内容里面,理论上没有限制,适合大 量数据的提交。
b,安全上来讲,post方式相对安全(因为请求参数及值存放在实体内容里面,而get 方式会将请求参数及值显示在浏览器地址栏)。
但是要注意,post方式并没有将数据加密。
14.2 Response
Response对象:用来访问服务器端所创建的并发回到客户端的响应信息。为脚本提供HTTP变量,指明服务器和服务器的功能和关于发回浏览器的内容的信息,以及任何将为这个域而存放在浏览器里新的cookie。它也提供了一系列的方法用来创建输出,例如无处不在的Response.Write方法。
Response(中文“反应、响应”的意思):可以理解为服务器对客户端请求的响应,就是服务器接收到客户端的请求后,成生页面信息、Cookie(发到客户端后就保存在客户端)等发送到客户端。
14.3 Cookie
cookie: Cookies(客户端状态管理)是当你浏览某网站时,由Web服务器置于你硬盘上的一个非常小的文本文件,它可以记录你的用户ID、密码、浏览过的网页、停留的时间等信息。 当你再次来到该网站时,网站通过读取Cookies,得知你的相关信息,就可以做出相应的动作,如在页面显示欢迎你的标语,或者让你不用输入ID、密码就直接登录等等。
讲的通俗一点就是:
Cookie(中文“饼干”,在这里不能这样理解了):就是保存在客户端上的一些信息,可以用来验证用户信息,提高用户响应速度等等。为何不把它理解为:我把饼干放在家里,我想吃的时候就拿出来吃。
14.4 Session
Session(客户端状态管理)技术就好比医院发放给病人的就医卡和医院为每个病人保留病例档案的过程。
当浏览器访问Web服务器时,Servlet容器就会创建一个Session对象和ID属性,其中,Session对象就相当于病历档案,ID就相当于就诊卡号。当客户端后续访问服务器时,只要将标识号传递给服务器,服务器就能判断出该请求是哪个客户端发送的,从而选择与之对应的Session对象为其服务。
需要注意的是,由于客户端需要接收、记录和回送Session对象的ID,因此,通常情况下,Session是借助Cookie技术来传递ID属性的。
cookie 和session 的区别:
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用COOKIE。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
十五 jstl,el和jsp和Listener和Filter
15.1 JSP
15.1.1 JSP的九大内置对象
pageContext对象的范围只适用于当前页面范围,即超过这个页面就不能够使用了。
所以使用pageContext对象向其它页面传递参数是不可能的 .
九种内置对象:
四个作用域对象:application session request pageContext
15.1.2 JSP页面常用指令
<%@page contentType=“text/html; charset=utf8” pageEncoding=“utf8”%>
<%@page import=“bean.,java.util.”%>
<%@taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
15.1.3 JSP页面Java代码编写
A):<% xxxxxxxxxxxxxxxx %>
B):<%= xxxxxxxxxxxxxxxxxxx%>
15.2 Jstl与el表达式
15.2.1 jstl标签库
1、jstl是什么?
java standard taglib(java标准标签库)。
2、标签是什么?
sun公司制订的一种技术规范,用来将jsp页面
中的java代码使用类似于html当中的标记来替换
的一种技术。这样做的目的,是为了使jsp页面
更好维护以及更好的测试。
3、核心标签的使用
1)使用步骤
需要将jstl标准标签库相关的jar文件copy
WEB-INF\lib。
jstl.jar standard.jar
2)在jsp文件当中,使用taglib指令导入标签。
3)使用标签。
test属性:当值为true,执行标签体的内容,
为false,则不执行。
var属性:指定一个绑订名。
scope属性:指定一个绑订范围。
var属性和scope属性用于将test的结果绑订到
指定的对象(pageContext,request,session,
application)上。
用于分支,当某个条件满足,执行某一个分支。
每一个分支条件用when标签来表示。
test属性:当值为true,执行标签体的内容
当其它分支都不满足条件,则执行该标签体的内容。
用于遍历集合items属性:指定要遍历的集合。
var属性:指定一个绑订名,jsp引擎会从
集合当中取一个对象,绑订到pageContext对象上。
varStatus属性:指定一个绑订名,对应的
绑订值是一个java对象,封装了遍历时的一些
信息,包括当前遍历的对象的下标(index)以
及是第几次(count)遍历。
当用户禁止cookie以后,会自动在地址后面添加sessionId。
当使用绝对路径时,会自动在地址前添加应用名。
value属性:指定地址。
在表单提交、链接当中,可以使用该标签。
绑订一个对象到指定的范围。
value属性:绑订值。
解除绑订
处理异常,会将异常信息封装成一个对象,绑订到pageContext对象上。
<%
Integer.parseInt(“123a”);
%>
${msg}
url指定一个jsp文件的地址,jsp会在运行时调用这个jsp。
重定向到另外一个地址。url属性指定重定向的地址。
用于输出el表达式的值。
value指定输出的值,default指定缺省值。
escapeXml设置成true,会将value中的特殊字符替换成相应的实体。缺省值就是true。
演示案例:语法
男
女
${love}
${aa.index}
${aa.count}
用户名:${user.username}
年龄:${user.age}
用户ID: ${user.idCard.idCard}
性别 : ${user.sex}
访问uri.jsp
<%
Integer.parseInt("123a");
%>
${msg}
before: rs:${sessionScope.rs}
after: rs:${sessionScope.rs}
15.2.2 el表达式
1、el表达式是什么?
sun制订的一种用于计算的一种规则,早期只能
用于给标签的属性赋值,现在也可以直接输出。
2、el表达式的基本语法
${el表达式}
第一种:访问bean的属性
${user.name}:jsp引擎会依次从pageContext
、request、session、application查找绑订
名为"user"的对象,如果找到了,就不再向下
查找,否则,继续向下查找。
session.setAttribute("user", user);
找到后,调用该对象的getName(),并输出其值。
找不到,则输出""。
或者也可以使用
${user["name"]}或者是${user[propname]}
此外,[]里面还可以是0,1..这样的下标,作用
是输出数组里的元素值。
可以使用pageScope,requestScope,sessionScope
,applicationScope四个关键字指定查找的范围。
${requestScope.user.name}
第二种:获得请求参数值
${param.username}:等价于
request.getParameter("username");
${paramValues.username}:等价于
request.getParameterValues("interest");
第三种:计算一个表达式,将结果作为标签的属性值或者直接输出。
算术运算:"+","-","*","/","%", 但是要注意,"+"号不能连接字符串。
关系运算:"==","!=",">","<",">=","<=",
可以使用对应的"eq","nq","lt","gt","le","ge"代替。
逻辑运算:"&&","||","!",可以使用"and","or","not"代替。
empty运算:判断一个字符串是否为空,集合内容是否为空,以及绑订的 对象是否存在。
${empty str}
1.空字符结果为true
2.找不到绑订名对应的对象,结果是true
3.集合内容为空,结果为true
4.null结果为true:
15.3 Listener监听器与Filter过滤器
15.3.1 Listener监听器
1)什么是监听器?
servlet规范当中定义的一种特殊的类,
作用是监听容器当中产生的一些事件并进行
相应的处理。
容器产生的事件指的是两大类事件:
第一大类:生命周期相关的事件,指的是当
容器创建或者销毁request,session,
ServletContext对象时产生的事件。
第二大类:绑订事件,指的是当调用request,
session,ServletContext对象的setAttribute,
removeAttribute时产生的事件。
2)如何写监听器
step1 写一个java类,
实现特定的监听器接口类(依据要监听的事件类型)。
step2 在接口声明的方法中,实现监听的逻辑。
step3 配置(web.xml)。
3)ServletContext接口
web服务器在启动时,会为每一个已经部署的应用
创建唯一的一个ServletContext实例。该实例会一直
存在,除非服务器关闭或者应用被删除。
a,如何获得ServletContext实例。
GenericServlet提供了getServletContext()方法。
HttpSession提供了getServletContext()方法。
ServletConfig提供了getServletContext()方法。
b,常用方法
b1,绑订数据
setAttribute(String name,Object obj);
getAttribute(String name);
removeAttribute(String name);
b2,配置全局的初始化参数
step1 在web.xml中,使用
配置的参数,可以被所有的servlet共享。
step2 使用
String ServletContext
.getInitParameter(String paraName);
b3,依据逻辑路径获得实际部署时的物理路径。
String
ServletContext.getRealPath(String url);
Java servlet 监听器种类及介绍
[http://blog.csdn.net/amork/article/details/7246128]
15.3.2 Filter过滤器
1)什么是过滤器
servlet规范当中定义的一种特殊的类,用于对
servlet容器的调用过程进行拦截。
2)怎样写一个过滤器
step1 写一个java类,实现一个Filter接口。
step2 在doFilter方法里,实现过滤的逻辑。
step3 配置(web.xml)。
3)配置初始化参数
step1
web.xml中,使用元素来配置初始化参数
step2
在Filter类当中,
使用FilterConfig.getInitParameter(String paraName);
来获得初始化参数。
4)过滤器的优先级
当有多个过滤器都满足过滤的条件时,依据
的先后顺序依次执行。
5)过滤器的优点
a,可以将多个web组件相同的逻辑写在一个
过滤器当中,方便代码的维护。
b,可以实现代码的“可插拔性"。给一个软件
增加或者减少某个功能,不会影响到已经存在
的功能。