JavaWeb从头再来系列之JSTL基本知识介绍

一:什么是JSTL
JSTL是apache对EL表达式的扩展(也就是说JSTL依赖EL),JSTL是标签语言, JSTL标签中可以搭配EL使用,
它们俩主要是想替换java脚本 ,EL可以直接在jsp中使用不需要导入包,而要使用jstl必须导入一个 jstl-1.2jar

二:jstl标签库
core:核心库
fmt:格式化库

2.1:core:核心库:
先使用taglib指令导入
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>

<%@page import="java.util.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		//pageContext.setAttribute("hello", "pageContext_hello");
		pageContext.setAttribute("a", "<script>alert('hello');</script>");
	%>

	<!--JSTL标签  -->
	hello world<br/>
	<c:out value="hello world"></c:out><br/>
	<c:out value="${hello}"/> <!--和${hello}相同,全域查找,找不到返回空!  -->
	<c:out value="${hello}" default="找不到"/><br/> <!--全域查找,找不到的话会输出default属性的值!  -->
	<c:out value="${a}" default="找不到" escapeXml="true"/><br/> <!--escapeXml默认是true,这样就不会受到js攻击  -->
	
	
	<!--Set标签: 可以代替脚本中这些域设值了  -->
	<c:set var="xxx" value="pageContext_xxx"></c:set><br/> <!--等价于: pageContext.setAttribute("xxx","pageContext_xxx") -->
	<c:set var="xxx" value="request_xxx" scope="request"/><br/> <!--等价于: request.setAttribute("xxx","pageContext_xxx") -->
	<c:set var="xxx" value="session_xxx" scope="session"/><br/> <!--以此类推 -->
	<c:set var="xxx" value="application_xxx" scope="application"/><br/>
	
	<!--out标签差不多可以代替EL表达式了,虽然里面还是要EL的支持  -->
	<c:out value="${xxx}"/><br/>
	<c:out value="${requestScope.xxx}"/><br/>
	<c:out value="${sessionScope.xxx}"/><br/>
	<c:out value="${applicationScope.xxx}"/><br/>
	
	<!--remove标签  -->
	<c:set var="a" value="pageContext_a"/><br/> 
	<%-- <c:remove var="a"/><br/>  --%><!--不指定scope属性是删除所有域中的a属性!  -->
	<%-- <c:remove var="${a}" scope="page"/><br/> --%>
	
	<!--url标签:会在url重写的时候添加JsessionId  -->
	<c:url value="/"/> <!--输出/项目名/  -->
	<c:url value="/AServlet"><!--输出: /day_09/AServlet?username=URL编码&password=123 , 注意:一般get请求不会自动url编码的,post会  -->
		<c:param name="username" value="王"></c:param>
		<c:param name="password" value="123"></c:param>
	</c:url>
	<br/>
	<hr/>
	
	<!--if标签: 保证test属性是一个boolean值  -->
	<c:set var="a" value="pageContext_a"/>
	<c:if test="${not empty a }"> <!--判断a不等于null  -->
		<c:out value="${a}"/>
	</c:if>
	
	<br/>
	<!--choose标签: 相当于if...else if...else if..结构  -->
	<c:set var="score" value="61" />
	<c:choose>
		<c:when test="${score>100 || score<0 }">错误的分数</c:when>
		<c:when test="${score>60}">及格</c:when>
		<c:otherwise>
			不及格
		</c:otherwise>
	</c:choose>
	
	<br/>
	
	<!--循环标签foreach: 普通for,增强for  -->
	<c:set var="sum" value="0" />	
	<c:forEach var="i" begin="0" end="10">
		<c:set var="sum" value="${sum + i }" />	
	</c:forEach>
	<c:out value="${sum}"/>
	
	<!--遍历数组:  -->
	<%
		String[] strs = {"apple","pear"};
		request.setAttribute("strs", strs);
	%>
	
	<br/>
	<c:forEach items="${strs}" var="str">
		<c:out value="${str}"/>
	</c:forEach>
	<br/>
	
	<!--遍历List:  -->
	<%
		List<String> lists = new ArrayList<String>(Arrays.asList("a","b"));
		request.setAttribute("lists", lists);
	%>
	<c:forEach items="${requestScope.lists}" var="list">
		<c:out value="${list }"></c:out>
	</c:forEach>
	<br/>
	
	<!--遍历Map:  -->
	<%
		Map<String,String> stu = new LinkedHashMap<String,String>();
		stu.put("number", "N_1001");
		stu.put("name", "zhangSan");
		stu.put("age", "23");
		stu.put("sex", "male");
		pageContext.setAttribute("stu", stu);
	%>
	<c:forEach items="${pageScope.stu}" var="item">
		<c:out value="${item.key}: ${item.value}"/>
	</c:forEach>
	<br/>
	
	
	<%
		List<String>  nums = new ArrayList<String>(Arrays.asList("一","二","三"));
		pageContext.setAttribute("nums", nums);
	%>
	<!--循环状态  
    varStatus这个属性用来指定接收“循环状态”的变量名,例如:<forEach varStatus=”vs” …/>,这时就        
    可以使用vs这个变量来获取循环的状态了。
    count:int类型,当前以遍历元素的个数;
    index:int类型,当前元素的下标;
    first:boolean类型,是否为第一个元素;
    last:boolean类型,是否为最后一个元素;
    current:Object类型,表示当前
    -->

	<c:forEach items="${nums}" var="item" varStatus="vs">
		${vs.index } ${vs.count } ${vs.first } ${vs.last } ${vs.current}<br/>
	</c:forEach>
	
</body>
</html>

 循环状态的效果图:

 2.2:fmt:格式化库
先导入:<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<!--格式时间  -->
	<%
		pageContext.setAttribute("date", new Date());
	%>
	<fmt:formatDate value="${date }" pattern="yyyy-MM-dd HH:mm:ss"/>
	
	<!--格式数字 -->
	<%
		double d1 = 3.5;
		double d2 = 4.4; 
		pageContext.setAttribute("d1", d1);
		pageContext.setAttribute("d2", d2);

	%>
	<fmt:formatNumber value="${d1 }" pattern="0.00"/><br/>
	<fmt:formatNumber value="${d2 }" pattern="#.##"/>

 三:自定义标签!(要求可以看懂就行!)

自定义标签

1. 步骤
   标签处理类(标签也是一个对象,那么就需要先有类!)
   tld文件,它是一个xml
   页面中使用<%@taglib%>来指定tld文件的位置

2. 标签处理类
  SimpleTag接口:
    void doTag():每次执行标签时都会调用这个方法;
    JspTag getParent():返回父标签(非生命周期方法)
    void setParent(JspTag):设置父标签
    void setJspBody(JspFragment):设置标签体
   void seetJspContext(JspContext):设置jsp上下文对象,它儿子是PageContext

  其中doTag()会在其他三个方法之后被tomcat调用。

3. 配置tld文件(tld模板,可以解压jstl.jar, 有个c.tld)
    tld文件一般都放到WEB-INF之下,这样保证客户端访问不到!

  <tag>
      <name>myTag1</name> 指定当前标签的名称
      <tag-class>cn.itcast.tag.MyTag1</tag-class> 指定当前标签的标签处理类!
      <body-content>empty</body-content> 指定标签体的类型,我们这里使用的是空标签!
  </tag>

4. 页面中指定tld文件位置
<%@ taglib prefix="it" uri="/WEB-INF/tlds/itcast-tag.tld" %>
导标签库,就是为页面指定tld文件的位置!

例子:

public class MyTag1 implements SimpleTag {
	private PageContext pageContext;
	private JspFragment body;

	/**
	 * 所有的setXxx()方法都会在doTag()方法之前被tomcat调用!
	 * 所在doTag()中就可以使用tomcat传递过来的对象了。
	 */
	@Override
	public void doTag() throws JspException, IOException {
		pageContext.getOut().print("Hello Tag!");
	}

	@Override
	public JspTag getParent() {
		return null;
	}

	@Override
	public void setJspBody(JspFragment body) {
		this.body = body;
	}

	@Override
	public void setJspContext(JspContext context) {	
		this.pageContext = (PageContext) context;
	}

	public void setParent(JspTag arg0) {}
}

 

/**
 * SimpleTagSupport它实现了SimpleTag接口。
 *   它已经把所有的tomcat传递的数据都保存起来了!而且还提供了get方法供子类调用!
 * @author cxf
 *
 */
public class MyTag2 extends SimpleTagSupport {
	@Override
	public void doTag() throws JspException, IOException {
		this.getJspContext().getOut().print("再 Hello 一次 Tag!");
	}
}

 tld文件

<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
    version="2.1">
   
  <tlib-version>1.0</tlib-version>
  <short-name>itcast</short-name>
  <uri>http://www.itcast.cn/tags/it-1.0</uri>
  
  <tag>
  	<name>myTag1</name>
  	<tag-class>cn.itcast.tag.MyTag1</tag-class>
  	<body-content>empty</body-content>
  </tag>
  
  <tag>
  	<name>myTag2</name>
  	<tag-class>cn.itcast.tag.MyTag2</tag-class>
  	<body-content>empty</body-content>
  </tag>
  
  <tag>
  	<name>myTag3</name>
  	<tag-class>cn.itcast.tag.MyTag3</tag-class>
  	<body-content>scriptless</body-content>
  </tag>
  
  <tag>
  	<name>myTag4</name>
  	<tag-class>cn.itcast.tag.MyTag4</tag-class>
  	<body-content>empty</body-content>
  </tag>
  
  <tag>
  	<name>myTag5</name>
  	<tag-class>cn.itcast.tag.MyTag5</tag-class>
  	<body-content>scriptless</body-content>
  	<attribute>
  		<name>test</name>
  		<required>true</required>
  		<rtexprvalue>true</rtexprvalue>
  	</attribute>
  </tag>
</taglib>


 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值