< %=request.getParameter(“username”)% > 等价于 ${ param.username }

本文详细介绍了JSP EL语言的定义、语法结构、变量、有效表达式、隐式对象及应用实例,帮助开发者掌握EL语言的核心用法。
  1. 一、JSP EL语言定义  
  2.   
  3.    
  4.        EL 提供了在 JSP 脚本编制元素范围外使用运行时表达式的功能。脚本编制元素是指页面中能够用于在 JSP 文件中嵌入 Java 代码的元素。它们通常用于对象操作以及执行那些影响所生成内容的计算。JSP 2.0 将 EL 表达式添加为一种脚本编制元素。  
  5.   
  6.    
  7. 二、JSP EL简介  
  8.   
  9. 1、语法结构  
  10.      ${expression}  
  11. 2、[ ]与.运算符  
  12.      EL 提供“.“和“[ ]“两种运算符来存取数据。  
  13.      当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用“[ ]“。例如:  
  14.          ${user.My-Name}应当改为${user["My-Name"] }  
  15.      如果要动态取值时,就可以用“[ ]“来做,而“.“无法做到动态取值。例如:  
  16.          ${sessionScope.user[data]}中data 是一个变量  
  17. 3、变量  
  18.      EL存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量。  
  19.      因为我们并没有指定哪一个范围的username,所以它会依序从Page、Request、Session、Application范围查找。  
  20.      假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传null。  
  21.      属性范围在EL中的名称  
  22.          Page          PageScope  
  23.          Request          RequestScope  
  24.          Session          SessionScope  
  25.          Application      ApplicationScope  
  26. 二、JSP EL 中的有效表达式  
  27.   
  28.        有效表达式可以包含文字、操作符、变量(对象引用)和函数调用。我们将分别了解这些有效表达式中的每一种:  
  29. 1、文字  
  30.   
  31. JSP 表达式语言定义可在表达式中使用的以下文字:  
  32.   
  33.   
  34. 文字  文字的值  
  35.   
  36. Boolean  
  37.       
  38.   
  39. true 和 false  
  40.   
  41. Integer  
  42.       
  43.   
  44. 与 Java 类似。可以包含任何正数或负数,例如 24、-45、567  
  45.   
  46. Floating Point  
  47.       
  48.   
  49. 与 Java 类似。可以包含任何正的或负的浮点数,例如 -1.8E-45、4.567  
  50.   
  51. String  
  52.       
  53.   
  54. 任何由单引号或双引号限定的字符串。对于单引号、双引号和反斜杠,使用反斜杠字符作为转义序列。必须注意,如果在字符串两端使用双引号,则单引号不需要转义。  
  55. Null    null  
  56.   
  57.    
  58. 2、操作符  
  59.   
  60. JSP 表达式语言提供以下操作符,其中大部分是 Java 中常用的操作符:  
  61.   
  62.   
  63. 术语  定义  
  64.   
  65. 算术型  
  66.       
  67.   
  68. +、-(二元)、*、/、div、%、mod、-(一元)  
  69.   
  70. 逻辑型  
  71.       
  72.   
  73. and、&&、or、||、!、not  
  74.   
  75. 关系型  
  76.       
  77.   
  78. ==、eq、!=、ne、、gt、<=、le、>=、ge。可以与其他值进行比较,或与布尔型、字符串型、整型或浮点型文字进行比较。  
  79.   
  80. 空  
  81.       
  82.   
  83. 空操作符是前缀操作,可用于确定值是否为空。  
  84. 条件型     A ?B :C。根据 A 赋值的结果来赋值 B 或 C。  
  85.   
  86.    
  87. 3、隐式对象  
  88.   
  89. JSP 表达式语言定义了一组隐式对象,其中许多对象在 JSP scriplet 和表达式中可用:  
  90.   
  91.   
  92.   
  93.   
  94.   
  95. pageContext  
  96.       
  97.   
  98. JSP 页的上下文。它可以用于访问 JSP 隐式对象,如请求、响应、会话、输出、servletContext 等。例如,${pageContext.response} 为页面的响应对象赋值。  
  99.   
  100.   
  101. 此外,还提供几个隐式对象,允许对以下对象进行简易访问:  
  102.   
  103.   
  104. 术语  定义  
  105.   
  106. param  
  107.       
  108.   
  109. 将请求参数名称映射到单个字符串参数值(通过调用 ServletRequest.getParameter (String name) 获得)。getParameter (String) 方法返回带有特定名称的参数。表达式 $(param.name) 相当于 request.getParameter (name)。  
  110.   
  111. paramValues  
  112.       
  113.   
  114. 将请求参数名称映射到一个数值数组(通过调用 ServletRequest.getParameter (String name) 获得)。它与 param 隐式对象非常类似,但它检索一个字符串数组而不是单个值。表达式 ${paramvalues.name) 相当于 request.getParamterValues(name)。  
  115.   
  116. header  
  117.       
  118.   
  119. 将请求头名称映射到单个字符串头值(通过调用 ServletRequest.getHeader(String name) 获得)。表达式 ${header.name} 相当于 request.getHeader(name)。  
  120.   
  121. headerValues  
  122.       
  123.   
  124. 将请求头名称映射到一个数值数组(通过调用 ServletRequest.getHeaders(String) 获得)。它与头隐式对象非常类似。表达式 ${headerValues.name} 相当于 request.getHeaderValues(name)。  
  125. cookie  将 cookie 名称映射到单个 cookie 对象。向服务器发出的客户端请求可以获得一个或多个 cookie。表达式 ${cookie.name.value} 返回带有特定名称的第一个 cookie 值。如果请求包含多个同名的 cookie,则应该使用 ${headerValues.name} 表达式。  
  126. initParam   将上下文初始化参数名称映射到单个值(通过调用 ServletContext.getInitparameter(String name) 获得)。  
  127.   
  128.   
  129. 除了上述两种类型的隐式对象之外,还有些对象允许访问多种范围的变量,如 Web 上下文、会话、请求、页面:  
  130.   
  131.   
  132. 术语  定义  
  133.   
  134. pageScope  
  135.       
  136.   
  137. 将页面范围的变量名称映射到其值。例如,EL 表达式可以使用 ${pageScope.objectName} 访问一个 JSP 中页面范围的对象,还可以使用 ${pageScope.objectName.attributeName} 访问对象的属性。  
  138.   
  139. requestScope  
  140.       
  141.   
  142. 将请求范围的变量名称映射到其值。该对象允许访问请求对象的属性。例如,EL 表达式可以使用 ${requestScope.objectName} 访问一个 JSP 请求范围的对象,还可以使用 ${requestScope.objectName.attributeName} 访问对象的属性。  
  143.   
  144. sessionScope  
  145.       
  146.   
  147. 将会话范围的变量名称映射到其值。该对象允许访问会话对象的属性。例如:  
  148.   
  149.   
  150. $sessionScope.name}   
  151.   
  152. applicationScope  
  153.       
  154.   
  155. 将应用程序范围的变量名称映射到其值。该隐式对象允许访问应用程序范围的对象。  
  156.   
  157.    
  158. 三、特别强调:  
  159.   
  160. 1、注意当表达式根据名称引用这些对象之一时,返回的是相应的对象而不是相应的属性。例如:即使现有的 pageContext 属性包含某些其他值,${pageContext} 也返回 PageContext 对象。  
  161.   
  162. 2、 注意 <%@ page isELIgnored="true" %> 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默认的启用EL语言。  
  163. 四、举例说明  
  164.   
  165. 1、例如,  
  166.   
  167.       < %=request.getParameter(“username”)% >       等价于       ${ param.username }  
  168.   
  169. 2、例如,但是下面的那句EL语言可以完成如果得到一个username为空,则不显示null,而是不显示值。  
  170.   
  171.    
  172.   
  173.       <%=user.getAddr( ) %>      等价于     ${user.addr}。  
  174.   
  175. 3、例如:  
  176.   
  177. <% =request.getAttribute(“userlist”) %>     等价于$     { requestScope.userlist }  
  178.   
  179. 4、例如,原理如上例3。  
  180.   
  181. ${ sessionScope.userlist } 1  
  182.   
  183. ${ sessionScope.userlist } 2  
  184.   
  185. ${ applicationScope.userlist } 3   
  186.   
  187. ${ pageScope.userlist } 4  
  188.   
  189. ${uselist} 含义:执行顺序为4 1 2 3。  
  190.   
  191. “.”后面的只是一个字符串,并不是真正的内置对象,不能调用对象。  
  192.   
  193. 4、例如,  
  194.   
  195.    <%=user.getAddr( ) %>      等价于     ${user.addr}  
  196.   
  197.    第一句前面的user,为一个变量。  
  198.   
  199.    第二句后面user,必须为在某一个范围里的属性。  
  200.   
  201.    
  202.   
  203.    
  204.   
  205. 补充:  
  206. <%@ taglib prefix="c" http://java.sun.com/jstl/core_rt">http://java.sun.com/jstl/core_rt" %>  
  207. FOREACH:  
  208. <c:forEach items="${messages}"  
  209. var="item"  
  210. begin="0"  
  211. end="9"  
  212. step="1"  
  213. varStatus="var">  
  214. ……  
  215. </c:forEach>  
  216. OUT:  
  217. <c:out value="/${logininfo.username}"/>  
  218. c:out>将value 中的内容输出到当前位置,这里也就是把logininfo 对象的  
  219. username属性值输出到页面当前位置。  
  220. ${……}是JSP2.0 中的Expression Language(EL)的语法。它定义了一个表达式,  
  221. 其中的表达式可以是一个常量(如上),也可以是一个具体的表达语句(如forEach循环体中  
  222. 的情况)。典型案例如下:  
  223. ? ${logininfo.username}  
  224. 这表明引用logininfo 对象的username 属性。我们可以通过“.”操作符引  
  225. 用对象的属性,也可以用“[]”引用对象属性,如${logininfo[username]}  
  226. 与${logininfo.username}达到了同样的效果。  
  227. “[]”引用方式的意义在于,如果属性名中出现了特殊字符,如“.”或者“-”,  
  228. 此时就必须使用“[]”获取属性值以避免语法上的冲突(系统开发时应尽量避免  
  229. 这一现象的出现)。  
  230. 与之等同的JSP Script大致如下:  
  231. LoginInfo logininfo =  
  232. (LoginInfo)session.getAttribute(“logininfo”);  
  233. String username = logininfo.getUsername();  
  234. 可以看到,EL大大节省了编码量。  
  235. 这里引出的另外一个问题就是,EL 将从哪里找到logininfo 对象,对于  
  236. ${logininfo.username}这样的表达式而言,首先会从当前页面中寻找之前是  
  237. 否定义了变量logininfo,如果没有找到则依次到Request、Session、  
  238. Application 范围内寻找,直到找到为止。如果直到最后依然没有找到匹配的  
  239. 变量,则返回null.  
  240. 如果我们需要指定变量的寻找范围,可以在EL表达式中指定搜寻范围:  
  241. ${pageScope.logininfo.username}  
  242. ${requestScope.logininfo.username}  
  243. ${sessionScope.logininfo.username}  
  244. ${applicationScope.logininfo.username}  
  245. 在Spring 中,所有逻辑处理单元返回的结果数据,都将作为Attribute 被放  
  246. 置到HttpServletRequest 对象中返回(具体实现可参见Spring 源码中  
  247. org.springframework.web.servlet.view.InternalResourceView.  
  248. exposeModelAsRequestAttributes方法的实现代码),也就是说Spring  
  249. MVC 中,结果数据对象默认都是requestScope。因此,在Spring MVC 中,  
  250. 以下寻址方法应慎用:  
  251. ${sessionScope.logininfo.username}  
  252. ${applicationScope.logininfo.username}  
  253. ? ${1+2}  
  254. 结果为表达式计算结果,即整数值3。  
  255. ? ${i>1}  
  256. 如果变量值i>1的话,将返回bool类型true。与上例比较,可以发现EL会自  
  257. 动根据表达式计算结果返回不同的数据类型。  
  258. 表达式的写法与java代码中的表达式编写方式大致相同。  
  259. IF / CHOOSE:  
  260. <c:if test="${var.index % 2 == 0}">  
  261. *  
  262. </c:if>  
  263. 判定条件一般为一个EL表达式。  
  264. <c:if>并没有提供else子句,使用的时候可能有些不便,此时我们可以通过<c:choose>  
  265. tag来达到类似的目的:  
  266. <c:choose>  
  267. <c:when test="${var.index % 2 == 0}">  
  268. *  
  269. </c:when>  
  270. <c:otherwise>  
  271. !  
  272. </c:otherwise>  
  273. </c:choose>  
  274. 类似Java 中的switch 语句,<c:choose>提供了复杂判定条件下的简化处理手法。其  
  275. <c:when>子句类似case子句,可以出现多次。上面的代码,在奇数行时输出“*”号,  
  276. 而偶数行时输出“!”。  
  277. 经验:1、如果EL表达式无法解析:– <%@ page isELIgnored="false" %>  
  278.   
  279. 一、           JSTL  
  280.   
  281. 1、EL运算符>;  
  282.        2)var指定变量,并把EL运算结果赋值给该变量值为true/false;  
  283.        3)scope:指定 var变量的范围;  
  284.   
  285.   
  286. 6、迭代标签  
  287. 语法:<c:forEach items=“collection” var=“name” varStatus=“status” begin=“int“  
  288. end=”int” step=“int” >  
  289.            //循环体  
  290.            </c:forEach>  
  291.      说明:1)items:是集合,用EL表达式;  
  292.        2)var:变量名,存放items  
  293.        3)varStatus: 显示循环状态的变量  
  294. ①index:从0开始;  
  295.                      ②count:元素位置,从1开始;  
  296.                      ③first:如果是第一个元素则显示true;  
  297.                      ④last:如果是最后一个元素则显示true;  
  298.        4)begin:循环的初始值(整型);  
  299.        5)end: 循环结束 ;  
  300.        6)step:步长,循环间隔的数值;  
  301. 7、<c:otherwise>标签  
  302.      例:  
  303. 如果user.wealthy值true,则显示user.wealthy is true.  
  304. <c:choose>  
  305. <c:when test="">  
  306. user.generous is true.  
  307. </c:when>  
  308. <c:when test="">  
  309. user.stingy is true.  
  310. </c:when>  
  311. <c:otherwise>  
  312. user.generous and user.stingy are false.  
  313. </c:otherwise>  
  314. </c:choose>  
  315. 说明:只有当条件user.generous返回值是true时,才显示user.generous is true.  
  316. 只有当条件user.stingy返回值是true时,才显示user.stingy is true.  
  317. 其它所有的情况(即user.generous和user.stingy的值都不为true)全部显示user.generous and  
  318. user.stingy are false.  
  319. 由于JSTL没有形如if (){…} else {…}的条件语句,所以这种形式的语句只能用<c:choose>、  
  320. <c:when><c:otherwise>标签共同来完成了。  
  321. 8、c:forTokens>标签  
  322. 说明:    
  323. items 进行循环的项目 是 无  
  324. delims 分割符 是 无  
  325. begin 开始条件 否 0  
  326. end 结束条件 否 集合中的最后一个项目  
  327. step 步长 否 1  
  328. var 代表当前项目的变量名 否 无  
  329. varStatus 显示循环状态的变量 否 无  
  330. 例子:  
  331. <c:forTokens items="a:b:c:d" delims=":" var="token">  
  332. <c:out value=""/>  
  333. </c:forTokens>  
  334. 这个标签的使用相当于java.util.StringTokenizer类。在这里将字符串a:b:c:d以:分开循环四次,  
  335. token是循环到当前分割到的字符串。  
  336. 9、<c:redirect>标签  
  337.      说明:标签将请求重新定向到另外一个页面,它有以下属性 属性 描 述 是否必须 缺省值  
  338. url url地址 是 无  
  339. context /后跟本地web应用程序的名字 否 当前应用程序  
  340. 例子:  
  341. <c:redirect /'>http://www.yourname.com/login.jsp"/>  
  342. 将请求重新定向到http://www.yourname.com/login.jsp页,相当于response.setRedirect  
  343. ("http://www.yourname.com/login.jsp");  
  344. 10、<c:param>标签  
  345.      说明:<c:param>标签用来传递参数给一个重定向或包含页面,它有以下属性属 性 描 述 是否  
  346. 必须 缺省值  
  347. name 在request参数中设置的变量名 是 无  
  348. value 在request参数中设置的变量值 否 无  
  349. 例子:  
  350. <c:redirect url="login.jsp">  
  351. <c:param value="888"/>  
  352. </c:redirect>  
  353. 将参数888以id为名字传递到login.jsp页面,相当于login.jsp?id=888  
  354. 11、<fmt:>格式化标签  
  355.      说明:需要导入   <%@ taglib prefix="fmt" http://java.sun.com/jsp/jstl/fmt">http://java.sun.com/jsp/jstl/fmt" %>  
  356.      1)格式化日期<fmt:formatDate value=“” pattern=“yyyy-MM-dd HH:mm:ss”/>  
  357.                Value:通过EL表达式或<%new Date() %> 取的日期值;  
  358.                Pattern:输出的日期格式;                        
  359.   
  360.     2) 格式化数字<fmt:formatNumber  
  361. value="${n}" pattern="###,###.##" /> 
<%@ page import="util.DbConnet" %> <%@ page import="java.sql.ResultSet" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <% //获取用户输入的查询内容 String appliance_id = request.getParameter("appliance_id"); if(appliance_id==null) appliance_id=""; String appliance_type = request.getParameter("appliance_type"); if(appliance_type==null) appliance_type=""; String appliance_name = request.getParameter("appliance_name"); if(appliance_name==null) appliance_name=""; //1.数据总数 String sql = "select count(*) as total from `living_room_appliances` " + "where `appliance_id` like ? and `appliance_type` like ? and `appliance_name` like ?;"; Object[] params = new Object[]{ "%"+appliance_id+"%","%"+appliance_type+"%","%"+appliance_name+"%" }; ResultSet rs = DbConnet.select(sql, params); rs.next(); int total = rs.getInt("total"); //2.每页显示的行数 int pageSize = 5; //3.总页数 double result = (double)total/pageSize; //向上取整:只要数值带有有效的小数,舍去小数,整数位加一 int pageTotal = (int) Math.ceil(result); //4.当前页码 String pageNoStr = request.getParameter("pageNo"); pageNoStr = pageNoStr==null?"1":pageNoStr; int pageNo = Integer.parseInt(pageNoStr); //获取用户表中的数据,显示出来 sql = "select * from `living_room_appliances` " + "where `appliance_id` like ? and `appliance_type` like ? and `appliance_name` like ?" + "limit ?,?;"; int start = (pageNo - 1) * pageSize;//(当前页码-1)*每页显示的行数 params = new Object[]{ "%"+appliance_id+"%","%"+appliance_type+"%","%"+appliance_name+"%",start,pageSize }; rs = DbConnet.select(sql, params); %> <html> <head> <title>用户列表</title> <link rel="stylesheet" href="../css/common.css"> <link rel="stylesheet" href="../css/list.css"> </head> <body> <%--搜索区域 S--%> <div class="search"> <form> <label for="appliance_id">账号:</label> <input type="text" id="appliance_id" name="appliance_id" value="<%=appliance_id%>"> <label for="appliance_type">姓名:</label> <input type="text" id="appliance_type" name="appliance_type" value="<%=appliance_type%>"> <label for="appliance_name">姓名:</label> <input type="text" id="appliance_name" name="appliance_name" value="<%=appliance_name%>"> <button id="btnSearch" class="primary" type="button">查询</button> <button id="btnReset" type="button">重置</button> </form> </div> <%--搜索区域 E--%> <%--按钮区域 S--%> <div class="btn-box"> <button id="btnAdd" class="primary" type="button">新增</button> </div> <%--按钮区域 E--%> <%--表格区域 S--%> <div class="table-box"> <table> <tr> <th>编号</th> <th>账号</th> <th>姓名</th> <th>操作</th> </tr> <% while (rs.next()){ %> <tr> <td><%=rs.getString("appliance_id")%></td> <td><%=rs.getString("appliance_type")%></td> <td><%=rs.getString("appliance_name")%></td> <td> <button data-id="<%=rs.getString("id")%>" name="btnEdit" class="primary" type="button">编辑</button> <button data-id="<%=rs.getString("id")%>" name="btnDelete" class="danger" type="button">删除</button> </td> </tr> <% } %> </table> </div> <%--表格区域 E--%> <%--页码区域 S--%> <%--<div class="pager">--%> <%-- <ul>--%> <%-- <li>共<%=total%>条数据/每页<%=pageSize%>条</li>--%> <%-- <% if(pageNo>1){%>--%> <%-- <li class="page"><a href="list.jsp?username=<%=username%>&realname=<%=realname%>&pageNo=1">首页</a></li>--%> <%-- <li class="page"><a href="list.jsp?username=<%=username%>&realname=<%=realname%>&appliance_name<%appliance_name%>&pageNo=<%=pageNo-1%>">上一页</a></li>--%> <%-- <% } %>--%> <%-- <%– <li class="active">1</li>–%>--%> <%-- <% for (int i=1;i<=pageTotal;i++){%>--%> <%-- <li class="<%=(pageNo==i?"active":"")%>" class="page">--%> <%-- <a href="list.jsp?username=<%=username%>&realname=<%=realname%>&pageNo=<%=i%>"><%=i%></a>--%> <%-- </li>--%> <%-- <% } %>--%> <%-- <% if(pageTotal>pageNo){%>--%> <%-- <li class="page"><a href="list.jsp?username=<%=username%>&realname=<%=realname%>&pageNo=<%=pageNo+1%>">下一页</a></li>--%> <%-- <li class="page"><a href="list.jsp?username=<%=username%>&realname=<%=realname%>&pageNo=<%=pageTotal%>">尾页</a></li>--%> <%-- <% } %>--%> <%-- </ul>--%> <%--</div>--%> <%--页码区域 E--%> <script src="../js/jquery-3.5.1.min.js"></script> <script src="../js/common.js"></script> <script> //绑定搜索按钮的点击事件 $('#btnSearch').on('click', function () { //获取搜索框中的内容:账号、姓名 let username = $('#username').val(); let realname = $('#realname').val(); window.location.href="list.jsp?username=" + username + "&realname=" + realname; }); //绑定重置按钮的点击事件 $('#btnReset').on('click', function () { window.location.href="list.jsp"; }); //绑定新增按钮的点击事件 $('#btnAdd').on('click', function () { window.location.href="add.jsp"; }); //绑定行内的编辑按钮点击事件 $('button[name=btnEdit]').on('click', function () { let id = $(this).attr('data-id');//从当前点击的按钮身上获取data-id的值 window.location.href = 'edit.jsp?id='+id; }); //绑定行内的删除按钮点击事件 $('button[name=btnDelete]').on('click', function () { if(confirm("确定要删除吗?")) { //获取删除按钮所在行的编号(id) let id = $(this).attr('data-id');//从当前点击的按钮身上获取data-id的值 //无刷新方式提交删除请求 postAction('/user/delete', {id: id}, function (res) { alert(res.msg); if (res.result) window.location.href = res.url; }); } }); </script> </body> </html> 请修改这些代码的错误
最新发布
07-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值