当前位置: 代码迷 >> 综合 >> Jsp2
  详细解决方案

Jsp2

热度:27   发布时间:2024-02-28 04:34:52.0

文章目录

    • JSTL
      • 导入jstl.jar 和standard.jar
      • set out remove
      • if else
      • choose
      • forEach
      • forTokens
      • fmt:formatNumber 格式化数字
      • fmt:formatDate 格式化日期
      • fn:
    • EL表达式
      • 取值
      • 作用域优先级
      • JavaBean概念
      • 获取JavaBean的属性
      • 结合JSTL的

JSTL

JSTL JSP Standard Tag Library 标准标签库
JSTL允许开人员可以像使用HTML标签 那样在JSP中开发Java功能。
JSTL库有core, i18n, fmt, sql 等等。
i18n和sql用的很少,core和fmt在工作中会用到

导入jstl.jar 和standard.jar

把这两个jar包放在web/WEB-INF/lib 下

set out remove

在页面中使用JSTL需要在jsp中 通过指令进行设置

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

prefix="c" 表示后续的标签使用都会以<c: 开头

<c:set var="name" value="${'gareen'}" scope="request" />

在作用域request中设置name,相当于

<%request.setAttribute("name","gareen")%>
<c:out value="${name}" />

相当于 <%=request.getAttribute("name")%>

<c:remove var="name" scope="request" />

在作用域request中删掉name,相当于

<%request.removeAttribute("name")%>

作用域可以是pageContext, request, session, application,

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<c:set var="name" value="${'gareen'}" scope="request" /> 
通过标签获取name: <c:out value="${name}" /> <br> 
<c:remove var="name" scope="request" /> <br>
通过标签获取name: <c:out value="${name}" /> <br>

if else

JSTL通过<c:if test=""> 进行条件判断

但是JSTL没有<c:else,所以常用的办法是在<c:if的条件里取反
配合if使用的还有通过empty进行为空判断
empty可以判断对象是否为null,字符串长度是否为0,集合长度是否为0

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8" import="java.util.*"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><c:set var="hp" value="${10}" scope="request" /><c:if test="${hp<5}"><p>这个英雄要挂了</p>
</c:if><c:if test="${!(hp<5)}"><p>这个英雄觉得自己还可以再抢救抢救</p>
</c:if><%pageContext.setAttribute("weapon", null);pageContext.setAttribute("lastwords", "");pageContext.setAttribute("items", new ArrayList());
%><c:if test="${empty weapon}"><p>没有装备武器</p>
</c:if>
<c:if test="${empty lastwords}"><p>挂了也没有遗言</p>
</c:if>
<c:if test="${empty items}"><p>物品栏为空</p>
</c:if>

choose

虽然JSTL没有提供else标签,但是提供了一个else功能的标签<c:choose><c:when test="${hp<5}"></c:when><c:otherwise></c:otherwise>
</c:choose>

看上去繁琐。

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8" import="java.util.*"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><c:set var="hp" value="${3}" scope="request" /><c:choose><c:when test="${hp<5}"><p>这个英雄要挂了</p></c:when><c:otherwise><p>这个英雄觉得自己还可以再抢救抢救</p></c:otherwise>
</c:choose>

forEach

可以在JSP中使用for循环,但是其可读性很差。 借助JSTL的c:forEach标签,可以改善可读性
这里分别使用for循环和<c:forEach标签来演示遍历一个List的区别

<c:forEach items="${heros}" var="hero" varStatus="st"  >

items="${heros}" 表示遍历的集合
var="hero" 表示把每一个集合中的元素放在hero上
varStatus="st" 表示遍历的状态
在这里插入图片描述

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8" import="java.util.*"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><%List<String> heros = new ArrayList<String>();heros.add("塔姆");heros.add("艾克");heros.add("巴德");heros.add("雷克赛");heros.add("卡莉丝塔");request.setAttribute("heros",heros);
%><!-- 使用jsp中的for循环来遍历List -->
<table width="200px" align="center" border="1" cellspacing="0">
<tr><td>编号</td><td>英雄</td>
</tr><%
int i =0;
for (String hero : heros) {
    
i++;
%><tr><td><%=i%></td><td><%=hero%></td>
</tr><%}%></table><br>
<!-- 使用JSTL中的c:forEach 循环来遍历List -->
<table width="200px" align="center" border="1" cellspacing="0">
<tr><td>编号</td><td>英雄</td>
</tr><c:forEach items="${heros}" var="hero" varStatus="st"  ><tr><td><c:out value="${st.count}" /></td><td><c:out value="${hero}" /></td></tr>
</c:forEach>
</table>

forTokens

<c:forTokens专门用于字符串拆分,并且可以指定多个分隔符

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8" import="java.util.*"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><c:set var="heros" value="塔姆,艾克;巴德|雷克赛!卡莉丝塔" /><c:forTokens items="${heros}" delims=":;|!" var="hero"><c:out value="${hero}" /> <br />
</c:forTokens>

fmt:formatNumber 格式化数字

fmt 标签常用来进行格式化,其中fmt:formatNumber用于格式化数字
使用之前要加上

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix='fmt' %>  
<fmt:formatNumber type="number" value="${money}" minFractionDigits="2"/>

<fmt:formatNumber 表示格式化数字
minFractionDigits 小数点至少要有的位数
maxFractionDigits 小数点最多能有的位数

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8" import="java.util.*"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix='fmt' %> <c:set var="money" value="888.8" />
<c:set var="pi" value="3.1415926" />
最少两个小数点:
<fmt:formatNumber type="number" value="${money}" minFractionDigits="2"/>
<br>
最多两个小数点:
<fmt:formatNumber type="number" value="${pi}" maxFractionDigits="2" />

fmt:formatDate 格式化日期

fmt 标签常用来进行格式化,其中fmt:formatDate 用于格式化日期
fmt:formatNumber 格式化数字一样,使用之前要加上

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix='fmt' %>  
<fmt:formatDate value="${now}" pattern="G yyyy年MM月dd日 E"/>
<fmt:formatDate value="${now}" pattern="a HH:mm:ss.S z"/>
<fmt:formatDate value="${now}" pattern="yyyy-MM-dd HH:mm:ss"/>
<fmt:formatDate 表示格式化日期
yyyy 表示年份
MM 表示月份
dd 表示日期
E 表示星期几a 表示是上午还是下午
HH 表示小时
mm 表示分钟
ss 表示秒
S 表示毫秒
z 表示时区
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8" import="java.util.*"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix='fmt' %> <%Date now = new Date();pageContext.setAttribute("now",now);
%>完整日期: <fmt:formatDate value="${now}" pattern="G yyyy年MM月dd日 E"/><br>
完整时间: <fmt:formatDate value="${now}" pattern="a HH:mm:ss.S z"/><br>
常见格式: <fmt:formatDate value="${now}" pattern="yyyy-MM-dd HH:mm:ss"/>

在这里插入图片描述

fn:

fn标签提供各种实用功能,首先使用之前使用加入如下指令

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 

用法举例:

'获取name的前5位'${
    fn:substring(name, 0, 5)}

在这里插入图片描述

EL表达式

取值

不同版本的tomcat是否默认开启对EL表达式的支持,是不一定的。
所以为了保证EL表达式能够正常使用,需要在<%@page 标签里加上isELIgnored="false"

使用EL表达式,非常简单
比如使用JSTL输出要写成

<c:out value="${name}" /> 

但是用EL只需要

${
    name}
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8" isELIgnored="false"%> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<c:set var="name" value="${'gareen'}" scope="request" />
通过标签获取name: <c:out value="${name}" /> <br>
通过 EL 获取name: ${
    name}

在这里插入图片描述

作用域优先级

EL表达式可以从pageContext,request,session,application四个作用域中取到值,如果4个作用域都有name属性怎么办?
EL会按照从高到低的优先级顺序获取

pageContext>request>session>application
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8" isELIgnored="false"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><c:set var="name" value="${'gareen-pageContext'}" scope="page" />
<c:set var="name" value="${'gareen-request'}" scope="request" />
<c:set var="name" value="${'gareen-session'}" scope="session" />
<c:set var="name" value="${'gareen-application'}" scope="application" />
4个作用域都有name,优先获取出来的是 : ${
    name}

在这里插入图片描述

JavaBean概念

EL可以很方便的访问JavaBean的属性,那么JavaBean是什么呢?
JavaBean的标准

  1. 提供无参public的构造方法(默认提供)
  2. 每个属性,都有public的getter和setter
  3. 如果属性是boolean,那么就对应is和setter方法
    比如示例代码中的Hero类,默认提供了一个无参的public的构造方法。 同时每个属性都有getter和setter
package bean;
public class Hero {
    public int id;public String name;public float hp;public int damage;public int getId() {
    return id;}public void setId(int id) {
    this.id = id;}public String getName() {
    return name;}public void setName(String name) {
    this.name = name;}public float getHp() {
    return hp;}public void setHp(float hp) {
    this.hp = hp;}public int getDamage() {
    return damage;}public void setDamage(int damage) {
    this.damage = damage;}}

获取JavaBean的属性

获取JavaBean的属性,只需要通过.符号操作就可以了。
像这样 ${hero.name} ,就会自动调用getName方法了
注: 如果属性是boolean类型,那么就会自动调用isXXX方法了
一般创建了数组或其他,是用request.setAttributerequest.setAttribute("hero", hero);等设置属性,方便其他调用

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8" isELIgnored="false" import="bean.*"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><%Hero hero =new Hero();hero.setName("盖伦");hero.setHp(616);request.setAttribute("hero", hero);
%>
英雄名字 : ${
    hero.name} <br>
英雄血量 : ${
    hero.hp}

在这里插入图片描述

结合JSTL的<c:forEach

EL还可以结合 JSTL的<c:forEach 使用,进一步简化代码
原代码中的

<c:out value="${hero}" /> 

可以简写为

${
    hero}
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8" import="java.util.*"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><%List<String> heros = new ArrayList<String>();heros.add("塔姆");heros.add("艾克");heros.add("巴德");heros.add("雷克赛");heros.add("卡莉丝塔");request.setAttribute("heros",heros);
%><table width="200px" align="center" border="1" cellspacing="0">
<tr><td>编号</td><td>英雄</td>
</tr><c:forEach items="${heros}" var="hero" varStatus="st"  ><tr><td>${
    st.count}</td><td>${
    hero}</td></tr>
</c:forEach>
</table>

取参

EL表达式还可以做到request.getParameter("name") 这样的形式获取浏览器传递过来的参数
先把jstl.jsp代码改为如例所示,然后访问如下地址

http://127.0.0.1/jstl.jsp?name=abc

可以观察到获取了参数 name

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8" import="java.util.*" isELIgnored="false"%>
${
    param.name}

eq

进行条件判断,大大简化了 JSTL的 c:if 和 c:choose 代码
如例,一行代码就能起到其他好几行代码的效果

${
    killNumber ge 10? "超神":"还没超神" }
例子中讲的是大于等于,除此之外的其他用法如下:
eq相等 ne、neq不相等,
gt大于, lt小于
gt大于, lt小于
gte、ge大于等于
lte、le 小于等于
not非 mod求模
is [not] div by是否能被某数整除
is [not] even是否为偶数
is [not] odd是否为奇
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8" import="java.util.*"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><%
request.setAttribute("killNumber", "10");
%>c:if 的用法,运行结果:
<c:if test="${killNumber>=10}">
超神
</c:if>
<c:if test="${killNumber<10}">
还没超神
</c:if>
<br>
c:choose 的用法,运行结果:<c:choose><c:when test="${killNumber>=10}">超神</c:when><c:otherwise>还没超神</c:otherwise>
</c:choose>
<br>
EL表达式eq的用法,运行结果:
${
    killNumber ge 10? "超神":"还没超神" }