EL表达式和jsp标签

时间:2022-04-14 13:37:51

2 EL表达式

2.1 简介

EL表达式替代jsp表达式。因为开发jsp页面的时候遵守原则:在jsp页面中尽量少些甚至不写java代码。

 

EL表达式作用:向浏览器输出域对象中的变量或表达式计算的结果

 

基本语法: ${变量或表达式}    代替<%=变量或表达式%>

 

2.2 EL获取不同类型的数据

普通字符串

普通的对象

数组或List集合

Map集合

2.3 EL执行表达式

算术表达式

比较表达式

逻辑表达式

判空表达式

2.4 EL11个内置对象

pageContext

pageScope

requestScope

sessionScope

applicationScope

param   

paramValues

header

headerValues

cookie

initParam

3 Jsp标签

3.1 简介

EL表达式可以替换jsp表达式,但是EL表达式局限: 不能条件判断,不能赋值,不能迭代。jsp标签替代jsp脚本,完成条件判断,赋值,迭代等等功能。

 

3.2 Jsp标签分类

1jsp内置标签(动作标签): 使用的时候不需要导入标签库

2jstl标签(标准标签): 使用的时候都需要导入标签库

3)自定义标签:使用的时候都需要导入标签库

 

3.3 动作标签

<jsp:forward/>   转发标签

<jsp:param/>    参数标签

<jsp:include/>    包含标签

注意:

包含标签的原理是包含与被包含的页面单独翻译成不同的java文件,然后再运行时合并在一起。 (先翻译再合并,动态包含)

静态包含 vs  动态包含

静态包含: 先合并再翻译。不能携带参数

动态包含: 先翻译再合并。携带参数

 

3.4 JSTL标签

  jstl标签,java standard tag libarary java标准标签库。

 

特点: 在使用jstl标签时需要导入标签库

 

jstl标签库分类:

核心标签库(重要)(c

国际化标签库(fmt)

EL函数库(fn)

SQL标签库(sql)

XML标签库(x)

 码农翻身

3.5 使用JSTL标签

1)导入jstl的支持jar包,在java5.0之后jstl已经是属于5.0的支持包里面。

2)使用jsp页面,需要在jsp的顶部使用taglib指令导入需要的标签库

3)使用标签:

<c:set/>

3.6 核心标签库的标签

保存数据:

<c:set></c:set>

var: 数据的名称  value: 保存的数据值  scope: 保存到哪个域。

获取数据:

     <c:out value=""></c:out>

value: 代表获取域中的某个名称内容。如果数据在域中,必须使用EL语法去获取

       default: 默认值。当前需要获取的内容为null,那么使用默认值代替

    escapeXml: 默认情况下为trueout标签会把输入的内容进行转义。如果不需要转义,则为false既可!

单条件判断

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

多条件判断

     <c:choose></c:choose>

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

     <c:otherwise></c:otherwise>

用于迭代(循环)

     <c:forEach></c:forEach>

begin: 从哪个元素开始遍历,从0开始

       end: 到哪个元素位置

       step: 增加步长。默认step1

       items: 需要遍历的数据。(数组|List集合|Map集合) 如果是获取域数据,那么使用EL表达式获取

       var: 每个元素名称

     varStatus: 当前状态对象。该对象封装当前元素状态信息。  例如 count属性: 表示当前遍历的是哪个元素,从1开始

       注意: forEach标签遍历Map集合时,把每个Map的对象使用Entry封装,

       Entry封装键对象和值对象,通过getKey()获取键对象,通过getValue()获取值对象

     <c:forTokens items="" delims=""></c:forTokens>

items: 需要遍历的字符串

        delims: 指定分割符号

        var: 每个内容的名称

重定向

    <c:redirect></c:redirect>

 

3.7 自定义标签

当现有的标签无法满足需求的时候,就需要开发者自行开发标签。

 

需求: 获取客户端的IP地址

实现SimpleTag接口/继承SimpleTagSupport类,重写doTag()方法。

编写标签库描述符(tld)文件,在tld文件中对自定义标签进行描述,并放置在WEB-INF/目录下。

注意

<body-content>:指定标签体的类型。可能取值有 4 种:

JSP:表示支持jsp标准表达式取值,即<%= %>。只能在传统标签用,简单标签不支持!

empty:没有标签体

scriptless:标签体可以包含 el 表达式和 JSP 动作元素,但不能包含 JSP 的脚本元素

tagdependent:表示标签体交由标签本身去解析处理。若指定 tagdependent,在标签体中的所有代码都会原封不动的交给标签处理器,而不是将执行结果传递给标签处理器

完成以上操作,即可在JSP页面中导入和使用自定义标签。

 

3.8 自定义标签的执行过程

访问:http://localhost:8080/jsp/tag.jsp

 

前提: tomcat启动的时候,会读取day12项目下的WEB-INF的文件。包括web.xmltld文件。

1)翻译成java文件-》 编译成class文件-> 构造方法- 》 调用_jspService()方法

2)在内存tld文件中,查询是否存在一个uri名称为http://www.td.comtld文件

3)得到对应的tld文件内容。

4)读到<td:showIp>内容时,截取showIp名称(就是标签),tld文件中查询是否存在nameshowIptag标签。

5)取出<tag>标签的内容<tag-class>字符串: com.xxt.tag.ShowIpTag

 

可以重写的方法

setJspContext方法

用于把JSP页面的pageContext对象传递给标签处理器对象

setParent方法

用于把父标签处理器对象传递给当前标签处理器对象

getParent方法

用于获得当前标签的父标签处理器对象

setJspBody方法

用于把代表标签体的JspFragment对象(即标签体内容)传递给标签处理器对象

doTag方法

用于完成所有的标签逻辑,包括输出、迭代、修改标签体内容等。在doTag方法中可以抛出javax.servlet.jsp.SkipPageException异常,用于通知WEB容器不再执行JSP页面中位于结束标记后面的内容。

4 JavaBean规范

4.1 简介

  JavaBean就是一个普通的java类,必须遵守以下规则的java类才能称为javabean

1)必须有一个无参的构造方法

2)把类的属性私有化。   (不能直接访问属性)  private

3)必须提供公开的gettersetter方法 。 (通过gettersetter操作属性)

 

场景:

1)项目的实体对象符合javabean的规范

2EL表达式,访问对象的属性。${student.name}  原理:调用 getName();

3)自定义标签处理,给标签属性赋值。  setNum(int num)

4)  JSP页面中可以使用javabean

JavaBean作用: 用于封装业务的数据

操作对象的属性:

通过gettersetter方法

 

2)编程实战:

MVC开发模式:

M(model) javabean: 封装业务数据

V(view) jsp: 显示数据(jstl+el表达式)

C(controller) servlet: 接收参数数据,调用业务逻辑,跳转视图

三层开发结构

dao(数据持久化层) 负责数据访问,实体对象的增删改

service(事务层) 负责处理系统的业务逻辑

web层: servlet+jsp完成用户交互