day11JSP内置对象和EL表达式.docx

上传人:b****6 文档编号:7179697 上传时间:2023-01-21 格式:DOCX 页数:13 大小:144.89KB
下载 相关 举报
day11JSP内置对象和EL表达式.docx_第1页
第1页 / 共13页
day11JSP内置对象和EL表达式.docx_第2页
第2页 / 共13页
day11JSP内置对象和EL表达式.docx_第3页
第3页 / 共13页
day11JSP内置对象和EL表达式.docx_第4页
第4页 / 共13页
day11JSP内置对象和EL表达式.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

day11JSP内置对象和EL表达式.docx

《day11JSP内置对象和EL表达式.docx》由会员分享,可在线阅读,更多相关《day11JSP内置对象和EL表达式.docx(13页珍藏版)》请在冰豆网上搜索。

day11JSP内置对象和EL表达式.docx

day11JSP内置对象和EL表达式

课程大纲:

1、Jsp概述与执行原理

2、Jsp基本语法

3、Jsp指令

4、Jsp的内置对象和域对象(重点)

5、Jsp最佳实践

6、EL表达式(非常重要)

学习目标:

了解Jsp的运行机制,掌握jsp内置对象和域对象的使用以及EL的基本使用

1JSP概述与执行原理

1.1Jsp概述

JSP全称是JavaServerPages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。

JSP这门技术的最大的特点在于,写jsp就像在写html,但:

Ø它相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据。

Ø相比servlet而言,servlet很难对数据进行排版,而jsp除了可以用java代码产生动态数据的同时,也很容易对数据进行排版。

Jsp快速入门:

在jsp页面中输出当前时间。

比较servlet开发和JSP开发:

不管是JSP还是Servlet,虽然都可以用于开发动态web资源。

但由于这2门技术各自的特点,在长期的软件实践中,人们逐渐把servlet作为web应用中的控制器组件来使用,而把JSP技术作为数据显示模板来使用。

其原因为,程序的数据通常要美化后再输出:

Ø让jsp既用java代码产生动态数据,又做美化会导致页面难以维护。

Ø让servlet既产生数据,又在里面嵌套html代码美化数据,同样也会导致程序可读性差,难以维护。

因此最好的办法就是根据这两门技术的特点,让它们各自负责各的,servlet只负责响应请求产生数据,并把数据通过转发技术带给jsp,数据的显示jsp来做。

1.2Jsp执行原理

在tomcat中找到JSP引擎动态产生的文件

理解JSP引擎工作原理

1)首先,客户端发出请求(request),请求访问JSP网页

2)接着,JSPContainer将要访问的.JSP文件转译成Servlet的源代码(.java文件)

3)然后,将产生的Servlet的源代码(.java文件)经过编译,生成.class文件,并加载到内存执行

4)最后把结果响应(response)给客户端

2Jsp基本语法

2.1JSP模板元素

JSP页面中的HTML内容称之为JSP模版元素。

JSP模版元素定义了网页的基本骨架,即定义了页面的结构和外观。

2.2JSP脚本表达式

JSP脚本表达式(expression)用于将程序数据输出到客户端

语法:

<%=变量或表达式%>

举例:

当前时间:

<%=newjava.util.Date()%>

JSP引擎在翻译脚本表达式时,会将程序数据转成字符串,然后在相应位置用out.write(…)将数据输给客户端。

JSP脚本表达式中的变量或表达式后面不能有分号(;)。

2.3JSP脚本片段

JSP脚本片断(scriptlet)用于在JSP页面中编写多行Java代码。

语法:

<%

多行java代码

%>

注意:

JSP脚本片断中只能出现java代码,不能出现其它模板元素,JSP引擎在翻译JSP页面中,会将JSP脚本片断中的Java代码将被原封不动地放到Servlet的_jspService方法中。

JSP脚本片断中的Java代码必须严格遵循Java语法,例如,每执行语句后面必须用分号(;)结束。

在一个JSP页面中可以有多个脚本片断,在两个或多个脚本片断之间可以嵌入文本、HTML标记和其他JSP元素。

举例:

<%

intx=10;

out.println(x);

%>

这是JSP页面文本

<%

inty=20;

out.println(y+””+x);

%>

多个脚本片断中的代码可以相互访问,犹如将所有的代码放在一对<%%>之中的情况。

如:

out.println(x);

单个脚本片断中的Java语句可以是不完整的,但是,多个脚本片断组合后的结果必须是完整的Java语句,例如:

<%

for(inti=1;i<5;i++)

{

%>

<%

}

%>

2.4JSP声明

JSP页面中编写的所有代码,默认会翻译到servlet的service方法中,而Jsp声明中的java代码被翻译到_jspService方法的外面,即实例变量。

语法:

<%!

java代码

%>

所以,JSP声明可用于定义JSP页面转换成的Servlet程序的静态代码块、成员变量和方法。

多个静态代码块、变量和函数可以定义在一个JSP声明中,也可以分别单独定义在多个JSP声明中。

JSP隐式对象的作用范围仅限于Servlet的_jspService方法,所以在JSP声明中不能使用这些隐式对象。

<%!

static

{

System.out.println("loadingServlet!

");

}

privateintglobalVar=0;

publicvoidjspInit()

{

System.out.println("initializingjsp!

");

}

%>

<%!

publicvoidjspDestroy()

{

System.out.println("destroyingjsp!

");

}

%>

2.5JSP注释

JSP注释的格式:

<%--注释信息--%>

JSP引擎在将JSP页面翻译成Servlet程序时,忽略JSP页面中被注释的内容。

3Jsp指令

JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。

在JSP2.0规范中共定义了三个指令:

page指令

Include指令

taglib指令

3.1指令基本语法

JSP指令的基本语法格式:

<%@指令属性名="值"%>

举例:

<%@pagecontentType="text/html;charset=UTF-8"%>

如果一个指令有多个属性,这多个属性可以写在一个指令中,也可以分开写。

例如:

<%@pagecontentType="text/html;charset=UTF-8"%>

<%@pageimport="java.util.Date"%>

也可以写作:

<%@pagecontentType="text/html;charset=UTF-8"import="java.util.Date"%>

3.2Page指令

page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面中的什么地方,它作用的都是整个JSP页面,为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个JSP页面的起始位置。

page指令的属性:

language="指明JSP支持的语言,默认为java语言"

*import="当前JSP页面中,需要导入的包,其中import可以写多次"

session="true表示需要服务器创建session/false不需要服务器创建session",默认true

buffer="none|8kb|sizekb"JSP输出使用的缓存大小,默认8kb

autoFlush="true表示当缓存满时,web容器是自动刷新到客户端/false需要手工刷新到客户端",默认true

isThreadSafe="true表示web服务器确保线程安全/false不确保线程安全",默认true

info="text"表示jsp的相关描述信息,可以通过getServletInfo()取得该jsp的信息

*errorPage="当前jsp页面出错后,转发到的目标页面"

*isErrorPage="true"(当某个jsp页面有该属性时,web容器会自动创建exception对象

使用page指令解决JSP中文乱码:

JSP程序存在有与Servlet程序完全相同的中文乱码问题

Ø输出响应正文时出现的中文乱码问题

Ø读取浏览器传递的参数信息时出现的中文乱码问题

JSP引擎将JSP页面翻译成Servlet源文件时也可能导致中文乱码问题(UTF-8)

===如何解决JSP引擎翻译JSP页面时的中文乱码问题=====

1)通过page指令的contentType属性说明JSP源文件的字符集编码

2)page指令的pageEncoding属性说明JSP源文件的字符集编码

3.3Include指令

include指令用于引入其它JSP页面,如果使用include指令引入了其它JSP页面,那么JSP引擎将把这两个JSP翻译成一个servlet。

所以include指令引入通常也称之为静态引入。

语法:

<%@includefile="relativeURL"%>

其中的file属性用于指定被引入文件的相对路径。

file属性的设置值必须使用相对路径,如果以“/”开头,表示相对于当前WEB应用程序的根目录(注意不是站点根目录),否则,表示相对于当前文件。

细节:

Ø被引入的文件必须遵循JSP语法。

Ø被引入的文件可以使用任意的扩展名,即使其扩展名是html,JSP引擎也会按照处理jsp页面的方式处理它里面的内容,为了见明知意,JSP规范建议使用.jspf(JSPfragments)作为静态引入文件的扩展名。

Ø由于使用include指令将会涉及到2个JSP页面,并会把2个JSP翻译成一个servlet,所以这2个JSP页面的指令不能冲突(除了pageEncoding和导包除外)。

4JSP9个隐藏对象和4个域对象

4.1什么是隐含对象?

不用我们手工去创建的对象,由容器根据页面设置而产生直接可以使用

requestHttpServletRequest

responseHttpServletResponse

sessionHttpSession

applicationServletContext

configServletConfig

exception(特殊情况下使用)

pagethis(本JSP页面)

outJspWriter(带缓冲的PrintWriter)

pageContext(使普通Java类可访问WEB资源,自定义标签常用)

4.2out隐藏对象

out隐式对象用于向客户端发送文本数据。

out对象是通过调用pageContext对象的getOut方法返回的,其作用和用法与ServletResponse.getWriter方法返回的PrintWriter对象非常相似。

JSP页面中的out隐式对象的类型为JspWriter,JspWriter相当于一种带缓存功能的PrintWriter,设置JSP页面的page指令的buffer属性可以调整它的缓存大小,甚至关闭它的缓存。

只有向out对象中写入了内容,且满足如下任何一个条件时,out对象才去调用ServletResponse.getWriter方法,并通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中:

设置page指令的buffer属性关闭了out对象的缓存功能

Øout对象的缓冲区已满

Ø整个JSP页面结束

out隐式对象的工作原理图

4.3pageContext对象

pageContext对象是JSP技术中最重要的一个对象,它代表当前JSP页面的运行环境,这个对象不仅封装了对其它8大隐式对象的引用,它自身还是一个域对象,可以用来保存数据。

并且,这个对象还封装了web开发中经常涉及到的一些常用操作,例如包含和跳转其它资源、检索其它域对象中的属性等。

通过pageContext获得其他对象

getException方法返回exception隐式对象

getPage方法返回page隐式对象

getRequest方法返回request隐式对象

getResponse方法返回response隐式对象

getServletConfig方法返回config隐式对象

getServletContext方法返回application隐式对象

getSession方法返回session隐式对象

getOut方法返回out隐式对象

pageContext封装其它8大内置对象的意义。

pageContext作为域对象

pageContext对象的方法

ØpublicvoidsetAttribute(java.lang.String name,java.lang.Object value)

Øpublicjava.lang.Object getAttribute(java.lang.String name)

Øpublicvoid removeAttribute(java.lang.String name)

pageContext对象中还封装了访问其它域的方法

Øpublicjava.lang.Object getAttribute(java.lang.String name,int scope)

ØpublicvoidsetAttribute(java.lang.String name,java.lang.Object value,int scope)

Øpublicvoid removeAttribute(java.lang.String name,int scope)

代表各个域的常量

ØPageContext.APPLICATION_SCOPE

ØPageContext.SESSION_SCOPE

ØPageContext.REQUEST_SCOPE

ØPageContext.PAGE_SCOPE

findAttribute方法(*重点,先后查找各个域中的属性)

4.4四大域对象

到此为止,web开发接触到了4个域对象:

ØpageContext(称之为page域)

Ørequest(称之为request域)

Øsession(称之为session域)

ØservletContext(称之为application域)

这4个域对象是学习web的重点,也是笔试经常考察的知识点。

明确如下问题:

Ø这4个对象的生命周期?

Ø什么是域?

为什么把这4个对象叫做域对象呢?

Ø哪种情况下用哪种域对象。

引入和跳转到其他资源

PageContext类中定义了一个forward方法和两个include方法来分别简化和替代RequestDispatcher.forward方法和include方法

传递给这些方法的资源路径,如果路径以“/”开头,表示相对于当前WEB应用程序的根目录,否则,表示相对于当前JSP所映射到的访问路径。

5Jsp最佳实践

不管是JSP还是Servlet,虽然都可以用于开发动态web资源。

但由于这2门技术各自的特点,在长期的软件实践中,人们逐渐把servlet作为web应用中的控制器组件来使用,而把JSP技术作为数据显示模板来使用。

其原因为,程序的数据通常要美化后再输出:

●让jsp既用java代码产生动态数据,又做美化会导致页面难以维护。

●让servlet既产生数据,又在里面嵌套html代码美化数据,同样也会导致程序可读性差,难以维护。

●因此最好的办法就是根据这两门技术的特点,让它们各自负责各的,servlet只负责响应请求产生数据,并把数据通过转发技术带给jsp,数据的显示jsp来做。

6EL表达式

6.1EL表达式概述

EL表达式语言是JSP2.0才引入的

Ø补充jsp对JavaBean访问的能力

Ø可以说是对useBean,getProperty,setProperty等动作的增强

语法

Ø文字

Ø运算符

Ø变量和JavaBean属性数据输出

Ø存取器

Ø隐含对象

可以自由设置是否支持表达式语言

6.2EL表达式语法

语法形式

${}

例如:

useBeanid=“boy”,class=“com.pojo.Boy”/>

${boy}

${boy.name}

在EL表达式中,数字、字符串、布尔值和null都可以被指定为文字值(常量)。

字符串可以用单引号或双引号定界。

布尔值被指定为true和false。

${100}

100

${-168.18}

-168.18

${3.8E18}

3.8E18

${3.8e-18}

3.8e-18

${3.14159265}

3.14159265

${"HelloJSPEL!

"}

HelloJSPEL!

等价于<%="HelloJSPEL!

"%>

${'HelloJSPEL...'}

HelloJSPEL...

${true}//canbeTRUE?

true

${false}//canbeFALSE?

false

${str==null}

true

6.3EL运算符

算术运算符

+、-、*、/(或div)和%(或mod)

关系运算符

==(或eq)、!

=(或ne)、<(或lt)

>(或gt)、<=(或le)和>=(或ge)

逻辑运算符

&&(或and)、||(或or)和!

(或not)

验证运算符

empty

其中,empty判断一个变量是否为null或是否包含有效数据:

if(name==null||name.equlas("")){…}

等价于

${emptyname}->true

存取器

[]

输出对象属性值,输出数组或集合中对应索引值

.

输出对象属性值

例子:

对象

列表

Map容器

6.4EL中的隐含对象

EL提供了自己的一套隐含对象,方便在页面内对各种常用数据信息的访问.

EL隐藏对象

JSP隐藏对象

pageScope/pageContext

pageContext

requestScope

request

sessionScope

session

applicationScope

appication

param

request.getParameter()

paramValues

在提交表单里,有多个输入域同名getParameterValues

header

request.getHeader(),

按照keyvalue的形式取出value:

是一个String类型的值

headerValues

按照keyvalue的方式取出,

但headerValues里面的value是一个String类型的数组

cookie

request.getCookies()

initParam

contextparam

EL表达式的支持

可以自由设置是否支持表达式语言,

<%@pageisELIgnored="false"%>:

缺省为false,表示可以使用EL

配置web.xml也可达到同样的效果(同时存在,那种起作用?

)(禁用脚本和EL)默认都是false

在页面中通过page指令设置isELIgnored属性的优先级比在web.xml中通过设置的高

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1