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 }