JSP的内置对象

什么是JSP的内置对象呢?

在JSP页面进行编程的时候,如果我们要使用一些对象,如:HttpSession,ServletConfig,ServletContext这些对象,如果每次都要先创建这些对象,然后再去使用它们,这样就显得十分繁琐了,为了方便使用者,Sun公司在开发JSP的时候,把一些对象设置为内置对象,开发者在JSP页面编程的时候不必声明这些对象就能直接使用,这就是JSP的内置对象。

那么JSP对象有哪些呢?

JSP内置对象               对应的类型             备注

Request          HttpServletRequest       用于得到请求信息  

Response         HttpServletResponse       用于设置响应信息

Application           ServletContext       代表web应用环境

Config             ServletConfig       用于得到Servlet初始化参数

Session             HttpSession       用于的设置Session对象,调用request.getSession时被创建

Page               Object         在JSP被翻译成java文件后,创建的字节码对象

Out               JspWriter       一个带缓冲的PrintWriter

Exception             Thorwable       异常对象,封装异常信息,发生异常时调用

Pagecontext           PageContext        代表当前jsp的上下文对象

上面大多数对象在学习Servlet的时候已经学习过,下面我们只说一下两个特别的对象:

Out对象

Out对象的类型:JspWriter ,用于向浏览器输出数据。

我们知道以前向页面输出数据,要用到PrintWriter,下面说一下两者的区别:

PrintWriter:直接向页面输出数据,通过调用它的write()方法。

JspWriter:内部有一个一定大小的缓冲区,当这个缓冲区满了,先把缓存区的数据写入   PrintWriter,然后由PrintWriter把数据输出到页面。

那如果要输出的数据填不满缓冲区怎么办呢,别担心,开发者已经为我们想好了:

JspWriter把数据写入PrintWriter的情况:

1)缓冲区满了。

2)Jsp页面已经加载完成,缓冲区虽然没有满,但JspWriter会把数据写入PrintWriter。

3)关闭JspWriter的缓冲区,JspWriter就会把数据直接写入PrintWriter。

那我们怎么设置缓冲区的大小呢?

我们可以在jsp页面使用page指令,然后设置它里面的buffer属性。

如果不设置,它的默认值是8kb。如果想关闭缓冲区我们可以把缓冲区的大小设置为 0kb或none。

PageContext对象

Pagecontext对象的数据类型:PageContext。

作用:代表当前jsp上下文对象。

那么什么是上下文对象呢?在语文书我们可能看到这样的语句:“根据上下文,xxxxxxx”

所谓的上下文就是全文,所以Pagecontext对象可以获取jsp的全部内置对象~

1)通过pagecontext对象来获得jsp的其他8个内置对象

代码如下:

  1. <body>
  2. <%
  3. pageContext.getRequest();
  4. pageContext.getResponse();
  5. pageContext.getSession();
  6. pageContext.getException();
  7. pageContext.getOut();
  8. pageContext.getPage();
  9. pageContext.getServletConfig();
  10. pageContext.getServletContext();
  11. %>
  12. </body>

为什么它可以这样获取其它内置对象呢?我们来看看它的源代码吧~

  1. class _04_page_jsp extends HttpServlet{
  2.  
  3. public void _jspService(){
  4. PageContext pageContext;//把8个内置对象放入PageContext类中
  5. HttpSession session;
  6. ServietConfig config;
  7. SevletContext application;
  8. .....
  9.  
  10. //调用method1
  11. method1(pageContext);
  12. }
  13.  
  14. public void metdho1(PageContext pageContext){
  15. //在这里需要使用到内置对象。例如session、config......
  16. //得到pageContext对象就可以得到其他8个内置对象
  17. pageContext.getRquet();
  18. pageContext.getResponse();
  19. ........
  20. }
  21. }

由上述代码可以看到,在JSP类里面的Serive()方法内声明了这些变量,而里面又调用了了method1方法了把8个内置对象add到pageContext里了~

除了这个作用,pageContext还能作为域对象来使用。

1)pageContext作为域对象使用

域对象的作用:保存数据,得到数据

我们之前已经学过三个域对象:

requset域对象

context域对象

session域对象

这些都是servlet里可以使用的域对象。

然而,在JSP中,除了可以使用上面的三个域对象,还能使用pageContext域对象。

pageContext域对象的范围: 在当前jsp页面中有效的!!!

那么现在我们来使用它吧~

你可以这样把数据保存到pageContext域

        pageContext.setAttribute("name",Object);

然后这样得到数据:

        pageContext.getAttribute("name");

除了可以把数据保存在pageContext域,你也可以用pageContext对象把数据保存在其它域对象里!

指定域对象保存:

        pageContext.setAttribute("name",Object,域常量)

指定域获取:

        pageContext.getAttribute("name" ,域常量);

域常量:

    PAGE_SCOPE: pageContext域

   REQUEST_SCOPE: request域

    SESSION_SCOPE: session域

    APPLICATION_SCOPE: context域

自动搜索:

      pageContext.findAttribute("name");

注意:自动在4个域中依次按顺序(从小到大)搜索数据:

      page -> requeste -> session -> application

如果在某个域中找到数据,则返回该域中的数据,如果4个域都找不到数据,那么就返回null

总结4个域对象

1.jsp的4个域对象

a) Request

b) Session

c) Application

d) pageContext

2.域对象的作用

保存数据,得到数据,清楚数据

3.域对象的核心方法

setattribute(String s,Object obj);

getattribute(String s)

removeattribute(String s)

4.四个域对象的作用范围

Request域对象:同一次请求有效,可用转发来维持。

Session域对象:同一次会话有效。

Application域对象:同一个web应用下有效。

pageContext域对象:同一个jsp页面内有效。

可以在html页面内嵌入java代码,这样是十分不利于开发者和美工分工的,所以后来我们提倡:尽量在jsp页面内不使用java代码,为此,两种新的技术出现了:

我们 用EL表达式来代替 jsp表达式;

用jsp标签来代替jsp中的java脚本。

EL表达式

那么什么是EL表达式

Jsp中的一种语法,用来代替jsp表达式。

EL表达式的语法:

${变量或表达式}   十分的简便。

EL表达式的用法!

1)用与输出域中的数据

我们现在两个域中存入名字一样的两个数据,然后用EL来输出到页面

  1. pageContext.setAttribute("id", "rrrr",pageContext.REQUEST_SCOPE);
  2. pageContext.setAttribute("id", "ppp");
  3. %>
  4. ${id}

页面输出的结果为:ppp

所以,如果没有指定域对象,EL表达式就会依次在page->request->session->application域里找那个名字的变量,先找到就先用。

那么如何指定域对象呢??在变量名前加上域范围!

  ${域范围.name}

域范围:

  pageScoope: pageContext域

requestScope: request域

sessinoScope: session域

applicatinScope: application域

1)除了能输出域对象保存的数据,EL表达式还能输出对象里的属性!!!

假如我们定义了一个Person类,它有一个属性name,有一个getName()方法。

那么我们可以用EL表达式来把它的name属性的值取出来:

  1. pageContext.setAttribute("person", person);
  2. %>
  3. ${person.name}

这样就能把name属性的值取出来了!为什么会这样呢,因为EL表达式中的 .name 相当于调用了对象的getName()方法,这一点大家要注意了。

1)EL表达式也可以用来输出集合对象的值!

List对象:

  1. pageContext.setAttribute("personList", list);
  2. %>
  3. ${personList[0]}

中括号里的值表示脚标!是不是很简便~

Map对象:

  1. pageContext.setAttribute("personMap", map);
  2. %>
  3. ${personMap["ppp"]}

中括号里填的是key的值,这样就能得到对应的value的值了~

4)用于计算表达式

      算术、${12+13-12*5+100}

      比较、${5<3}

      逻辑、${5<6&&7>8}

      判空 判断是否null${name==null }

      判断是否是空字符串${name==""}

      还有一种empty关键字可以用来判断空和null,用法:

          ${empty name }

EL表达式内置对象

EL表达式还有内置对象!!别怕,很多都学过了,分别是

pageContext   --等价于jsp的pageContext内置对象

pageScope      --指定域获取

requestScope

sessionScope

applicationScope

param       --请求参数

paramValues

header       --请求头

headerValues

除了以上9种内置对象,还乐意获得以下两种~

cookie       --获取cookie

initParm     --获取web应用全局参数

下面用代码示范一下:

  1. <body>
  2. <%=pageContext.getRequest() %>
  3. <br/>
  4. <%--EL获取web上下文 --%>
  5. ${pageContext.request.contextPath } <br/>
  6. ${pageContext.request.remoteHost }
  7. <a href="${pageContext.request.contextPath }/04.el1.jsp">页面</a>
  8.  
  9. <hr/>
  10. <%-- param / paramValues --%>
  11. <%--jsp接收参数 --%>
  12. <%
  13. String name = request.getParameter("name");
  14. //out.write(name);
  15.  
  16. String[] names = request.getParameterValues("name");
  17. for(String n:names){
  18. out.write(n+"<br/>");
  19. }
  20. %>
  21.  
  22. <%--EL获取参数 --%>
  23. <br/>
  24. EL: ${param["name"]}<br/>
  25. EL: ${paramValues["name"][0] } - ${paramValues["name"][1] }
  26.  
  27. <hr/>
  28. <%--请求有: header / headerValues --%>
  29. <%--jsp获取头 --%>
  30. <%=request.getHeader("user-agent") %>
  31.  
  32. <%=request.getHeaders("user-agent") %>
  33. <br/>
  34. <%--EL获取请求头 --%>
  35. EL: ${header["user-agent"] }<br/>
  36. EL: ${headerValues["user-agent"][0] }
  37.  
  38. <hr/>
  39. <%--cookie: --%>
  40. <%--jsp获取cookie --%>
  41. <%=request.getCookies() %>
  42. <br/>
  43. <%--EL获取 Cookie--%>
  44. ${cookie["JSESSIONID"].name } - ${cookie["JSESSIONID"].value }
  45.  
  46. <hr/>
  47. <%--EL获取全局参数--%>
  48. ${initParam["AAA"] } - ${initParam["BBB"] }
  49. </body>

以上就是EL的内容,重点在引用属性时会调用它的getXxxx方法!

下面我们来说一下JSP的标签吧!

Jsp标签

聪明的你一定会发觉,就算EL表达式可以代替JSP表达式,但想要完成一些功能,EL表达式是不够的,例如循环,条件判断等。所以JSP标签就来和它相辅相成了!

什么是JSP标签

jsp标签 替代 jsp脚本的功能。

Jsp标签分类

一)JSP内置标签,又称为动作标签

二)JSTL标签库的标签

三)自定义标签

就三种,不多~

动作标签

动作标签不用手动导入,所以我们直接使用就行。常使用的动作标签有以下三种:

<jsp:forward page="">    转发标签

<jsp:param name="" value=""/>  参数标签。参数标签不能单独使用,只能用在forward或include 标签中。

<jsp:include page=""/>   包含标签。用于包含其他页面。是一种动态包含。

那么现在在JSP文件中演示下吧:

  1. <jsp:include page="包含的页面">
  2. <jsp:param name="参数名" value="参数值"/>
  3. </jsp:include>
  4.  
  5. <jsp:forward page="页面名称">
  6. <jsp:param name="参数名" value="参数值"/>
  7. </jsp:forward>

什么是动态包含呢?

JSP文件需要先翻译成JAVA源文件,然后再编译成CLASS文件。

动态包含:两个JSP文件各自先翻译,然后在编译运行时再合并。也就是说途中会产生多个java文件

静态包含:两个文件先合并,然后一并翻译成java源文件,过程中只产生1个java文件。

***************静态包含  vs  动态包含*****************

静态包含:  @include指令实现。原理是先合并再翻译。静态包含不能携带参数。

动态包含:  <jsp:include/> 标签实现。原理是先翻译再合并。动态包含可以使用<jsp:param/>标签携带参数到被包含页面

JSTL标签库

JSTL,Java Strandard Tag Libarary  java标准标签库

*****使用jstl标签库,需要在jsp页面中导入标签库

常见的JSTL标签库

核心标签库 (c: 设置变量,获取变量,条件判断,循环  )(主要)

国际化标签库  (fmt: 日期国家化,文字国际化,数字国际化  )(以后说)

EL函数库  ( fn:对String常用的方法 )

数据库标签库 (sql:对数据库操作的标签)

XML标签库( x:对xml文件操作的标签 )

核心标签库

使用jstl标签步骤:

1) 如果是用java5.0的jar包,那么就已经包含jstl的jar包。

2) 在jsp页面头部导入标签库:

  1. <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

3)在jsp页面中使用

核心库中常用的几种标签

<c:set></c:set>      -- 设置数据

<c:out value=""></c:out>   --得到数据

<c:if test=""></c:if>      --单条件判断

<c:choose></c:choose>     --多条件判断

<c:when test=""></c:when>

<c:otherwise></c:otherwise>

<c:forEach></c:forEach>       --循环,遍历集合或数组

<c:forTokens items="" delims=""></c:forTokens>  -循环字符串

<c:redirect></c:redirect>    --重定向

下面我们来一一示范下怎么使用这些标签吧

  1. <body>
  2. <%--使用set标签设置数据,默认是在pageContext域中设置,也可以指定域保存 --%>
  3. <c:set var="name" value="eric" scope="request"></c:set>
  4. ${requestScope.name}
  5.  
  6. <%-- out标签,从域对象中得到数据,
  7. default属性:设置默认值,当属性为null时,就会用默认值代替
  8. escapeXml:是否对内容进行转义,false:不进行转义,true:进行转义
  9. 什么是转义:特殊字符不会被识别作用,当普通字符输出
  10. --%>
  11. <c:out value="${name}" default="abc" escapeXml="false"></c:out>
  12.  
  13. <%--if标签:单条间判断--%>
  14. <c:if test="${1>2}">
  15. 条件成立执行的内容
  16. </c:if>
  17.  
  18. <%--choose标签:多条件判断 --%>
  19. <c:set var="id" value="001"></c:set>
  20. <c:choose>
  21. <c:when test="${id=002}">此用户是002</c:when>
  22. <c:when test="${id=001}">此用户是001</c:when>
  23. <c:otherwise>不存在此用户</c:otherwise>
  24. </c:choose>
  25.  
  26. <%--遍历List
  27. begin:从哪个元素开始遍历,第一个下标为0
  28. end:到哪个元素结束
  29. step:步长
  30. items:需要遍历的对象的名称
  31. var:每个元素对象的名称
  32. varStatus:当前遍历对象的状态,即:已经遍历了几个元素。
  33. --%>
  34. <c:forEach items="${list}" var="student" varStatus="varSta">
  35. 序号${varSta.count}-姓名${student.name}-年龄${student.age}
  36. </c:forEach>
  37.  
  38. <%--遍历Map--%>
  39. <c:forEach items="${map}" var="entry" varStatus="varSta">
  40. 序号${varSta.count}-编号${entry.key}-姓名${entry.value.name}
  41. </c:forEach>
  42.  
  43. <%--forTokens便签 :循环字符串,可以切割后将子串都输出
  44. items:要循环的对象
  45. delims:以什么东西切割字符串
  46. var:切割后的单个对象的名称
  47. --%>
  48. <c:forTokens items="${str}" delims="-" var="s">
  49. ${s} <br/>
  50. </c:forTokens>
  51.  
  52. <%--重定向 标签--%>
  53. <c:redirect url="http://www.baidu.com"></c:redirect>
  54.  
  55. </body>

JavaWeb之 JSP:内置对象,EL表达式,JSP标签基础的更多相关文章

  1. Java EE JSP内置对象及表达式语言

    一.JSP内置对象 JSP根据Servlet API规范提供了一些内置对象,开发者不用事先声明就可使用标准变量来访问这些对象. JSP提供了9种内置对象: (一).request 简述: JSP编程中 ...

  2. JavaWeb——JSP内置对象application,JSP属性范围

    application application语法 application对象 JSP属性范围 范围的分类 page request session application pagecontext延伸 ...

  3. jsp 内置对象---EL

    ServletRequest : java.lang.String      getParameter(java.lang.String name) 返回一个string           对应 n ...

  4. EL表达式,JSP内置对象

    基本语法格式 EL都是以 ${ 为起始.以} 为结尾的 ${ EL Expression} 示例: ${ “Helloworld” }  //输出字符串常量 ${ str }  //输出字符串变量st ...

  5. IT兄弟连 JavaWeb教程 JSP内置对象经典面试题

    1.请说明cookie.request.session.application的作用域和声明周期? 并说明它们适用与什么场景? request的生命周期是一次请求.可以用于JSP表单提交数据. ses ...

  6. Jsp内置对象及EL表达式的使用

    一.JSP的内置对象(9个JSP内置对象) JSP的内置对象引用名称 对应的类型 request HttpServletRequest response HttpServletResponse ses ...

  7. JSP运行过程 JSP脚本 静态动态包含 jsp指令 jsp内置对象jsp四大作用域 jsp动作元素 EL表达式 JSTL 设计模式 JSP开发模式 EL内置对象

    Day38 JSP JSP的运行过程具体如下: (1)客户端发出请求,请求访问JSP文件. (2)JSP容器先将JSP文件转换成一个Java源文件(Java Servlet源程序),在转换过程中,如果 ...

  8. jsp内置对象和el表达式内置对象误区

    未经允许禁止转载... jsp九大内置对象 EL表达式隐含的11个对象 隐含对象名称 描       述 pageContext 对应于JSP页面中的pageContext对象(注意:取的是pageC ...

  9. JavaWeb学习----JSP内置对象详解

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

随机推荐

  1. 未完全关闭数据库导致ORA-01012: not logged的解决

    首先使用SHUTDOWN 没加任何参数方式关闭数据库,在数据库未关闭时CTRL+Z停止执行,退出用SQLPLUS重登陆,出现报错:ORA-01012: not logged on SQL> st ...

  2. TFS客户端登录用户修改

    1.操作环境: Windows 10 Pro Visual Studio 2013 TFS客户端 2.操作背景 安装完成TFS系统后,使用administrator在客户端进行登陆测试(已勾选保存用户 ...

  3. .NET MVC4.0与CA对接

    1.改web.confog 2.引用CA提供的 dll 3.在controller层加个方法,记得加上授权认证的特性,获取信息 [Authorize] publi void calogin() { H ...

  4. confluence启动关闭

    cd /opt/atlassian/confluence/bin startup.sh shutdown.sh

  5. IE SEESION共享的问题

    前几天,我们在开发工作流的过程中出现了一个比较奇怪的问题,原本看不到流程的人员,在登陆后却能够看到对应流程的待办任务,并且导致流程流向混乱!在调模式下调试程序发现(假设登陆两个用户)第二个登陆用户的信 ...

  6. JS &#8203; ZERO WIDTH SPACE

    如上编码 ZERO WIDTH SPACE  在各个语言的表达. JS中使用 var b = a.replace(/\u200B/g,''); 来替换,去掉 ZERO WIDTH SPACE . ht ...

  7. 使用py2exe打包你的py程序

    软件环境:python3.3.4 + PyQt5 使用py2exe打包写好的py文件,过程如下: 在你要打包的代码文件(比如sample.py)的同文件夹建立一个python代码文件(比如setup. ...

  8. ct任务添加与中控机批量后台操作

    ct 任务nohup sh ./bin/start.sh </dev/null >/dev/null 2>&1 & 中控机批量 for h in `get_hosts ...

  9. 如何判断raid1中哪块硬盘损坏?

    服务器 2块硬盘做的raid1,如果其中有一块坏掉,如何能判断是哪块坏掉? 方法①.通过硬盘硬件指示灯进行观察,一般黄灯代表硬盘存在问题,显示红灯则代表硬盘损坏.方法②.通过开机进入阵列配置进行查看, ...

  10. 1.7见识一下什么叫Linux驱动:LED

    1.任何的Linux驱动都有一个装载函数(装载驱动时调用)和一个卸载函数(卸载驱动时调用): 2.装载函数和卸载函数分别通过module_init和module_exit宏指定.