zoukankan      html  css  js  c++  java
  • JavaWeb02-JSP数据交互

    01.页面编码格式

    001.jsp页面本身的编码 page指令中的 pageEncoding属性!
    002.浏览器渲染页面采用的编码 contentType属性
    003.服务器保存数据采用的编码(request) 默认为 ISO-8859-1

    注意:
    01.--前两种(pageEncoding/contentType),一旦指定了一种,另一种如果不指定的话 默认采用已指定的编码!
    --request.setCharacterEncoding(String charset)用来设置request内部保存数据的格式!(不包括URL!)
    02.contentType和pageEncoding的区别:
    contentType定义的是响应的资源类型,也可以包含jsp页面和响应内容的字符集;
    pageEncoding指定jsp文件的字符集以及默认的contentType字符集!

    02.JSP 九个内置对象!
    out : JspWriter类的实例!
    常用方法:01.void print(Object); ==》输出各种类型!
    02.void println(Object);==》输出各种类型!
    03.void write(charset); ==》输出字符类型! 不能打印 null String str=null!
    response: 最常用重定向! void sendRedirect(String location)

    session:会话!(HttpSession类的实例)
    浏览器与web服务器之间使用http协议进行通信的!
    HTTP协议是一种基于请求/响应模式的 无状态 访问协议!
    “无状态”是指每一个HTTP请求都是独立的!服务器不会保存以往的请求和会话!
    因此,当一个客户端发送请求到web服务器时,无论是否是第一次来访,服务器都当他是第一次来访!
    作为服务器来说,必须有一种机制来唯一标识每一个请求用户(不然不能确定每一次操作是否是同一用户!),同时记录该用户的状态信息!==》会话跟踪机制!
    该机制可以保存每个请求用户的会话信息!

    session 一词指 有始有终的一系列动作!
    session执行过程:
    01.会话机制是一种服务器端的机制!当用户第一次向服务器发送请求时,服务器会为该用户创建唯一的会话,会话将一直持续到用户访问结束!
    02.当服务器接收到客户端请求时,服务器端会首先判断是否创建了与该客户端对应的会话!
    如果已创建,就将该请求与此会话相关联!反之,就创建一个新的会话!
    03.服务器端是否创建了相关会话,是通过一个唯一的标识 sessionid来实现的!
    如果在客户端的请求中包含了一个sessionid。则说明在此前已经为该客户端创建了会话!
    服务器就根据这个sessionid将之前的session对象读取出来!
    否则就创建一个新的会话对象并生成一个sessionid!
    并将sessionid在本次响应中 “返回给客户端保存” !(sessionid是保存在 客户端cookie中!)

    sessionid会返回客户端,那么在客户端sessionid保存在哪??
    在客户端保存信息使用 cookie,在cookie中,保存sessionid的名称是JESEEIONID!(由一串复杂的字符串组成!)

    session和浏览器窗口:
    通过超链接打开的新窗口,新窗口与其父窗口的sessionid相同!
    (目前针对与谷歌/IE8以上的浏览器,多个窗口为同一个sessionid!共享同一个缓存!保存在本地的cookie中!)

    会话的失效:
    01.会话超时:两次请求的时间间隔超过了服务器允许的最大时间间隔!
    001.通过session对象的setMaxInactionInterval(单位秒)设置session的 “非活动时间”!(浏览器最后依次访问服务器开始计算!)
    002.在项目的web.xml中设置!
    <session-config>
    <session-timeout>10(单位分钟)</session-timeout>
    </session-config>
    003.在应用服务器中的web.xml中设置!

    这里引入一个概念:
    项目中web.xml和tomcat服务器中的web.xml
    01.tomcat-web.xml + 项目-web.xml = 合并的xml
    02.如果这两个中出现重复的配置,项目中的优先!(就近原则)
    03.tomcat服务器中为全局配置!项目中是局部的!只针对本项目有效!

    02.手动调用方法使其失效
    session.invalidate():设置session对象失效!主要应用于 用户注销登录的功能!
    如果只想清空会话中的某个数据对象,使用session.removeAttribute(String key)!会话仍然有效!

    注意:session.setAttribute(String key,Object value) value值为Object类型,get获取时需要向下转型!


    request:将url和data封装成request请求!
    请求中的中文乱码问题:
    01. post请求方式: tomcat对请求数据默认采用ISO-8859-1的编码!
    request.setCharacterEncoding("utf-8"); 页面中
    页面本身的编码要和请求没编码一致!<%@page contentType="text/html;charset=utf-8"%>
    02. get请求方式:
    因为get请求时,提交的数据作为查询字符串被附加到url的末尾发送至服务器!
    对于这部分数据,使用request.set..是不起作用的!
    解决方式1:
    得到请求的参数后进行编码转换!
    String name = request.setParameter("name");
    name = new String(name.getBytes("ISO-8859-1"),"utf-8");
    其中,getBytes()按照ISO-8859-1的编码格式把name转化为 byte数组!
    在通过new String()使用指定的utf-8将 byte数组狗造成一个新的String!
    解决方式2:
    方式1中,如果存在多个参数,则要对每个参数都进行操作!繁琐,效率不高!
    可以通过tomcat目录结构confserver.xml 文件
    设置<Connector>节点!
    <Connector port="8080" protocol="HTTP/1.1"
    connectionTimeout="20000" redirectPort="8443"
    URIEncoding="UTF-8"/>

    application : 类似于系统的全局变量!同一个应用内的所有用户之间的数据共享!
    常用方法:String getRealPath();返回相对路径的真实路径!
    e:apache-tomcat-7.0.73webapps...
    经常应用于统计访问人数!
    Integer count = (Integer)application.getAttribute("count");
    if(count != null){
    count = count+1;
    }else{
    count =1;
    }
    application.setAttribute("count",count);

    page :当前jsp页面实例化的对象 (this)
    这里说明下 两个 include的区别:
    01.include指令:
    <%@include file="**.jsp"%>
    例如 a.jsp include b.jsp
    过程:
    将a.jsp+b.jsp= c.jsp (合并后生成 c.jsp) c 是我们模拟的,实际没有 c.jsp文件!
    c.jsp--c.java--c.calss--执行!
    所以说 两个pageContext在同一个作用域中!
    02.pageContext.include("**.jsp");
    例如 a.jsp include b.jsp
    过程:
    01.先执行 b.jsp--b.java--b.class--执行!--得到结果 c(null)
    02.将结果 c(null) 与 a.jsp合并成新的c.jsp! --c.java--c.class--执行!--得到结果
    所以说 两个pageContext分别在 a和b 两个作用域中!
    a.jsp页面:
    String name = "haha";
    pageContext.setAttribute("name",name);
    a中内容:<%=pageContext.getAttribute("name")%>
    <%=pageContext.include("b.jsp")%>//在 a页面中 引入b页面
    b.jsp页面:
    b中内容:<%=pageContext.getAttribute("name")%>

    运行a.jsp得到结果为:haha null

    config :指定jsp页面初始化配置(servlet中会使用!)

    exception :异常一般使用java代码处理!此对象很少使用!
    该对象只有在 page指令中设定 isErrorPage为true的页面中使用!

    pageContext :内置对象的集大成者!通过pageContext 可以获取其他8个内置对象! pageContext.getRequest()...
    Object getAttribute();//返回Object类型value值!
    void include();//请求指定的资源,并将目标资源的响应结果包含在调用页面的响应中!

    JSP内置对象不需要实例化?
    所谓内置对象就是由Web容器加载的一组ServletAPI的实例,这些实例由JSP规范进行了默认的初始化操作!(_jsp.java中!)
    内置对象名均为JSP的保留字!

    03.JSP四大作用域
    page;对应一个jsp页面的运行
    request:一次请求
    session: 会话有效期内
    application:整个应用上下文

    范围 : application > session > request > page


    04.转发和重定向!
    转发过程:
    web容器内部将一个request请求的处理权交给了另外一个资源,属于同一个请求/响应的过程!request对象的信息不会丢失!
    转发是在 服务器端发挥作用!通过RequestDispatcher对象的forward()将提交信息在多个页面间进行传递!
    转发是在服务器内部进行控制权的转移!客户端浏览器地址栏不会显示出转发后的地址!(可以共享请求中的数据!)
    重定向过程:
    web容器向浏览器返回一个响应,浏览器接收这个响应后再发送一个新的http请求到服务器(属于两次不同的请求!第一次请求request对象的信息将丢失!)
    重定向是在客户端发挥作用!通过请求新的地址实现页面跳转!(浏览器重新请求地址!地址栏中显示转向后的地址!)

    注意:如果想在重定向下 传递少量的参数,可以将参数追加至url末尾!
    response.sendRedirect("welcome.jsp?userName="+name+"&pwd="+pwd);

    在使用超链接<a>进行数据传递时,采用的是get方式!
    (除了form中指定post和ajax指定post,其他情况都默认采用get方式提交请求!)

    05.include指令!
    通过include指令引用公用代码文件,从而缓解代码冗余问题!
    <%@include file="文件路径"%>
    01.在JSP编译阶段 插入一个包含文本或代码的文件,这个包含的过程是 静态的!(可包含JSP HTML 文本文件等...)
    02.include指令只有 一个属性 file! 被包含的文件路径!

    06.cookie
    cookie 由Netscape公司发明,是最常用的 跟踪用户会话的方式!
    是由服务器端生成 并发送给客户端浏览器!浏览器会将其保存在某目录下的文本文件!

    应用场景:
    01.判断用户注册用户是否已经登录,保存信息以便下次简化登录!
    02.最近浏览的商品
    03.统计网站浏览次数
    04.实现个性化服务,针对用户喜好展示不同内容

    注意:
    cookie会将用户信息保存在客户端,安全性上cookie存在一定风险!不建议将敏感信息保存在cookie中!

    01.创建cookie
    Cookie cookie = new Cookie(String name,String value);
    02.写入cookie
    response.addCookie(cookie);
    03.读取cookie
    Cookie[] cookies = request.getCookies();//该方法返回http请求中的coookie数组!

    遍历此数组,通过getName()和getValue() 获取!

    04.验证sessionid以cookie的形式保存在客户端之中!
    创建会话
    session.setAttribute("str","haha");
    response.sendRedirect("getCookie.jsp");
    //此处如果为转发,则得不到cookie中的JSESSIONID!
    因为转发是一次请求,客户端没有得到响应!故没有向客户端写入cookie!

    在getCookie.jsp中进行获取
    out.print("sessionid="+session.getId());
    Cookie[] cookies = request.getCookies();
    if(cookies!=null){
    for(Cookie cookie:cookies){
    out.print("cookieName="+cookie.getName())
    out.print("cookieValue="+cookie.getValue());
    }
    }

    得到结果 sessionid 和 cookieValue 的值一致!

    05.cookie的有效期
    cookie是有生命周期的!
    cookie.setMaxAge(int expiry); 以秒为单位!

    注意:
    如果设置expiry=0 则表示从客户端删除该cookie!
    如果设置expiry为负数/不设置 则表示cookie会在当前窗口关闭后失效!

    07.cookie 和 session

    session的作用域是在服务器端保存用户信息,cookie是在客户端!
    session作用域中保存的值是Obejct类型,cookie保存的值是String类型!
    session作用域随会话的结束而将其存储的数据销毁,cookie可以长期保存在客户端!
    session通常保存重要的信息,而cookie通常保存不重要的信息!

    例如 保存用户登录名/密码 不能使用cookie!
    电商网站中的“最近浏览过的商品”可以使用cookie保存!


















  • 相关阅读:
    #include <functional>
    3.3内联函数
    如何查看内存占用和运行速度
    属性和方法的动态绑定和限制
    __slots__节约空间
    函数进阶之一等对象
    python继承之super
    python的方法VSjava方法
    python面向对象基础(三)内置方法 __xx__
    python面向对象基础(二)反射
  • 原文地址:https://www.cnblogs.com/9513-/p/7954006.html
Copyright © 2011-2022 走看看