JavaWeb笔记十三:JSTL、自定义标签、MVC、Java三层框架

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%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() {
  } esle if() {
  } esle if() {
  } else if() {
  } else {
  }

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

<c:forEach>

可以用来遍历数组、List、Map、

1. 计数循环

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


<c:forEach begin="1" end="10" var="i" step="2">
 ${i}
</c:forEach>
等同于
for(int i = 1; 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

<%
	List<String> names = new ArrayList<String>();
	names.add("zhangSan");
	names.add("liSi");
	names.add("wangWu");
	names.add("zhaoLiu");
	pageContext.setAttribute("ns", names);
%>
<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 }" varStatus="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 prefix="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="${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/itcast.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>itcast</short-name> 
	<uri>http://www.itcast.cn/tags</uri> 
	<tag> 
		<name>hello</name> <!--标签名称-->
		<tag-class>cn.itcast.tag.HelloTag</tag-class> <!--标签处理类名称-->
		<body-content>empty</body-content> <!--标签体为空,即空标签-->
	</tag>
</taglib>

3. jsp页面中使用自定义标签

<%@ taglib prefix="it"  uri="/WEB-INF/hello.tld"  %>
......
<it: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.getParameter("exec");
		if(s != null && s.endsWith("true")) {
			// 获取标签体对象
			JspFragment body = this.getJspBody() ;
			// 执行标签体
			body.invoke (null);
		}

	}
}

2. tld

	<tag>
		<name>hello</name>
		<tag-class>cn.itcast.tags.HelloTag</tag-class>
		<body-content>scriptless</body-content> <!--标签体内容不可以是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>cn.itcast.tag.IfTag</tag-class> 
		<body-content>scriptless</body-content>
		<!--部署属性-->
		<attribute> 
			<name>test</name> <!--属性名-->
			<required>true</required> <!--属性是否为必须的-->
			<rtexprvalue>true</rtexprvalue> <!--属性值是否可以为EL或JSTL等-->
		</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层(数据访问层):封装对数据库的操作,通常对应一次对数据库的访问,例如添加、修改、删除、查询等。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值