Javaweb学习笔记——(十三)——————JSTL、JSTL核心标签库、自定义标签、有标签体的标签、带有属性的标签、MVC、Javaweb三层框架

时间:2023-09-12 21:56:20

JSTL

Apache提供的标签库
jar包:jstl-1.2.jar,如果传MyEclipse,他会在我们导入jar包,无需自己导入,如果没有使用MyEclipse那么需要自行导入。

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

导入JSTL核心标签库
<%taglib prefix="c" uri="http://java.sun.com/jstl/core"%>

<c:set>
*<c:set var="a" value="hello"/>创建名为·a,值为hello的域属性,范围:page
*<c:set var="a" value="hello" scope="session" /> 范围为session

<c:out>
*<c:out value="aaa"/>输出字符串aaa
*<c:out value="${aaa }"/> 输出域属性aaa,其中与${aaa}相同
*<c:out value="${aaa }" default="xxx"/>如果${aaa}不存在,那么输出xxx字符串
*<c:out value="${aaa }" escapeXml="true"/>如果${aaa}中包含特殊字符,那么转义它。这可以防止JavaScript攻击

<c:remove>
*<c:remove var="a"/> 删除名为a的域属性
*<c:remove var="a" scope="page" /> 删除page域中名为a的域属性

<c:url>
*<c:url value="/AServlet"/> 输出URL:/项目名/AServlet
*<c:url value="/AServlet" var="url" scope="page"/>

把生成的url保存到page域中,而不会输出
*<c:url value="/AServlet">:输出URL:/项目名/
AServlet?username=%xx%xx%xx%xx%xx,其中张三会被URL编码
<c:param name="username" value="张三"/>
</c:url>

<c:if>
*<c:if test="${条件}"> 当条件为true时执行标签体内容
hello
</c:if>

<c:choose>
<c:choose>
<c:when test="${条件1}">a</c:when>
<c:when test="${条件2}">b</c:when>
<c:when test="${条件3}">c</c:when>
<c:otherwise>d</c:otherwise>
</c:choose>

等同于:
if(){

}else if(){

}else if(){

}

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

<c:forEach>
可以用来遍历数组,List、Map、

1.计数循环
<c:forEach begin="1" end="10" var="i">
${i}
</c:forEach>
等同于
for(int i = 1; i <= 10; i++》){
our.println(i);
}

<c:forEach begin="1" end="10" var="i">
${i}
</c:forEach>
等同于
for(int i = i; i <= 10; i+=2){
out.println(i);
}

-------------------------------------------------------------------------------------------
2.遍历数组
<%
String[] names = {"zhangSan", "liSi", "wangWu", "zhaoLiu"};
pageContext.setAttribute("ns", names);
%>
<c:forEach var="item" items="${ns}">
<c:out value="name:${item}" /><br/>
</c:forEach>

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

3.遍历List
<%
String[] names = {"zhangSan", "liSi", "wangWu", "zhaoLiu"};
names.add("zhangSan");
names.add("liSi");
names.add("wangWu");
names.add("zhaoLiu");
pageContext.setAttribute("ns", name);
%>
<c:forEach var="item" items="${ns}">
<c:out value="name: ${item}" /><br/>
</c:forEach>

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

4.遍历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}">
<c:out value="${item.key}" ${item.value}/> <br/>
</c:forEach>

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

5.循环状态对象
循环状态对象是用来说明循环的状态的,属性如下:
count:int类型,当前以遍历元素的个数;
index:int类型,当前元素的下标;
first:boolean类型,是否为第一个元素;
last:boolean类型,是否为最后一个元素;
current:Object类型,表示当前项目。

<c:forEach var="item" items="${ns}" varStarus="vs" >
<c:if test="${vs. first}"> 第一行:</c:if>
<c:if test="${vs.last}"> 最后一行:</c:if>
<c:out value="第${vs.count}行"/>
<c:out value="[${vs.index}]:" />
<c:out value="name: ${vs.current}" /><br/>
</c:forEach> 

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

导入JSTL格式化标签库
<%@ taglib prifix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<% 
Date date = new Date();
pageContext.setAttribute("d", date);
%>
<fmt:formatDate value="${d }" 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="${d}" 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="#.##" />

*pattern:0.00,表示小数不足两位时,使用0补足两位
*pattern:#.##,表示小数不足两位时,有几位显示几位,不会补足

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

自定义标签
自定义标签:
1.实现了Tag接口,即传统标签。不建议使用
2.实现了SimpleTag接口,即简单标签,建议使用

Javaweb中还提供了SimpleTagSupport类,继承它要比实现SimpleTag接口方便。

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

步骤:
1.标签处理类:继承SimpleTagSupport类
public class HelloTag extends SimpleTagSupport {
public void doTag() throws JspException, IOException {
//获取JspContext对象,再获取out对象,再向页面输出
//获取到的JspContext其实就是当前页面的pageContext对象
this.getJspContext().getOut().write("<p>Hello SimpleTag!<p>");
}
}

2.标签描述符文件(tld)
/WEB-INF/tlds/changedy.tld

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xml="http://www.w3.org/XML/1998/namespace" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd ">

<tlib-version>1.0</tlib-version> 
<short-name>changeyd</short-name> 
<uri>http://www.changeyd.top/tags</uri> 
<tag> 
<name>hello</name> <!--标签名称-->
<tag-class>com.changeyd.tag.HelloTag</tag-class> <!--标签处理类名称-->
<body-content>empty</body-content> <!--标签体为空,即空标签-->
</tag>

</taglib>

3.jsp页面中使用自定义标签
<%@ taglib prefix="changeyd" uri="/WEB-INF/hello.tld" %>
..........
<changeyd:hello/>

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

有标签体的标签

1.标签处理类
public class HelloTag extends SimpleTagSupport{
public void doTag() throws JspException, IOException{
PageContext pc = (PageContext) this.getJspContext();
HttpServletRequest req = (HttpServletRequest) pc.getRequest();
String s = req.getParamter("exec");
if(s != null && s.endWith("true")){
//获取标签体对象
JspFragment body = this.getJspBody();
//执行标签体
body.invoke(null);
}

}

2.tld
<tag>
<name>hello</name>
<tag-class>com.changeyd.tags.HelloTag</tag-class>
<!-- 标签体内容不可以是Java脚本,但可以是el、jstl等 -->
</tag>

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

不执行标签下面的页面内容
public void doTag() throws JspException, IOException{
this.getJspContext().getOut().print("<h1>只能看到我!</h1>");
throw new SkipPageException();
}

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

带有属性的标签
public class IfTag extends SimpleTagSupport{
private boolean test;//设置属性,提供getter/setter方法
public boolean isTest(){
return test;
}

public void setTest (boolean test){
this.test = test;
}
@Override
public void doTag() throws JspException, IOException{
if(test){//如果test为true,执行标签体内容
this.getJspBody().invoke(null);
}

}

<tag>
<name>if</name>
<tag-class>com.changeyd.tag.IfTag</tag-class>
<body-content>scriptless</body-content>
<!-- 部署属性 -->
<attribute>
<name>test</name><!-- 属性名 -->
<required>true</required> <!-- 属性是否为必须 -->
<rtexprvalue>true</rtexprvalue> <!-- 属性值是否可以为EL或SJTL等 -->
</attribute>
</tag>

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

MVC
1.什么是MVC
MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。

*控制器Controller:对请求进行处理,负责请求转发;
*视图View:界面设计人员进行图形界面设计;
*模型Model:程序编写程序应用的功能(实现算法等等)、数据库管理;

2.Java与MVC
JSP Model1第一代:JSP + DB
JSP Model1第二代:JSP + JavaBean + DB
JSP Model2:JSP + Servlet + JavaBean + DB

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

JavaWeb三层框架
*Web层(表示层):与web相关的,例如jsp、servlet都是web层

*Business层(业务逻辑层):封装业务逻辑,通常对应一个业务功能,例如登录、注册都一个业务功能。

*Data层(数据访问层):封装对数据库的操作,通常对应一次对数据库的访问,例如添加、修改、删除、查询等。

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

笔记:

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:域,默认为scope,可选值:page,request、session、application

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

3.url
*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>
结果为:/day3-1/index.jsp?username=%ED%2C%3F%ED%2C%3F

*var:指定变量名,一旦添加了这个属性,那么url标签就不会再输出到页面,而是把生成url保存到域中。

*scope:它与var一起使用,用来保存url。

4.if:对应Java中的if语句
*<c:if test="布尔类型">...</c:if>,当test为值时,执行标签体内容

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){
System.out.println(str);
}

属性:
*items:指定要循环谁,它可以是一个数组或一个集合
*var:把数组或集合中的每个元素赋值给var指定的变量。

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

循环状态
可以使用varStatus来创建循环状态变量!

循环状态变量有如下属性:
*count:循环元素的个数
*index:循环元素的个数
*first:是否为第一个元素
*last:是否为最后一个元素
*current:当前元素

<c:forEach items="${list }" var="els" varStatus="vs">
${vs.index} ${vs.count} ${vs.first} ${vs.last} ${vs.current} <br/>
</c:forEach>

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

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="${num2}" pattern="#.##"

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

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

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

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

3.配置tld文件
tld文件一般都放在WEB-INF之下,这样保证客户端访问不到!
<tag>
<name>myTag1</name>指定当前标签的名称
<tag-class>com.changeyd.tag.MyTag1</tag-class> 指定当前标签的标签处理类
<body-context>empty</body-context>指定标签体的类型,我们这里使用的是空标签
</tag>

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

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

进阶

标签体内容
*empty:无标签体
*JSP:jsp2.0已经不再支持这个类型了,表示标签体内容可以是:java脚本,可以是标签,可以是el表达式
*scriptless:只能是EL表达式,也可以是其他的标签。
*tagdependent:标签体内容不会被执行,而是直接赋值标签处理类。

不在执行标签下面内容的标签

在标签处理类中的doTag()中使用的SkipPageException来结束
Tomcat会调用标签处理类的doTag()方法,然后Tomcat会得到SkipPageExcetpion,它会跳过本页面其他内容

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

标签属性
步骤:
1.给你的标签处理类添加属性:
为标签处理类添加属性,属性至少要且一个set方法,这个set方法会在doTag()方法之前被tomcat执行,所在doTag()中就可以使用属性了。

2.在tld文件中对属性进行配置
<attribute>
<name>test</name> 指定属性名
<required>true</required> 指定属性是否为必需的
<rtexprvalue>true</rtexprvalue> 指定属性是否可以使用EL
</attribute>

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

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

M -- model  模型(自己写代码)
V -- View   视图(jsp)
C -- Cotroller 控制器(Sservlet)

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

JavaWeb三层框架

Web层 --> 与Web相关的内容(Servlet, JSP, Servlet相关API:request、response、session、ServletContext)
业务层 --> 业务对象(Service)
数据层 --> 操作数据库(DAO Data Access Object)(所有对数据库的操作,不能跳出DAO之外)