-
标签技术概述
在jsp页面中有HTML语句和java语句相互嵌套,如果java的逻辑代码和页面的HTML组成代码都十分复杂,两者有掺杂在一起,页面的可读性和可维护性都将降低。为了解决这个问题,产生了标签技术。用它来替换页面中的java语句,这样页面中只会出现HTML代码,整体的可读性和可维护性都会提升。-
常用的JSP标签技术
jsp标签
sun公司提供的标签技术 - 目前用的比较少
el表达式
便捷易用 - 使用非常广泛 - 但只是表达式无法实现复杂功能
jstl标签库
提供了大量强大的标签支持,是目前应用最广泛的标签库
自定义标签
sun提供的标签库开发接口,允许开发人员自己来开发特定功能的标签 - 通常用在框架级别的开发中,普通开发人员很少使用
其他第三方标签
以后了解 -
EL表达式概述
在jsp页面内的<%= JSP脚本表达式%> 都可以使用EL表达式来替换。
EL Expression Language 表达式语言
在javaee5及其以上版本中,都已经默认包含了el表达式的相关开发包,无需手动导入。 -
使用方式
语法:${ el表达式 }
可以获取常量、变量、数组、列表、映射、javabean等中的数据 -
EL特点:
EL表达式不能设置值,只能获取值
EL表达式只能获取域中的属性
EL表达式不能遍历 -
获取常量
el表达式获取常量
<%=123 %> <%=123.123 %> <%="abc"%> <%=true%> ${123 } ${123.123 } ${"abc" } ${true } -
获取变量
a. 获取指定域中的属性
el表达式获取域中的变量
<%
pageContext.setAttribute(“name”, “朴大胖”, PageContext.APPLICATION_SCOPE);
pageContext.setAttribute(“name”, “曹二胖”, PageContext.SESSION_SCOPE);
pageContext.setAttribute(“name”, “李三瘦”, PageContext.REQUEST_SCOPE);
pageContext.setAttribute(“name”, “丽丽”, PageContext.PAGE_SCOPE);
%>
<%=pageContext.getAttribute(“name”) %>
<%=request.getAttribute(“name”) %>
<%=session.getAttribute(“name”) %>
<%=application.getAttribute(“name”) %>
${pageScope.name}
${requestScope.name}
${sessionScope.name }
${applicationScope.name }
i. el表达式中的四大作用域
el表达式 jsp脚本表达式
pageScope PAGE_SCOPE
requestScope REQUEST_SCOPE
sessionScope SESSION_SCOPE
applicationScope APPLICATION_SCOPE
b. 自动搜寻域
自动搜寻域
<%=pageContext.findAttribute(“name”) %>
${name}
c. 获取数组中的数据
获取数组中数据
<%
String[] names ={“殷天正”,“谢逊”,“韦一笑”,“黛绮丝”};
pageContext.setAttribute(“names”, names);
%>
${names[0]}
${names[1]}
${names }
d. 获取链表中的数据
获取链表中的数据
<%
List list = new LinkedList();
list.add(“aaa”);
list.add(“bbb”);
list.add(“ccc”);
pageContext.setAttribute(“l”, list);
%>
${l[0]}
e. 获取映射中的数据
获取映射中的数据
<%
Map<String,String> map = new HashMap<String,String>();
map.put(“name”, “曹洋”);
map.put(“age”, “18”);
map.put(“wife”,“丽丽”);
map.put(“addr”, “安徽”);
request.setAttribute(“map”, map);
request.setAttribute(“w”, “wife”);
%>
${map}
${map.name}
<%-- ${map.wife.first} --%>
${map[“wife”] }
[wife]: ${map[w]}
f. 获取javabean中的数据
在一个类中,如果存在私有化属性,这些属性包含get或set任意一个方法,则这些私有化的属性就可以称之为javabean属性,类中存在这些属性,这个类就是javabean的类。
获取javabean中的数据
<%
Person p = new Person(“曹洋”,18,“女”);
pageContext.setAttribute(“p”,p);
%>
<%=p.getName() %>
p.namei.在jsp脚本表达式中使用p.getXxx()方法获取的数据,在el表达式中都可以使用{p.name} i. 在jsp脚本表达式中使用p.getXxx()方法获取的数据,在el表达式中都可以使用p.namei.在jsp脚本表达式中使用p.getXxx()方法获取的数据,在el表达式中都可以使用{p.xxx}的方式来获取。
ii. 如果javabean中的getXxx()方法发生了修改,则el表达式也要随之修改。
例如:
getName() ${p.name}
getNamex() ${p.namex}-
获取执行运算的结果
a. 算术运算
算术运算
${3+2}
${3-2}
${3/2 }
${3*2 }
${3%2 }
${3+“2”}
${3-“2” }
b. 关系运算
关系运算
${3>2 }
${3<2 }
${3==2 }
${3!=2 }
${3>=2 }
${3<=2 }
c. 逻辑运算
逻辑关系
${true && false }
${true and false }${true || false } ${true or false } ${!true } ${not true }
d. empty运算
empty运算用于判断当前域中属性是否为空。
Empty运算规则:如果对象为null 字符串为空 集合、数组、映射没有任何元素 empty操作都会返回true,否则false
empty运算
<%
String str = null;
pageContext.setAttribute(“str”, str);
String s ="";
pageContext.setAttribute(“s”, s); -
String[] names = {};
pageContext.setAttribute(“names”, names);
List list = new LinkedList();
pageContext.setAttribute(“list”, list);
Map<String,String> map = new HashMap();
pageContext.setAttribute(“mapx”, map);
List listx = new LinkedList();
listx.add(“abc”);
pageContext.setAttribute(“listx”, listx);
%>
${empty str }
${empty s }
${empty names}
${empty list }
${empty mapx }
${empty listx }
e. 三元表达式运算
三元表达式
<%
Map<String,String> mapx = new HashMap();
mapx.put(“name”, “”);
pageContext.setAttribute(“mapx”, mapx);
%>
${empty mapx.name?“曹洋”:mapx.name}
7. el表达式的内置对象–11个
a. el表达式中的域对象 —4个
pageScope
requestScope
sessionscope
applicationScope
b. 代表请求头的内置对象
header 获取一个返回值为Map<String,String>的内置对象
headerValues 获取一个返回值为Map<String,String[]>的内置对象
request.getHeader(“host”)
${header.host}
c. 代表请求参数的内置对象
param 获取一个返回值为Map<String,String>的内置对象
paramValues 获取一个返回值位Map<String,String[]>的内置对象
request.getParameter(“username”)
${param.username}
d. 获取初始化请求参数的内置对象
initParam 获取一个返回值为Map<String,String>的内置对象
initParam.url
e. 获取浏览器中的cookie信息的内置对象
cookie 获取一个返回值为Map<String,Cookie>的内置对象
cookie.JSESSIONID.name
cookie.JSESSIONID.value
f. 获取pageContext内置对象
<%=request.getContextPath()%>
${pageContext.request.contextPath}
8. el表达式调用java方法
略。
1. JSTL标签库概述
JSTL全称为JavaServerPages Standard Tag Library。
由JCP(Java Community Process)指定标准。
是提供给 Java Web 开发人员一个标准通用的标签函数库。
可以和 EL 配合来取代传统直接在页面上嵌入 Java 程序(Scripting)的做法,以提高程序可读性、维护性和方便性。
2. jstl引入
在java ee5及其以上版本,已经默认包含了jstl标签库,可以直接直接使用。
再通过指令确定引入的标签库名称:
<%@taglib uri="" prefix=""%> uri="地址" prefix简称
3. 拓展:命名空间或名称空间概述
在通过taglib指令引入标签的时候,需要指定一个名称空间URN。这个URN中的内容看似是一个地址,但是实际上表示的是一个名字。书写形式为地址的原因是希望做到每一个指定标签库规范的人都可以有唯一一份规范,避免两两之间相互重复。
4. taglib可以引入的标签库
core ---- 核心标签库 c库
fmt ---- 国际标签库
sql ---- sql标签库
xml ---- xml标签库
a. taglib指令引入core库
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
5. jstl标签
a. c:set 设置或修改值的标签
i. 设置或修改域中值
<h3>c:set设置域中值</h3>
<c:set scope="page" var="a" value="abc"></c:set>
<c:set scope="request" var="a" value="123"></c:set>
<c:set scope="session" var="a" value="789"></c:set>
<c:set scope="application" var="a" value="114"></c:set>
${pageScope.a }
${requestScope.a}
${sessionScope.a }
${applicationScope.a }
${a}
<h4>修改域中的值</h4>
<c:set scope="request" var="a" value="曹洋"></c:set>
${requestScope.a}
ii. 设置或修改map中值
<h3>c:set设置map中的值</h3>
<%
Map<String,String> map = new HashMap<String,String>();
pageContext.setAttribute("map", map);
%>
<c:set target="${map}" property="name" value="小朴朴"></c:set>
${map}
${map.name }
<h4>修改map中的值</h4>
<c:set target="${map }" property="name" value="小兰兰"></c:set>
${map }
${map.name }
iii. 修改javabean中值
<h3>javabean中值的修改</h3>
<%
Person p = new Person("李帅",19,"女");
pageContext.setAttribute("p", p);
%>
${p.name }
<c:set target="${p}" property = "name" value="小帅帅"></c:set>
${p.name }
<!-- javabean中如果没有对应set方法提供,则不能随意设置新的属性 -->
<%-- <c:set target="${p }" property="addr" value="河北"></c:set> --%>
<%-- ${p.addr } --%>
b. c:remove 移除域中属性
<h3>c:remove移除域中属性</h3>
<c:set scope="page" var="name" value="谢逊"></c:set>
<c:set scope="request" var="name" value="韦一笑"></c:set>
<c:set scope="session" var="name" value="殷天正"></c:set>
<c:set scope="application" var="name" value="黛绮丝"></c:set>
${pageScope.name }
${requestScope.name }
${sessionScope.name }
${applicationScope.name}
${name }
<hr>
<!-- 删除指定域中的数据 -->
<c:remove var="name" scope="request" />
${pageScope.name }
${requestScope.name }
${sessionScope.name }
${applicationScope.name}
<hr>
<!-- 如果不指定删除哪一个域,则将全部域中对应的属性删除 -->
<c:remove var="name"/>
${pageScope.name }
${requestScope.name }
${sessionScope.name }
${applicationScope.name}
c. c:if 判断结构
<h3>c:if 判断结构</h3>
<c:set var="num" value="100" scope="request"></c:set>
<c:if test="${num<100}" var="flag" >
num小于100
</c:if>
${flag }
<c:if test="${num>=100}" var="flag1">
num大于等于100
</c:if>
${flag1}
d. c:choose 选择判断结构
<c:choose>
<c:when test="${num<100}"></c:when>
<c:when test="${num<1000}"></c:when>
<c:when test="${num<10000}"></c:when>
<c:otherwise></c:otherwise>
</c:choose>
<h3>c:choose选择判断结构</h3>
<c:choose>
<c:when test="${num<100 }">num小于100</c:when>
<c:when test="${num<1000 }">num小于1000</c:when>
<c:when test="${num<10000 }">num小于10000</c:when>
<c:otherwise>num大于等于10000</c:otherwise>
</c:choose>
e. c:forEach 循环结构
<h3>c:forEach 循环结构</h3>
<%-- <c:forEach begin="0" end="100" step="2" var="e" varStatus="stat">
${stat.count}
</c:forEach> --%>
<!-- 0到100能够被3整除的偶数总数(count) -->
<c:forEach begin="0" end="100" step="2" var="i" varStatus="s" >
<c:if test="${s.count%3 == 0 }">
<font color='red'>${i}</font>
</c:if>
<c:if test="${s.count%3 != 0 }">
<font color='blue'>${i}</font>
</c:if>
</c:forEach>
<h4>遍历数据结构</h4>
<%
List list = new LinkedList();
list.add("abc");
list.add(123);
list.add(true);
pageContext.setAttribute("list", list);
%>
<c:forEach items="${list }" var="l" step="1">
${l}
</c:forEach>
f. c:catch 捕获异常
<h3>c:catch 捕获异常</h3>
<c:catch var="ca">
<%
String str = null;
str.toLowerCase();
%>
</c:catch>
${ca }
g. c:forTokens 切割字符串
<h3>c:forTokens切割字符串</h3>
<c:forTokens items="www.tedu.cn" delims="." var="v">
${v }
</c:forTokens>
- 纯Servlet开发
纯servlet开发,将HTML页面展示代码和java的逻辑处理代码都书写在后台中,使页面展示与逻辑处理绑死在一起,如果需要修改,则当前servlet需要全部改变。-
纯JSP开发
纯JSP开发,可以在JSP页面内书写HTML页面展示代码和java的逻辑处理代码。所有内容由后台转而移向前台书写,没有从根本上解决,开发和维护时遇到的可读性和可维护性较低的问题。 -
JSP+javabean开发 java模式一
jsp负责页面展示和接收请求,javabean负责逻辑处理和封装数据 。由于jsp一个模块负责两个模块的内容,使页面中不得不出现必要的逻辑处理代码,应该讲这部分内容与JSP页面分离。因为JSP页面是善于页面展示,而不善于逻辑处理的。 -
Servlet+JSP+JavaBean javaModelTwo
Servlet负责接收请求,JSP负责页面展示,JavaBean负责逻辑处理和封装数据。
开发中的三个部分,在这种模式下,分成三个模块,两两模块之间得到了最大程度的解耦,一个模块改动对另外的模块影响很小。所以可以把它们看做是相互独立的三个模块。
三个模块各司其职,能够最大成功提升开发效率,以及提升代码的可读性及可维护性。 -
MVC开发模式
在MVC开发模式看来,任何一个程序都可以由三部分组成。负责接收请求的控制器(Controller),负责展示页面的视图(View)和负责处理逻辑的模型(Model)这三部分组成。
MVC开发模式将三个模块分开,每个模块担任一个职责,模块之间几乎不会受到影响。在这种情况下,开发效率可以得到显著提升,以及提升代码的可读性及可维护性。
注意:MVC开发模式适用于所有的语法的开发,并不是只有java开发才适用。 -
Javaee高级开发模式
-