Java进阶学习第十二天——JSP JavaBean EL

文档版本 开发工具 测试平台 工程名字 日期 作者 备注
V1.0 2016.05.04 lutianfei none

session(拓展)

session的追踪(了解)

session的创建和销毁

  • 创建session : 第一次访问资源,调用request.getSession()
  • session销毁的三种方法:
    • 非正常关闭服务器
    • session的过期,默认是30分钟。(tomcat/conf/web.xml)
        <session-config>
        <session-timeout>30</session-timeout>
        </session-config>
* 调用session.invalidate() 手动销毁session
  • session的域对象
    • ServlerContext :代表整个web应用,数据库链接
    • session :一次会话,存放个人的信息。
    • request :一次请求,存放错误处理。


JSP

JSP概述

  • JSP(Java Server Pages)与Java Servlet一样,是在服务器端执行的
    • 不同的是先由服务器编译部署成Servlet执行
  • JSP技术的企业最佳实践
    • 生成html内容
  • 新的JSP2.0规范版本包括新的功能
    • EL表达式
JSP的设置
  • 设置JSP文件的打开方式:window –> preferences –> General –> Editors –> File Associations –> *.jsp – 选择MyEclipse JSP Editor – default
  • 设置JSP文件的编码:window –> preferences–> 搜索JSP –> 找到JSP –> 选择UTF-8

JSP页面的注释

  • HTML的注释 <!-- --> JSP文件的阶段存在,在翻译成java文件也存在, 在页面存在
  • JAVA的注释 JSP文件的阶段存在,在翻译成java文件也存在, 在页面不存在
  • JSP的注释 <%-- JSP的注释 --%> 只会存在JSP文件的阶段,编译阶段消失。

JSP的指令元素

  • 功能

    • 用于指示JSP执行某些步骤
    • 用于指示JSP表现特定行为
  • 语法:<%@ 指令元素 属性名=属性值 %> : <%@ directive [ attribute =“value” ] %>

  • 分类

    • page指令标记,设置JSP的属性
    • include指令标记,包含页面
    • taglib指令标记 :引入标签库文件
page指令标记
  • page属性包含在<%@ page%>之间。
  • 这些属性可以单独使用,也可以几个或多个同时使用
  • page指令用来定义JSP文件的全局属性
  • 在JSP页面中,只有import可以出现多次,其它属性都只能出现一次

  • 属性:

    • language :JSP文件允许嵌入的语言。只支持一种JAVA语言。(不需要改变)
    • extends :JSP翻译成Servlet文件,servlet继承的类。(不需要改变)
    • session :默认值是true,可以直接使用session。设置false,不能直接使用。
    • import :引入java的jar包(使用多次)
    • buffer :设置缓冲区的大小 默认8kb
    • aotoFlush :设置默认刷新缓冲区(不要修改)
    • errorPage :指定错误页面
    • isErrorPage :设置值,可以是exception对象,设置true,使用exception,设置false不能使用exception对象
    • contentType :服务器端输出所有内容采用编码。
    • pageEncoding :JSP翻译成Servlet文件时采用的编码。
    • isELIgnored :是否忽略EL表达式(false,不忽略,true,忽略)
    • 重点:
      • session import contentType pageEncoding isELIgnored

Java进阶学习第十二天——JSP JavaBean EL_第1张图片
Java进阶学习第十二天——JSP JavaBean EL_第2张图片

  • 配置全局的错误页面
  • 在web.xml中进行配置。
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
 </error-page>

 <error-page>
<error-code>500</error-code>
<location>/500.jsp</location>
 </error-page>


  • page指令练习
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" session="true" buffer="8kb" autoFlush="true" errorPage="/jsp/error.jsp" isELIgnored="false"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

<h4>欢迎</h4>

<% List list = new ArrayList(); // int a = 10 / 0; request.setAttribute("username", "小风"); %>

<!-- HTML的文本 -->
${ username }

</body>
</html>


include指令标记
  • include指令的语法<%@ include file=“filename” %>
  • include指令的作用是在JSP页面中静态包含一个文件,同时由JSP解析包含的文件内容
  • 静态包含的含义
    • file不能为变量
      • <% String url="index.html" ; %>
      • <%@ include file = "<%= url %>" %>
    • 不可以在file 所指定的文件后接任何参数
      • <%@ include file = "jw.jsp?nm=browser" %>

Java进阶学习第十二天——JSP JavaBean EL_第3张图片


  • 静态包含举例
    • 包含的是目标文件的源码;包含过来,一起翻译
//head.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<h3>网站的LOGO</h3>

//////

//menu.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <h3>网站的超链接</h3>

///////

//foot.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<h3>网站的友情链接</h3>

//////

//body.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

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

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

<%@ include file="/include/head.jsp" %>
<%@ include file="/include/menu.jsp" %>
    <h3>网站的新闻(数据变化)</h3>
<%@ include file="/include/foot.jsp" %>


</body>
</html>


taglib指令标记
  • Taglib指令用于在JSP页面中导入标签库
  • 常用标签库JSTL
  • 常用属性
    • uri 标签文件的URI地址
    • prefix 标签组的命名空间前缀
    • 语法:<%taglib %>


JSP的内置对象(9个)

  • request response session application out pageContext page config exception
内置对象 真实的对象 方法
request HttpServletRequest setAttribute() getAttribute()
response HttpServletResponse addCookie() getWriter()
session HttpSession setAttribute() getAttribute()
application ServletContext setAttribute() getAttribute()
config ServletConfig getInitParameter() getInitParameterNames()
exception Throwable getMessage()
page this(HttpServlet)Object (不使用对象)
out JspWriter write() print()
pageContext PageContext setAttribute() getAttribute()

Java进阶学习第十二天——JSP JavaBean EL_第4张图片


exception对象
  • exception对象是java.lang.Trowable类的实例
  • 前提条件:isErrorPage="true",才能使用exception对象。
  • exception对象用来处理JSP文件在执行时所有发生的错误和异常
  • exception对象可以和page指令一起使用,通过指定某一个页面为错误处理页面,对错误进行处理<%@ page isErrorPage=”true “%>的页面内使用


page对象
  • 当前页面的对象。
  • “page” 对象代表了正在运行的由JSP文件产生的类对象 【一般不建议使用】
  • page对象是指向当前JSP程序本身的对象this
  • page对象其实是java.lang.Object类的实例对象


out对象
  • 向客户端输出数据
  • 管理服务器输出缓冲区
  • 内部使用PrintWriter对象来输出文本级数据
  • 通过page指令的buffer属性来调整缓冲区的大小,默认的缓冲区是8kb
    Java进阶学习第十二天——JSP JavaBean EL_第5张图片

  • 举例:


<%= "HELLO" %>
<% out.print("AAAA"); %>
<% response.getWriter().print("BBBB"); %>
<% out.print("CCCC"); %>
* 输出结果:
 //BBBB HEELO AAAA CCCC

Java进阶学习第十二天——JSP JavaBean EL_第6张图片


  • out隐式对象的工作原理图
    Java进阶学习第十二天——JSP JavaBean EL_第7张图片


pageContext对象
  • pageContext对象可以直译为“页面上下文”对象,代表的是当前页面运行的一些属性。
  • 它是javax.servlet.jsp.PageContext类的实例对象,可以使用PageContext类的方法。pageContext对象提供了对JSP页面所有的对象及命名空间的访问。
  • pageContext对象提供了page范围的存取方法

  • pageContext也是域对象,代表当前的页面范围,在当前的页面范围内获取数据。

  • 向JSP的四个作用域范围内存数据。
    • Servlet中有三个域,而JSP有四个域。
    • JSP中多了pageContext的域范围,代表当前页面范围。
  • 获取其他8个内置对象。

    • 编写框架、通用性较高的代码。
  • pageContext中的方法:

    • setAttribute(String name, Object value)
    • setAttribute(String name, Object value, int scope)
    • getAttribute(String name)
    • getAttribute(String name, int scope)
    • removeAttribute(String name)
    • removeAttribute(String name, int scope)
    • findAttribute(String name)
  • JSP的四种数据范围

    • ServletContext 整个web应用
      • application 应用范围
    • session 一次会话,会话范围
    • request 一次请求,请求范围
    • pageContext 当前页面,page范围
  • 通过pageContext获得其他对象(默认从最小的域开始取)

    • getException方法返回exception隐式对象
    • getPage方法返回page隐式对象
    • getRequest方法返回request隐式对象
    • getResponse方法返回response隐式对象
    • getServletConfig方法返回config隐式对象
    • getServletContext方法返回application隐式对象
    • getSession方法返回session隐式对象
    • getOut方法返回out隐式对象
    • pageContext封装其它8大内置对象的意义,思考:如果在编程过程中,把pageContext对象传递给一个普通java对象,那么这个java对象将具有什么功能?
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

<%=request.getParameter("username") %>

<h4>pageContext向其他域中存入值</h4>    
<% pageContext.setAttribute("name", "美美"); // 下面这句等价于上面 pageContext.setAttribute("name", "美美", pageContext.PAGE_SCOPE); request.setAttribute("name", "小凤"); // 向request域中存入值 pageContext.setAttribute("name", "小凤", pageContext.REQUEST_SCOPE); // 向session域存入值 pageContext.setAttribute("name", "小苍", pageContext.SESSION_SCOPE); // 向ServletContext域存入值 pageContext.setAttribute("name", "小班长", pageContext.APPLICATION_SCOPE); %>

<%= pageContext.getAttribute("name", pageContext.SESSION_SCOPE)%>
<%= session.getAttribute("name") %>


${ pageScope.name }
${ requestScope.name }
${ sessionScope.name }
${ applicationScope.name }

</body>
</html>


JSP的标签

  • JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护。
JSP常用标签
  • 把数据封装到JavaBean中(JSP页面中完成)
    • <jsp:useBean> 使用一个ID和一个给定作用范围和同一ID的JavaBean相关联
    • <jsp:setProperty> 设置JavaBean的属性值
    • <jsp:getProperty> 取得JavaBean的属性值
  • <jsp:include> 页面的包含(服务器端路径,没有项目名称)
    • 属性:page 要包含的页面
  • <jsp:forward> 在JSP的页面中完成转发(服务器端路径,没有项目名称)
    • 属性:page 要转发的页面
  • <jsp:param> 传递参数,需要写在<jsp:forward>的中间
    • 属性:name:参数名称 value:参数值


  • 动态包含原理
    Java进阶学习第十二天——JSP JavaBean EL_第8张图片


指令 <jsp:forward><jsp:param>
  • 将请求传递给另一个JSP页面(转发)。<jsp:forward page=“转发路径”} />
  • <jsp:param>用来传递参数,可以写在<jsp:forward>中间,可以使用request.getParameter();来接收参数

  • param,forward 练习

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

<h4>JSP的动作标签</h4>
<jsp:forward page="/jsp/pageContext.jsp">
    <jsp:param name="username" value="meimei"/>
</jsp:forward>

</body>
</html>


  • 在Servlet中如果使用request.getRequestDispatcher.forward进行页面跳转,那么该语句以后的代码会执行:
    request.getRequestDispatcher.forward(“XXX”);
    System.out.println(“It can execute…”);

  • 但是JSP中<jsp:forward>后面的代码不会执行,因为翻译的时候,Serlvet容器自动为<jsp:forward>后面添加了return语句

<% String s=request.getRemoteAddr(); if(s.startsWith("10.28.176.",0)){ %>
    <jsp:forward page="index_inner.jsp"/>
    <%}else{ %>
    <jsp:forward page="index_outter.jsp"/>
<% } %>


<jsp:include>include指令的比较
  • <jsp:include>标签是动态引入<jsp:include>标签涉及到的2个JSP页面会被翻译成2个servlet,这2个servlet的内容在执行时进行合并。
  • include指令静态引入,涉及到的2个JSP页面会被翻译成一个servlet,其内容是在源文件级别进行合并。
  • 不管是<jsp:include>标签,还是include指令,它们都会把两个JSP页面内容合并输出,所以这两个页面不要出现重复的HTML全局架构标签,否则输出给客户端的内容将会是一个格式混乱的HTML文档。

  • 两种include用法的区别
    Java进阶学习第十二天——JSP JavaBean EL_第9张图片

  • 主要有两个方面的不同:

    • 一、执行时间上:
      • <%@?include?file=“relativeURI”%>是在翻译阶段执行;
      • <jsp:include?page=“relativeURI”?flush=“true”?/>请求处理阶段执行。
    • 二、引入内容的不同:
      • <%@?include?file=“relativeURI”%>引入静态文本(html,jsp),在JSP页面被转化成servlet之前和它融和到一起。
      • <jsp:include?page=“relativeURI”?flush=“true”?/>引入执行页面或servlet所生成的应答文本
    • 另外在两种用法中file和page属性都被解释为一个相对的URI。如果它以斜杠/开头,那么它就是一个环境相关的路径,将根据赋给应用程序的URI的前缀进行解释;如果它不是以斜杠开头,那么就是页面相关的路径,就根据引入这个文件的页面所在的路径进行解释
<!-- index.jsp --> 无法编译
<% int num = 100; if (num > 10) { %>
<%@ include file="a.jsp"%>
<% } else { %>
<%@ include file="b.jsp"%>
<% } %> 一起编译执行


<!-- index.jsp --> 显示正常a.jsp
<% int num = 100; if (num > 10) { %>
<jsp:include page="a.jsp" />
<% } else { %>
<jsp:include page="b.jsp" />
<% } %> else无法执行


<!-- b.jsp 是一个有错误-->
<%=new java.util.Date()<u style="text-underline:single">;</u> %>


指令<jsp:forward>
  • 将请求传递给另一个JSP页面。
<jsp:forward page={"relativeURL" | "<%= expression %>"} /> <jsp:forward page={"relativeURL" | "<%= expression %>"} > <jsp:param name="PN" value="{PV | <%= expression %>"}/> * </jsp:forward>
  • <jsp:forward>之后的代码不执行


JavaBean和内省

什么是JavaBean?

  • JavaBean是一个遵循特定写法的Java类,它通常具有如下特点:
    • 这个Java类必须具有一个无参的构造函数
    • 属性私有化。
    • 私有化的属性必须通过public类型的方法暴露给其它程序,并且方法的命名也必须遵守一定的命名规范。
public class User(){
    private String username;
    private String password;
    public void setUsername(){

    }
    public void getUsername(){

    }
    public void getPassword(){

    }
    public void getInfo(){

    }
}


  • 作用:

    • JavaBean在J2EE开发中,通常用于封装数据,对于遵循以上写法的JavaBean组件,其它程序可以通过反射技术实例化JavaBean对象,并且通过反射那些遵守命名规范的方法,从而获知JavaBean的属性,进而调用其属性保存数据。
  • 把数据封装到JavaBean中(JSP页面中完成的)

<jsp:useBean id="u" class="cn.itcast.vo.User"></jsp:useBean>
<jsp:setProperty property="username" name="u"/>
<jsp:setProperty property="password" name="u"/>
或者
<jsp:setProperty property="*" name="u"/>


<jsp:getProperty property="username" name="u"/>
<jsp:getProperty property="password" name="u"/>


JavaBean的属性

  • JavaBean的属性可以是任意类型,并且一个JavaBean可以有多个属性。每个属性通常都需要具有相应的setter、 getter方法,setter方法称为属性修改器getter方法称为属性访问器
  • 属性修改器必须以小写的set前缀开始,后跟属性名,且属性名的第一个字母要改为大写
    • 例如,name属性的修改器名称为setName,password属性的修改器名称为setPassword。
  • 属性访问器通常以小写的get前缀开始,后跟属性名,且属性名的第一个字母也要改为大写
    • 例如,name属性的访问器名称为getName,password属性的访问器名称为getPassword。
  • 一个JavaBean的某个属性也可以只有set方法或get方法,这样的属性通常也称之为只写、只读属性。


在JSP中使用JavaBean

  • JSP技术提供了三个关于JavaBean组件的动作元素,即JSP标签,它们分别为:
  • <jsp:useBean>标签:用于在JSP页面中查找或实例化一个JavaBean组件。
  • <jsp:setProperty>标签:用于在JSP页面中设置一个JavaBean组件的属性。
  • <jsp:getProperty>标签:用于在JSP页面中获取一个JavaBean组件的属性。

  • 编写表单页面,把数据提交到另一个JSP的页面,可以使用传统方式封装数据,也可以使用<jsp:userBean>来封装数据。

  • 设置属性是<jsp:setProperty name=“u” property=“*”> : * 代表所有的属性


<jsp:useBean>标签

  • <jsp:useBean>标签用于在指定的域范围查找指定名称的JavaBean对象:
    • 如果存在则直接返回该JavaBean**对象的引用**。
    • 如果不存在实例化一个新的JavaBean对象并将它以指定的名称存储到指定的域范围中。
  • 常用语法:<jsp:useBean id="beanName" class="cn.itcast.Test" scope="page|request|session|application"/>
  • id属性用于指定JavaBean实例对象的引用名称和其存储在域范围中的名称
  • class属性用于指定JavaBean的完整类名(即必须带有包名)。
  • scope属性用于指定JavaBean实例对象所存储的域范围,其取值只能是page、request、session和application等四个值中的一个,其默认值是page
<jsp:useBean>执行原理

<jsp:useBean id="currentDate" class="java.util.Date"/>

//翻译成的Servlet源码:
java.util.Date currentDate = null;
synchronized (_jspx_page_context) {
    currentDate = (java.util.Date)_jspx_page_context.getAttribute(
                "currentDate", PageContext.PAGE_SCOPE);
    if (currentDate == null){
        currentDate = new java.util.Date();
        _jspx_page_context.setAttribute("currentDate",
                currentDate, PageContext.PAGE_SCOPE);
    }
}


带标签体的<jsp:useBean>标签
  • 语法:
    <jsp:useBean ...>
        Body
    </jsp:useBean> 
  • 功能:
    • Body部分的内容只在<jsp:useBean>标签创建JavaBean的实例对象时才执行。


<jsp:setProperty>标签

  • <jsp:setProperty>标签用于设置和访问JavaBean对象的属性。
  • 语法格式:
<jsp:setProperty name="beanName" 
{ 
    property="propertyName" value="{string | <%= expression %>}" |
    property="propertyName" [ param="parameterName" ] | 
    property= "*" 
}/>
  • name属性用于指定JavaBean对象的名称。
  • property属性用于指定JavaBean实例对象的属性名。
  • value属性用于指定JavaBean对象的某个属性的值,value的值可以是字符串,也可以是表达式。为字符串时,该值会自动转化为JavaBean属性相应的类型,如果value的值是一个表达式,那么该表达式的计算结果必须与所要设置的JavaBean属性的类型一致。
  • param属性用于将JavaBean实例对象的某个属性值设置为一个请求参数值,该属性值同样会自动转换成要设置的JavaBean属性的类型。


<jsp:getProperty>标签

  • <jsp:getProperty>标签用于读取JavaBean对象的属性,也就是调用JavaBean对象的getter方法,然后将读取的属性值转换成字符串后插入进输出的响应正文中。
  • 语法:<jsp:getProperty name="beanInstanceName" property="PropertyName" />
    • name属性用于指定JavaBean实例对象的名称,其值应与<jsp:useBean>标签的id属性值相同。
    • property属性用于指定JavaBean实例对象的属性名
    • 如果一个JavaBean实例对象的某个属性的值为null,那么,使用<jsp:getProperty>标签输出该属性的结果将是一个内容为“null”的字符串。


内省 (Introspector)

  • 访问JavaBean属性的两种方式:
    • 直接调用bean的setXXX或getXXX方法。
    • 通过内省技术访问(java.beans包提供了内省的API)
      • 内省技术是基于反射技术的
      • 通过Introspector类获得Bean对象的 BeanInfo,然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor ),通过这个属性描述器就可以获取某个属性对应的 getter/setter方法,然后通过反射机制来调用这些方法。
@Test
public void run() throws Exception{
User user = new User();
// 获取类的信息
BeanInfo info = Introspector.getBeanInfo(user.getClass());
// 获取属性的描述
PropertyDescriptor [] pds = info.getPropertyDescriptors();
// 循环遍历,获取属性的名称
for (PropertyDescriptor pd : pds) {
// System.out.println(pd.getName());
if(!"class".equals(pd.getName())){
// 获取写的方法
Method m = pd.getWriteMethod();
m.invoke(user, "admin");
}
}

System.out.println(user.getUsername());
System.out.println(user.getPassword());
}


beanutils工具包

  • Apache组织开发了一套用于操作JavaBean的API,这套API考虑到了很多实际开发中的应用场景,因此在实际开发中很多程序员使用这套API操作JavaBean,以简化程序代码的编写。
  • Beanutils工具包的常用类:

    • BeanUtils
      • populate(Object bean, Map properties)
    • 自定义转换器
      • ConvertUtils.regsiter(Converter convert, Class clazz)
      • 传入日期类型的Date.class
  • 导入jar包,放在WEB-INF–>lib目录下

    • commons-beanutils-1.8.3.jar
    • commons-logging-1.1.1.jar
  • 把字符串转换成日期类型

    • 编写一个类,实现Converter接口。重写该方法。eg:把字符串转换日期。
    • 在封装数据之前进行注册。
    • ConvertUtils.register(Converter converter, Class clazz) Date.class
/** * 字符串转换日期类 * @author Administrator * */
public class MyDateConverter implements Converter{

    /** * 字符串转换成日期 */
    public Object convert(Class clazz, Object obj) {
        // 把输入的字符串,转换成日期类型,返回
        String dDate = (String) obj;
        // 把字符串转换成日期
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date date;
        try {
            date = sdf.parse(dDate);
        } catch (ParseException e) {
            e.printStackTrace();
            throw new RuntimeException("转换日期错误");
        }
        return date;
    }

}
  • UserBeanUtilServlet类
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 获取数据
        Map<String, String []> map = request.getParameterMap();
        // 创建User对象
        User user = new User();

        // 完成注册
        ConvertUtils.register(new MyDateConverter(), Date.class);

        // 完成封装
        try {
            BeanUtils.populate(user, map);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

        // 打印
        System.out.println(user.getUsername());
        System.out.println(user.getPassword());
        System.out.println(user.getMoney());
        System.out.println(user.getBirthday());
    }


EL表达式

EL表达式简介

  • 语法:${ }
  • EL 全名为Expression Language。EL主要作用:
  • 获取数据:
    • EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象、获取数据。(某个web域 中的对象,访问javabean的属性、访问list集合、访问map集合、访问数组)
  • 执行运算:
    • 利用EL表达式可以在JSP页面中执行一些基本的关系运算、逻辑运算和算术运算,以在JSP页面中完成一些简单的逻辑运算。${user==null}
  • 获取web开发常用对象
    • EL 表达式定义了一些隐式对象,利用这些隐式对象,web开发人员可以很轻松获得对web常用对象的引用,从而获得这些对象中的数据。
  • 调用Java方法
    • EL表达式允许用户开发自定义EL函数,以在JSP页面中通过EL表达式调用Java类的方法。

EL注意事项

  • EL表达式是JSP 2.0(JavaEE1.4)规范中的一门技术 。因此,若想正确解析EL表达式,需使用支持Servlet2.4/JSP2.0技术的WEB服务器。
  • 注意:有些Tomcat服务器如不能使用EL表达式
    • (1)升级成tomcat6
    • (2)在JSP中加入<%@ page isELIgnored="false" %>

* EL获取(域对象中的)数据*

  • 使用EL表达式获取数据语法:${标识符}
  • EL表达式语句在执行时,会调用pageContext.findAttribute方法,用标识符为关键字,分别从page、request、session、application四个域中查找相应的对象,找到则返回相应对象,找不到则返回 (注意,不是null,而是空字符串)。
  • 示例:${user}

  • EL表达式也可以很轻松获取JavaBean的属性,或获取数组、Collection、Map类型集合的数据,例如:

    • ${user.address.city}
    • ${user.list[0]}:访问有序集合某个位置的元素
    • ${map.key} : 获得map集合中指定key的值
  • .[ ] 区别
  • 结合JSTL的foreach标签,使用EL表达式也可以很轻松迭代各种类型的数组或集合,示例:
    • 迭代数组
    • 迭代collection类型集合
    • 迭代map类型集合
<h4>获取域对象中的值</h4>
<% pageContext.setAttribute("name", "黄海波"); request.setAttribute("name", "美美"); %>

${ pageScope.name }
${ requestScope.name }



<h4>域中数组的值</h4>
<% String [] arrs = {"美美","波波","东东","名名"}; request.setAttribute("arrs", arrs); %>
${ arrs[2] }



<h4>域中集合的值</h4>
<% List<String> list = new ArrayList<String>(); list.add("美美"); list.add("小凤"); list.add("芙蓉"); request.setAttribute("list", list); %>
${ list[1] }


<h4>域中Map集合的值</h4>
<% Map<String,String> map = new HashMap<String,String>(); map.put("aa", "美美"); map.put("bb", "小凤"); request.setAttribute("map", map); %>
${ map.bb }



<h4>域中集合中有对象的值</h4>
<% List<User2> uList = new ArrayList<User2>(); uList.add(new User2("banzhang","123")); uList.add(new User2("美美","abc")); request.setAttribute("uList", uList); %>
${ uList[1].username }


EL执行运算

  • 语法:${运算表达式},EL表达式支持如下运算符:
    Java进阶学习第十二天——JSP JavaBean EL_第10张图片
    Java进阶学习第十二天——JSP JavaBean EL_第11张图片

  • empty运算符:检查对象是否为null或“空”

  • 二元表达式:${user!=null?user.name : “”}

<h4>加法运算</h4> ${ n1 + n2 } <h3>关系运算</h3> <h4>大于</h4> ${ n1 > n2 } 或者 ${ n1 gt n2 } <h4>小于</h4> ${ n1 < n2 } 或者 ${ n1 lt n2 } <h4>等于</h4> ${ n1 == n2 } 或者 ${ n1 eq n2 } <h4>不等于</h4> ${ n1 != n2 } 或者 ${ n1 ne n2 } <h4>大于等于</h4> ${ n1 >= n2 } 或者 ${ n1 ge n2 } <h4>小于等于</h4> ${ n1 <= n2 } 或者 ${ n1 le n2 } <h3>逻辑运算</h3> <h4></h4> ${ n1 > n2 && n3 > n4 } 或者 ${ n1 > n2 and n3 > n4 } <h4></h4> ${ n1 > n2 || n3 > n4 } 或者 ${ n1 > n2 or n3 > n4 } <h4></h4> ${ !(n1 > n2) } 或者 ${ not (n1 > n2) }


EL表达式保留关键字

Java进阶学习第十二天——JSP JavaBean EL_第12张图片

  • 所谓保留字的意思是指变量在命名时,应该避开上述的名字,以免程序编译时发生错误


获取WEB开发中的对象

  • EL表达式语言中定义了11个隐含对象,使用这些隐含对象可以很方便地获取web开发中的一些常见对象,并读取这些对象的数据。
  • 语法:${隐式对象名称} :获得对象的引用

Java进阶学习第十二天——JSP JavaBean EL_第13张图片
Java进阶学习第十二天——JSP JavaBean EL_第14张图片

  • param 获取请求的参数 getParameter()
  • paramValues 获取请求的参数 getParameterValues()
  • header 获取请求头的信息
  • headerValues 获取请求头的信息
  • initParam 获取全局的初始化参数
  • cookie 获取cookie
  • pageContext

  • 测试各个隐式对象

  • 注意事项
    • 测试headerValues时,如果头里面有- ,例Accept-Encoding,则要headerValues[“Accept-Encoding”]
    • 测试cookie时,例${cookie.key}取的是cookie对象,如访问cookie的名称和值,须${cookie.key.name}${cookie.key.value}
<h4>EL的WEB对象</h4>
${ param.username }


<h4>获取请求头</h4>
${ header.referer }

<h4>获取全局初始化参数</h4>
${ initParam.username }

<h4>pageContext对象</h4>
${ pageContext.request.contextPath }

你可能感兴趣的:(jsp,javabean,el表达式,java进阶,内省技术)