JSP中的九大内置对象(内置对象的作用与应用场景)

上一篇博客已经介绍了内置对象的生存周期定义和大概作用,还有内置对象数据传递的比较分析,接下来就来详细的讲讲各个内置对象之间的应用

 

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%

扫描二维码关注公众号,回复: 9050084 查看本文章

可行但不可用,很多汉字要进行编码的话,编码量过大

(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.18080/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-nameparameter-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设计模式;不安全;

 

 

发布了20 篇原创文章 · 获赞 25 · 访问量 2160

猜你喜欢

转载自blog.csdn.net/qq_38992372/article/details/104233759