JAVA——J2EE之JSP

一、

通过Servlet进行整个网站的开发是可以的。 不过在Servlet中输出html代码,特别是稍微复杂一点的html代码,就会给人一种很酸爽的感觉。

如果能够直接使用Html代码,然后在html中写java代码,就好了~

JSP … 就可以干这个事情。

1.hello.jsp

在web目录下下新建一个文件hello.jsp

访问网页
http://127.0.0.1/hello.jsp
注: 不需要重启tomcat

<%@page contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*"%>
你好 JSP
<br>
<%=new Date().toLocaleString()%>

2.代码解释

<%@page contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8" import="java.util.*"%>

是JSP的<%@page指令
contentType=”text/html; charset=UTF-8”
相当于response.setContentType(“text/html; charset=UTF-8”); 通知浏览器以UTF-8进行中文解码

pageEncoding="UTF-8" //如果jsp文件中出现了中文,这些中文使用UTF-8进行编码
import="java.util.* //导入其他类,如果导入多个类,彼此用,逗号隔开

<%= > 输出

<%=new Date().toLocaleString()%>

输出当前时间,相当于在Servlet中使用response.getWriter()进行输出

response.getWriter().println(new Date().toLocaleString());

二、JSP 转译为SERVLET

为什么JSP可以在html中运行java代码? 这是因为JSP被转译成了Servlet

1.执行过程

  1. 把 hello.jsp转译为****hello_jsp.java
  2. hello_jsp.java 位于
    c:\tomcat\work\Catalina\localhost_\org\apache\jsp
  3. hello_jsp.java**是一个servlet**
  4. 把hello_jsp.java 编译为hello_jsp.class
  5. 执行hello_jsp,生成html
  6. 通过http协议把html 响应返回给浏览器
    这里写图片描述

2.hello_jsp.java 为什么是Servlet

在Servle章节中,我们说HelloServlet是一个Servlet,不是因为它的类名里有一个”Servlet”,而是因为它继承了 HttpServlet

打开转译hello.jsp 后得到的hello_jsp.java,可以发现它继承了类
(c:\tomcat\work\Catalina\localhost_\org\apache\jsp\hello_jsp.java)

org.apache.jasper.runtime.HttpJspBase
HttpJspBase 继承了HttpServlet
所以我们说hello_.jsp.java 是一个Servlet

三、界面元素

1.jsp由这些页面元素组成:

  1. 静态内容
    就是html,css,javascript等内容
  2. 指令<%@%>
    以<%@开始 %> 结尾,比如<%@page import=”java.util.*”%>
  3. 表达式 <%=%>
    用于输出(out.println)一段html
  4. Scriptlet<%%>
    在<%%> 之间,可以写任何java 代码
  5. 声明<%!%>
    在<%!%> 之间可以声明字段或者方法。但是不建议这么做。
  6. 动作jsp:
    <jsp:include page="Filename" >
    在jsp页面中包含另一个页面。在包含的章节有详细的讲解
  7. 注释 <%– – %>
    不同于 html的注释 通过jsp的注释,浏览器也看不到相应的代码,相当于在servlet中注释掉了
    这里写图片描述

2.<%=%>和 <%out.println()%>

<%="hello jsp"%> 

就相当于

<%out.println("hello jsp");%>

out是jsp的隐式对象,可以直接使用。一共有9种隐式对象,请参考 隐式对象 章节

注: <%=%> 不需要分号结尾,<%%> 需要以分号结尾,和java代码一样

3.for循环

结合for循环在jsp里输出html是常见的做法。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*"%>
<% 
    List<String> words = new ArrayList<String>();//里面是java代码
    words.add("today");
    words.add("is");
    words.add("a");
    words.add("great");
    words.add("day");
%>

<table width="200px" align="center" border="1" cellspacing="0">

<%for (String word : words) {%>

<tr>
    <td><%=word%></td>//输出一个word
</tr>

<%}%> 

</table>

四、INCLUDE包含其他页面的两种方式,以及其区别

每个网页的最下方都有 版权声明等信息。 如果不使用包含,那么每个网页都需要单独写,如果版权声明要修改,则需要很大的工作量。

使用include的办法,只需要准备一个footer.jsp,然后在其他页面包含footer.jsp即可。

修改的时候,只需要修改footer.jsp所有的页面就都修改了,维护成本降低了很多。

include有两种方式1.指令include2.动作include

1.首先准备一个footer.jsp

<hr>
<p style="text-align:center">copyright@2016
</p>

2.通过指令include

@include

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

你好  JSP

<%@include file="footer.jsp" %>

3.通过动作include

通过动作

<jsp:include page="footer.jsp" />

在hello.jsp中包含该页面

<jsp:include page="footer.jsp" />

4.指令include和动作include的区别(插入与传参)

通过之前的学习知道,JSP最后会被转译成Servlet

如果是指令include

<%@include file="footer.jsp" %>

footer.jsp的内容会被插入到 hello.jsp 转译 成的hello_jsp.java中,最后只会生成一个hello_jsp.java文件

如果是动作include

<jsp:include page="footer.jsp" />

footer.jsp的内容不会被插入到 hello.jsp 转译 成的hello_jsp.java中,还会有一个footer_jsp.java独立存在。 hello_jsp.java 会在服务端访问 footer_.jsp.java,然后把返回的结果,嵌入到响应中。

5.传参

因为指令<%@include 会导致两个jsp合并成为同一个java文件,所以就不存在传参的问题,在发出hello.jsp 里定义的变量,直接可以在footer.jsp中访问。

而动作其实是对footer.jsp进行了一次独立的访问,那么就有传参的需要。

如本例:
1. 在hello.jsp中使用动作<jsp:include,并通过<jsp:param 带上参数

<jsp:include page="footer.jsp">
    <jsp:param  name="year" value="2017" />
</jsp:include>
  1. footer.jsp中,使用request.getParameter(“year”)取出year
    hello.jsp如下
<%@page contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*"%>

你好 JSP
<%=new Date().toLocaleString()%>

<jsp:include page="footer.jsp">
    <jsp:param  name="year" value="2017" />
</jsp:include>

footer.jsp如下

<hr>
    <p style="text-align:center">copyright@<%=request.getParameter("year")%>
</p>

五、跳转

和Servlet的跳转一样,JSP的跳转也分服务端跳转客户端跳转
首先准备 jump.jsp来分别演示客户端跳转和服务端跳转

1.客户端跳转

jsp的客户端跳转和Servlet中是一样的。

<%
    response.sendRedirect("hello.jsp");
%>

可以通过firefox的调试工具可以观察到访问jump.jsp返回302(临时客户端跳转),跳转到了hello.jsp

2.服务端跳转

与Servlet的服务端跳转一样,也可以使用

request.getRequestDispatcher("hello.jsp").forward(request, response);

或者使用动作jsp:forward,简化代码

<jsp:forward page="hello.jsp"/>

六、演示 COOKIE 的创建和访问

有的网站,登陆的时候,会出现一个选项,问你是否要一周内或者一个月内保持登陆状态。
如果你选了,那么一周之内,都不需要再输入账号密码
这个功能,就是靠cookie来实现的

1.什么是cookie(给你个vip通行证拿着吧)

Cookie是一种浏览器和服务器交互数据的方式

Cookie是由服务器端创建,但是不会保存在服务器。

创建好之后,发送给浏览器。浏览器保存在用户本地

下一次访问网站的时候,就会把该Cookie发送给服务器

2.setCookie.jsp

在web目录下创建一个文件 setCookie.jsp

Cookie c = new Cookie("name", "Gareen");

创建了一个cookie,名字是”name” 值是”Gareen”

c.setMaxAge(24 * 60 * 60);

表示这个cookie**可以保留一天,如果是**0,表示浏览器一关闭就销毁

c.setPath("127.0.0.1");

Path表示服务器的主机名,只有浏览器通过这个主机名访问服务器的时候,才会提交这个cookie到服务端

response.addCookie(c);

通过response把这个cookie保存在浏览器端

访问地址:

http://127.0.0.1/setCookie.jsp

通过HTTP调试工具也可以在Cookies这一栏看到

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="javax.servlet.http.Cookie"%>

<%
    Cookie[] cookies = request.getCookies();
    if (null != cookies)
        for (int d = 0; d <= cookies.length - 1; d++) {
            out.print(cookies[d].getName() + ":" + cookies[d].getValue() + "<br>");
        }
%>

这里写图片描述

七、SESSION 详解

健身房,就相当于服务器,不同的储物柜,就是会话Session
切换到我们常见的购物网站的场景
李佳汜登陆天猫之后,在购物车里看到的物品是蜡烛和皮鞭
毛竞登陆天猫之后,在购物车里看到的物品是手铐和《Java 21天从入门到精通》

1.什么是session

Session对应的中文翻译是会话
会话指的是从用户打开浏览器访问一个网站开始,无论在这个网站中访问了多少页面,点击了多少链接,都属于同一个会话直到该用户关闭浏览器为止,都属于同一个会话。

2.setSession.jsp

session.setAttribute("name", "teemo");

session对象 保存数据的方式,有点像Map的键值对(key-value)
“name”是键,”teemo” 是值

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="javax.servlet.http.Cookie"%>

<%
   session.setAttribute("name", "teemo");
%>

<a href="getSession.jsp">跳转到获取session的页面</a>

3.getSession.jsp

session.getAttribute("name");

通过session,根据”name” 取出对应的名称

4.Session和Cookie的关联

回到健身房的储物柜这一段:

李佳汜和毛竞都有自己的盒子,那么他们怎么知道哪个盒子是自己的呢?
通过钥匙就能找到自己的盒子了。

储物柜对应服务器上的Session
钥匙对应浏览器上的Cookie
你用你的Cookie打开属于你的Session

5.示意图

这里写图片描述
j session id
你去健身房(访问),一开始这里没你的储物柜(Session),然后老板给了你一个,并且把柜id贴在了你钥匙(cookie)上,下次你去,服务台的小姐姐看你钥匙和柜子上的id做比较,然后把你存的东西(各种属性)给你。

6.如果没有cookie,session如何工作

如果浏览器把cookie功能关闭,那么服务端就无法获取jsessionid,每一次访问,都会生成一个新的session对象。(不让贴id到钥匙上,那只好每次都一个柜子)

为了解决这个问题,可以使用

response.encodeURL("getSession.jsp"))

response.encodeURL方法会把getSession.jsp这个url转换为

getSession.jsp;jsessionid=22424AEA86ADBE89F335EEB649D997A8

通过这个方式,提交jsessionid到服务器。 服务器根据这个jsessionid匹配到对应的session. 与session相关的功能,就可以正常工作了。

7.Session有效期

比如登录一个网站,登录后,在短时间内,依然可以继续访问而不用重新登录

但是较长时间不登录,依然会要求重新登录,这是因为服务端的session在一段时间不使用后,就失效了。
这个时间,在Tomcat默认配置下,是30分钟。
可以通过 d:/tomcat/conf/web.xml 中的session-config 配置进行调整

八、JSP 四种作用域(当前、请求、回话、全局)

JSP有4个作用域,分别是
pageContext 当前页面
requestContext 一次请求
sessionContext 当前会话
applicationContext 全局,所有用户共享

1.pageContext(当前页面作用域)

准备setContext.jspgetContext.jsp,分别表示向作用域设置数据,和从作用域获取数据

pageContext表示当前页面作用域

通过pageContext.setAttribute(key,value)数据,只能在当前页面访问,在其他页面就不能访问了。

<%
    pageContext.setAttribute("name","gareen");
%>

<%=pageContext.getAttribute("name")%>

set完无法用get获取<%=pageContext.getAttribute("name")%>

2.requestContext(表示一次请求,结束数据被回收)

requestContext 表示一次请求。随着本次请求结束,其中的数据也就被回收

常用写法是

request.setAttribute("name","gareen"); 
request.getAttribute("name")

但是也可以用pageContext来做,写成
pageContext.setAttribute(“name”,”gareen”,pageContext.REQUEST_SCOPE);
pageContext.getAttribute(“name”,pageContext.REQUEST_SCOPE)不过不常用
SET

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

<%
    request.setAttribute("name","gareen");
%>

<%=request.getAttribute("name")%>

3.requestContext与服务端跳转(

requestContext指的是一次请求
如果发生了服务端跳转,从setContext.jsp跳转到getContext.jsp,这其实,还是一次请求。 所以在getContext.jsp中,可以取到在requestContext中设置的值

这也是一种页面间传递数据的方式
SET

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    request.setAttribute("name","gareen");
%>

<jsp:forward page="getContext.jsp"/>

GET

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

<%=request.getAttribute("name")%>

4.requestContext与客户端跳转(response.sendRedirect)

客户端跳转,浏览器会发生一次新的访问,新的访问会产生一个新的request对象

所以页面间客户端跳转的情况下,是无法通过request传递数据的。
这里get到null
SET(通过request)

<%
    request.setAttribute("name","gareen");
    response.sendRedirect("getContext.jsp");
%>

GET

<%=request.getAttribute("name")%>

5.sessionContext(会话)

sessionContext 指的是会话,从一个用户打开网站的那一刻起,无论访问了多少网页,链接都属于同一个会话(就跟聊天窗口一样),直到浏览器关闭。

所以页面间传递数据,也是可以通过session传递的。

但是,不同用户对应的session是不一样的,所以session无法在不同的用户之间共享数据

与requestContext类似的,也可以用如下方式来做

pageContext.setAttribute(“name”,”gareen”,pageContext.SESSION_SCOPE);
pageContext.getAttribute(“name”,pageContext.SESSION_SCOPE)
SET(通过session对象)

<%
    session.setAttribute("name","gareen");
    response.sendRedirect("getContext.jsp");//客户端跳转dao另一个jsp
%>
<%=session.getAttribute("name")%>

6.applicationContext(全局)

applicationContext 指的是全局,所有用户共享同一个数据

在JSP中使用application对象, application对象是ServletContext接口实例
也可以通过 request.getServletContext()来获取。
所以 application == request.getServletContext() 会返回true
application**映射的就是web应用本身**。

与requestContext类似的,也可以用如下方式来做

pageContext.setAttribute(“name”,”gareen”,pageContext.APPLICATION_SCOPE);
pageContext.getAttribute(“name”,pageContext.APPLICATION_SCOPE)
SET(通过application对象)

<%
    application.setAttribute("name","gareen");
    System.out.println(application == request.getServletContext());
    response.sendRedirect("getContext.jsp");
%>

GET<%=application.getAttribute("name")%>
这里写图片描述

客户端与服务端跳转区别复习

客户端(浏览器)的跳转:跳转之后地址栏的信息是会变的,变为跳转之后的地址信息
服务器端的跳转:跳转之后的地址栏的信息不会发生任何的改变

具体区别请等待MVC部分

(1).而且在使用request属性范围时,只有服务器端跳转才能将request范围的属性保存到跳转页面;而如果是客户端的跳转,则无法进行request属性的传递
(2).另外,如果是服务器端的跳转,则执行跳转语句时立刻进行跳转;如果使用的是客户端跳转,则是整个页面执行完之后才执行跳转的。
(3).在Servlet中如果想要进行客户端的跳转,直接使用HttpServletResponse接口的SendRedirect()即可,但是需要注意的是,此跳转只能传递session以及application范围的属性,而无法传递request范围的属性

总结:1.服务端一般便于传输数据,客户端就完全是另一个页面了
2.客户端传递不了request范围的属性,只能传递session以及application范围

九、JSP 九种隐式对象

JSP的隐式对象指的是不需要显示定义直接就可以使用对象,比如request,response

JSP一共有9个隐式对象,分别是
request(请求),response(响应), out (输出)
pageContext(当前页面作用域), session(会话作用域),application(全局作用域)

page(当前对象)

JSP 会被编译为一个Servlet类 ,运行的时候是一个Servlet实例。 page即代表this

config(注:这种用法不常见,不推荐使用)

config可以获取一些在web.xml中初始化的参数
在JSP中使用config比较复杂,需要如下几个步骤
1. 在web.xml中进行配置
2. 创建一个testconfig.jsp
通过config.getInitParameter(“database-ip”) 获取参数
3. 访问路径,获取web.xml中配置的参数

http://127.0.0.1/testconfig

注1: 不能通过 http://127.0.0.1/testconfig.jsp 获取参数,只能通过/testconfig路径

exception

exception 对象只有当前页面的<%@page 指令设置为isErrorPage="true"的时候才可以使用。

十、JSTL JAVA STANDARD TAG LIBRARY 标准标签库

JSTL允许开人员可以像使用HTML标签 那样在JSP中开发Java功能

JSTL库有core, i18n, fmt, sql 等等。

i18n和sql用的很少,corefmt在工作中会用到,本章节主要讲解core和fmt

1.导入jar包

首先需要两个jar包,分别是jstl.jar 和standard.jar

2.set 、out、 remove(重要)

在页面中使用JSTL需要在jsp中 通过指令进行设置

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

prefix=”c” 表示后续的标签使用都会以<c: 开头

1.set

<c:set var="name" value="${'gareen'}" scope="request" />

作用域request设置name属性,相当于

<%request.setAttribute("name","gareen")%>

2.out

<c:out value="${name}" />相当于

<%=request.getAttribute("name")%>

3.remove

<c:remove var="name" scope="request" />作用域request中删掉name,相当<%request.removeAttribute("name")%>
作用域可以是pageContext, request, session, application,

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

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

<c:set var="name" value="${'gareen'}" scope="request" />

通过标签获取name: <c:out value="${name}" /> <br>

<c:remove var="name" scope="request" /> <br>

通过标签获取name: <c:out value="${name}" /> <br>

2.if else

JSTL通过<c:if test=""> 进行条件判断

但是JSTP没有<c:else,所以常用的办法是在<c:if的条件里取反

<c:if test="${!(hp<5)}">
    <p>这个英雄觉得自己还可以再抢救抢救</p>
</c:if>

配合if使用的还有通过empty进行为空判断
empty可以判断对象是否为null,字符串长度是否为0,集合长度是否为0

3.forEach

可以在JSP中使用for循环,但是其可读性很差。(JSP与html混在一块)

<table width="200px" align="center" border="1" cellspacing="0">

<%for (String word : words) {%>

<tr>
    <td><%=word%></td>
</tr>

<%}%>

</table>

借助JSTL的c:forEach标签,可以改善可读性

在本例中,分别使用for循环和<c:forEach标签来演示遍历一个List的区别

<c:forEach items="${heros}" var="hero" varStatus="st"  >

items=”${heros}” 表示遍历的集合
var=”hero” 表示把每一个集合中的元素放在hero上
varStatus=”st” 表示遍历的状态

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

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


 <%--以下展示采用JSP的for循环和  jstl中的c:forEach来遍历list --%>
<%
    List<String> heros = new ArrayList<String>();
    heros.add("塔姆");
    heros.add("艾克");
    heros.add("巴德");
    heros.add("雷克赛");
    heros.add("卡莉丝塔");
    request.setAttribute("heros",heros);
%>

<!-- 使用jsp中的for循环来遍历List -->
<table width="200px" align="center" border="1" cellspacing="0">
<tr>
    <td>编号</td>
    <td>英雄</td>
</tr>

<%
int i =0;
for (String hero : heros) {
i++;
%>

<tr>
    <td><%=i%></td>
    <td><%=hero%></td>
</tr>

<%}%><!-- 你看看这里,在JSP中插入了html表格的代码,可读性很差 -->

</table>
<br>




<!-- 使用JSTL中的c:forEach 循环来遍历List -->
<table width="200px" align="center" border="1" cellspacing="0">
<tr>
    <td>编号</td>
    <td>英雄</td>
</tr>
   <!-- 使用JSTL 在html里加java,对于每个hero,输出一行表格 -->
<c:forEach items="${heros}" var="hero" varStatus="st"  >
    <tr>
        <td><c:out value="${st.count}" /></td>
        <td><c:out value="${hero}" /></td>
    </tr>
</c:forEach>
</table>

4.forTokens

<c:forTokens专门用于字符串拆分,并且可以指定多个分隔符

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

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

<c:set var="heros" value="塔姆,艾克;巴德|雷克赛!卡莉丝塔" />

<c:forTokens items="${heros}" delims=":;|!" var="hero">
    <c:out value="${hero}" /> <br/>
</c:forTokens>

5.fmt:formatNumber 格式化数字

fmt 标签常用来进行格式化,其中fmt:formatNumber用于格式化数字
使用之前要加上

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix='fmt' %>  
<fmt:formatNumber type="number" value="${money}" minFractionDigits="2"/>

<fmt:formatNumber 表示格式化数字
minFractionDigits 小数点至少要有的位数
maxFractionDigits 小数点最多能有的位数

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

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

<c:set var="money" value="888.8" />
<c:set var="pi" value="3.1415926" />
最少两个小数点:
<fmt:formatNumber type="number" value="${money}" minFractionDigits="2"/>
<br>
最多两个小数点:
<fmt:formatNumber type="number" value="${pi}" maxFractionDigits="2" />

6.格式化日期fmt:formatDate

fmt 标签常用来进行格式化,其中fmt:formatDate 用于格式化日期
和fmt:formatNumber 格式化数字一样,使用之前要加上

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix='fmt' %>  
<fmt:formatDate value="${now}" pattern="G yyyy年MM月dd日 E"/>
<fmt:formatDate value="${now}" pattern="a HH:mm:ss.S z"/>
<fmt:formatDate value="${now}" pattern="yyyy-MM-dd HH:mm:ss"/>

<fmt:formatDate 表示格式化日期
yyyy 表示年份
MM 表示月份
dd 表示日期
E 表示星期几

a 表示是上午还是下午
HH 表示小时
mm 表示分钟
ss 表示秒
S 表示毫秒
z 表示时区

fn:标签的多种用法

首先使用之前使用加入如下指令

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 
函数 描述
fn:containsIgnoreCase(string, substring) 如果参数string中包含参数substring(忽略大小写),返回true
fn:endsWith(string, suffix) 如果参数 string 以参数suffix结尾,,返回true
fn:escapeXml(string) 将有特殊意义的XML (和HTML)转换为对应的XML character entity code,并返回
fn:indexOf(string, substring) 返回参数substring在参数string中第一次出现的位置
fn:join(array, separator) 将一个给定的数组array用给定的间隔符separator串在一起,组成一个新的字符串并返回。
fn:length(item) 返回参数item中包含元素的数量。参数Item类型是数组、collection或者String。如果是String类型,返回值是String中的字符数。
fn:replace(string, before, after) 返回一个String对象。用参数after字符串替换参数string中所有出现参数before字符串的地方,并返回替换后的结果
fn:split(string, separator) 返回一个数组,以参数separator 为分割符分割参数string,分割后的每一部分就是数组的一个元素
fn:startsWith(string, prefix) 如果参数string以参数prefix开头,返回true
fn:substring(string, begin, end) 返回参数string部分字符串, 从参数begin开始到参数end位置,包括end位置的字符
fn:substringAfter(string, substring) 返回参数substring在参数string中后面的那一部分字符串
fn:substringBefore(string, substring) 返回参数substring在参数string中前面的那一部分字符串
fn:toLowerCase(string) 将参数string所有的字符变为小写,并将其返回
fn:toUpperCase(string) 将参数string所有的字符变为大写,并将其返回
fn:trim(string) 去除参数string 首尾的空格,并将其返回

十一、好用吓死人的EL表达式语言

1.取值

不同版本的tomcat是否默认开启对EL表达式的支持,是不一定的。
所以为了保证EL表达式能够正常使用,需要在<%@page 标签里加上isELIgnored=”false”
使用EL表达式,非常简单

比如使用JSTL输出要写成

<c:out value="${name}" />

但是用EL只需要${name}

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isELIgnored="false"%>

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

<c:set var="name" value="${'gareen'}" scope="request" />

通过标签获取name: <c:out value="${name}" /> <br>

通过 EL 获取name: ${name}

2.作用域优先级

EL表达式可以从pageContext,request,session,application四个作用域中取到值,如果4个作用域都有name属性怎么办?
EL会按照从小到大的优先级顺序获取
pageContext>request>session>application

3.JavaBean概念

EL可以很方便的访问JavaBean的属性,那么JavaBean是什么呢?

JavaBean的标准
1. 提供无参 public构造方法(默认提供)
2. 每个属性,都有public的getter和setter
3. 如果属性boolean,那么就对应is和setter方法

比如示例代码中的Hero类,默认提供了一个无参的public的构造方法。 同时每个属性都有getter和setter

4.获取JavaBean的属性(通过.

获取JavaBean的属性,只需要通过.符号操作就可以了。
像这样 ${hero.name} ,就会自动调用getName方法
注: 如果属性是boolean类型,那么就会自动调用isXXX方法了

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isELIgnored="false" import="bean.*"%>

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

<%
    Hero hero =new Hero();
    hero.setName("盖伦");
    hero.setHp(616);

    request.setAttribute("hero", hero);
%>

英雄名字 : ${hero.name} <br>
英雄血量 : ${hero.hp}

5.结合JSTL的<c:forEach

EL还可以结合 JSTL的<c:forEach 使用,进一步简化代码
原代码中的<c:out value="${hero}" />
可以简写为
${hero}

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

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

<%
    List<String> heros = new ArrayList<String>();
    heros.add("塔姆");
    heros.add("艾克");
    heros.add("巴德");
    heros.add("雷克赛");
    heros.add("卡莉丝塔");
    request.setAttribute("heros",heros);
%>

<table width="200px" align="center" border="1" cellspacing="0">
<tr>
    <td>编号</td>
    <td>英雄</td>
</tr>

<c:forEach items="${heros}" var="hero" varStatus="st"  >
    <tr>
        <td>${st.count}</td>
        <td>${hero}</td>
    </tr>
</c:forEach>
</table>

6.取参

EL表达式还可以做到request.getParameter(“name”) 这样的形式获取浏览器传递过来的参数
先把jstl.jsp代码改为如例所示,然后访问如下地址

http://127.0.0.1/jstl.jsp?name=abc

可以观察到获取了参数 name

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*" isELIgnored="false"%>

${param.name}

7.eq

进行条件判断,大大简化了 JSTL的 c:if 和 c:choose 代码
如例,一行代码就能其他其他好几行代码的效果

${killNumber ge 10? "超神":"还没超神" }

例子中讲的是大于等于,除此之外的其他用法如下:
eq相等 ne、neq不相等
gt大于, lt小于
gte、ge大于等于
lte、le 小于等于
not非 mod求模
is [not] div by是否能被某数整除
is [not] even是否为偶数
is [not] odd是否为

猜你喜欢

转载自blog.csdn.net/Jae_Peng/article/details/80077484