JAVA_DAY24:数据传递与保存,request对象,session,cookie
1:request对象介绍
客户端(客户机)提交数据,先把数据提交给web服务器(tomcat),web服务器会把数据进行封装,数据被web服务器封装在HttpServletRequest对象中,
程序员就可以在自己的Servlet程序中使用HttpServletRequest对象获取客户端提交的所有数据。
Request常用的方法有:
getParameter(String name) 获取客户端提交的数据 参数name 就是客户端在form表单中书写的name属性的值,如果不一致将获取不到对应的值
getParameterNames() 获取客户端提交的数据中的所有的key值(form表单中的所有提交的name属性的值)
getParameterValues(String name) 获取form表单中用户提交的某个name属性对应的多个value属性值
域对象其实就是一个类似于map的容器,可以向容器中存入指定的值,在需要的时候,可以通过key去获取对应的值来使用
setAttribute(String name, Object o) 向request域中存放一个映射关系,name留着取值使用的
getAttribute(String name) 通过映射关系的key,获取对应的值
removeAttribute(String name) 通过映射关系的key,移除这一关系
setCharacterEncoding(String env) 设置客户端提交数据解码时使用的编码表,只对post请求有效
getRequestDispatcher(String path) 获取转发器对象,调用forward( )方法用于转发请求
getMethod() 获取客户端提交数据的方式 get 或post方式
思考: 为什么通过request对象能够获取到提交值???
2:get请求与post请求区别 - 记住 4条以上
GET和POST是HTTP协议中最长用的请求方法
1:GET参数通过URL传递;POST放在请求中,不会在浏览器中显示
2:GET请求在URL中传送的参数是有长度限制的,而POST没有。
3:从安全角度,GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
4:GET请求会被浏览器主动cache(缓存),而POST不会,除非手动设置。
5:处理乱码的方式不一样
查询,删除用get
新增,修改用 post
3:编码问题
当用户提交有中文数据的信息时,可能会出现乱码;
为什么会出现乱码问题:编码表不一致造成, 编码表的作用是编码和解码,编码和解码必须使用相同的编码表,这样才能保证数据的完整性。
原因:客户端提交的数据,浏览器使用的utf-8编码,然后服务器端使用的iso-8859-1解码了(tomcat7以前默认的编码),而在我们jsp程序获取到的数据
就是服务器解码后的乱码数据。
解决:我们需要把这些乱码的数据全部恢复到正确的数据,就需要把乱码的数据从新编码,使用默认的编码将乱码之后的数据重新编码到提交时候的数据
然后再根据我们使用的编码进行解码
Get请求乱码解决:str就是你获取到的乱码数据
byte[] bytes = str.getBytes("iso-8859-1"); //将乱码数据使用指定的编码表编回到乱码前的状态
String newStr = new String(bytes,"utf-8"); //使用指定的编码表进行解码
post请求乱码解决:
request.setCharacterEncoding("utf-8"); // 一定要出现在获取参数之前,一般会放在第一行
设置响应的编码:
response.setCharacterEncoding("utf-8");
使用request.setCharacterEncoding("utf-8") 一定要保证在获取请求数据之前。一般放在第一行。
还可以直接修改tomcat的配置文件进行编码的修改:
配置tomcat\conf\server.xml文件:
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
4:Jsp九大内置对象
请求对象:request
输出对象:out
响应对象:response
应用程序对象:application
会话对象:session
页面上下文对象:pageContext
页面对象:page
配置对象:config
异常对象:exception
5:在域对象存值
HttpServletRequest对象还可以当作一个容器来使用。Request对象主要是用来封装用户的请求。并且使用Request对象可以给请求中继续添加其他的数据,
如果把Request对象当作容器来使用,那么我们就可以继续给客户端本次请求的数据中继续添加其他的数据,
使用转发技术,转到其他的程序中,然后在使用Request对象的时候,把存放在对象中的数据取出来。
setAttribute(String name, Object o) 向request域中存放一个映射关系,key为String类型,value为Object 类型
getAttribute(String name) 通过映射关系的key,获取对应的值
域对象一共有四个:pageContext,request,session, servletContext(application)
范围,
pageContext:只在当前页面有效, - 存放的值只能在当前页面使用
Request:一次请求有效,使用同一个request,请求级别的域
Session:会话级别,从打开浏览器的那一刻开始,一直到关闭浏览器,之间这段时间称之为一次会话
ServletContext(Application):应用级别,项目级别
请说出jsp的4个域对象分别是什么?以及他们各自的作用域?
6:页面跳转
登录为例:
登录成功了,跳转到主页,使用重定向实现
登录失败了,则停留在登录页,并且要给出提示,转发,重定向
注意:
转发和重定向都可以实现页面的跳转:
请求转发:request.getRequestDispatcher("/url").forward(request, response)
重定向:response.sendRedirect("url")
转发和重定向的区别:
1、转发使用的是request.getRequestDispatcher()方法;重定向使用的是response.sendRedirect();
2、转发:浏览器URL的地址栏不变。重定向:浏览器URL的地址栏改变;
3、转发是服务器内部行为,重定向是客户端行为;
4、转发是浏览器只做了一次访问请求。重定向是浏览器做了至少两次的访问请求;
5、转发可以携带数据,信息不会丢失;重定向不能携带参数,信息会丢失(request范围)。
6、转发只能在服务器内部转发;重定向没有限制,重定向是可以访问外部资源。
一般浏览上带参数有参数,一般都是使用重定向。
7:会话
从客户端打开浏览器开始访问服务器,到服务器给客户端响应数据,客户端继续访问服务器,直到客户端关闭浏览器,整个过程称为一次客户端和服务器之间的会话。
在这个会话的过程中我们可以保存用户在整个会话过程中的数据,不管用户发起了多少次请求,数据都可以保存在其中,在用户的任何一次请求中,都可以获取到前面已经保存的数据。要完成这个功能,就需要使用sun公司给我们提供的Cookie对象或者Session对象。
Cookie对象主要是给客户端写数据,数据需要保存在客户端,Session对象主要是在服务器端创建和当前用户相关的一个容器,专门为每个不同的用户保存数据。
1:session
Session:会话技术,从客户端打开浏览器访问服务器,到最后客户端关闭浏览器,整个过程称为一次会话。
在这个会话的过程中,服务器会针对每个客户端创建一个和客户端相关的唯一的临时容器,这个容器用于保存当前客户的所有信息。
并且在给客户端响应数据的时候,会给客户端回送一个唯一标识当前客户端相关的临时容器的id,在客户端下次访问服务器的时候,会携带这个id信息(cookie),在服务器端就可以找到和客户端相关的临时容器, 继续使用这个临时容器。
如果获取这个Session对象,为每个客户端服务:在servlet可以通过Request对象获取和当前客户端相关的唯一Session对象。在jsp中可以直接使用

2:sessionId
每个session都有一个唯一的sessionid,
session.getId();可以获取session的id
3:session的生命周期
Session称为服务器端用于保存用户的信息的容器。它主要针对浏览器而言。
Session对象到底什么时候创建的:
Session对象的创建时间是:程序中第一次调用getSession方法时,这时web服务器会创建Session对象。并把这个Session对象返回。
Session对象一旦创建好了就为后续用户的所有操作服务,主要是保存用户的一连串的操作的信息。只要用户一直在操作,那么这个Session对象就会一直存在。
Session的销毁时间:
1、一般在web服务器中Session有默认的存活时间,一般是半小时。如果在30分钟内,用户一直没有做任何操作,这时服务器会当前这个Session自动的销毁。
2、不正常关闭服务器。正常关闭服务器,服务器会把这个Session对象使用io流中的序列化技术保存在tomcat/work目录下
3、在Servlet程序中手动的销毁Session对象。session.invalidate();
Session的存活时间可以在web.xml中配置也可以通过方法指定:
setMaxInactiveInterval(int interval); //单位是秒,一般是在存储值的时候进行设置
注意:这里的时间是以分钟为单位
<session-config>
<session-timeout>30</session-timeout>
</session-config>
4:会话的清除
设置会话失效:session.invalidate();
移除会话的一个属性:session.removeAttribute(key);
5:cookie
Cookie技术主要需要依赖于给用户响应数据时,服务器给用户的本地(客户端)写数据。Cookie中存储的是服务器端发送到客户端的少量信息。
创建一个 cookie,cookie 是 servlet 发送到 Web 浏览器的少量信息,这些信息由浏览器保存,访问服务器的时候,会带着cookie中存储的信息到服务器。cookie 的值可以唯一地标识客户端,因此 cookie 常用于会话管理。
Cookie技术主要解决的是在客户端和服务器进行交互的过程中,保存用户的数据,这些数据主要是通过服务器使用Cookie对象写到客户端的浏览器中,然后在浏览器中保存这些数据。Cookie对象可以保存用户和服务器的交互数据,但是需要保存在客户端。
6:cookie API
创建cookie:
在javax.servlet.http 包中有 Cookie类,它拥有接收2个参数的构造方法,可以创建一个Cookie对象。
Cookie(String name, String value) :name就是给cookie起一个名字,value是当前Cookie具体的数据。类似于一个map,通过name获取具体的值。
使用new就可以创建出一个cookie- 服务器端
获取cookie
需要使用HttpServletRequest对象中的getCookies方法,会得到一个Cookie数组,这是因为一个站点可能会存放多个Cookie数据
例如:Cookie[] cookies = request.getCookies();
得到Cookie数组之后,判断cookies数组是否存在 cookies == null,如果cookies存在,根据cookie的name去查找指定cookie
发送cookie
创建好Cookie对象之后,需要使用HttpServletResponse中的addCookie方法,将Cookie对象添加到响应中,然后发给客户端。
例如:response.addCookie(cookie); // 将cookie写到客户端
在Cookie对象中提供了getName可以获取Cookie的key值,提供的getValue可以获取key对应的value值,同时也可以使用setValue给当前的Cookie对象设置value值。
SetPath设置cookie可以访问资源路径
SetMaxAge() - 设置cookie的生存时间 ,单位是秒


浙公网安备 33010602011771号