2 EL表达式
2.1 简介
EL表达式替代jsp表达式。因为开发jsp页面的时候遵守原则:在jsp页面中尽量少些甚至不写java代码。
EL表达式作用:向浏览器输出域对象中的变量或表达式计算的结果
基本语法: ${变量或表达式} 代替<%=变量或表达式%>
2.2 EL获取不同类型的数据
普通字符串
普通的对象
数组或List集合
Map集合
2.3 EL执行表达式
算术表达式
比较表达式
逻辑表达式
判空表达式
2.4 EL的11个内置对象
pageContext
pageScope
requestScope
sessionScope
applicationScope
param
paramValues
header
headerValues
cookie
initParam
3 Jsp标签
3.1 简介
EL表达式可以替换jsp表达式,但是EL表达式局限: 不能条件判断,不能赋值,不能迭代。jsp标签替代jsp脚本,完成条件判断,赋值,迭代等等功能。
3.2 Jsp标签分类
1)jsp内置标签(动作标签): 使用的时候不需要导入标签库
2)jstl标签(标准标签): 使用的时候都需要导入标签库
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: 默认情况下为true,out标签会把输入的内容进行转义。如果不需要转义,则为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: 增加步长。默认step为 1
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.xml和tld文件。
1)翻译成java文件-》 编译成class文件-> 构造方法- 》 调用_jspService()方法
2)在内存tld文件中,查询是否存在一个uri名称为http://www.td.com的tld文件
3)得到对应的tld文件内容。
4)读到<td:showIp>内容时,截取showIp名称(就是标签),到tld文件中查询是否存在name为showIp的tag标签。
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)必须提供公开的getter和setter方法 。 (通过getter和setter操作属性)
场景:
1)项目的实体对象符合javabean的规范
2)EL表达式,访问对象的属性。${student.name} 原理:调用 getName();
3)自定义标签处理,给标签属性赋值。 setNum(int num)
4) JSP页面中可以使用javabean
JavaBean作用: 用于封装业务的数据
操作对象的属性:
通过getter或setter方法
2)编程实战:
MVC开发模式:
M(model): javabean: 封装业务数据
V(view): jsp: 显示数据(jstl+el表达式)
C(controller): servlet: 接收参数数据,调用业务逻辑,跳转视图
三层开发结构
dao层(数据持久化层): 负责数据访问,实体对象的增删改查
service层(事务层): 负责处理系统的业务逻辑
web层: servlet+jsp完成用户交互