标签:
*apache的东西,依赖EL
* 使用jstl需要导入jstl1.2.jar
* 四大库:
> core:核心库,重点
> fmt:格式化:日期、数字
> sql:过时
> xml:过时
*jar包
* 在jsp页面中:<%@taglib prefix="前缀" uri="路径"%>
----------------------
*<c:out>:输出
> value:可以是字符串常量,也可以是EL表达式
> default:当要输出的内容为null时,会输出default指定的值
> escapeXml:默认值为true,表示转义!
*<c:set>:设置(创建域的属性)
> var:变量名
> value:变量值,可以是EL表达式
> scope:域,默认为page,可选值:page、request、session、application
*<remove>:删除域变量
> var:变量名
> scope:如果不给出scope,表示删除所有域中的该名称的变量;如果指定了域,那么只删除该域的变量。
*url标签会在需要URL重写时添加sessionId
*value:指定一个路径!它会在路径前面自动添加项目名。
<> <c:url value="/index.jsp"/>,它会输出/day13_1/index.jsp
* 子标签:<c:param>,用来给url后面添加参数,例如:
<c:url value="/index.jsp">
<c:param name="username" value="张三"/> <!--可以对参数进行url编码!!-->
</c:url>
结果为:/day13_1/index.jsp?username=%ED%2C%3F%ED%2C%3F
*var:指定变量名,一旦添加了这个属性,那么url标签就不会再输出到页面,而是把生成url保存到域中。
*scope:它与var一起使用,用来保存url。
<c:url value="/" var="a" scope="request"/>
把本该输出的结果赋给变量a。范围为request
对应java中的if语句
*<c:if test="布尔类型">...</c:if>,当test值为true时,执行标签体内容!
<c:set var="a" value="hello"/>[在page域中创建名为a的变量] <c:if test="${not empty a }"><span style="font-size: 13.3333px; font-family: Arial, Helvetica, sans-serif;">[判断a变量不为null,没有指定域,表示全域]</span> <c:out value="${a }"/> </c:if>
它对应java中的if/else if/... /else
* 例如:
<c:choose>
<c:when test="">...</c:when>
<c:when test="">...</c:when>
<c:when test="">...</c:when>
...
<c:otherwise> ...</c:otherwise>
</c:choose>
等同与
if(...) {
}else if( ....) {
}else if( ....) {
}else if( ....) {
}...
else { ...}
它用来循环遍历数组、集合!
它还可以用来计数方式来循环!
计数方式:
for(int i = 1; i <= 10; i++) {
...
}
<c:forEach var="i" begin="1"end="10">
${i}
</c:forEach>
属性:
*var:循环变量
*begin:设置循环变量从几开始。
*end:设置循环变量到几结束。
*step:设置步长!等同与java中的i++,或i+=2。step默认为1
----------------------
用来输出数组、集合!
<c:forEach items="${strs }"var="str">
${str}<br/>
</c:forEach>
等同于
for(String str : strs) {
...
}
属性:
* items:指定要循环谁,它可以是一个数组或一个集合
* var:把数组或集合中的每个元素赋值给var指定的变量。
遍历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 var="item" items="${stu }"><span style="font-size: 13.3333px; font-family: Calibri;">[因为遍历的是Map,所以每一项是Entry类型]</span> <c:out value="${item.key }: ${item.value }"/><br/><span style="font-size: 13.3333px; font-family: Calibri;">[获取Entry的key和value]</span> </c:forEach>
----------------------
循环状态
可以使用varStatus来创建循环状态变量!
循环状态变量有如下属性:
*count:循环元素的个数
*index:循环元素的下标
*first:是否为第一个元素
*last:是否为最后一个元素
*current:当前元素
<% ArrayList<String> list = new ArrayList<String>(); list.add("一"); list.add("二"); list.add("三"); pageContext.setAttribute("list", list); %> <c:forEach items="${list }" var="ele" varStatus="vs"> ${vs.index} ${vs.count } ${vs.first } ${vs.last } ${vs.current }<br/> </c:forEach>结果
0 1 true false 一
1 2 false false 二
2 3 false true 三
====================================
它是格式化库
<fmt:formatDate value=""pattern="">
value:指定一个Date类型的变量
pattern:用来指定输出的模板!例如:yyyy-MM-dd HH:mm:ss
--------------
<fmt:formatNumber value="${num1}" pattern="0.00">
保留小数点后2位,它会四舍五入!如果不足2位,以0补位!
<fmt:formatNumber value="${num1}" pattern="#.##">
保留小数点后2位,它会四舍五入!如果不足2位,不补位!
====================================
* 标签处理类(标签也是一个对象,那么就需要先有类!)
*tld文件,它是一个xml
* 页面中使用<%@taglib%>来指定tld文件的位置
SimpleTag接口:
*void doTag():每次执行标签时都会调用这个方法;
*JspTag getParent():返回父标签(非生命周期方法)
*void setParent(JspTag):设置父标签
*void setJspBody(JspFragment):设置标签体
*void seetJspContext(JspContext):设置jsp上下文对象,它儿子是PageContext
其中doTag()会在其他三个方法之后被tomcat调用。
SimpleTagSupport类:
* SimpleTagSupport它实现了SimpleTag接口。
* 它已经把所有的tomcat传递的数据都保存起来了!而且还提供了get方法供子类调用!
tld文件一般都放到WEB-INF之下,这样保证客户端访问不到!
<tag>
<name>myTag1</name> 指定当前标签的名称
<tag-class>cn.itcast.tag.MyTag1</tag-class>指定当前标签的标签处理类!
<body-content>empty</body-content>指定标签体的类型,我们这里使用的是空标签!
</tag>
<%@ taglib prefix="it"uri="/WEB-INF/tlds/itcast-tag.tld" %>
导标签库,就是为页面指定tld文件的位置!
-------------------------------
*empty:无标签体!
*JSP:jsp2.0已经不在支持这个类型了!表示标签体内容可以是:java脚本,可以是标签,可以是el表达式
*scriptless:只能是EL表达式,也可以是其他的标签!
*tagdependent:标签体内容不会被执行,而是直接赋值标签处理类!
不在执行标签下面内容的标签!
在标签处理类中的doTag()中使用SkipPageException来结束!
Tomcat会调用标签处理类的doTag()方法,然后Tomcat会得到SkipPageException,它会跳过本页面其他内容!
public class MyTag4 extends SimpleTagSupport { @Override public void doTag() throws JspException, IOException { this.getJspContext().getOut().print("只能看到我,下面什么都没有!"); throw new SkipPageException();//抛出这个异常后,在本标签后面的内容,将看不到! } }
---------------
步骤:
1. 给你的标签处理类添加属性!
为标签处理类添加属性,属性至少要且一个set方法!这个set方法会在doTag()方法之前被tomcat执行!所在doTag()中就可以使用属性了。
2. 在tld文件中对属性进行配置
<attribute>
<name>test</name> 指定属性名
<required>true</required>指定属性是否为必需的
<rtexprvalue>true</rtexprvalue>指定属性是否可以使用EL
</attribute>
简单模拟if标签
/** * 有属性的标签 * * @author cxf * */ public class MyTag5 extends SimpleTagSupport { private boolean test; /* * 这个方法会由tomcat来调用,并且在doTag()之前 */ public void setTest(boolean test) { this.test = test; } @Override public void doTag() throws JspException, IOException { if(test) { /* * 执行标签体 */ this.getJspBody().invoke(null);//如果传递的输出流为null,表示使用的就是当前页面的out! } } }
==========================================
它不是java独有,所有的B/S结构的项目都在使用它!
M --model 模型(自己写代码)----程序编写程序应用的功能(实现算法等等)、数据库管理;
V --View 视图(jsp)----界面设计人员进行图形界面设计;
C --Cotroller 控制器(Servlet)----对请求进行处理,负责请求转发
几乎现在所有B/S结构的软件都采用了MVC设计模式。但是要注意,MVC在B/S结构软件并没有完全实现,例如在我们今后的B/S软件中并不会有事件驱动!
==========================================
我们常说的三层框架是由JavaWeb提出的,也就是说这是JavaWeb独有的!
所谓三层是表述层(WEB层)、业务逻辑层(Business Logic),以及数据访问层(Data Access)。
Web层 --> 与Web相关的内容(Servlet,JSP,Servlet相关API:request、response、session、ServletContext)
业务层 --> 业务对象(Service):业务层中不包含JavaWeb API,它只关心业务逻辑;
数据层 --> 操作数据库(DAO Data Access Object)(所有对数据库的操作,不能跳出到DAO之外)
PS:注意,在业务层中不能出现JavaWeb API,例如request、response等。也就是说,业务层代码是可重用的,甚至可以应用到非Web环境中。业务层的每个方法可以理解成一个万能,例如转账业务方法。业务层依赖数据层,而Web层依赖业务层!
例:利用三层框架结构简单实现显示User类的属性
jsp页面
显示结果
web.servlet(UserServlet)
* 在servlet中依赖service,然后通过service完成功能,把结果保存到request中
* 转发到jsp显示。
service(UserServive)
// service层依赖dao层
* service的查询,需要使用dao来完成!
dao(Dao)
* 把xml中的数据查询出来之后,封装到user对象中,然后返回
domain(User)
* 把数据库中查询出的结果保存到这个对象中。
web day13 JSTL标签库(c标签,自定义标签),MVC设计模式,JavaWeb经典三层框架
标签:
原文地址:http://blog.csdn.net/opopopwqwqwq/article/details/51204611