一、JSP
JSP:Java Server Page SUN 公司提供的动态网页编程技术,是 Java Web 服务器端的动态资源。它相比 html 而言,html 只能为用户提供静态数据,而 Jsp 技术允许在页面中嵌套 java 代码,为用户提供动态数据。相比 servlet 而言,servlet 很难对数据进行排版,而 jsp 除了可以用 java 代码产生动态数据的同时,也很容易对数据进行排版。不管是 JSP 还是 Servlet,虽然都可以用于开发动态 web 资源。但由于这 2 门技术各自的特点,在长期的软件实践中,人们逐渐把 servlet 作为 web 应用中的控制器组件来使用, 而把 JSP 技术作为数据显示模板来使用。其实 Jsp 就是一个 Servlet,当我们第一次访问 Jsp 的时候,Jsp 引擎都会将这个 Jsp 翻译 成一个 Servlet,这个文件存放在tomcat(源码目录) 中的 work 目录中。
1、注释
JSP中有两类注释:显示注释和隐式注释
显示注释:客户端可以看到的注释。
隐式注释:客户端看不到的注释
- 显示注释:集成HTML风格的注释
- 隐式注释:
- java的注释
- jsp的注释
<!-- 继承HTML的注释 -->
// java的注释,只能在脚本段中使用
// 单行注释
/*多行注释*/
<%-- jsp自己的注释 --%>
2、Scriptlet
在JSP中可以嵌入JAVA程序,这种就叫脚本段程序
jsp中一共有三种脚本段
<%--Java脚本段,第一种--%>
<%
String str = "Hello";
System.out.println(str);
out.print(str);
out.print("---------");
out.print(a);
out.print("---------");
%>
第一种脚本段程序,可以自定义局部变量、编写java语句
<%--Java脚本段,第二种--%>
<%!
int a = 100;
%>
第二种脚本段程序,可以定义全局变量,方法和类
<%--Java脚本段。第三种--%>
<%=a%>
第三种脚本段程序,是一个表达式,一般用来获取数据
3、包含指令标签
包含,名字意思,可以包含另一个文件。一般如果一些代码需要重复使用,就可以使用包含操作
包含分为两种:
静态包含
和动态包含
扫描二维码关注公众号,回复: 11716700 查看本文章
1、静态包含
静态包含就是将另一个文件中的数据复制一份到自己的文件中,最后会生成一个源文件。因为最后是生成一个源文件,所有两个文件中的脚本段程序中不能出现相同名字的变量
<%@include file="04-header.jsp"%>
file的属性值就就是要被包含的文件
2、动态包含
动态包含生成的是多个文件,只不过会调用别的文件,就类似于java中的方法调用。脚本段程序中可以出现同名的变量。并且动态包含可以传递参数。
<%
request.setCharacterEncoding("UTF-8");
String uname = "张三";
String usex = "男";
String str = "04-header.jsp";
%>
<jsp:include page="<%=str%>">
<%--传递参数--%>
<jsp:param name="uname" value="<%=uname%>"/>
<jsp:param name="usex" value="<%=usex%>"/>
<jsp:param name="uage" value="18"/>
</jsp:include>
-
page:要被包含的文件
-
<jsp:param name=“uname” value="<%=uname%>"/>:
- name:参数名字
- value:参数值
动态包含的标签之间除了传递参数,否则什么都不要添加,空格都不行
接收参数通过request.getParameter获取
<%
String uname = request.getParameter("uname");
String usex = request.getParameter("usex");
String uage = request.getParameter("uage");
%>
4、Jsp的四大域对象
JSP的域对象和servlet的差不多,只不过是多个了一个page
- page:当前页面
- request:一次请求
- session:一次会话
- application:整个服务器
方法 | 描述 |
---|---|
getParameter | 获取数据 |
setAttribute | 添加数据 |
removeAttribute | 删除数据 |
// page 当前页面有效
pageContext.setAttribute("name1","zhangsan");
// request 一次请求有效
request.setAttribute("name2","zhangsan");
// session 一次会话有效
session.setAttribute("name3","lisi");
// application 服务器不关闭一直有效
application.setAttribute("name4","wanger");
5、EL表达式
EL表达式可以让JSP写起来更加的简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法,让 Jsp 的代码更加简化。
5.1、语法
${expression}
EL表达式一般都是对域对象进行取值。
5.2、设置数据
<%
pageContext.setAttribute("name","zhangsan");
request.setAttribute("name","lisi");
session.setAttribute("name","wanger");
application.setAttribute("name","mazi");
%>
5.3、获取数据
LE表达式获取值的顺序是从最小范围开始,到最大范围
page-request-session-application
1、获取域对象中的值
${name}
从小范围到大范围,所以结果是zhangsan
2、获取指定域对象中的值
page域:${pageScope.name}<%--page域--%>
request域:${requestScope.name}<%--request域--%>
session域:${sessionScope.name}<%--session域--%>
application域:${applicationScope.name}<%--application域--%>
3、获取list集合中的数据
List<String> list = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("王二");
list.add("麻子");
request.setAttribute("list",list);
<h3>List集合</h3>
<p>list集合的长度:${list.size()}</p>
<p>list集合指定下标的值:${list[0]}</p>
<p>list集合指定下标的值:${list.get(1)}</p>
4、获取Map集合中的数据
Map map = new HashMap();
map.put("name","张三");
map.put("age",20);
map.put("sex",true);
request.setAttribute("map",map);
<h3>Map集合</h3>
<p>Map集合的长度:${map.size()}</p>
<p>Map集合Key的值:${map.name}</p>
<p>Map集合Key的值:${map["age"]}</p>
<p>Map集合Key的值:${map.get("sex")}</p>
5、获取set集合中的数据
Set<String> set = new HashSet<>();
set.add("张三");
set.add("李四");
set.add("王二");
set.add("麻子");
request.setAttribute("set",set);
<h3>Set集合</h3>
<p>Set集合的长度${set.size()}</p>
<p>Set集合${set}</p>
6、获取JavaBean对象的属性值
User user = new User(1,"啊哈哈",true);
request.setAttribute("user",user);
<h3>JavaBean</h3>
<p>JavaBean:${user}</p>
<p>JavaBean中的属性:${user.id}</p>
<p>JavaBean中的属性:${user.getName()}</p>
<p>JavaBean中的属性:${user.sex}</p>
5.4、empty空值空值判断
<%
request.setAttribute("str1","");
request.setAttribute("str2",null);
request.setAttribute("str3","ahh");
List list1 = null;
List list2 = new ArrayList();
List list3 = new ArrayList();
list3.add(123);
request.setAttribute("list1",list1);
request.setAttribute("list2",list2);
request.setAttribute("list3",list3);
Map map1 = null;
Map map2 = new HashMap();
Map map3 = new HashMap();
map3.put(1,1);
request.setAttribute("map1",map1);
request.setAttribute("map2",map2);
request.setAttribute("map3",map3);
User user1 = null;
User user2 = new User();
User user3 = new User(1,"张三",true);
request.setAttribute("user1",user1);
request.setAttribute("user2",user2);
request.setAttribute("user3",user3);
%>
字符串空值判断
空字符串:true
null:true
结果:
true true false
${empty str1}
${empty str2}
${empty str3}
list集合空值判断
null:true
长度0:true
结果:
true true false
${empty list1}
${empty list2}
${empty list3}
Map集合空值判断
null:true
长度0:true
结果:
true true false
${empty map1}
${empty map2}
${empty map3}
JavaBean空值判断
null:true
结果:
true false false
${empty user1}
${empty user2}
${empty user3}
5.5、EL运算
<%
request.setAttribute("a",10);
request.setAttribute("b",2);
request.setAttribute("c","aa");
request.setAttribute("d","bb");
request.setAttribute("e",new String("aa"));
%>
1、等值判断
${a==b}
${c==d}
${e==c}
${e eq c}
${a == 10}
${a == 5}
${c == 'aa'}
${c == "aa"}
eq等同于==
2、算数运算
<p>算数运算</p>
${a+b}
${a-b}
${a*b}
${a/b}
${a div b}
div:同等于/
3、大小比较与逻辑运算
${a > b}
${a >= b}
${a > b && b>5}
${a < b || b<5}
二、JSTL
Java Server Pages Standard Tag Libray(JSTL):JSP 标准标签库,是一个定制标签类库的集合,用于解决一些常见的问题,例如迭代一个映射或者集合、条件测试、XML 处理,甚至数据库和访问数据库操作等。
核心标签库:http://java.sun.com/jsp/jstl/core
包含 Web 应用的常见工作,比如:循环、表达式赋值、基本输入输出等。
格式化标签库:http://java.sun.com/jsp/jstl/fmt
用来格式化显示数据的工作,比如:对不同区域的日期格式化等。
JSTL类库的引用方式:<%@taglib uri="" prefix="" %>
官方下载地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
1、条件动作标签
条件动作指令用于处理页面的输出结果依赖于某些输入值的情况,在 Java 中是利用 if、 if…else 和 switch 语句来进行处理的。在 JSTL 中也有 4 个标签可以执行条件式动作指令:if、 choose、when 和 otherwise。
1.1、if标签
判断标签
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
test | 条件 | 是 | 无 |
var | 用于存储条件结果的变量(限域变量名) | 否 | 无 |
scope | var属性的作用域 可取值:page|request|session|application |
否 | page |
<%
request.setAttribute("num",100);
request.setAttribute("str","ahh");
request.setAttribute("name","ahh");
%>
<c:if test="${num > 10}">
数值大于10
</c:if>
<c:if test="${num <= 10}">
数值小于10
</c:if>
<c:if test="${str eq 'ahdh'}" var="flag" scope="request">
str等于ahh
</c:if>
注:if标签没有else属性,如有要达到else的样子,需要再写相反条件的if
1.2、choose、when 和 otherwise 标签
类似于java中的switch
- choose标签没有属性。
- when标签只有一个test属性。
- otherwise标签没有属性。
<%
request.setAttribute("a",98);
%>
<c:choose>
<c:when test="${a<60}">
不及格
</c:when>
<c:when test="${a==60}">
刚好及格
</c:when>
<c:when test="${a<=80}">
良好
</c:when>
<c:when test="${a<=100}">
优秀
</c:when>
<c:otherwise>
错误的成绩
</c:otherwise>
</c:choose>
注意:
- choose最少要有一个when标签,可以没有ptherwise标签
- choose和otherwise没有属性,when必须要有test标签
- otherwise必须是在最后一个when标签之后
- choose中只能放when和otherwise
- when和otherwise标签中可以有其它标签
- otherwise会在所有的when不执行的时候自动执行
2、foreach标签
forEach 是将一个主体内容迭代多次,或者迭代一个对象集合。可以迭代的对象包括所有的java.util.Collection 和java.util.Map 接口的实现,以及对象或者基本类型的数组。他还可 以迭代 java.util.Iterator 和java.util.Enumeration,但不能在多个动作指令中使用 Iterator 或者 Enumeration,因为 Iterator 或者Enumeration 都不能重置(reset)。
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
items | 要被循环的数据 | 否 | 无 |
begin | 开始的元素(0=第一个元素,1=第二个元素) | 否 | 0 |
end | 最后一个元素(0=第一个元素,1=第二个元素) | 否 | Last element |
step | 每一次迭代的步长 | 否 | 1 |
var | 代表当前条目的变量名称 | 否 | 无 |
varStatus | 代表循环状态的变量名称 | 否 | 无 |
1、循环
<c:forEach var="i" begin="1" end="10" step="1">
${i}
</c:forEach>
2、list集合遍历
<%
List<String> list = Arrays.asList("A1","A2","A3","A4","A5","A6","A7","A8","A9","A10");
request.setAttribute("list",list);
%>
<c:forEach var="item" items="${list}">
${item}
</c:forEach>
3、JavaBean集合遍历
<%-- 循环对象集合 --%>
<%
List<User> userList = new ArrayList<>();
userList.add(new User(1,"张三","123456"));
userList.add(new User(2,"李四","123123"));
userList.add(new User(3,"王二","666666"));
userList.add(new User(4,"麻子","986512"));
request.setAttribute("userList",userList);
%>
<%--判断是否为空--%>
<c:if test="${!empty userList}">
<%--遍历--%>
<c:forEach items="${userList}" var="user">
${user.uID}
${user.uName}
${user.uPwd}
</c:forEach>
</c:if>
3、格式化动作标签
JSTL 提供了格式化和解析数字和日期的标签,我们讨论里面有:formatNumber、formatDate、parseNumber及parseDate。
3.1、formatNumber标签
formatNumber标签用于格式化数字,百分比,货币。该标签用指定的格式或精度来格式化数字。(将数值型数据转换成指定格式的字符串类型。)
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
value | 要显示的数字 | 是 | 无 |
type | NUMBER,CURRENCY,或 PERCENT类型 | 否 | Number |
var | 存储格式化数字的变量 | 否 | Print to page |
scope | var属性的作用域 | 否 | page |
- 如果设置了var属性,则格式化后的结果不会输出,需要通过el表达式获取var对应的限域变量名
- 默认的类型(type)的取值为number。可取值:number数值型、percent百分比类型、currency货币型
<%--数字类型--%>
<fmt:formatNumber value="10" type="number" var="num"/> ${num}
<%--百分比类型--%>
<fmt:formatNumber value="10" type="percent"/>
<%--货币类型--%>
<fmt:formatNumber value="10" type="currency"/>
<%--设置时区--%>
<fmt:setLocale value="en_US"/>
<fmt:formatNumber value="10" type="currency"/>
3.2、formatDate标签
formatDate标签用于使用不同的方式格式化日期。(将Date型数据转换成指定格式的字符串类型。)
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
value | 要显示的日期 | 是 | 无 |
type | DATE, TIME, 或 BOTH | 否 | date |
dateStyle | FULL, LONG, MEDIUM, SHORT, 或 DEFAULT | 否 | default |
timeStyle | FULL, LONG, MEDIUM, SHORT, 或 DEFAULT | 否 | default |
pattern | 自定义格式模式 | 否 | 无 |
timeZone | 显示日期的时区 | 否 | 默认时区 |
var | 存储格式化日期的变量名 | 否 | 显示在页面 |
scope | 存储格式化日志变量的范围 | 否 | 页面 |
代码 | 描述 | 实例 |
---|---|---|
y | 不包含纪元的年份。如果不包含纪元的年份小于 10,则显示不具有前导零的年份。 | 2002 |
M | 月份数字。一位数的月份没有前导零。 | April & 04 |
d | 月中的某一天。一位数的日期没有前导零。 | 20 |
h | 12 小时制的小时。一位数的小时数没有前导零。 | 12 |
H | 24 小时制的小时。一位数的小时数没有前导零。 | 0 |
m | 分钟。一位数的分钟数没有前导零。 | 45 |
s | 秒。一位数的秒数没有前导零。 | 52 |
<%
request.setAttribute("myDate",new Date());
%>
${myDate}<br>
<fmt:formatDate value="${myDate}"/> <br>
<fmt:formatDate value="${myDate}" type="date"/> <br>
<fmt:formatDate value="${myDate}" type="time"/> <br>
<fmt:formatDate value="${myDate}" type="both"/> <br>
FULL---<fmt:formatDate value="${myDate}" type="both" dateStyle="full"/> <br>
LONG---<fmt:formatDate value="${myDate}" type="both" dateStyle="long"/> <br>
SHORT---<fmt:formatDate value="${myDate}" type="both" dateStyle="short"/> <br>
MEDIUM---<fmt:formatDate value="${myDate}" type="both" dateStyle="MEDIUM"/> <br>
<hr>
FULL---<fmt:formatDate value="${myDate}" type="both" timeStyle="full"/> <br>
LONG---<fmt:formatDate value="${myDate}" type="both" timeStyle="long"/> <br>
SHORT---<fmt:formatDate value="${myDate}" type="both" timeStyle="short"/> <br>
MEDIUM---<fmt:formatDate value="${myDate}" type="both" timeStyle="MEDIUM"/> <br>
MEDIUM---<fmt:formatDate value="${myDate}" type="both" timeStyle="MEDIUM" timeZone="en_US"/> <br>
<hr>
<fmt:formatDate value="${myDate}" pattern="yyyy-MM-dd HH:mm:ss"/> <br>
3.3、parseNumber标签
与formathNumber刚好相反,这个是把字符串转换为指定数值
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
value | 要解析的数字 | 否 | Body |
type | NUMBER,,CURRENCY,或 PERCENT | 否 | number |
var | 存储待解析数字的变量 | 否 | Print to page |
scope | var属性的作用域 | 否 | page |
<fmt:setLocale value="zh_CN"/>
<fmt:parseNumber value="10"/>
<fmt:parseNumber value="10" type="number"/>
<fmt:parseNumber value="100%" type="percent"/>
<fmt:parseNumber value="¥10" type="currency"/>
3.3、parseDate标签
把字符串转换为时间
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
value | 要显示的日期 | 是 | 无 |
type | DATE, TIME, 或 BOTH | 否 | date |
dateStyle | FULL, LONG, MEDIUM, SHORT, 或 DEFAULT | 否 | default |
timeStyle | FULL, LONG, MEDIUM, SHORT, 或 DEFAULT | 否 | default |
pattern | 自定义格式模式 | 否 | 无 |
var | 存储格式化日期的变量名 | 否 | 显示在页面 |
scope | 存储格式化日志变量的范围 | 否 | 页面 |
<fmt:parseDate value="2020-3-25"/> <br>
<fmt:parseDate value="2020-3-25" type="date"/> <br>
<fmt:parseDate value="2020年3月25" pattern="yyyy年MM月dd"/><br>