上一篇博客已经介绍了内置对象的生存周期定义和大概作用,还有内置对象数据传递的比较分析,接下来就来详细的讲讲各个内置对象之间的应用
request对象
例:requset.getParameter(“name”);
此时拿到的既不是html中也不是text中的汉字,而是从http协议中拿到的汉字,所以静态编码已经不可用
解决方案:
(1)网络传送动态编码(转化为字节数组(字节流))
String name = request.getParameter("uname") ;
byte[] b = name.getBytes("ISO8859-1") ;
name = new String(b) ;
既可以对http协议体里的汉字编码也可以对http协议头的汉字做编码(post,get)
编码成功率高:90%
可行但不可用,很多汉字要进行编码的话,编码量过大
(2)使用request内置对象进行动态编码
request.setCharacterEncoding("GBK") ;
直接对request里的所有未经编码的汉字进行编码,使用getParameter();获取到的已经是编码过的汉字
优点:代码量小
缺点:只对http协议体里的汉字进行编码(post),对表单里汉字做编码(post)
编码成功率不高:80%
总结:对于大部分使用request.setCharacterEncoding()编码,少部分request动态编码编码不了的就用字节流编码
多值请求场景
复选框中一个参数名对应多个参数值
请求一发送,tomcat创建request内置对象,将参数名key=uname,参数值value=tom ,参数名key=inst,参数值value=init1(init1是一个字符串数组对象);存放到request对象中的参数区
问题:复选框没有选择的话 String inst[] = null; 后面输出的时候容易出现空指针异常(inst.length)
解决办法:
可以用request获取浏览器所在客户端的IP地址:Request.getRemoteAddr();
服务端跳转:requester.getRequestDispatcher(“XXX.jsp”);
Response
1.定时刷新
2.定时跳转(定时刷新的特例)
3.客户端跳转(重定向)(定时跳转的特例)
相当于:
会先执行完当前页面再进行跳转
属于客户端跳转,相当于重新发请求(服务器向http协议设置控制信息,浏览器自动跳转)
上图,服务器控制台会打印出:
**跳转之前...
**跳转之后...
总结:
resquest作用:
1 接收传递参数,属性
2 动态编码
3 服务端跳转 requester.getRequestDispatcher(“XXXX.jsp”);
response作用:
1 把结果数据发送到浏览器显示(jsp页面)
2 设置http协议头,控制浏览器自动发送请求:a定时刷新 b定时跳转
3 客户端跳转
4 向用户发送cookie(不安全,占内存)
介绍一下服务端跳转和客户端跳转的相同点和不同点
相同点:
都是从一个页面或者一个组件跳转到另一个页面或组件
不同点:
1 语法不同
Response.sendRedirect(“xxx.jsp”);
Request.setRequestDispatcher(“XXX.jsp”).forword(resquest,response);
2 跳转实质不同
浏览器自动跳转(服务器只是向http协议设置控制信息)
服务器跳转
3 后面代码是否执行
客户端跳转执行,服务端跳转不执行
4 能否传递数据到跳转页面
客户端不能,服务端能
5 是否可以重新传参
客户端可以,服务端不可以
6 浏览器地址栏是否变化
客户端变化,服务端不变化
服务端跳转用于正常流程,客户端跳转用于异常流程
在介绍Session之前先给大家讲一下Cookie
Cookie
系统Cookie(在客户端浏览器)
把客户端和服务端用户对应的session进行联系,从而使客户端的请求可以找到对应的session,完成对用户身份的验证工作;
作用:封装用户对应的sessionId,以便于用户找到用户对应的session;
key----sessionId value----32位的session标识;
由tomcat自动创建、维护;
用户Cookie(不鼓励使用)
把本应保存在服务端上用户的敏感信息,以cookie的形式保存在客户端;
实例:本地的软件自动保存用户的账户和密码;
创建、获取:
创建 http协议:127.0.0.1:8080/test/cookieDemo01.jsp?name=ZTE&password=ZS
Cookie c1 = new Cookie("name","ZTE") ;// 封装用户的信息
Cookie c2 = new Cookie("password","ZS") ;
// 保存在本地,时间为60秒
c1.setMaxAge(60) ;
c2.setMaxAge(60) ;
// 通过response对象将Cookie设置到客户端
response.addCookie(c1) ;
response.addCookie(c2) ;
创建过程:
把用户名和密码设到cookie里(cookie的数据结构是特殊的map,只能封装一个对键值对,有多少个用户信息就有多少个cookie);在请求结束时,通过response把c1,c2所指的封装了用户名密码的cookie对象放在http协议头回传给浏览器所在的客户端(用户并不知道);(原则上cookie可以无时间限制的存放在客户端的硬件上,为了减少cookie的存放时间,可以设置cookie的存放时间setMaxAge;)
获取:
// 通过request对象,取得客户端设置的全部Cookie
// 实际上客户端的Cookie是通过HTTP头信息发送到服务器端上的
Cookie[] c = request.getCookies() ;
for(int i=0;i<c.length;i++) //若没有取得Cookies就会产生空指针异常
{
Cookie temp = c[i] ;
<h1><%=temp.getName()%> <%=temp.getValue()%></h1>
}
上面展示的JSESSIONID 89*****是系统Cookie,而下面的则是用户Cookie
获取过程:
通过request取得该用户相关的所有cookie,放到cookie数组对象;
循环获取cookie数组里的每个key和value;
Session
作用:保存用户的各种信息
什么时候创建:用户第一次发送请求访问服务器的动态主键
销毁方式:
1.关闭浏览器后15分钟;2.人为释放掉;3.后台强行关闭;4.在配置文件中设置
例:sessionNew.jsp
执行过程:
重启tomcat ,第一次发送请求,tomcat创建request内置对象,将IP地址和参数,cookie(现在没有)存放到request内置对象中,通过目录名找到SessionNew.jsp,执行isNew()方法先到request内置对象去找系统cookie,没有系统cookie,则认为没有对应的session,返回true,tomcat为用户创建新的session,从新的session里调用getId()拿到sessionID,然后创建一个系统cookie对象,将32位的sessionId作为value,请求结束后,通过response内置对象将系统cookie发送到客户端
第二次发送请求
......执行isNew(),到request内置对象去找系统cookie,存在系统cookie,通过getID()拿到对应的sessionid,在系统session中通过sessionid找到对应的session,返回false,则认为是旧的session(旧用户)
Session和Cookie
Session |
Cookie |
存放用户的验证信息 |
存放用户的敏感信息 |
存放在服务端 |
存放在客户端 |
用法: 在系统cookie里获取sessionId找到服务端相应的session完整用户的验证 |
用法: 通过request拿到用户cookie和系统cookie,并在请求完通过response再传回浏览器 |
需要通过cookie才能找到session |
|
Application
Class MyClass Implements ServletContext
MyClass 是实现ServletContext的类;而ServletContext application=new MyClass();getServletContext()方法取得一个实现ServletContext接口类的对象;
举例:得到工作目录的真实路径:
public String getRealPath(String path)
需要一个参数:/
在实际应用中往往使用getServletContext()方法代替application
<h1><%=getServletContext().getRealPath("/")%></h1>
实现原理:
请求:http://127.0.0.1:8080/test/base/07/Hello.jsp
1 String currentURL = request.getRequestURL();
currentURL = /test/base/07/Hello.jsp
2 Int endURL = currentURL.indexOf(“/”,1);
String targetURL = currentURL.substring(0,endURL);
targetURL = /test
3 在server.xml文件中通过path=”/test” 取得docBase=”f:\test\Web”/>
<Context path=”/test” docBase=”f:\test\Web”/>
Config
作用:存放、传递组件在web.xml中配置信息的初始化参数;
创建:tomcat启动;销毁:tomcat关闭
二异性:
一个servlet-name对应了两个jsp-file,就会出错
<servlet>
<servlet-name>zte</servlet-name>
<jsp-file>/WEB-INF/sdemo.jsp</jsp-file>
</servlet>
<servlet>
<servlet-name>zte</servlet-name>
<jsp-file>/WEB-INF/hello.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>zte</servlet-name>
<url-pattern>/a4</url-pattern>
</servlet-mapping>
tomcat一启动,就会先创建一个config对象(时间比application还要早),有的话就把组件的初始化参数就封装到config内置对象里,并指明是哪个组件的初始化参数
初始化参数:
设置<init-param>的param-name和parameter-value
<servlet>
<servlet-name>zte</servlet-name>
<jsp-file>/WEB-INF/sdemo.jsp</jsp-file>
<init-param>
<param-name>uname</param-name>
<param-value>zs</param-value>
</init-param>
<init-param>
<param-name>upass</param-name>
<param-value>zhangsan</param-value>
</init-param>
</servlet>
从config里获取初始化参数:
要在web.xml里面配置初始化参数(见上图);
只能取得该组件的初始化参数;
<h1><%=config.getInitParameter("uname")%></h1>
<h1><%=config.getInitParameter("upass")%></h1>
Out内置对象
作用:动态向客户端输出数据;(尽量少用)
缺点:
不符合MVC设计模式;不安全;