JSTL标签库与EL表达式
JSTL 是JSP的标准标签库,是一个JSP的标签集合 ,按照类别包括核心标签,格式化标签,JSTL函数,SQL标签和XML标签 ,其中前三个用的概率较高。要想使用JSTL标签库我们首先要做的就是引入对应的Jar包【standard.jar和jstl.jar】。有时候我们在jsp页面上面要嵌套大量的Java代码,但是又要在页面上进行源码的编写,复杂且难以维护,所以我们就可以利用我们的JSTL标签库进行解决这个问题。
EL是JSP的表达式语言,EL表达式使我们在访问JavaBean中的数据非常简单,EL 表达式语法为【${expr}】,在jsp页面中,常用于获取后台传递的数据。通常情况下,我们将JSTL标签库与EL表达式进行结合使用,能很方便的进行数据的展示。
-- 后台进行model存储数据
model.addAttribute("rangeType","DQLQ");
model.addAttribute("title","title");
-- 前台利用JSTL标签库和EL表达式进行展示解析
${title}
-- 其中使用了JSTL标签库中的c:if 标签,然后在test判断条件中利用了el表达式。
1
2
3
4
5
6
7
8
9
JSTL核心标签
引用核心标签库的语法如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
1
核心标签库是最常用的JSTL标签。【红色圈线为重点】
这里写图片描述
格式化标签
引用格式化标签库的语法如下:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
1
JSTL格式化标签用来格式化并输出文本、日期、时间、数字。【红色圈线为重点】
这里写图片描述
JSTL函数
引用JSTL函数标签库的语法如下:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
1
JSTL函数库包含一系列标准函数,大部分是通用的字符串处理函数。【红色圈线为重点】
这里写图片描述
EL表达式基本操作符
在EL表达式中,我们可以利用绝大部分的Java所提供的算术和逻辑操作符。
这里写图片描述
注意EL 表达式中空值的判定
对NuLL的判断
Empty 对于 null 和”” 都会返回true
== null 则是对null 返回true 而对”” 则是返回false
Not empty 不等于空,包括不等于null 和不等于””
---------------------
作者:發V發
来源:CSDN
原文:https://blog.csdn.net/sinat_28978689/article/details/79381947
版权声明:本文为博主原创文章,转载请附上博文链接!
============================================================================================
一,来自于博文: http://www.cnblogs.com/o-andy-o/archive/2012/10/24/2737530.html
javascript中小脚本遍历list(之前没有转换成json格式)
var productinfo= [
<%List
.getAttribute("ProductItem");
if (list != null && list.size() > 0) {
for (int i = 0; i < list.size(); i++) {
try {
out.print("{code:\"" + list.get(i).get("PRODUCTCODE")
+ "\",name:\"" + list.get(i).get("PRODUCTNAME")
+ "\"}");
if (i != list.size() - 1) {
out.print(",");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
}
}
}%>
];
jstl+EL遍历list map array
List:
index:${status.index }
ID:${student.id }
Name:${student.name }
Country:${student.address.country }
City:${student.address.city }
Street:${student.address.street }
Map:
index:${status.index }
ID:${entry.key }
Name:${entry.value.name }
Country:${entry.value.address.country }
City:${entry.value.address.city }
Street:${entry.value.address.street }
Array:
${color}
jstl函数库:
函数 |
描述 |
fn:contains(string, substring) |
如果参数string中包含参数substring,返回true |
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 首尾的空格,并将其返回 |
//给遍历赋值,相当于 <% int example = 100+1; %>
//打印变量,相当于 <%=example%>
//从session中移除变量 <% session.removeAttribute("example")%>
//test里面是一个boolean的运算, var里面声明的变量则记录test的结果,scope指明这个变量的存在范围,有4个值,博文的第三点(JSP- 内置对象)
//条件为true时,执行的代码
//items中是遍历的集合变量,var里面声明集合中的单个对象名称为currentBook
…//显示书籍信息
循环遍历:
1、在jsp中引入标准函数声明
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
2、若要判断集合的大小,则需要引入如下声明
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
3、如何使用jstl判断集合是否为空
${user}为集合,user为集合名
json集合判断是否为空:
$(function(){
var coverageinfo= [];
});
$(function(){
var coverageinfo= ${coverageinfo};
});
4、如何取得集合的大小
${fn:length(sessionScope.键)}
${fn:length(map)}
取得json集合的大小:${covArr}.length;
取得字符串的长度 :${fn:length("hello")}
5、varStatus显示循环变量的状态
例:
.....................
其中status这个变量就记录了循环变量的状态
6、如何遍历Map集合
遍历Map集合的值:
foodmap:保存session中的map
foodmap.value:取得map的值,即获取保存在map中的一个对象
要获取对象中的数据,必须用foodmap.value.quantity去点对象的属性(quantity就是对象的属性)
二、 EL表达式与JSTL(C)标签: http://blog.csdn.net/javaloveiphone/article/details/7956237
一、EL表达式: Expression Language提供了在 JSP 脚本编制元素范围外(例如:脚本标签)使用运行时表达式的功能。脚本编制元素是指页面中能够用于在JSP 文件中嵌入 Java 代码的元素。它们通常用于对象操作以及执行那些影响所生成内容的计算
1)语法结构
${expression}
2)[]与.运算符
EL 提供.和[]两种运算符来存取数据。
当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用 []。
例如:${user.My-Name}应当改为${user["My-Name"] }
如果要动态取值时,就可以用[]来做,而.无法做到动态取值。
例如:${sessionScope.user[data]}中data 是一个变量
3)变量
EL存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为 username的变量。
它会依序从Page、Request、Session、Application范围查找(范围从小到大)。
如果找到则停止,并且不显示null,而是不显示值,这也是el表达式的优点,同时也是使用EL表达式取值进行判断时应该注意的
例如:在js中使用s标签并配合EL表达式取值做判断
var username = ${username};
正确的方式为:
属性范围在EL中的名称 使用方式: 相当于:
Page PageScope ${ pageScope.page_name }
Request RequestScope ${ requestScope.request_name } <%=request.getAttribute("request_name");%>
Session SessionScope ${ sessionScope.session_name } <%=session.getAttribute("session_name");%>
Application ApplicationScope ${ applicationScope.application_name } <%=application.getAttribute("application_name");%>
二、有效表达式
有效表达式可以包含文字、操作符、变量(对象引用)和函数调用。
1)文字:
文字文字的值
Boolean true 和 false 例如:${true}
Integer 与 Java 类似。可以包含任何正数或负数,例如 24、-45、567 例如:${23+45}
Floating Point 与 Java 类似。可以包含任何正的或负的浮点数,例如 -1.8E-45、4.567
String 任何由单引号或双引号限定的字符串。对于单引号、双引号和反斜杠,使用反斜杠字符作为转义序列。
必须注意,如果在字符串两端使用双引号,则单引号不需要转义。
Null null
2)操作符
JSP 表达式语言提供以下操作符,其中大部分是 Java 中常用的操作符:
术语定义
算术型 +、-(二元)、*、/、div、%、mod、-(一元)
逻辑型 and、&&、or、||、!、not
关系型 ==、eq、!=、ne、、gt、<=、le、>=、ge。可以与其他值进行比较,或与布尔型、字符串型、整型或浮点型文字进行比较。
空空操作符是前缀操作,可用于确定值是否为空。例如:${empty user.username} ${not empty user.username}
条件型 A ?B :C。根据 A 赋值的结果来赋值 B 或 C。
3)隐式对象
最常用的隐式对象有${param}和${paramValues}.
param 将请求参数名称映射到单个字符串参数值(通过调用 ServletRequest.getParameter (String name) 获得)。
getParameter (String) 方法返回带有特定名称的参数。表达式 $(param . name) 相当于 < %=request. getParameter(“username”)% >
例如在一个页面地址栏里面传的参数可以在另一个页面中通过这样的方式取出
paramValues 将请求参数名称映射到一个数值数组(通过调用 ServletRequest.getParameter (String name) 获得)。
它与 param 隐式对象非常类似,但它检索一个字符串数组而不是单个值。表达式 ${paramvalues. name) 相当于 request.getParamterValues(name)。
header 储存用户浏览器和服务端用来沟通的数据(通过调用 ServletRequest.getHeader(String name) 获得)。
例:要取得用户浏览器的版本,可以使用${header["User-Agent"]}。表达式 ${header. name} 相当于 request.getHeader(name)。
headerValues 有可能同一标头名称拥有不同的值(通过调用 ServletRequest.getHeaders(String) 获得)。
它与头隐式对象非常类似。表达式 ${headerValues. name} 相当于 request.getHeaderValues(name)。
cookie 将 cookie 名称映射到单个 cookie 对象。向服务器发出的客户端请求可以获得一个或多个 cookie。
表达式 ${cookie. name .value} 返回带有特定名称的第一个 cookie 值。
如果请求包含多个同名的 cookie,则应该使用 ${headerValues. name} 表达式。
initParam 将上下文初始化参数名称映射到单个值(通过调用 ServletContext.getInitparameter(String name) 获得)。
表达式${initParam.userid}相当于application.getInitParameter("userid");
pageContext取得其他有关用户要求或页面的详细信息。
${pageContext.request.queryString} 取得请求的参数字符串 相当于<%=request.getQueryString()%>
${pageContext.request.requestURL} 取得请求的URL,但不包括请求之参数字符串 <%=request.getRequestURL()%>
${pageContext.request.contextPath} 服务的web application 的名称 相当于<%=request.getContextPath()%>
${pageContext.request.method} 取得HTTP 的方法(GET、POST)
${pageContext.request.protocol} 取得使用的协议(HTTP/1.1、HTTP/1.0)
${pageContext.request.remoteUser} 取得用户名称
${pageContext.request.remoteAddr } 取得用户的IP 地址
${pageContext.session.new} 判断session 是否为新的
${pageContext.session.id} 取得session 的ID
${pageContext.servletContext.serverInfo} 取得主机端的服务信息
另外:上面提到的pageScope、requestScope、sessionScope 和 applicationScope也都是EL的隐式对象
例如:<%=user.getAddr( ) %> 等价于 ${user.addr} (user为一个变量,在action或者severlet中存放于指定的作用域中,addr为user的属性)
三、特别强调
1、注意当表达式根据名称引用这些对象之一时,返回的是相应的对象而不是相应的属性。
例如:即使现有的 pageContext 属性包含某些其他值,${pageContext} 也返回 PageContext 对象。
2、注意 <%@ page isELIgnored="true" %> 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默认的启用EL语言。
四、JSTL(C)标签:
由于EL表达式不能循环取出集合对象的值,所以可以通过使用jstl标签中的方法解决这个循环取出集合对象的问题
jstl是建立在el表达式基础上的语言,属于jsp外部的一个标准标签,库导入标签格式为:<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
JSTL部分介绍:
1、
2、迭代标签
语法:
//循环体
说明:1)items:是集合,用EL表达式;
2)var:变量名,存放items ,代表集合中每一条数据
3)varStatus: 显示循环状态的变量,有一下几个属性:
①index:从0开始; 显示当前迭代的索引值
②count:元素位置,从1开始; 显示当前迭代显示的行位置,通过配合判断语句,实现给奇、偶行着不同的色,以进行分区
③first:如果是第一个元素则显示true;
④last:如果是最后一个元素则显示true;
4)begin:循环的初始值(整型);
5)end: 循环结束 ;
6)step:步长,循环间隔的数值;
3、
4、
结构形式:
..........
:用于选择标签对之间满足条件的语句,相当于switch语句
5、、
说明:标签将请求重新定向到另外一个页面,它有以下属性
例子:
将请求重新定向到http://www.baiddu.com/login.jsp页,相当于response.setRedirect ("http://www.yourname.com/login.jsp");
6、
说明:
例子:
这个就在地址栏里面显示的形式为:http://www.baidu.com/login.jsp?paramName=paramValue
五、
说明:需要导入 <%@ taglib prefix="fmt" http://java.sun.com/jsp/jstl/fmt">http://java.sun.com/jsp/jstl/fmt" %>
1)格式化日期
Value:通过EL表达式或<%new Date() %> 取的日期值;
Pattern:输出的日期格式;诉讼
例如:
2) 格式化数字
===================================================================================================
FreeMarker是什么
FreeMarker 是一个用Java 语言编写的模板引擎,它可以根据一个模板生成一个文本,具体来定位的话,FreeMarker应该算是文本生成的一个工具。
在使用时首先定义一个模板文件,常写成ftl结尾的形式,也可以是jsp或者html文件改写来的。
模板文件中有四种元素:
1、文本:直接输出的部分
2、注释:即<#--...-->格式不会输出
3、插值:即${..}部分,将使用数据模型中的部分替代输出
4、FTL指令:和HTML标签类似,标签前加#予以区分,不会输出
比如判断语法的话也是if else。
遍历的话使用的是#list。
<#list 要循环的数据 as 循环后的数据> #list>
获取循环的下标:_index
内建函数:
内建函数语法格式: 变量?函数名称 比如: ${goodsList?size} 条记录
转换JSON字符串为对象:<#assign data=text?eval />
数字转换为字符串:累计积分:${point?c}
比较运算符:
=或者==:判断两个值是否相等.
!=:判断两个值是否不等.
>或者gt:判断左边值是否大于右边值
>=或者gte:判断左边值是否大于等于右边值
<或者lt:判断左边值是否小于右边值
<=或者lte:判断左边值是否小于等于右边值
为什么要用FreeMarkerDRT
FreeMarker这种技术优点就是可以使表现层和业务逻辑层分离,模板只需要负责数据展示,不需要写任何逻辑代码,这样分工可以更明确一些。并且FreeMarker由于生成的是静态界面,所以访问速度特别快
如何使用FreeMarker
在项目中,商品详情页是使用的FreeMarker来做的,商品审核通过的时候,将审核通过的商品ID传给FreeMarker,将静态界面生成,然后存到服务器上,当点击商品详情的时候,直接根据商品的ID去服务器上查找生成的详情界面就好了。
---------------------
作者:酷萌的汉子
来源:CSDN
原文:https://blog.csdn.net/weixin_42489163/article/details/82700464
版权声明:本文为博主原创文章,转载请附上博文链接!
===================================================================================================
2016年05月15日 13:41:38 stevennest 阅读数:4223更多
个人分类: JAVA
在最近项目中第一次使用Freemarker生成JSP网页,用此文章记录下Freemarker的一些常用方法。
转义符是我使用Freemarker遇到的第一个坑,由于不熟悉Freemarker对自身特殊关键字的处理,导致无法正常生成jsp网页。
在jsp中,我们经常在头部用java定义一些变量,然后在jsp页面中直接使用,如下所示,这样可以动态获取网站的css样式。
<%String ctx = request.getContextPath();
request.setAttribute("ctx",ctx);
%>
但如果把上面的代码直接拷贝到freemarker的ftl模板中,会报错。因为本来也属于Freemarker的关键字,用于显示后台定义的get,set变量,当模板文件
{ctx}找不到后台定义的ctx的get,set属性就会报空指针错误。对于这种情况,Freemarker提供了自己的转移标签。{r'
{}}。
如果希望正确生成上面的jsp代码,可以在模板文件中用以下写法。
Freemarker如果后台定义的对象为空,也会导致报错无法生成模板。这时需要使用以下语法。
<#if 对象名??>
#if>
具体案例代码如下:
<#if emergencyNavLevel??>
<#list emergencyNavLevel as emergency>
${emergency}
#list>
#if>
还有以下情况,对象user,name为user的属性的情况,user,name都有可能为空,那么可以写成${(user.name)!”},表示user或者name为null,都显示为空。判断为空。代码如下:
<#if (user.name)??>
……
#if>
无论structs的标签还是jstl的标签,前台经常需要把后台的List对象循环输出,Freemarker也提供了自己的标签在前台循环输出后台的定义的List对象。
例如:在后台定义了
private List queryList;
public List getQueryList() {
return queryList;
}
public void setQueryList(List queryList) {
this.queryList = queryList;
}
Freemarker在ftl模板中输出语法为
<#list queryList as query>
#list>
<#if>
<#if>
<#elseif>
<#elseif>
<#else>
#if>
if else也可以用于多层嵌套,具体案例中代码如下
<#list queryList as query>
<#if query.tdAlign==0>
<#else>width="${query.tdWidth}"#if> align="left" <#if query.tdValue="checkbox">headerTitle=""<#else>headerTitle="${query.thCaption}"#if> >
#if>
<#if query.tdAlign==1>
<#else>width="${query.tdWidth}"#if> align="center" <#if query.tdValue="checkbox">headerTitle=""<#else>headerTitle="${query.thCaption}"#if>>
#if>
<#if query.tdAlign==2>
<#else>width="${query.tdWidth}"#if> align="right" <#if query.tdValue="checkbox">headerTitle=""<#else>headerTitle="${query.thCaption}"#if>>
#if>
<#if query.tdValue=='checkbox'>
" />
#if>
<#if query.tdValue=='sequence'>
<%=(currentPageNo-1)*pageSize+count-1%>
#if>
<#if query.tdValue != 'status'>
<#if query.tdValue == 'createTime'>
" >
<#elseif query.tdValue == 'flContent'>
待联合审批
待联合盖章
待分发
已分发
<#elseif query.tdValue == 'status'>
" >
在办
已办
已注销
将注销
已归档
草稿
<#else>
" >
#if>
#if>
#list>
item_index:当前变量的索引值
item_has_next:是否存在下一个对象 其中item名称为as后的变量名
具体案例代码如下:
<#list conditionList as conditon>
<#if conditon.srhInputType!=3>${conditon.thCaption}: #if>
<#if conditon.srhInputType==0>
#if>
<#if conditon.srhInputType==1>
至
#if>
<#if conditon.srhInputType==2>
#if>
<#if !conditon_has_next && conditon_index%3 == 1> #if>
<#if !conditon_has_next && conditon_index%3 == 0> #if>
<#if !conditon_has_next && conditon_index%3 == 2> #if>
<#if conditon_has_next && conditon_index%3 == 2>#if>
#list>
你可能感兴趣的:(面试)