您的位置:首页 > 编程语言 > Java开发

web day13 JSTL标签库(c标签,自定义标签),MVC设计模式,JavaWeb经典三层框架

2016-04-20 23:27 387 查看


JSTL

1. jstl的概述

*apache的东西,依赖EL

* 使用jstl需要导入jstl1.2.jar

* 四大库:

> core:核心库,重点

> fmt:格式化:日期、数字

> sql:过时

> xml:过时

2. 导入标签库

*jar包

* 在jsp页面中:<%@taglib prefix="前缀" uri="路径"%>

----------------------

core --> c标签!

1. out和set

*<c:out>:输出

> value:可以是字符串常量,也可以是EL表达式

> default:当要输出的内容为null时,会输出default指定的值

> escapeXml:默认值为true,表示转义!

*<c:set>:设置(创建域的属性)

> var:变量名

> value:变量值,可以是EL表达式

> scope:域,默认为page,可选值:page、request、session、application

2. remove

*<remove>:删除域变量

> var:变量名

> scope:如果不给出scope,表示删除所有域中的该名称的变量;如果指定了域,那么只删除该域的变量。

3. url

*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

4. if:

对应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>


5. choose:

它对应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 { ...}

6. forEach

它用来循环遍历数组、集合!

它还可以用来计数方式来循环!

计数方式:

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库

它是格式化库

<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位,不补位!

====================================

自定义标签

1. 步骤

* 标签处理类(标签也是一个对象,那么就需要先有类!)

*tld文件,它是一个xml

* 页面中使用<%@taglib%>来指定tld文件的位置

2. 标签处理类

SimpleTag接口:

*void doTag():每次执行标签时都会调用这个方法;

*JspTag getParent():返回父标签(非生命周期方法)

*void setParent(JspTag):设置父标签

*void setJspBody(JspFragment):设置标签体

*void seetJspContext(JspContext):设置jsp上下文对象,它儿子是PageContext

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

SimpleTagSupport类:

* SimpleTagSupport它实现了SimpleTag接口。

* 它已经把所有的tomcat传递的数据都保存起来了!而且还提供了get方法供子类调用!

3. 配置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文件的位置!

-------------------------------


自定义标签进阶



标签体内容

*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!
}
}
}


==========================================

MVC



它不是java独有,所有的B/S结构的项目都在使用它!

M --model 模型(自己写代码)----程序编写程序应用的功能(实现算法等等)、数据库管理;

V --View 视图(jsp)----界面设计人员进行图形界面设计;

C --Cotroller 控制器(Servlet)----对请求进行处理,负责请求转发

几乎现在所有B/S结构的软件都采用了MVC设计模式。但是要注意,MVC在B/S结构软件并没有完全实现,例如在我们今后的B/S软件中并不会有事件驱动!

==========================================

JavaWeb三层框架



我们常说的三层框架是由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)

* 把数据库中查询出的结果保存到这个对象中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: