四大作用域--request-response------Cookie

request的特点
1.一次请求 多次转发
2.转发后地址栏不发生变化
3.request可以携带参数
4;request域对象:在一次请求中,传递数据

response
1;两次请求 两次响应
2;地址栏会发生变化
3;不能携带参数

用户发送的所有的请求都是通过request对象实现,request中携带了请求的地址、参数等等

方法名描述
getParameter(String key)获取参数
setCharacterEncoding(String encoding)设置请求编码
getRequestDispatch(String path).forward(req,resp)请求转发
//中文乱码处理方案1(get请求):new String(uname.getBytes("ISO-8859-1"),"utf-8")
示例:uname = new String(uname.getBytes("ISO-8859-1"),"utf-8");
//中文乱码处理方案2(post请求)
示例:request.setCharacterEncoding("utf-8")
//中文乱码处理方案2(修改tomcat配置)
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URLEncoding="utf-8"/>

登录界面

//login.jsp
<%--
  action指定表单信息发送的服务器地址
  method指定发送请求的方式
  --%>
<form action="control.jsp">
  <input type="text" name="uname" placeholder="请输入用户名">
  <input type="password" name="pwd" placeholder="请输入密码">
  <input type="submit" value="登录">
</form>
//control.jsp
//获取请求中携带的信息
String uname = request.getParameter("uname");
String pwd = request.getParameter("pwd");



**转发与重定向区别**
转发的地址栏不会发生改变,但是重定向会发生改变
转发是一次请求和一次响应,但是重定向是两次请求和两次响应
转发可以使用request域对象传递数据,但是重定向不可以
转发发生在服务器内部,转发的资源不需要携带项目名,重定向可以重定到任何资源。

**session**

概念
session是服务器端的技术
服务器在运行时为每一个用户创建一个独享的session对象
每个用户在访问服务器过程中,产生的数据可以放在session对象中
每个用户需要保存个人的,每次访问服务器的时候,都携带个人的sessionid
session技术基于cookie,使用cookie传递sessionid。



<!--control.jsp-->
<%
//设置请求编码格式
request.setCharacterEncoding("utf-8");
//获取表单中的参数
String uname = request.getParameter("uname");
String pwd = request.getParameter("pwd");
//对用户名及密码进行验证(操作数据库)
if("admin".equals(uname) && "admin".equals(pwd)){
  //将用户的用户名存储起来作为登录成功的标识
  session.setAttribute("uname",uname);
  //设置session的失效事件(单位:秒)
  session.setMaxInactiveInterval(5);
  //登录成功直接跳转到个人中心页面
  response.sendRedirect("person.jsp");
}else{
  //通过session存储一个错误信息
  session.setAttribute("errMsg","用户名或密码错误");
  //回到登录页面,并提示错误信息
  response.sendRedirect("login.jsp");
}
%>
<!--login.jsp-->
<%
String errMsg = "";
//登录页面可能会被打开多次(用户想要切换账户)
Object object = session.getAttribute("errMsg");
if(object != null){//从登录失败后跳转过来的
  errMsg = (String)object;
  //移除session中的key
  session.removeAttribute("errMsg");
}
%>
<p style="color:red;"><%=errMsg%></p>
<form action="control.jsp" method="post">
  <input type="text" name="uname" placeholder="请输入用户名">
  <input type="password" name="pwd" placeholder="请输入密码">
  <input type="submit" value="登录">
</form>
<!--个人中心-->
<%
//首先需要先验证用户是否已经登录
Object object = session.getAttribute("uname");
if(object == null){//代表用户未登录,跳转到登录页面
  response.sendRedirect("login.jsp");
  return;
}
%>
<h4>个人中心</h4>
<p>欢迎,<%=object%></p>

cookie
概念
是客户端的会话技术,默认cookie是保存在用户的浏览器上
程序把用户的数据以cookie的形式写回到用户的浏览器上(响应头:set-cookie)
当用户使用浏览器访问程序的时候,携带自己浏览器上的cookie(请求头:cookie)

<%
	 //将name存储到Cookie中
  Cookie nameCookie = new Cookie("name",name);
	//将创建的cookie存储到响应头中
  response.addCookie(nameCookie);
%>
<%
  //获取cookie
  Cookie[] cookies = request.getCookies();
  for(Cookie cook : cookies){
    String val = cook.getValue();
    out.println(cook.getName()+":"+val+"<br/>");
  }
%>

Cookie生效时间

1.值为正数时,代表了cookie的存活时长(秒为单位)

2.值为0时,代表立即清除cookie

3.值为负数时,代表cookie的生命周期与当前会话一致

Cookie针对不同的浏览器可以存储的数量是有限的

一、浏览器允许每个域名所包含的cookie数:

Microsoft指出InternetExplorer8增加cookie限制为每个域名50个,但IE7似乎也允许每个域名50个cookie。

Firefox每个域名cookie限制为50个。

Opera每个域名cookie限制为30个。

Safari/WebKit貌似没有cookie限制。但是如果cookie很多,则会使header大小超过服务器的处理的限制,会导致错误发生。

注:“每个域名cookie限制为20个”将不再正确!

二、当很多的cookie被设置,浏览器如何去响应。

除Safari(可以设置全部cookie,不管数量多少),有两个方法:

最少最近使用(leastrecentlyused(LRU))的方法:当Cookie已达到限额,自动踢除最老的Cookie,以使给最新的Cookie一些空间。Internet Explorer和Opera使用此方法。

Firefox很独特:虽然最后的设置的Cookie始终保留,但似乎随机决定哪些cookie被保留。似乎没有任何计划(建议:在Firefox中不要超过Cookie限制)。

三、不同浏览器间cookie总大小也不同:

Firefox和Safari允许cookie多达4097个字节,包括名(name)、值(value)和等号。

Opera允许cookie多达4096个字节,包括:名(name)、值(value)和等号。

Internet Explorer允许cookie多达4095个字节,包括:名(name)、值(value)和等号。

注:多字节字符计算为两个字节。在所有浏览器中,任何cookie大小超过限制都被忽略,且永远不会被设置。

application对象

application是全局作用域对象,也称为web的上下文对象,通常用于存储一些全局参数

方法
setAttribute(key,val)设置全局参数 getAttribute(key)获取全局参数

案例:统计文章的浏览次数(一半这种值存到appliction )

<%
	//设置默认的阅读量
    int count = 0;
    //1.先从全局作用域中获取存储的已访问的数量
    Object object = application.getAttribute("count");
    if(object != null){
        count = (Integer)object;
    }
    //2.在已有的阅读量的基础上+1
    count++;
    //3.将最新的阅读量存储到全局作用域中(更新)
    application.setAttribute("count",count);
%>
阅读量:<%=count%>
JSP的四大作用域

为了根据不同的情况去进行数据的存储、传递等等,jsp中给出了四大作用域以满足不同的使用情况

作用域 描述
pageContext 当前页生效
request 一次请求中生效
session 一次会话中生效
application 整个web中生效

include指令:

include指令用于引入其他的页面
动作标签(将jsp中的常见的一些功能以标签的形式进行使用)

<jsp:include /> 将另一个页面中的内容引入进来,include的指令会将整个jsp页面进行编译及翻译的过程,可以使用变量

(动作标签只是引入了页面的结果,指令是将整个jsp的逻辑等都加载进来)

<jsp:forward /> 以标签的形式替换了request在小脚本中的跳转形式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值