1.使用session保存多个请求会共同用到的属性,因为只要是同一浏览器发过来的多个请求,都属于同一个会话(同一个浏览器多个窗口发送都属于同一个会话,这个求解)
2.容器通过会话id得知哪个客户是谁,因为如果你的ip地址是路由器的地址,就不能唯一地表示你。第一次会话时,客户发送请求到服务器,然后服务器接收到请求后,作出响应并且将响应发回到客户那里,然后在响应首部加上会话id,以后每次浏览器发送请求到服务器的时候,都会在首部加上这个会话id,那么每次服务器都会知道是哪个客户发送请求过来,就会调用响应的httpSession对象。(session对象通过request.getSession())得到),实质上的会话id是通过cookie对象设置进去首部的
3.当你调用request.getSession的时候,容器会自动帮你做一下工作
(1)创建新的httpSession对象
(2)产生位移的会话id,并且创建新的cookie对象,将会话id与cookie相连
(3)将cookie对象加进去响应的set-cookie首部下面
4.当浏览器禁用cookie的时候,会话id会放在url后面,作为参数传收,但是不能使用request.getParameter()得到,这里有点不理解,求指教
5.删除会话,通过设置会话超时或者调用invalidate()方法
(1)在dd中配置, <session-config><session-timeout>15</session-timeout></session-config>
(2)session.setMaxInactiveInternal(20*69)
(3)cookie都是服务器先发送第一个响应的时候设置的,当你i想在客户和服务器之间每次都知道用户的名字时候,可以在第一次服务器做响应的时候把名字设置在cookie上,因为cookie是一个名/值对,并且它的交互是自动的。cookie就是客户和服务器之间交换的一小段数据
第一次在服务器端的时候,
Cookie cookie = new Cookie("username",name);
Cookie.setMaxAge();//设置cookie的存货时间
response.addCookie(cookie)//把cookie发送到客户
//从客户请求得到cookie
Cookie[] cookies = request.getCookies();
for(int i = 0;i < cookies.length;i++){
Cookie cookie = cookies[i];
if(cookies[i].getName.equals("username")){
再通过getValue得到这个username对应的值
}
当你的对象需要每次都在客户和服务器中交流的时候,即每次都要在浏览器中显示的数据,则一般应该产生一个cookie对象,然后将它设置在set-cookie首部中
}
session保存的是对象,cookie中保存的是字符串
6.jsp的使用
(1).jsp会变成一个servlet对象
(2).<%%>里面的语句会放在具体的jspService()方法里面,<%=%>等价于out.println()
(3).<%!%>是声明,会变成转化后的servlet的类范围里面,方法或语句都可以
(4).在建立jspService()方法的时候,会产生一大堆隐式对象,例如httpServletRequest和jspWriter这种,会有一半servlet应该有的所有隐式对象
(5).将jsp转换成java源代码和编译成一个class文件只会发生一次在一个jsp中
(6).可以在dd中使用jsp-file配置初始化参数
(7).pageContext是jsp特有的隐式对象,并且可以通过这个对象得到其他所有的对象(而且能得到所有域的属性)
7.jsp动作和el
(1).<jsp:useBean id="" class="" scope="" />来声明和初始化一个bean属性,如果没有这个id属性的话,会创建一个新的对象,然后set进去,相当于定义一个变量
useBean中的id要与getProperty中的name相匹配,默认是page属性域
(2).<jsp:getProperty name="" property="" />相当于从name找到在useBean中已经定义的变量,然后得到这个属性对象的property值,通过get方法
(3).当在jsp:useBean中使用type属性的时候,生产的servlet会是类型,class属性是指当你要新创建对象的时候new的类型
Type p = null;
if(p==null){
p = new class();
}
(4).el表达式
当使用el表达式的时候,第一个是使用findAttribute找到这个名字对应的对象,后面都是调用get方法。先找页面,再找请求,会话,到应用作用域
.和[]来访问,使用[]的时候,可以用它来访问list或数组或者map,例:${musicList[0]}
使用musicMap["Ambient"]是查找ambient对应的键值,如果没有引号,则先查找ambient对应的建,再查找到这个建对应的键值
请求参数,可以在el中通过param得到,例:
<input type="text" name="food" /> 在jsp中,${param.food}
el中有cookie隐式对象,可以使用${cookie.属性名.value}来得到你要的cookie的值
只有pageContext是真正得到对象,其他都只是得到作用域不是真正得到对象(例如request),只是作用域属性的map
(5)include指令和jsp:include动作的区别
include指令:将整个jsp代码放进去,只会编译一次,如果代码修改后,web容器是不会知道的(不过一般现在web容器已经支持这个功能),静态 使用file
include动作:只是将include进去的jsp的响应与本来的响应合起来,每次有请求到来时,include动作中的jsp页面都会重新编译一次,所以为动态包含 使用page
可以使用jsp:param来给包含的页面添加东西
<jsp:forward page="" />来转向到另一个jsp中,使用这个的时候,缓冲区会在转发之前清空,等于转发之前的内容不会打印出来