一、jsp标签
1.1 jsp标签的作用
jsp的核心语法: jsp表达式 <%=表达式 %>和 jsp脚本<% %>。
以后开发jsp的原则: 尽量在jsp页面中少写甚至不写java代码。
使用EL表达式,替换jsp表达式
使用jsp标签,替换jsp脚本。
使用jsp标签替换掉jsp脚本。
1.2 jsp标签的分类
1.内置标签(动作标签),不需要再jsp页面导入标签
2.jstl标签,需要在jsp页面导入标签
3.自定义标签,开发者自己定义,需要在jsp页面导入标签
二、内置标签(动作标签)
##转发标签:
<jsp:forward page="/index.jsp"></jsp:forward>
相当于
request.getRequestDispatcher("/index.jsp").forward(request, response);
##包含标签(动态包含):
<jsp:include page="./index2.jsp"></jsp:include>
原理:两个jsp页面会被各自翻译java文件,然后在运行时,会进行动态包含在一个页面。
##参数标签:
转发传参:
<jsp:forward page="/index.jsp">
<jsp:param value="name" name="小王"/>
<jsp:param value="pwd" name="123"/>
</jsp:forward>
相当于
request.getRequestDispatcher("/index.jsp?name=小王&pwd=123").forward(request, response);
动态包含传参:
<jsp:include page="./index2.jsp">
<jsp:param value="name" name="eric"/>
<jsp:param value="name2" name="hlp"/>
</jsp:include>
接参
<%request.getParameter("name") ;%>
2.1 转发标签
<jsp:forward page="/index.jsp"></jsp:forward>
原理:该标签会在翻译时被翻译成一下代码:
request.getRequestDispatcher("/index.jsp").forward(request, response);
例子1:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>EL 表达式获取数据</title>
</head>
<body>
<%--
注释:以下代码相当于注释的代码
<%
request.getRequestDispatcher("/index.jsp").forward(request, response);
%>
--%>
<jsp:forward page="/index.jsp"></jsp:forward>
</body>
</html>
2.2 参数标签
转发标签
传参:
<jsp:forward page="/index.jsp">
<jsp:param value="name" name="小王"/>
<jsp:param value="pwd" name="123"/>
</jsp:forward>
接参:
<%=request.getParameter("key1") %>
原理:该标签会被翻译成以下代码
request.getRequestDispatcher("/index.jsp?name=小王&pwd=123").forward(request, response);
动态包含
传参:
<jsp:include page="./index3.jsp">
<jsp:param value="hlp" name="key1"/>
</jsp:include>
接参:
<%=request.getParameter("key1") %>
例1:转发标签传参
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>EL 表达式获取数据</title>
</head>
<body>
<jsp:forward page="/index.jsp">
<jsp:param value="name" name="小王"/>
<jsp:param value="pwd" name="123"/>
</jsp:forward>
<%--
上述代码,相当于以下java代码
<%
request.getRequestDispatcher("/index.jsp?name=小王&pwd=123").forward(request, response);
%>
--%>
</body>
</html>
2.2 包含标签(动态包含)
包含标签(动态包含):
<jsp:include page="./index2.jsp"></jsp:include>
原理:包含与被包含的页面先各自翻译成java源文件,然后在运行时合并在一起。
先翻译后包含,动态包含。
实现页面包含功能,有两种方式:
方式一:包含指令(静态包含)
<%@include file="被包含的页面" %>
方式二:包含标签(动态包含)
<jsp:include page="./index.jsp" >
静态包含与动态包含的区别:
1.语法区别
静态包含(包含指令)
<%@include file="被包含的页面" %>
动态包含(包含标签)
<jsp:include page="./index.jsp" >
2.参数区别
静态包含不能传参。
动态包含可以向被包含的页面传参,
3.原理不同
静态包含:先合并在翻译。
静态包含只有一份源代码。
被包含的页面与包含的页面,在翻译时就被翻译成一个源文件。
动态包含:先合并在翻译。
动态包含有两份源代码。
被包含的页面与包含的页面会先各自被翻译成java源文件,然后在运行时再被合并成一个文件。
4.区别总结
静态包含:<%@include file="被包含的页面" %>
先合并在翻译,不能传参。
动态包含:<jsp:include page="./index.jsp" >
先翻译在合并,能传参
例1: 静态包含实例
index2.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>EL 表达式获取数据</title>
</head>
<body>
222222
</body>
</html>
NewFile.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>EL 表达式获取数据</title>
</head>
<body>
11111zz
<%@include file="./index2.jsp" %>
</body>
</html>
例2: 动态包含实例
inedx2.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>EL 表达式获取数据</title>
</head>
<body>
222222
</body>
</html>
NewFile.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>EL 表达式获取数据</title>
</head>
<body>
11111111
<jsp:include page="./index2.jsp"></jsp:include>
</body>
</html>
例3 : 动态包含传参
传参
<jsp:include page="./index2.jsp">
<jsp:param value="name" name="eric"/>
</jsp:include>
接参
<%request.getParameter("name") ;%>
index2.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>EL 表达式获取数据</title>
</head>
<body>
222222
<%request.getParameter("name") ;%>
</body>
</html>
NewFile.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>EL 表达式获取数据</title>
</head>
<body>
11111zz
<jsp:include page="./index2.jsp">
<jsp:param value="name" name="eric"/>
</jsp:include>
</body>
</html>
三、JSTL标签(java标准标签库)
java standard tag libiary
JSTL有五套标签库,重点的是前三套。
核心标签库(c标签库)
国际化标签库(fmt标签库)
EL函数库(fn函数库)
xml标签库(x标签库) 不重要
sql标签库(sql标签库) 不重要 在jsp页面中,一般不会做数据的操作,数据的操作一般放在dao,所以这两个库不重要。
3.1 JSTL标签库
核心标签库的重点标签:
保存数据:
<c:set></c:set>
获取数据:
<c:out value=""></c:out>
单条件判断
<c:if test=""></c:if>
多条件判断
<c:choose></c:choose>
<c:when test=""></c:when>
<c:otherwise></c:otherwise>
循环数据
<c:forEach></c:forEach>
<c:forTokens items="" delims=""></c:forTokens>
重定向
<c:redirect></c:redirect>
3.1.1 set标签
1.set标签:保存数据到域中
<c:set var="name" value="hlp" scope="request/session/context/page(默认)"></c:set>
相当于
page.setAttribute("name","hlp",PageContext.REQUEST_SCOPE);
3.2.2 out标签
2.out标签:输出数据到浏览器
<c:out value="name" default="默认值"></c:out>
输出name字符串到浏览器
<c:out value="${msg}" default="<h3>标题3</h3>" escapeXml="true"></c:out>
从域中获取msg的值输出到浏览器。
如果msg为null,则使用默认值。
escapeXml为true,表示value的值原样输出,如果为false,则转义输出。
3.2.3 if标签
3.if标签:单条件判断
如果条件成立,则输出标签体中的内容到浏览器
<c:if test="${!empty msg}">
条件成立
</c:if>
<c:if test="${!empty emps}">
<c:forEach items="${emps}" var="emp" varStatus="vs">
<tr>
<td>${emp.id }</td>
<td>${emp.name }</td>
<td>${emp.age }</td>
<td>${emp.id }</td>
</tr>
</c:forEach>
</c:if>
<c:if test="${10 >5 }">
条件成立
</c:if>
3.2.4 choose标签
4.choose标签:多条件判断
<c:choose>
<c:when test="${score>=90 && score<=100}">
优秀
</c:when>
<c:when test="${score>=60 && score<70}">
及格
</c:when>
<c:otherwise>
不及格
</c:otherwise>
</c:choose>
3.2.5 forEach标签
5.forEach标签:循环
begin="" : 从哪个元素开始遍历,从0开始.默认从0开始
end="": 到哪个元素结束。默认到最后一个元素
step="" : 步长 (每次加几) ,默认1
items="": 需要遍历的数据(集合)
var="": 每个元素的名称
varStatus="": 索引对象。(count属性:当前位置,从1开始。index属性:从0开始)
遍历list
<c:forEach begin="0" end="1" varStatus="indexObj" items="${list}" var="item" >
${indexObj.index}-${item.nameT }-${item.age}<br/>
</c:forEach>
遍历map
<c:forEach items="${map}" var="entry">
${entry.key } - 姓名: ${entry.value.name } - 年龄:${entry.value.age }<br/>
</c:forEach>
3.2.6 forToken标签
6. forToken标签:切割字符串,并进行输出
<%
String str = "java-php-net-平面";
pageContext.setAttribute("str",str);
%>
<c:forTokens items="${str}" delims="-" var="s">
${s }<br/>
</c:forTokens>
3.2.7 redirct标签
7.redirct标签:实现jsp的重定向
<c:redirect url="http://www.baidu.com"></c:redirect>
相当于
response.sendRedirect("./index.jsp");
3.2 使用JSTL标签库的步骤
使用步骤:
1)导入JSTL使用的jar包(标签背后隐藏中java代码)
jstl-1.2.jar
standard.jar
(如果你使用了J2EE5.0的项目,则无需导入上述的包,因为在J2EE1.5之后,J2EE规范引入了jsp。自动包含了上述包)
2)在jsp页面中导入标签库
<%@taglib uri="标签库声明文件tld文件的标记" prefix="前缀"%>
3)使用标签库中的标签
>>>>>> 导包(JSTL包)
>>>>>> 使用taglib指令如何导入标签库
1.导入jstl相关库后,找到jstl.jar /META-INF/xx.tld 文件。
2.在jsp页面中导入标签库
<%@taglib uri="标签库声明文件tld文件的标记" prefix="前缀"%>
tld文件中的 uri 指的就是 【uri="标签库声明文件tld文件的标记"】
tld文件中文档的short-name 指的就是 【 prefix="前缀"】
>>>>>> 使用标签
<%@ page language="java" import="java.util.*,gz.itcast.b_entity.*" pageEncoding="utf-8"%>
<%--导入标签库 --%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>核心标签库</title>
</head>
<body>
<%--使用标签 --%>
<%--set标签 :保存数据(保存到域中)默认保存到page域 --%>
<c:set var="name" value="rose" scope="request"></c:set>
<%
String msg = null;
pageContext.setAttribute("msg",msg);
%>
${msg }
</body>
</html>
3.3 核心标签案例
例1:
<%@ page language="java" import="java.util.*,gz.itcast.b_entity.*" pageEncoding="utf-8"%>
<%--导入标签库 --%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>核心标签库</title>
</head>
<body>
<%--使用标签 --%>
<%--set标签 :保存数据(保存到域中)默认保存到page域 --%>
<c:set var="name" value="rose" scope="request"></c:set>
<%
String msg = null;
pageContext.setAttribute("msg",msg);
%>
${msg }
<br/>
<%--out标签: 获取数据(从域中)
default: 当value值为null时,使用默认值
escapeXml: 是否对value值进行转义,false,不转义,true,转义(默认)
--%>
<c:out value="${msg}" default="<h3>标题3</h3>" escapeXml="true"></c:out>
<hr/>
<%--if标签 :单条件判断--%>
<c:if test="${!empty msg}">
条件成立
</c:if>
<hr/>
<%--choose标签+when标签+otherwirse标签: 多条件判断 --%>
<c:set var="score" value="56"></c:set>
<c:choose>
<c:when test="${score>=90 && score<=100}">
优秀
</c:when>
<c:when test="${score>=80 && score<90}">
良好
</c:when>
<c:when test="${score>=70 && score<80}">
一般
</c:when>
<c:when test="${score>=60 && score<70}">
及格
</c:when>
<c:otherwise>
不及格
</c:otherwise>
</c:choose>
<%-- forEach标签:循环 --%>
<%
//List
List<Student> list = new ArrayList<Student>();
list.add(new Student("rose",18));
list.add(new Student("jack",28));
list.add(new Student("lucy",38));
//放入域中
pageContext.setAttribute("list",list);
//Map
Map<String,Student> map = new HashMap<String,Student>();
map.put("100",new Student("mark",20));
map.put("101",new Student("maxwell",30));
map.put("102",new Student("narci",40));
//放入域中
pageContext.setAttribute("map",map);
%>
<hr/>
<%--
begin="" : 从哪个元素开始遍历,从0开始.默认从0开始
end="": 到哪个元素结束。默认到最后一个元素
step="" : 步长 (每次加几) ,默认1
items="": 需要遍历的数据(集合)
var="": 每个元素的名称
varStatus="": 当前正在遍历元素的状态对象。(count属性:当前位置,从1开始)
--%>
<c:forEach items="${list}" var="student" varStatus="varSta">
序号:${varSta.count} - 姓名:${student.name } - 年龄:${student.age}<br/>
</c:forEach>
<hr/>
<c:forEach items="${map}" var="entry">
${entry.key } - 姓名: ${entry.value.name } - 年龄:${entry.value.age }<br/>
</c:forEach>
<hr/>
<%-- forToken标签: 循环特殊字符串 --%>
<%
String str = "java-php-net-平面";
pageContext.setAttribute("str",str);
%>
<c:forTokens items="${str}" delims="-" var="s">
${s }<br/>
</c:forTokens>
<%--redrict:重定向 --%>
<c:redirect url="http://www.baidu.com"></c:redirect>
</body>
</html>
例2:set标签
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@page import="org.jsoft.hello.Student"%>
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>核心标签库</title>
</head>
<body>
<c:set value="hlp" var="name" scope="page"></c:set>
<c:set value="hlp" var="name" scope="request"></c:set>
<c:set value="hlp" var="name" scope="session"></c:set>
<c:set value="hlp" var="name" scope="application"></c:set>
${pageScope.name}
${requestScope.name}
${sessionScope.name}
${applicationScope.name}
</body>
</html>
例3:out标签
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@page import="org.jsoft.hello.Student"%>
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>核心标签库</title>
</head>
<body>
<c:set value="hlp" var="name" scope="page"></c:set>
<c:set value="hlp" var="name" scope="request"></c:set>
<c:set value="hlp" var="name" scope="session"></c:set>
<c:set value="hlp" var="name" scope="application"></c:set>
<c:out value="${pageScope.name}"></c:out>
<c:out value="${requestScope.name}"></c:out>
<c:out value="${sessionScope.name}"></c:out>
<c:out value="${applicationScope.name}"></c:out>
</body>
</html>
例4:if标签
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@page import="org.jsoft.hello.Student"%>
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>核心标签库</title>
</head>
<body>
<c:set value="hlp" var="name" scope="page"></c:set>
<c:set value="hlp" var="name" scope="request"></c:set>
<c:set value="hlp" var="name" scope="session"></c:set>
<c:set value="hlp" var="name" scope="application"></c:set>
<c:if test="${sessionScope.name=='hlp'}">
我是后力
</c:if>
</body>
</html>
例5:切割字符串,并遍历输出
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@page import="org.jsoft.hello.Student"%>
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>核心标签库</title>
</head>
<body>
<%
session.setAttribute("str", "h-l-p");
%>
<c:forTokens items="${sessionScope.str}" delims="-" var="s">
${s }
</c:forTokens>
</body>
</html>
四、JSP内置标签、JSTL标签(java标准标签库)、Struts2标签
4.1 JSP内置标签、JSTL标签、Struts2标签的区别
1.jsp内置标签:
jsp自带的标签。
2.JSTL标签:
java标准标签库。第三方标签库。常用c标签。
3.Struts2标签:
struts2框架标签。
4.2 EL表达式
4.2.1 EL表达式
EL表达式
1.用于在JSP界面上取值。
2. ${userName}
从域对象中获取数据
4.2.2 案例
>>>>>> index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>员工列表</title>
</head>
<body>
<div>
<div>新增</div>
<table>
<tr>
<th>ID</th>
<th>姓名</th>
<th>年龄</th>
<th>备注</th>
<th>出生日期</th>
<th>部门</th>
<th>操作</th>
</tr>
<c:forEach items="${result}" var="emp" >
<td>${emp.id}</td>
<td>${emp.name}</td>
<td>${emp.age}</td>
<td>${emp.content}</td>
<td>${emp.birth}</td>
<td>${emp.dept.name}</td>
</c:forEach>
</table>
</div>
</body>
</html>
4.3 Struts2表达式
4.3.1 Struts2表达式
Struts2表达式
1.结合Struts2标签使用。用于Struts2标签取值。
2.使用方式
常规标签:
<s:property value="#name"/>
非常规标签:
<s:textfield value="%{name}" ></s:textfield>
4.3.2 案例