EL/JSTL – JSTL修改项目- 》让项目 中不能再有Java代码 - > 自定义标签。
JSP 动作: jsp:forward jsp:include动态包含
以下代码的问题:
<%=request.getParameter("name")%>
1:如果name这个参数不存在,则输出 null值。
2:上面的是java代码。
用于在页面上输出数据的。
语法:
${隐藏对象.属性}
如上面的输出语句可以修改成:
<%=request.getParameter("name")%>
<hr>
${param.name}
EL表达式的功能:
1:在页面上访问List,Map,Bean中的数据,显示。
2:防止出现Java代码。
隐藏对象 |
数据类型 |
示例 |
表示参数的: param |
Map<String,String> |
?name=Jack&age=90 ${param.name} : Jack - >类似于 param.get(“name”); ${param.age} : 90 |
paramValues |
Map<String,String[]> |
<hr> ${paramValues.name[0]},${paramValues.name[1]} |
表示获取头信息的 header |
Map<String,String> |
${header.host} <br> ${header["user-agent"]} |
headerValue |
Map<String,String[]> |
${headerValues['user-agent'][0]} |
表示cookie的 cookie |
Map<String,Cookie> |
${cookie.loginName.value} <br> 显示当前Session的id:${cookie.JSESSIONID.value} |
表示全局配置的初始化参数 在web.xml里面配置的<context-param>
initParam |
Map<String,String> |
<context-param> <param-name>name</param-name> <param-value>杰可乐</param-value> </context-param>
${initParam.name} : 杰可乐 |
|
|
|
表示域对象的
pageScope rerquestScope sesionScope applicatiionScope |
Map<String,Object> |
<% pageContext.setAttribute("name", "Jack"); request.setAttribute("name","Mary"); session.setAttribute("name", "Jerry"); application.setAttribute("name","Smith"); %> <hr> ${pageScope.name}:Jack<br> ${requestScope.name}:Mary<br> ${sessionScope.name}:Jerry<br> ${applicationScope.name}:Smith<br> |
表示当前页面对象的 表示工具类的 表示默认的隐藏对象的 pageContext
|
PageContext类型 |
表示工具类,可以调用所有没有参数的getXxxx()方法 ${pageContext.request.contextPath} <hr> <%=((HttpServletRequest)pageContext.getRequest()).getContextPath()%>
<!-- 以下表示:pageContext.findAttribute("name") --> ${name} |
这些隐藏对象:
如果某个值,不存在,则输出是 “”空的字符串。而不是null值。
<%
Person person = new Person();
person.setName("张三");
List<Object> list = new ArrayList<Object>();
list.add("Jerry");
list.add(person);
pageContext.setAttribute("tt",list);
%>
<hr>
<br>
${tt[1].name}
+ - * / % += ..都支持。
Empty 判断是否是 null , size==0
比较运算符号:
< gt > , eq = not eq !=
如何解决EL表达式,不能保存值,不能遍历数据的问题:
JSTL
SUN最先开发,目前由 apache维护。
JSTL标签,依赖于EL表达式。
JSTL标签分类:
4个标签一个函数:
标签、函数 |
使用 |
功能 |
Core标签 |
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> |
遍历,输出,显示,控制
|
Fmt标签 格式化标签,国际化标签 |
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="f" %> |
|
SQL标签 被禁止使用。 不能在页面上查询数据库。 不是 MVC原则 |
|
|
XML标签 在页面上处理XML数据 不是 MVC原则 |
|
|
Function函数 |
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> |
|
<c:out value="Jack"></c:out>
<br>
<c:out value="${param.name}" default="没有传递值" escapeXml="false"></c:out>
<br>
${param.name}
<c:set value="Jack" var="name"></c:set>
<br>
${pageScope.name}
<c:remove var="name" />
<br>
<%
String url = response.encodeRedirectURL(request.getContextPath()+"/");
out.print(url);
%>
<hr>
<c:url value="/"></c:url>
对于所有JSTL标签,都拥有var属性,var就是用于声明变量的,
如果声明了var变量,就会将数据放到var声明变量中的再放到指定域对象中去。而不显示。
如果没有var则是指不保存,直接显示。
<c:set var="sum" value="0"/>
<c:forEach begin="1" end="100" var="i">
<c:set value="${sum+i}" var="sum"></c:set>
</c:forEach>
${sum}
遍历集合:
<%
Map<String, Object> map = new HashMap<String, Object>();
map.put("name", "Jack");//Entry<String,Object> .getKey/getValue
map.put("age", 99);
pageContext.setAttribute("mm",map);
%>
<c:forEach items="${mm}" var="str">
${str.key}=${str.value}<br>
</c:forEach>
遍历下标对象:
<c:forTokens items="Jack#Mary,ALex#Smith" delims="#" var="str">
${str}<br>
</c:forTokens>
<c:if test="${param.age>100 }" var="boo">
1000
</c:if>
<c:if test="${!boo}">
not 100...
</c:if>
主页<br>
<c:set var="name" value="JKack" scope="request"></c:set>
<!-- 以下就是include -->
<c:import url="/one.jsp"></c:import>
<br>
格式化标签
<body>
<fmt:formatNumber value="49383484848.97384744" pattern="#,###.00"></fmt:formatNumber>
</body>
国际化标签
将中文进行转码:
@Test
public void test1() {
ResourceBundle res = ResourceBundle.getBundle("msg");
String name = res.getString("name");
System.err.println(name);//中文
}
以下是获取默认的国家,或是指定国家:
@Test
public void test1() {
//可以指定是哪一个国家
Locale locale = Locale.getDefault();
System.err.println(locale.getDisplayCountry());
System.err.println(locale.getDisplayLanguage());
ResourceBundle res = ResourceBundle.getBundle("msg",Locale.ENGLISH);
String name = res.getString("name");
System.err.println(name);//中文
}
<fmt:setLocale value="${param.local}"/>
<fmt:setBundle basename="msg" />
</head>
<body>
<a href="?local=zh_CN">中文</a> |
<a href="?local=en">English</a>
<hr>
<fmt:message key="name" />
<br>
<fmt:message key="welcome"></fmt:message>
<br>
<fmt:message key="img" var="iii"/>
<img alt="" src="${iii}">
</body>
Fn
<hr>
${fn:containsIgnoreCase('Jack and Mary','And') }
<br>
${fn:escapeXml(param.name)}
<br>
${param.name}
<br>
${fn:join(paramValues.name,"#")}