JSP技术

1.学习内容

JSP技术入门和常用指令

JSP的内置对象&标签介绍

EL表达式&EL的内置对象


2.JSP技术入门和常用指令

2.1.JSP的由来

在前面的学习过程中,页面相关的内容主要是通过html文件完成,而Servlet技术主要是在获取浏览器(客户端)提交的请求数据,或者是给浏览器(客户端)响应数据。在实际企业开发中,前端的页面(html文件)相关设计和美化工作都是前端工程师(美工)负责,后台的Java程序是由Java开发人员完成,前端给出的页面,不能满足后台开发人员的需求,这时就需要后台开发人员在Servlet中使用response获取输出流,拼接前端页面需要的html片段,这样会导致Servlet中的Java代码十分的臃肿,而且不利于前端人员维护页面。导致前后人员之间合作出现问题。针对这些问题,sun公司设计出JSP技术来解决。

JSP技术:Java Server Page。它的主要功能:可以直接在JSP文件中书写html代码,但是JSP文件最后会被翻译成对应的Java代码。这个翻译工作不需要开发人员做任何的事情,而直接由Java对应的机制完成。这样就可以保证前端工程师可以直接针对JSP文件进行页面设计和修改,后台人员可以在JSP页面中添加对应的业务程序。后台人员不用再在Servlet中通过response输出大量的html片段。

偷偷告诉你:其实不仅仅Java使用jsp技术代替html文件。微软的.net技术也推出的asp技术代替普通的html文件,php也推出了php技术代替html文件。

2.2.JSP的脚本元素----回顾

通过演示明白JSP文件本身和html文件区别并不大,但是sun公司发明的JSP技术不仅仅是为了代替html文件的,在JSP文件中还可以嵌入Java代码的。

如果需要在JSP文件中嵌入Java代码,必须按照特定的规则书写,否则就会出现翻译JSP文件时报错。

在JSP文件中嵌入Java代码有三种方式:1、脚本声明;2、脚本表达式;3、脚本片段

2.3.脚本翻译的体现

如果在项目中有多个JSP页面,只有第一次访问到某个JSP页面的时候,这个JSP页面会被tomcat服务器进行翻译。

在JSP页面上书写的不同的JAVA脚本代码,在翻译后的Java源代码中处于不同的位置。在tomcat的work目录下有所有用到的JSP文件翻译之后对应的Java代码。

tomcat的安装目录:\work\Catalina\localhost\beike\org\apache\jsp

书写demo.jsp,翻译之后对应的demo_jsp.java文件,它会被编译之后生成demo_jsp.class文件。

提问:JSP到的是什么东西?

JSP它翻译之后是一个Servlet程序。

2.4.JSP中的注释

由于JSP中可以书写html、Java代码,因此在JSP中可以嵌入html注释,还可以嵌入Java注释,还可以书写JSP自己的注释

1、html注释:只能修饰html内容。

2、java注释:只能修饰java代码。//  /* */ /** */

3、jsp注释:都可以包括。既可以注释掉java的内容,也可以注释掉html的内容

<%--注释内容--%>

html注释:

html注释它们在翻译之后,在Java的源代码中会存在(out.print输出出去),同时在生产的html源码也会存在,只是在页面上不显示。

html的注释,不能注释掉java脚本的内容。

java注释:Java的注释必须嵌入在上面介绍的三个脚本中,不能在jsp其他位置书写。----只能修饰java代码。并且当jsp翻译成servlet这个java类的时候,注释内容存在。在编译成class文件的时候消失

在JSP页面上嵌入的Java注释在翻译之后Java源代码中存在,在编译成class文件的时候消失

jsp自己的注释:<%--注释--%>(如果区分不开的化,就使用jsp自己的注释。)

jsp注释,仅仅只是在jsp页面中存在,翻译后的Java源代码中是没有的。

2.5.JSP指令

指令:可以理解成命令、约束、限制、规范。JSP中的指令:是用来限制约束JSP文件的。JSP中常用的指令有三个:page、include、taglib。

2.6.page指令

Page指令限制当前的JSP页面。

page指令限制当前的JSP文件中可以使用的哪些包下的Java类,以及当前JSP页面的编码格式等操作。一般书写的JSP文件的第一行。

page指令的格式:<%@pagekey=value  key=value  …….%>

例如:

在JSP页面上的page指令,可以把它的属性拆成多个page指令书写,也可以写在一起。

例如:

2.6.1.language属性

language属性:是声明当前这个JSP中可以使用编程语言 ,它默认就是Java。其实sun公司在设计JSP技术的时候,希望其他语言也可以使用JSP技术,但是最后也只有Java在使用。

2.6.2.import属性

import属性:声明当前这个页面可以使用的类所在的包。相当于书写Java代码中的导包操作。

导入util包下的所有,在JSP页面上就可以使用集合等工具类。

温馨提示JSP翻译之后,其实对应的就是一个Java类,并且这个类还是HttpServlet的子类因此JSP页面上是可以使用Servlet中的相关对象,并且不用导入。

查看翻译的Java源代码可以看到,程序中导入了如下的包。

注意:在JSP页面上,如果需要导入其他包下的类,书写完类名或接口名之后,在类名或接口名上使用alt +/联想导入对应的包。

2.6.3.pageEncoding重点contentType属性

pageEncoding属性:设置当前JSP页面保存的时候的编码表。

一般建议这个属性的值设置UTF-8.

contentType属性:它是设置浏览器在解析jsp中的代码时使用的编码表,但是一般不用设置它,只要在JSP页面上设置了pageEncoding在解析JSP的时候,如果没有设置contentType,浏览器解析的时候会使用pageEncoding的编码表。

如果要设置contentType属性,建议也设置为UTF-8。

温馨提示:一般在新建一个JSP文件的时候,page指令默认有language、import、pageEncoding属性,并且它们的属性值也不用修改(如果pageEncoding的编码表不是UTF-8需要修改为UTF-8)。

2.6.4.autoFlush属性

autoFlush属性:它是指在使用out对象输出的时候,是否自动刷新。默认是true。会自动刷新。一般不用设置,采用默认方式即可。

2.6.5.buffer属性

buffer属性:当前页面的输出流使用的缓冲区大小。默认的8kb。也可以自己修改。一般不用设置,采用默认方式即可

2.6.6.errorPage属性

errorPage属性:在jsp页面中发生异常或者错误的时候,使用这个属性可以配置当前页面发生异常之后,跳转到其他的页面显示(配置友好页面)。一般不用,后期会使用其他方式代替。

创建的错误页面如下:

在jsp页面中配置errorPage,并且在页面上故意书写发生异常的代码。

打开浏览器访问有异常的页面,最后看到配置的错误页面信息

2.6.7.isErrorPage属性


isErrorPage属性:设置当前的JSP页面是否是可以直接使用exception对象。如果设置true,当前的JSP文件翻译后的Java源代码会看到存在exception的引用。

2.6.8.多学一招

一般开发的时候,会把整个项目中的常见的错误处理配置到当前项目的web.xml文件中。

2.6.9.extends属性

extends属性:指定当前这个JSP翻译之后需要继承的父类。在指定的JSP的父类时,要求这个父类一定是HttpServlet的子类。一般不用设置,采用默认方式即可。

2.6.10.isELIgnored属性

isELIgnored="false"它是说当前的JSP页面中是否可以解析EL表达式。默认值为false,表示当前JSP页面可以解析出EL表达式中的内容。如果设置true,在JSP页面中书写EL表达式将不会被解析。直接显示在页面上。一般不用设置,采用默认方式即可。

2.6.11.session属性

session属性: 在当前的页面中是否可以直接使用session对象。默认值为true,也就是直接访问当前的JSP页面,如果没有session对象,就会直接创建Session对象,如果有,可以直接使用,但是如果设置为false,访问当前的JSP页面,就不会有任何session的信息。一般不用设置,采用默认方式即可。

2.7.JSP中的include指令(理解

JSP中的include指令,它主要是用来在当前的页面中引入其他的页面。这种引入方式成为静态的引入。

例如:一个网页,一般它的logo是一个页面,而版权部分是一个页面,主体部分是另外一个页面。

在某个页面上引入其他的jsp页面的时候,要求其他的jsp页面中只写网页的主体内容,而不需要网页的框架,因为它们在翻译成Java代码的时候,会被翻译到同一个Java文件中。

JSP中的include指令,它是将多个JSP文件翻译成一个Java源代码,把JSP的include指令称为静态包含。

注意:使用include引入其他的JSP页面,一定要保证多个JSP页面中嵌入的Java代码中的变量名不能重复。

2.8.JSP中的taglib指令重点

在JSP页面上是可以书写Java代码,也可以书写html代码,一般公司中页面是由美工维护,而我们负责后台开发。因此不建议在JSP页面上嵌入过多的Java代码。这时就需要把Java代码从页面中剔除。将页面上需要书写的所有标签都封装到对应的单独的Java程序中,然后在页面中使用taglib指令引入。引入的这些Java程序可以通过对应的标签体现。其实这些标签的背后还是Java代码。仅仅只是JSP页面上没有了Java代码而已。

taglib指令:主要是在页面上引入其他已经定义好的标签或者函数(其实就是在引入Java程序或者理解成类)。

例如:这里引入一个使用频率非常高的标签作为演示

在taglib指令中的属性:

uri:是当前标签对应的Java代码封装之后绑定的名称空间(给java代码专门的命名)

prefix:它是当前在页面上可以使用的标签的前缀。

JSP中的代码体现:

页面显示的效果:

3.JSP的内置对象(九大内置对象)

3.1.什么内置对象

内置对象:当前事物(对象)存在(创建)的之后,它的内部就已经拥有其他的对象,而在当前这个事物(对象)中是可以直接使用已经存在的其他对象。

例如:创建完A类的对象之后,在A类的源代码底层其实已经存在了B类,C类,等其他类的对象,那么在A类中是可以直接使用B、C类的对象,而这些B、C类对象可以称为A类的中的内置对象。

JSP文件被翻译之后对应的就是一个Servlet程序。那么在JSP页面上是可以直接使用Servlet中的学习过的相关对象。这些对象在页面上的Java代码中我们是可以直接使用的,而不需要再去手动的创建或者获取这些对象。

JSP的内置对象9个:这9个内置对象,可以在JSP翻译之后的对应的Java源代码的service方法中找到:

在翻译之后的service方法中的定义的对象:

HttpServletRequest使用request引用操作它是请求

HttpServletResponse使用response引用操作它是响应

HttpSession使用session引用操作session容器对象

ServletContext使用application引用操作表示当前项目对象

ServletConfig使用config引用操作专门获取当前这个Servlet的配置信息

Object使用page引用操作= this它表示的是当前那个JSP页面对象(翻译之后就是一个Servlet程序,这个page本身就是一个Servlet,但是由于在翻译之后赋值给了Object类型,导致不能使用使用Servlet中的功能)。后期把它当作第四个容器(域对象)使用。

PageContext使用pageContext引用操作它表示的是当前jsp页面的上下文。它的主要功能之一就是可以获取到JSP页面上的其他八个内置对象。

Throwable使用exception引用操作主要是表示当前JSP页面上的异常信息的

JspWriter使用out引用操作它相应于我们在Servlet中使用的response.getWriter

由于和Servlet相关的对象(HttpServletRequest、HttpServletResponse、HttpSession、ServletContext、ServletConfig),在学习Servlet时已经讲解过,这里不再重复介绍。用法和Servlet中用法相同。

3.2.page对象

在JSP页面中,由于page对象被提升成了Object类型。但是这个page在赋值的时候,赋值为this。

而this表示的是当前的jsp页面对象。jsp页面翻译之后又是Servlet程序,也就说当前的page本身就是一个Servlet对象,但由于被提升成Object类型,因此Servlet中的所有的方法page都无法使用。如果真的要使用,需要使用向下转型。因此在JSP页面中经常把page当做Servlet中的第4个容器(域对象)使用。

如果把page当做容器(域对象)使用的时候,这时它中保存的内容只能在这个JSP页面中使用,在其他的地方无法使用。

web中的四个域对象(容器对象)范围:从小打到顺序:

page  <  request  <  session  < ServletContext(application)

3.3.pageContext对象

pageConext它有四个功能:1、获取其他8个内置对象;2、给四个域对象中设置值;3、获取四个域对象中的值;4、移除四个域中的值。

相关的方法可以到可以从JspContext的API中查询出对应的方法:

3.3.1.获取其他8个内置对象

获取jsp页面中的其他的8个内置对象:下面7个可以在PageContext对象中找到:

下面方法可以在JspContext对象中找到:

需求:通过pageContext对象获取四个域对象:

<%--需求: 通过pageContext对象 获取四个域对象:--%>

<%

// page request session application

Object p = pageContext.getPage();

ServletRequest req = pageContext.getRequest();

HttpSession sess = pageContext.getSession();

ServletContext app = pageContext.getServletContext();

// 向request对象中保存数据

req.setAttribute("nvshen","柳岩");

%>

<%=request.getAttribute("nvshen")%>

3.3.2.给四个域对中的设置数据

setAttribute方法中的三个参数解释:

第一个参数:是需要给某个域中保存的数据对应的key值

第二个参数:是需要给某个域中保存的数据,也就是key对应的value值

第三个参数:是需要将数据具体保存到哪个域中,可以通过PageContext中的静态成员变量获取到

例如:

其中setAttribute( Striing name , Object value )默认将数据保存在page域中。如果需要设置在request、session、application域中,需要使用第二个setAttribute方法完成。

3.3.3.四个中获取数据

getAttribute( String name )它默认是从page域中找key对应的value,如果没有返回null。

getAttribute( String name , int scope )它是从指定的域中key对应的value。第一个参数是key值,第二个参数的域的名称(可以通过PageContext中的静态成员获取,例如PAGE_SCOPE)。

getAttributeNamesInScope (int scope)它是指从指定的域中获取所有的key值。

getAttributesScope( String name)获取key所在域

findAttribute( String name )它是从page、request、session、application四个域中依次找指定key对应的value,如果有任何一个域找到,就不会再继续找。如果四个域中都没有返回null。

3.3.4.从四个域中删除数据

removeAttribute( String name)从任意域中删除指定key对应的value值。如果多个域中都,将会将这几个域中的全部移除。

removeAttribute( String name , int scope )从指定的域中删除key对应的value值。

//需求1:通过pagecontext对象 向4大域对象保存数据

//需求2:通过pagecontext对象 从指定域对象获取数据

//需求3:通过pageContext对象 删除指定域对象的数据 和 删除不指定域对象的数据(比较)

//需求4:通过pagecontext对象 从域对象获取数据的简化方式


<%--  // 需求1: 通过pagecontext对象 向4大域对象保存数据--%>

<%

// 需求 是想4个域中保存address=上海X

//pageContext.setAttribute("address", "上海1"); // page

// pageContext.setAttribute("address", "上海1", pageContext.PAGE_SCOPE); // page

//pageContext.setAttribute("address", "上海2", PageContext.REQUEST_SCOPE); // request

//pageContext.setAttribute("address", "上海3", PageContext.SESSION_SCOPE); // session

//pageContext.setAttribute("address", "上海4", PageContext.APPLICATION_SCOPE); // servletcontext

%>

<%--// 需求3: 通过pageContext对象 删除指定域对象的数据 和 删除不指定域对象的数据(比较)--%>

<%

// 删除指定域对象的数据

//pageContext.removeAttribute("address", PageContext.PAGE_SCOPE);

//pageContext.removeAttribute("address", PageContext.REQUEST_SCOPE);

//pageContext.removeAttribute("address", PageContext.SESSION_SCOPE);

// pageContext.removeAttribute("address", PageContext.APPLICATION_SCOPE);

// 删除不指定域对象的数据

// pageContext.removeAttribute("address");

%>

<%--

// 需求2: 通过pagecontext对象 从指定域对象获取数据

pageContext.getAttribute(name, scope)

第一个参数: 数据的key

第二个参数: 数据的域范围

pageContext.getAttribute(name) 如果不指定域的范围,从page域获取数据

<%=pageContext.getAttribute("address") %>

<%=pageContext.getAttribute("address", PageContext.REQUEST_SCOPE) %>

<%=pageContext.getAttribute("address", PageContext.SESSION_SCOPE) %>

<%=pageContext.getAttribute("address", PageContext.APPLICATION_SCOPE) %>

--%>

<%--// 需求4: 通过pagecontext对象 从域对象获取数据的简化方式--%>

<%=pageContext.findAttribute("address")%>

3.4.out对象

out它主要是用来把数据输出到页面。

<%

out.println("out 输出1");

response.getWriter().println("response 输出1");

out.println("out 输出2");

%>

页面的显示结果:

上面的显示结果分析:

建议:在JSP页面上如果需要输出文本数据,全部使用out输出。

3.5.exception对象

在jsp页面上要能够使用exception内置对象,在jsp的page指令中,必须书写isErrorPage=true,否则在页面上是无法使用exception内置对象。

谨记:不要把异常带到JSP页面。一般异常需要在后台的Java代码处理完成, 如果真的有异常,就使用友好页面处理。

3.6.脚下留心(面试题

说明JSP的九大内置对象分别是什么?

page、request、response、session、application、servletConfig、PageContext、out、exception

记住:使用pageContext对象 如何操作四个域中的数据。

4.JSP中的标签

4.1.JSP标签作用

虽然sun公司在设计JSP技术的时候,允许在JSP页面中嵌入java代码,但是这样会导致html、js、java等代码严重的耦合在同一个文件中,导致后期维护十分的麻烦。于是sun公司就将可以在jsp页面上书写的java提前已经封装到对应的标签中,然后让开发者在jsp页面上通过使用标签的方式来使用相应的java代码。其实这些标签的用途并不大,后期如果真的需要功能强大的java代码,需要开发人员自己手动封装标签的。这里阶段介绍下JSP中已经内置好的几个标签。

jsp:useBean

jsp:setProperty

jsp:getProperty

它们三个合起来可以操作一个Java对象,并且可以给这个对象的属性设置值或者取出某个对象的属性值。

<%--    // 需求1: 通过标签创建user对象, 将user对象保存request对象中--%>

<%-- 等价于 User user = new User(); --%>

"user"class="cn.itcast.domain.User"scope="request">

<%--// 需求2: 通过标签给user对象的username属性设置为 张三,  password属性值 设置为 123;--%>

<%-- user.setUsername(张三)  user.setPassword(123) --%>

"username"name="user"value="张三"/>

"password"name="user"value="123"/>

<%--// 需求3: 通过标签 取出user对象的name属性值 和age属性值--%>

<%-- out.println(user.getUsername()) --%>

"username"name="user"/>

"password"name="user"/>

"address"name="user"/>

4.2.include标签(动态包含)

在前面介绍JSP的指令时,介绍过include的指令,它是将多个jsp文件在翻译的时候,合并在同一个java文件中,也被称为静态包含。

而在JSP中还提供include标签,它的功能也可以将多个jsp文件合并到同一个页面中,但在翻译的时候,多个JSP文件会翻译成不同的java代码,只有在真正给浏览器响应的时候时候才会把这些java文件合并在一起。这种包含称为动态包含。

上面介绍的静态包含和动态包含也是一道面试题,希望后期注意。

4.3.forword标签

它主要是代替我们在Servlet中学习的request的请求转发的。


"/index.jsp">

"zhangsan"name="name"/>

5.EL表达式

5.1.什么是EL表达式

jsp中的EL(express language)表达式技术:它仅仅是表达式。

EL表达式的功能:获取4个内置对象(域)中的数据,或自定义对象中的数据,或数组、集合容器中的数据。可以完成非常简单的运行。它不能完成循环、复杂的判断等功能。

EL表达式的书写格式:${表达式}

5.2.EL表达式获取域对象中的数据重点重点重点

格式1: ${xxxxScope.key}

使用el表达式从不同的域中取出数据,需要使用el中的4个内置对象搞定

pageScope、requestScope、sessionScope、applicationScope

在4个el内置对象xxxxScope取出保存的数据时,相当于使用pageContext.getAttribute(key,scope);取值

格式2: ${key}

如果不知道数据在哪个范围中,这时可以不用指定范围直接书写key值即可${key}

下面代码的底层对应的是pageContext.findAttribute();

需求1:通过el表达式 从指定域中获取数据(比较和java代码的不同)

需求2:通过el表达式 从不确定域中获取数据

<%

// 向4个域存数据

//pageContext.setAttribute("address", "上海1"); // page

//pageContext.setAttribute("address", "上海2", PageContext.REQUEST_SCOPE); // request

//pageContext.setAttribute("address", "上海3", PageContext.SESSION_SCOPE); // session

//pageContext.setAttribute("address", "上海4", PageContext.APPLICATION_SCOPE); // servletcontext

%>

<%--需求1: 通过el表达式 从指定域中获取数据 (比较和java代码的不同)--%>

<%--${pageScope.address}--%><%--等价于 pageContext.getAttribute(name, scope); --%>

<%--${requestScope.address}--%>

<%--${sessionScope.address }--%>

<%--${applicationScope.address}--%>

<%--需求2: 通过el表达式 从不确定域中获取数据--%>

${address}<%-- 等价于: pageContext.findAttribute(name) --%>

温馨提示:通过上面的演示,发现EL表达式从四个域中取值,就是在代替使用PageContext中的getAttribute方法取值的麻烦,底层依然在使用PageContext中的getAttribute方法。

脚下有雷,注意安全:使用pageContext的getAttribute方法或者findAttribute方法从4个范围中取出数据的时候,如果指定的key不存在会得到null,而使用el表达式取出的时候指定的key不存在,页面上什么都没有。

java代码获取值:<%=pageContext.getAttribute("address",pageContext.PAGE_SCOPE)%>


el表达式: ${pageScope.address}

页面结果:

5.3.EL表达式获取复杂数据重点重点重点

这里说的复杂数据是指:数组,集合,自定义对象。

5.3.1.演示EL获取数组中的值

获取数组数据

<%

// 创建数组

int[] arr = {11, 33, 66, 88};

// 将数组放到page域中

pageContext.setAttribute("arr1", arr);

%>

${arr1} ${arr1[0]}  ${arr1[1]}  ${arr1[2]}  ${arr1[3]} ${arr1[10]}

页面结果:

5.3.2.演示EL获取集合中的值

获取集合中的值

<%

List list =newArrayList();

Collections.addAll(list,"aaa","ccc","liuyan");

// 将list存到page域中

pageContext.setAttribute("list1", list);

%>

${list1} ${list1[0] } ${list1[1] } ${list1[2] }

页面结果:

5.3.3.演示EL获取自定义对象属性值

publicvoidsetUsername(String username) {

首先需要在项目中创建一个自定义的对象,这里创建User对象。并且针对User对象中的属性提供相应的get和set方法。

publicclassUser {

privateintid;

privateStringusername;

privateStringpassword;

publicintgetId() {

returnid;

}

publicvoidsetId(intid) {

this.id= id;

}

publicString getUsername() {

returnusername;

}

publicvoidsetUsername(String username) {

this.username= username;

}

this.username= username;

}

publicString getAddress() {

return"上海市航渡路18号";

}

publicvoidsetPassword(String password) {

this.password= password;

}

}

获取自定义对象的数据

<%

// 创建自定义对象

User user =newUser();

user.setId(1);

user.setUsername("柳岩");

user.setPassword("123");

// 将自定义user对象放到page域中

pageContext.setAttribute("user1", user);

%>

${user1}

${user1.id }

${user1.username }

${user1.password }

${user1.address }

页面结果:

脚下留心:在使用el表达式取出数组,集合,自定义对象中的数据的时候,能够使用.的地方都可以使用中括号。特别是在map集合或者自定义对象中key值或自定义对的属性名中包含多个字符的时候必须使用中括号搞定。

获取map数据

<%

// 创建map集合

Map map =newHashMap();

map.put("aaa","111");

map.put("ccc.xxx.yyy","333");

map.put("eee","555");

// 将map放到page域中

pageContext.setAttribute("map1", map);

%>

${map1 }

${map1.aaa}

${map1['ccc.xxx.yyy']}

${map1.eee}

脚下留心

EL表达式中,获取对象的属性的值的时候,其实不是在看这个对象所在的类是否有这个属性,只要这个对象所在的类中有getXxxxx方法可以使用EL表达式获取Xxxx值。

1.1.EL表达式执行运算(判断容器重点)

1使用el进行简单的运算的时候,如果指定的范围中的key不存在,

这时就不会去使用这个值计算,但是存在的依然会进行运算

需求1:将a和b保存到page域中,使用el计算a+b

需求2:将a和b保存到page域中,使用el计算a+b+c

2可以使用empty验证某个容器或者变量是否为null

格式: ${ empty集合或变量等}

如果集合元素的个数为0或者 变量为null则返回true;否则 返回false.

常用方式:

el中三元运算符: ${empty对象?表达式1 :表达式2 }

需求1:使用el表达式 判断集合是否为空

需求2:使用el表达式 判断用户是否存在


<%--需求1: 使用el表达式 判断集合是否为空--%>

<%

// 创建集合,并方法page域中

List list =newArrayList();

pageContext.setAttribute("list1", list);

%>

${emptylist1} ${not emptylist1}

${emptylist1 ? "为空":"不为空"}

${not emptylist1 ? "不为空":"为空"}


<%--需求2: 使用el表达式 判断用户是否存在--%>

<%

// 创建user对象, 将user对象放到page域中

User user =newUser();

user.setUsername("柳岩");

pageContext.setAttribute("user1", user);

%>

${emptyuser1 ? "匿名登录" : user1.username }

推荐阅读更多精彩内容