7.JSP的9大隐式对象
①隐式对象:是JSP中特有的,一个JSP页面新建后,不需要声明就可以直接使用的对象,这些对象默认隐藏在JSP页面中。能够很方便的开发JSP代码。JSP运行过程也是能够保证这些对象可以转换成Java代码的。
②9大隐式对象
Controller方法中可以用String[]接收,或者pojo的String[]属性接收。两种方式任选其一即可。
javax.servlet.jsp.PageContext pageContext = null;
javax.servlet.jsp.JspWriter out = null;
javax.servlet.http.HttpSession session = null;
javax.servlet.http.HttpServletRequest request
javax.servlet.http.HttpServletResponse response
javax.servlet.ServletContext application = null;
javax.servlet.ServletConfig config = null;
java.lang.Object page = this;
java.lang.Throwable exception
③分类:
⑴作用域对象:
Ⅰ.javax.servlet.jsp.PageContext pageContext = null;
详解:pageContext:只能在当前页面存数据,取数据。
实际上SUN公司在定义所有的JSP 隐式对象的时候,
使用了同一个接口----PageContext(在JSP页面中使用的所有对象,都可以从pageContext对象中得到)
属性:(int 类型)
pageContext.PAGE_SCOPE
pageContext.REQUEST_SCOPE
pageContext.SESSION_SCOPE
pageContext.APPLICATION_SCOPE
属性方法:
pageContext.getException()
pageContext.getPage()
pageContext.getRequest()
pageContext.getResponse()
pageContext.getServletConfig()
pageContext.getServletContext()
pageContext.getSession()
pageContext.getOut();
通过公共接口,得到保存在其他隐式对象中的数据
session.setAttribute('aaa','bbbb');
session.getAttribute('aaa');
pageContext.setAttribute('stu',stu,PageContext.SESSION_SCOPE);
pageContext.getAttribute('aaa',PageContext.SESSION_SCOPE);
Ⅱ.javax.servlet.http.HttpServletRequest request
Ⅲ.javax.servlet.http.HttpSession session = null;
Ⅳ.javax.servlet.ServletContext application = null;
⑵输入输出对象:
Ⅰ.javax.servlet.jsp.JspWriter out = null;
详解:主要用于设置响应的内容,一般指整个网页的html代码给用户看,带缓冲的输出对象,
输出字节流,缓冲区大小通过page指令指定。从响应对象中得到的输出对象,主要用于输出页
面的html代码,也可以输出文本字符串、xml字符串、JSON 字符串等。使用out只能输出字符
串,也是带缓冲的输出对象。
Ⅱ.javax.servlet.http.HttpServletResponse response
详解:主要用于设置响应头信息,方法有限,能够返回的数据也有限,给浏览器看。
Ⅲ.javax.servlet.http.HttpServletRequest request
详解:所有web程序输入的内容全部在该对象中
⑶辅助类对象:
javax.servlet.ServletConfig config = null;
java.lang.Object page = this;
java.lang.Throwable exception
①超出缓冲区不是致命错误;在超出缓冲区时,只需刷新输出即可。自动调用 out.flush();
②超出缓冲区是致命错误;在超出缓冲区时,引发一个异常。
③JSP中两种方法都可以处理,默认会给每个页面的out分配8kb缓存空间,当缓存用完后,会自动调用flash().所以一般我们使用jsp不会见到缓存异常。
如果一个页面不运行自动清空缓存。
<%@ page autoFlush='false' %>
(1)后台得到数据后,希望一次性把所有内容全部输出到页面;
clear() throws java.io.IOException,清除缓冲区的内容。如果已经刷新缓冲区,则clear操作将抛出。IOException,指示某些数据已经不可撤消地写入了客户端响应流。
(2)后台得到数据后,一点一点的传递给页面;
clearBuffer()清除缓冲区的当前内容。与clear()不同,如果已经刷新缓冲区,此方法不会抛出 IOException。它只清除缓冲区的当前内容,然后返回。
总结:Ajax应用中,会使用out对象,默认的缓存就足够。自动导入、导出报表,后台的数据处理量较大,输出到前台就需要处理缓存,一般处理缓存的项目,都是比较复杂的项目。缓存处理不好,用户体验就会非常糟糕。
①概述:EL(Expression Language)目的:为了使JSP写起来更加简单。表达式语言的灵感来自于ECMAScript和XPath表达式语言,它提供了在JSP中简化表达式的方法。它既不是编程语言也不是脚本语言。基于可用的命名空间(PageContext 属性)、嵌套属性和对集合、操作符(算术型、关系型和逻辑型)的访问符、映射到Java类中静态方法的可扩展函数以及一组隐式对象。
EL提供了一些标识符、存取器和运算符,用来检索和操作驻留在JSP容器中的数据。EL表达式只能用在JSP页面中,而且只能用于从作用域对象中读取数据,不能写入数据,也不能修改或删除数据。
②EL表达式的组成:(1)标识符 (2)存取器 (3)运算符
③EL表达式中的标识符、运算符、存取器
⑴标识符:
有很多标识符,常用的有11个;很多与JSP中的隐式对象是相同的。
JSP pageContext ${pageContext.request}
<% pageContext.getRequest() %>
作用域 pageScope
requestScope request.getAttribute('name');
sessionScope
applicationScope
请求参数 param request.getParameter('paramName');
paramValues
请求头信息 header request.getHeader();
headerValues
Cookie cookie ${cookie.loginName}
Cookie[] cks = request.getCookies();
if(cks != null){for(int i=0;i Cookie c = cks[i]; //该对象中有 name value
//判断用户名
if('loginName'.equals(c.getName())){loginname = c.getValue();}}}
项目 initParam ${initParam.projectName}
servletContext.getInitParameter('projectName');
初始化参数
⑵存取器:
. 最常用的存取器,能够自动调用对应名称的getXXXX()
[] 从数组中取数据,或从map对象中取数据时使用
UserInfo info = new UserInfo();
info.setPhone('15051676451');
User u = new User();
u.setName('aaa');
u.setAge(20);
u.setInfo(info);
request.setAttribute('user',u);
//JSP 页面中取数据使用 EL
${requestScope.user.name}
${requestScope.user.info.phone}
⑶运算符:
算术运算符:+ - * /(div) %(mod)
关系运算符:>(gt) <(lt) ==(eq) !=(ne) <=(le) >=(ge)
逻辑运算符:&&(and) ||(or) !(not)
验证运算符:empty
例如:
计算购物车中商品明细的总价:
${sessionScope.orderLines.product.price * 3}
逻辑运算进行比较:
${(x >= min) && (x <= max)}
验证:
//if(session.getAttribute('loginUser') != null)
${empty sessionScope.loginUser} == 等于null返回true
${not empty sessionScope.loginUser} == 不等于null返回true
小结:
(1)EL 表达式使用过程 。
${}--->${标识符.}--->${标识符.attributeName.}--->${标识符.attributeName.propertyName}
(2)EL 表达式只能在 JSP 页面中取值,可以通过标识符来指定取值的作用域范围,如果不指定,默认按照从小到大的范围查找。
pageScope-(找不到)->requestScope-(找不到)->sessionScope-(找不到)->applicationScope
session.setAttribute('name',value); //name 要特殊,不要冲突
(3)在El表达式中,可以使用运算符进行复杂运算。
(4)EL表达式一般是与JSTL配套使用的。