JSP和JSTL

一、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>

注意:

  1. choose最少要有一个when标签,可以没有ptherwise标签
  2. choose和otherwise没有属性,when必须要有test标签
  3. otherwise必须是在最后一个when标签之后
  4. choose中只能放when和otherwise
  5. when和otherwise标签中可以有其它标签
  6. 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
  1. 如果设置了var属性,则格式化后的结果不会输出,需要通过el表达式获取var对应的限域变量名
  2. 默认的类型(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>

猜你喜欢

转载自blog.csdn.net/Asdzxc968/article/details/105183261