一、EL与JSTL作用:
简化JSP文件上java代码开发步骤。
二、jsp主要的开发任务
将域对象中的数据读取并写入响应体中。
三、在jsp中使用java命令,将域对象中的数据读取并写入到响应体(客户端)
域对象读取的数据都是object类型 需要进行数据转换 eg: <% String value = (String)request.getAttribute("key"); //out.write(value); %> <%=value%>
五、EL的标准格式:
${域对象别名.关键字},他会到指定域对象读取对应关键字内容,并自动将内容写入到响应体中
六、JSP文件中域对象
1.application: 全局作用域对象 2.session: 会话作用域对象 3.request: 请求作用域对象 4.pageContext: 当前页作用域对象(很少使用)
七、EL表达式中域对象的别名
JSP EL application applicationScope session sessionScope request requestScope pageContext pageScope
八、EL表达式 将 高级对象属性写入到响应体中
${域对象.关键字.属性} EL表达式使用反射机制,通过调节当前属性对应的get方法 读取属性内容 所以直接.属性即可 不用.get属性()
九、EL表达式简化版
可以省略域对象别名 ${关键字} 原理: 你没有给他作用域对象,人家就猜白 从 小作用域到 大作用域 去定位关键字,如果有就读取并输出并结束执行 即pageContext-->request-->session-->application 缺点: 1.增加运行时间。 2.导致定位错误 即 获取信息错误 例如 你在session和pageContext中同时设置相同关键字, 你通过${关键字}获取的是pageContext中的值而不是session中的 【适用场景】:专门为pageContext读取数据并写入响应体作准备
十、EL表达式所支持的运算
1.数学运算 注: EL表达式会根据key获取的value的类型自动进行数据类型转换 <% String key1 = (String) pageContext.getAttribute("key1"); String key2 = (String) pageContext.getAttribute("key2"); %> EL表达式:${key1+key2} ------ 3 2.关系运算 正常运算符 > >= < <= == != EL中的别名 gt ge lt le eq != EL表达式不支持java中的if else 可以使用三元运算符 判断语句 ? 结果1 : 结果2 ; ${age ge 18 ?"欢迎光临" : "未满18,禁止入内!"} 3.逻辑运算
十一、 EL表达式 其他内置对象
1.param: 【作用】:读取请求协议包(request)中参数内容 【格式】:${param.请求参数名} 【相当于】: String value = (String) request.getParameter("请求参数名") out.write(value); 2.paramValues: 【作用】:读取请求协议包(request)中关联的多个请求参数,将参数内容保存到数组中 【格式】:${paramValues.请求参数名} 【相当于】: String array[] = request.getParameterValues("请求参数名") (该请求参数中含有多个值) 注: 因为单独EL表达式中没有循环,所以每个信息对应值的下标需要自己写 返回的数组[下标] 所以需要结合jstl去循环 3.initParam:(基本用不到) 【作用】: 【格式】:${initParam.共享数据名} 【相当于】: String value = application.getInitParameter("driver"); out.write(value); eg: web.xml文件中 <context-param> <param-name>driver</param-name> <param-value>com.mysql.jdbc.Driver</param-value> </context-param> JSP文件中 来自web.xml中的共享数据:${initParam.driver} 前端页面 来自web.xml中的共享数据:com.mysql.jdbc.Driver 4.
十二、相对路径和绝对路径
1.相对路径与绝对路径区别: 1、相对路径:以当前文件位置为起点,定位其他的资源文件 2、绝对路径:以当前网站的根目录,定位其他资源文件 “./”:代表目前所在的目录。 “../”:代表上一层目录。 以”/”开头:代表根目录。
十三、EL表达式的缺陷
1.只能读取域对象数据,不能向域对象中写入数据 或 更改数据 2.不支持控制语句 什么if判断 while循环 单独EL表达式都不能做到 所以如果单独使用EL表达式,无法确保JSP文件中所有的java命令都被替换
JSTL
1. 介绍
JSTL(JavaServerPages Standard Tag Library)JSP标准标签库 1.为什么要用JSTL:可以编写没有java代码的jsp页面。 使JSP页面很容易被WEB设计人员理解,表达更清晰。减少程序出错,使程序容易维护。 2.JSTL标准标签库: 核心标签库:java在jsp上基本功能进行封装,如if,while; 常用的是if和forEach sql标签库;JDBC在jsp中使用功能(不重要) xml标签;DOM4J在jsp上使用(不重要) Format标签:JSP文件格式转换(不重要) 3.说白了,JSTL常实现网页逻辑判断和迭代显示的, 4.需要引入<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 《掩耳盗铃|披着羊皮的狼 ,本质还是java命令,只不过看着像HTML标签》
2. 配置
1.导入依赖jar: <!-- https://mvnrepository.com/artifact/jstl/jstl --> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> 2.在JSP文件中引入JSTL中core包依赖约束(固定格式,直接复制粘贴) <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> uti--- prefix---前缀名
3. 标签使用
1.<c:set>: [作用]:在jsp文件上设置域对象中共享数据 [使用]:<c:set scope="session",var="key",value="10"/> [属性]: scope: 指定操作的域对象的别名 scope="application/session/request/page" var: 声明域对象关键字 value: 想要存入的共享数据 [相当于]: <% session.setAttribute("key","10"); %> 2.<c:if> [作用]:在jsp文件中控制那些内容可以写入到响应体中 就是java的if [使用]:<c:if test="EL表达式写的判断"> 内容 </c:if> 注; 经常会在jstl中嵌入EL表达式 eg: <c:set scope="request" var="age" value="20"/> <c:set scope="request" var="age" value="${requestScope.age+1}"/> 系统会先执行EL表达式再执行jstl 3.<c:choose> [作用]:在jsp文件中实现多分支选择判断,决定哪部分内容可以写入响应体中。就是java中的else if [使用]:<c:choose> <c:when test="EL表达式写的判断1">内容1 对应if </c:when> <c:when test="EL表达式写的判断2">内容2 对应if</c:when> <c:otherwise> 内容3 对应else</c:otherwise> </c:choose> 4.<c:forEach> [作用]:循环遍历 [用法1]: <c:forEach var="声明循环变量名称" begin="初始化循环变量" end="循环变量可以接收到的最大值" step="循环变量递增或递减值"> </c:forEach> step属性可以不写 默认递增1 循环变量会自动放到当前页面作用域(pageContext)中 eg: <c:forEach var="i" begin="1" end="5" step="1"> <option value="">第${i}页</option> </c:forEach> 相当于java中的 for(int i = 1; i <= 5 ; i++){} [用法2]: <c:forEach item="通过EL表达式获取域对象中的集合 如" var="声明一个循环变量"> </c:forEach> eg1: <c:forEach items="${studentSet}" var="student"> 学生编号:${student.sid} 学生姓名:${student.name} </c:forEach> 相当于java中的 for(Student student:StudentSet){} 用于遍历集合Set/List eg2: <c:forEach items="${studentMap}" var="key-value"> <tr> <td>${key-value.key}</td> <td>${key-value.value.sid}</td> <td>${key-value.value.name}</td> </tr> </c:forEach> 遍历Map集合的时候每次获得的var 是一个键值对 通过 循环遍历.key 循环遍历.value 获取对应的键值