--------学了自定义标签,也知道很多公司,都有自己的自定义的一套标签库,比如擅长做金融产品的公司,一般都有自己的一套自己写的针对金融产品的标签库,但是像我们平时做的中小系统,就没必要都自己去写一套标签库了,我们有现成的会使用就好!比如很常用的JSTL!
-------JSP Standard Tag Library(简称JSTL),是一套预先定义好、协助程序设计人员简化JSP网页制作的标签函数库,规格包含了各种网页运作所需的运用,例如循环、流程控制、输入/出、文本格式化,甚至XML文件处理及数据库访问操作均为其涵盖范围。
-------到JSP2.0后,通过结合使用EL,可以开发出没有java代码的JSP,这使得JSP的开发非常简单,非Java程序员都能胜任。另外,通过使用JSTL可以使
程的代码量大大减少。
使用核心标签
[#1.设置JSTL运行环境]
1.1下载JSTL的jar包,下载地址:http://tomcat.apache.org/taglibs/standard/
Impl: taglibs-standard-impl-1.2.5.jar JSTL实现类库
Spec: taglibs-standard-spec-1.2.5.jar JSTL标准接口
EL: taglibs-standard-jstlel-1.2.5.jar JSTL1.0标签-EL相关
Compat: taglibs-standard-compat-1.2.5.jar 兼容版本
如果不使用JSTL1.0标签,可以忽略taglibs-standard-jstlel包,taglibs-standard-compat包,应该是兼容以前版本标签库,所以一般只需要 taglibs-standard-impl 和 taglibs-standard-spec 两个jar包
1.2.也可以不用下载,不下载可以到tomcat目录里去copy也是可以的!
apache-tomcat-8.5.55\webapps\examples\WEB-INF\lib中有对应的包,复制到lib下即可。
1.3.配置页面taglib 若不记得uri(页面taglib配置需要).
可以解压包,打开如c.tld文件,找到uri, 复制用即可。
<uri>http://java.sun.com/jsp/jstl/core</uri>
----> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
2.核心标签库的应用。
2.1 <c:out>
语法1:未包含主体(body)
<c:out value= "value" [escapeXml= "{true|false}"]
[default= "defaultValue"] />
语法2:包含主体(body)
<c:out value= "value" [escapeXml= "{true|false}"]>
default value
</c:out>
语法3:将value值储存至目标对象target的属性propertyName
<c:set target="target" property="propertyName" value="值"/>
语法4:将本体(body)内容储存至目标对象target的属性propertyName
<c:set target="target" property="propertyName">
body content
</c:set>
例:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:out value="jstl tag"></c:out>
</body>
</html>
测试:http://localhost:8080/mvcproject/jstltest/c_out.jsp
jstl tag
测试:因为本测试在 mvcproject项目中测试的
2.<c:set>
语法1:将value值储存至范围变量varName
<c:set value="value" var="varName"
[scope="{page|request|session|application}"]/>**
语法2:将本体(body)内容设定储存至范围变量varName
<c:set var="varName" [scope="{page|request|session|application}"]>
body content
</c:set>
语法3:将value值储存至目标对象target的属性propertyName
<c:set target="target" property="propertyName" value="值"/>
语法4:将本体(body)内容储存至目标对象target的属性propertyName
<c:set target="target" property="propertyName">
body content
</c:set>
例:
<br>
<%
User user =new User(); //javaBean---cn.ybzy.mvcproject.model.User
pageContext.setAttribute("user",user); //页面域对象,本页有效
out.println("没有设置用户姓名前"+user); //为null
%>
<c:set target="${user}" property="username" value="熊少文"/>
<br>
c_set之后:
<c:out value="${user.username}"/>
<br/>
<c:out value="${user.getUsername() }"/> <!-- 这个和以上一个,两个c:out结果一样 -->
测试:http://localhost:8080/mvcproject/jstltest/c_out.jsp
没有设置用户姓名前User [id=0, username=null, password=null, phoneNo=null, address=null, regDate=null]
c_set之后: 熊少文
熊少文
3.<c:remove>
用来移除某个范围变量的內容值
<c:remove var="varName"
[scope="{page|request|session|application}"]/>
4.<c:url>标签
作用是将一个URL地址格式化为一个字符串,并且保存在一个变量当中。它具有URL自动重写功能。value指定的URL可以是当前工程的一个URL地址,也可以是其他web工程的URL。但是这时需要context属性,context:其他工程路径。也可以添加需要传递的参数
语法1:无本体内容,就是单纯的显示url地址
<c:url value="value" [context="context"]
[var="varName"] [scope="{page|request|session|application}"]/>
语法2:在本体内容指定url地址的参数?+的形式跟在后面
<c:url value="value" [context="context"]
[var="varName"] [scope="{page|request|session|application}"]>
<c:param name="" value=""></c:url>
****核心标签中的if、choose和when,提供相当于程序语言流程控制的功能 。**
-------<c:choose>则被运用于需要进行多重判断的场合,它本身是一个框架,判断内容则由<c:when>和<c:otherwise>两个标签完成 。
5.<c:if> 条件表达式一般用EL.
与Java中的if语句相同 。
语法1:无本体内容
<c:if test="testCondition" var="varName" [scope="{page|request|session|application}"]/>
语法2:包含本体内容
<c:if test="testCondition" [var="varName"] [scope="{page|request|session|application}"]>
body content
</c:if>
<c:if test ="${3>20}" var ="rs"/>
<c:out value="${rs}"/>
<c:if test="${3<4 }" var ="rs">
<c:out value="${rs}"/>
</c:if>
6.<c:choose>、<when>与<otherwise>
<c:choose>标签与Java的switch语句的功能一样,用于在众多选项中做出选择。
语法 - <c:choose>
<c:choose>
<c:when test="<boolean>">
...
</c:when>
<c:when test="<boolean>">
...
</c:when>
...
...
<c:otherwise>
...
</c:otherwise>
</c:choose>
例1:
<c:choose>
<c:when test="2>1">
2>1
</c:when>
<c:when test="4>3">
4>3
</c:when>
<c:otherwise>
6>5
</c:otherwise>
</c:choose>
结果: 6>5
这结果明显示,不符合我们的要求。而应这样
<c:set value="1" var ="var"/>
<c:choose>
<c:when test="${var==1}">
2>1
</c:when>
<c:when test="${var==2 }">
4>3
</c:when>
<c:otherwise>
6>5
</c:otherwise>
</c:choose>
7.<c:forEach> 循环。
语法1:迭代对象集合内容。
<c:forEach [var="varName"] items="collection" [varStatus="varStatusName"]
[begin="begin"] [end="end"] [step="step"]>
body content
</c:forEach>
语法2:迭代特定次数。
<c:forEach [var="varName"] [varStatus="varStatusName"]
begin="begin" end="end" [step="step"]>
body content
</c:forEach>
var每次从集合里拿出来的一个数据, 放进var指定的变量里 。items注入到jsp页面的集合类的数据, 放在这里头。varStatus也就是status封装了当前遍历的状态,比如,可以从该对象上
查看是遍历到了第几个元素:
${status.count}
<c:out value=”${status.current}”/>当前对象
<c:out value=”${status.index}”/>此次迭代的索引
<c:out value=”${status.count}”/>已经迭代的数量
<c:out value=”${status.first}”/>是否是第一个迭代对象
<c:out value=”${status.last}”/>是否是最后一个迭代对象
例:输出List集合<String> 姓名
1.TagController.java
@WebServlet(urlPatterns = {"*.tag"})
public class TagController extends HttpServlet {
..................................................................................................
private void index(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Map<String,Integer> map = new HashMap<>();
map.put("张三",20);
map.put("李四",21);
map.put("小白", 22);
// req.setAttribute("map", map);
//req.getRequestDispatcher("/tag/FirstTag.jsp").forward(req, resp);
List<String> lists = new ArrayList<>();
lists.add("张三");
lists.add("李四");
lists.add("王二");
lists.add("麻子");
Date date = new Date();
req.setAttribute("date", date);
req.setAttribute("list", lists);
req.getRequestDispatcher("/jstltest/forEach.jsp").forward(req, resp);
}
2.forEach.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<body>
<c:forEach items="${list}" var="u">
<c:out value="${u}" /> <br/><br/>
</c:forEach>
<table border="1" cellpadding="0" cellspacing="0">
<c:forEach items="${list}" var="u" varStatus="status">
<tr>
<td>现在循环到第 ${status.count} 个了!是第一个吗?${status.first }</td>
<td>${u}</td>
</tr>
</c:forEach>
</table>
<c:forEach var="vvv" begin="1" end ="10" step="2">
${vvv }<br/> <!--输出1 3 5 7 9-->
</c:forEach>
<!--下面的代码用的不多 -->
<c:forTokens items="xiong,shao,wen" delims="," var = "name">
<c:out value="${name}"/> <p>
</c:forTokens>
</body>
3.测试:
http://localhost:8080/mvcproject/index.tag
8格式化
①函数的fn.tdl复制进工程
③<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
格式化日期
<fmt:formatDate value="date" [type="{time|date|both}"][dateStyle="{default|short|medium|long|full}"]
[timeStyle="{default|short|medium|long|full}"]
[pattern="customPattern"]
[timeZone="timeZone"]
[var="varName"]
[scope="{page|request|session|application}"]/>
例:首先由上例中的控制类注入一个当前日期时间到jsp中,上拉可看到。
其次:forEach.jsp中定上:
没有格式化的日期时间: ${date}
<br>
格式化之后的日期时间:
<fmt:formatDate value ="${date }" dateStyle="full"/><br/>
<fmt:formatDate value ="${date }" type="time" timeStyle="full"/><br><br/>
<fmt:formatDate value ="${date }" type="both" pattern="yyyy-MM-dd HH:mm:ss"/>
测试:http://localhost:8080/mvcproject/index.tag
没有格式化的日期时间: Mon Jun 21 13:05:01 CST 2021
格式化之后的日期时间: 2021年6月21日
下午01时05分01秒
2021-06-21 13:05:01
数字格式化
9.函数标签库。
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
我们常用的也就是字符串处理,这里只列举字符串函数。
函数是作为表达式用的,不是标签形式。
例:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:set var="string1" value="This is first String"/>
<c:set var="string2" value="${fn:substring(string1,1,4)}"/>
<c:out value="${string2 }"/>
${string2}
</body>
</html>
EL,JSTL改造mvcproject.
index.jsp
1.判断用户登录,输入的密码,用户名,验证码是否错误‘提示语’note是否为空。
<%
if (request.getAttribute("note") != null) {
%>
<span style="color: red; font-weight: bolder;"><%=request.getAttribute("note")%></span>
<%
}
%>
改为:
<c:if test="${not empty requestScope.note}">
<span style="color: red; font-weight: bolder;">${note }</span>
</c:if>
main.jsp
1.利用session空间的东西,判断用户是否已登录成功,不是重新登录,不会直接输入该页而进入该页面。
<%
String username = (String)request.getSession().getAttribute("user");//如果session空间里有username,表明该username已登 陆成功,由于没计好,用user当username了。
if(username==null ||"".equals(username)){
response.sendRedirect(request.getContextPath()+"/index.jsp");
}
%>
改为:
<c:if test="${empty sessionScope.user }">
<c:redirect url="/index.jsp" context="${pageContext.request.contextPath}"/>
</c:if>
改了以后,有一个问题,所以后用过滤器来改
2.循环遍历记录,显示在表格中。
<%
List<User> list = (List<User>) request.getAttribute("userlist");
if(list !=null && list.size()>0){
for(User user:list){
%>
<tr>
<td><%=user.getId()%></td>
<td><%=user.getUsername()%></td>
<td><%=user.getPassword()%></td>
<td><%=user.getPhoneNo() %></td>
<td><%=user.getAddress() %></td>
<td><%=user.getRegDate() %></td>
<td><a href="<%=request.getContextPath()%>/update.udo?id=<%=user.getId()%>">编辑</a> | <a href="<%=request.getContextPath()%>/delete.udo?id=<%=user.getId()%>">删除</a></td>
</tr>
<%}
}
%>
</table>
改为:
update.jsp
1.判断用户名是否已存在(不包括自已上),不能修改已存在的记录。
<%
String note =(String) request.getAttribute("note"); //note是由UserControlller.java--updatedo传来的req.setAttribute("note","xxxx")
if(note!= null && !"".equals(note)){
%>
<tr><td style="text-align:center;color:red;font-weight:bolder;" colspan="2">${note}</td></tr>
<%
}
%>
改为:
<c:if test="${not empty requestScope.note }">
<tr><td style="text-align:center;color:red;font-weight:bolder;" colspan="2">${note}</td></tr>
</c:if>
``