讨论命令include和jsp-include的区别
例如:<%@ include file=”B” %>和<jps:include page= “C” >
带@的是jsp命令,静态包含:
A、B放在一起 --> 翻译 --> 编译 --> 执行 --> 生成HTML
带jsp的,动态包含:
A编译 –-> C编译 --> C、A分别执行 -->C结果加入到A结果 –-> 生成HTML
动态包含意味着执行jsp的时候,都需要对两个文件分别进行编译、执行,然后将两个计算的结果进行合并,比较耗时;静态包含是把代码进行合并,一起编译,执行。
JSP的配置
配置分为两种
- 在JSP的文件头中加入page命令标签(<%@page%>)
- 在部署描述符(即web.xml文件)中进行配置。
在page命令标签中配置,仅对当前文档生效;在web.xml配置,对所有匹配的jsp文件生效。
在部署描述符中定义(web.xml)
在web.xml中,每个标签的顺序不能颠倒。<include-prelude>
是静态包含在文件的头,<include-coda>
是静态包含在文件尾。
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern><!--只有匹配到的jsp会使用下面的配置,按照精度最高进行匹配-->
<page-encoding>utf-8</page-encoding><!--jsp页面的编码格式-->
<scripting-invalid>false</scripting-invalid><!--支持script脚本标签(<%%>这样的标签)-->
<include-prelude>/WEB-INF/jsp/base.jspf</include-prelude><!--在所匹配的jsp头部添加代码-->
<include-coda>/WEB-INF/jsp/footer.jspf</include-coda><!--在所匹配的jsp尾部添加代码-->
<trim-directive-whitespaces>true</trim-directive-whitespaces><!--去掉jsp编译成html后的空白-->
<default-content-type>text/html</default-content-type><!--默认的content-type-->
</jsp-property-group>
</jsp-config>
EL表达式
EL表达式用来替换JSP中的java代码,如果把它看做有返回值的函数的话,它的返回值永远是字符串,因此可以将EL表达式用于css中的value中。
EL表达式的基本形式
- EL表达式具体的格式:
${expr}
expr是一个返回字面值类型的表达式,该表达式的形式可以为如下:
- EL内置的运算:比较运算、逻辑运算、普通运算、empty、unary,其中
==
跟equals()
方法等同。 EL内置的函数
例如:${fn:join({“tom”, “jarry”, “garry”}, “,”)}的结果为: “tom,jarry,garry”
${fn:contains(String, String)}
:测试第一个参数是否包含一个或者多个第二个参数。${fn:length(Object)}
:获得Object的${fn:trim(String)}
${fn:escapeXml(String)}
:避开那些特殊的字符,如>
替换为≶
,&
替换为&
${fn:join(String[] src,String delimit)}
:将src变成字符串,用delimit进行链接。
- EL内置的运算:比较运算、逻辑运算、普通运算、empty、unary,其中
在JSP中引入标签库:
<%@ taglib prefix= “fn” uri= http://java.sun.com/jsp/jstl/functions %>
才能使用内置函数。
- EL调用对象中的方法
${user[“name”]}
- EL中字符串的拼接
${“hello” += “Word”}
,使用“+=”
符号进行字符串的拼接。
EL表达式使用作用域对象
- pageContext:表示本页面的对象,可以通过它获得ServletRequest对象、HttpSession对象等许多对象,这些对象不同于Scope,这些对象含有一些自身的属性和方法。
- Scope对象:这类对象是一个Map容器,Map拥有的操作可以在Scope中使用。下列中的Scope是按照作用域进行排序的:
- pageScope:作用域最小,仅能用于当前的页面,局部变量
- requestScope:request范围的变量
- sessionScope
- applicationScope:作用域最大
- 如果四个作用域变量都有一个a属性,${a}优先调用离自己最近的变量(
pageScope
离它最近,applicationScope
离它最远)
JSTL标签 <c:out value= "..." escapeXml="false"/>
:escapeXml属性默认为true,就是说会对value中的值进行${fn:escapeXml(String)}
处理。
JSTL标签中总是:非自闭合的时候,html为其默认值;自闭合的时候,default属性设置默认值。
<c:url value= “..” />、<c:redirect url= “” />
等包含url的JSTL标签中:- 都有一个属性
context
用于指定应用的路径,默认为当前应用。因此该标签会自动添加应用 - 非自闭合的时候,可以拥有
<c:param name= “” value= “” />
子标签
- 都有一个属性
- 循环
<c:forEach var= “i” begin= “0” end= “100” step= “1”varStatus= “status”>
...
</c:forEach>
/// 等同于:
for(int i=0; i<=100/*注意:循环次数是101次*/;i+=1){
...
}
<c:forEach items= “users” var= “user” varStatus= “status”>
${useer[“name”]}
</c:forEach>
/// 等同于:
for(User user : users) {
System.out.println(user.getName());
}
<c:forEach items= “map” var= “entry” varStatus= “status”>
${entry.getValue()}
${entry.getKey()}
</c:forEach>
等同于
Set<Map.Entry<String,String>> entries = map.entrySet();
for(Map.Entry entry : entries) {
System.out.prinln(entry.getValue());
System.out.prinln(entry.getKey());
}
其中,step默认值是1,是每次循环的步长。status是内置的一个拥有循环信息的变量,例如:
${status.begin}:循环开始的index
${status.index}:当前index处的值
items表示数据集变量的名字。当items为map时,会自动将items转变为Map.Entry的集合,即调用Map.entrySet()
,然后对该集合进行遍历。
6. <c:forTokens items= “This,is,a,nice,tag” delims= “,”></c:forTokens>
:该标签会分离字符串,分离的依据是delims
,所有的items
中的值都会被当作字符串处理。
7. <c:import>
用来请求其他页面的内容,镶嵌到本页面中
8. <c:choose>
中必须至少含有一句<c:when>
标签;<c:when>
标签必须在<c:choose>
中。第二句<c:when>
开始,等同于else if
,并非是if
。
<c:choose>
<c:when test="${i}>50">...</c:when>
<c:when test="${i}>5">...</c:when>
<c:otherwise>...</c:otherwise>
</c:choose>
//等同于
if(i > 50) {...}
else if (i > 5) {...}
else {...}
- 操作作用域变量
<c:remove var= "a" scope="request"/> // 如果没有指定scope时,所有的作用域变量的a属性均会被删除
<c:set var="myVariable" value="hello world" /> // 中的scope默认是pageScope,而不是匹配全部scope