深入学习JSP

JSP简简介

JSP,全称JavaServer Pages ,是由Sun公司主导创建的一种动态网页技术标准。

  • 动态生成网页数据,不是动态效果的网页
  • JSP在HTML中嵌入Java代码
  • JSP是服务端技术
  • 由应用服务器来编译和执行嵌入的Java代码,然后生成整个页面信息返回给客户端

JSP运行原理

​ 当浏览器第一次发送请求一个JSP资源是,JSP加载引擎会将一个.jsp文件转换成一个Servlet的.java文件

将HTML代码编入Servlet中,然后运行这个Servlet,将数据响应给浏览器。

JSP执行过程

  1. 客户端发出Request请求
  2. JSP Container(容器) 将JSP转译Servlet的源代码.java文件
  3. 将产生的Servlet源码进行编译,生成字节码.class文件
  4. 将.class 字节码文件加载进入内存,运行Servlet
  5. 通过Response对象将数据响应给浏览器

执行过程分为:

转译时期(Translation Time)

​ JSP网页转译成Servlet,生成.java文件,然后进行编译.class字节码文件

请求时期(Request Time)

​ 运行.class字节码文件,处理请求

JSP加载引擎

​ Tomcat conf目录 中web.xml配置文件中可以查看

    <servlet>
        <servlet-name>jsp</servlet-name>
        <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
        <init-param>
            <param-name>fork</param-name>
            <param-value>false</param-value>
        </init-param>
        <init-param>
            <param-name>xpoweredBy</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>3</load-on-startup>
    </servlet>

JSP加载引擎的匹配路径规则

 <!-- 默认servlet的映射 -->
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!-- JSP servlet的映射 -->
    <servlet-mapping>
        <servlet-name>jsp</servlet-name>
        <url-pattern>*.jsp</url-pattern>
        <url-pattern>*.jspx</url-pattern>
    </servlet-mapping>

JSP性能问题

JSP执行慢

JSP慢的原因:

  • 第一次请求需进行转译和编译
  • JSP转译之后通过大量IO流形式发送内容,IO流是一种重量级操作,是比较消耗资源的

JSP继承结构

在这里插入图片描述

JSP中的变量

在jsp文件中可以通过两种形式声明变量:

  • <%%> 标签中声明的变量是局部变量
  • <%!%>标签中声明的变量是成员变量

如下,在JSP中声明成员变量a ,局部变量b

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <%--
      <%!%>嵌入的代码转译后,作为JSP类的成员
      声明的变量作为成员变量
  --%>
  <%!
    int a=10;
  %>
  <%--
       <%%>嵌入的代码转译后,作为JSP中service方法内部代码
       声明的变量作为局部变量
   --%>
  <%
    int b=10;
  %>
  </body>
</html>

查看部分JSP转译后源码可以发现:

<%%> 标签中声明的变量,在JSP转译后的Servlet中service()方法中

 public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
      throws java.io.IOException, javax.servlet.ServletException {

    if (!javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
      final java.lang.String _jspx_method = request.getMethod();
      if ("OPTIONS".equals(_jspx_method)) {
        response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
        return;
      }
      if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method)) {
        response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
        response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP 只允许 GET、POST 或 HEAD。Jasper 还允许 OPTIONS");
        return;
      }
    }

    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;

    try {
      response.setContentType("text/html;charset=UTF-8");
      pageContext = _jspxFactory.getPageContext(this, request, response,
      			null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

      out.write("\n");
      out.write("\n");
      out.write("<html>\n");
      out.write("  <head>\n");
      out.write("    <title>$Title$</title>\n");
      out.write("  </head>\n");
      out.write("  <body>\n");
      out.write('\n');
      out.write('\n');
      out.write('\n');
    int b=10; 
      out.write("\n");
      out.write("  </body>\n");
      out.write("</html>\n");
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try {
            if (response.isCommitted()) {
              out.flush();
            } else {
              out.clearBuffer();
            }
          } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
        else throw new ServletException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }

<%!%> 标签中声明的变量,在JSP转译后的Servlet中作为成员变量形式存在

public final class index3_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports {
    int a=10;

JSP注释

JSP注释: <%-- 注释内容 --%>

JSP注释与其他注释区别:

注释编译时加入java代中浏览器是能查看注释
css注释
HTML注释
java注释不会
js注释
JSP不会不会

实例

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
    <style>
      /*css注释 存于JSP 编译时加入java代码中 会响应给浏览器*/
    </style>
    <script type="text/javascript">
        /*js注释 存于JSP页面 编译时加入java代码中 会响应给浏览器*/
    </script>
  </head>
  <body>
  <!--html注释 存于JSP页面 编译时加入java代码中 会响应给浏览器-->
  <%--JSP注释  存于JSP页面 编译时不加入java代码中 不会响应给浏览器--%>
  <%
    /*Java注释 存于JSP页面 编译时加入java代码中 不会响应给浏览器*/
  %>
  </body>
</html>

JSP使用建议

JSP和Servlet本质上相同,JSP页面可以使用Servlet

  • JSP编写风格是在HTML中嵌入少量代码
  • JSP更擅长展示数据,作为视图层view
  • Servlet更适合做后台程序,所以在分层上,我们往往将Servlet作为控制层Controller使用,JSP作为视图层显示

JSP指令标签

JSP指令标签是JSP页面上的一种特殊标签,用来设置JSP页面相关属性

标签作用
<<%@page%>>设置JSP页面依赖属性,如导包、脚本语言 、erro页面
<<%@includde%>>包含其他文件
<<%@table%>>引入标签库

page指令标签

属性描述
buffer指定out对象使用缓冲区的大小
autoFlush控制out对象的 缓存区
contentType指定当前JSP页面的MIME类型和字符编码
errorPage指定当JSP页面发生异常时需要转向的错误处理页面
isErrorPage指定当前页面是否可以作为另一个JSP页面的错误处理页
extends指定servlet从哪一个类继承
import导入要使用的Java类
info定义JSP页面的描述信息
isThreadSafe指定对JSP页面的访问是否为线程安全
language定义JSP页面所用的脚本语言,默认是Java
session指定JSP页面是否使用session
isELIgnored指定是否执行EL表达式
isScriptingEnabled确定脚本元素能否被使用

实例

<%--设置浏览器以什么格式和编码解析 响应的数据--%>
<%@ page contentType="text/html;charset=UTF-8"  %>
<%--设置JSP页面转换的语言--%>
<%@ page language="java"%>
<%--导包--%>
<%@ page import="java.util.Date" %>
<%--在转换成java代码时使用的编码 一般不用设置--%>
<%@ page pageEncoding="UTF-8" %>
<%--指定错误页 当页面发生错误时 指定跳转的页面--%>
<%@ page errorPage="error.jsp" %>
<%--
    指定当前页为错误提示页 当前页面可以接收异常对象
    必须配置isErrorPage="true" 才能使用exception
 --%>
<%@page isErrorPage="true" %>

可以在web.xml 配置各种错误的提示页

<error-page>
    <error-code>404</error-code>
    <location>/404.html</location>
</error-page>
<error-page>
    <error-code>500</error-code>
    <location>/500.html</location>
</error-page>

include标签

静态包含

<%@include file=“hade.jsp”%>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <%@include file="hade.jsp"%>
  hade
  </body>
</html>

动态包含

<jsp:include page=“hade.jsp”/>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
    <jsp:include page="hade.jsp"/>
  </body>
</html>

静态导报和动态导包的区别?

​ 静态包含:被引入的网页和当前页面生成代码生成一个java文件

静态包含生成Java文件部分源码

  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
    try {
      response.setContentType("text/html;charset=UTF-8");
      pageContext = _jspxFactory.getPageContext(this, request, response,
      			null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;
      out.write("<html>\n");
      out.write("  <head>\n");
      out.write("    <title>$Title$</title>\n");
      out.write("  </head>\n");
      out.write("  <body>\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("    <title>Title</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");
      out.write("<img src=\"static/JSP继承结构.png\" alt=\"\">\r\n");
      out.write("</body>\r\n");
      out.write("</html>\r\n");
      out.write("\n");
      out.write("  </body>\n");
      out.write("</html>\n");
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try {
            if (response.isCommitted()) {
              out.flush();
            } else {
              out.clearBuffer();
            }
          } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
        else throw new ServletException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }

​ 动态报换:被引入的网页生会成代码生成独立的java文件

动态包含生成Java文件部分源码

  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
    try {
      response.setContentType("text/html;charset=UTF-8");
      pageContext = _jspxFactory.getPageContext(this, request, response,
      			null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;
      out.write("<html>\n");
      out.write("  <head>\n");
      out.write("    <title>$Title$</title>\n");
      out.write("  </head>\n");
      out.write("  <body>\n");
      out.write("\n");
      org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "hade.jsp", out, false);
      out.write("\n");
      out.write("  </body>\n");
      out.write("</html>\n");
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try {
            if (response.isCommitted()) {
              out.flush();
            } else {
              out.clearBuffer();
            }
          } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
        else throw new ServletException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}

通过查看源码对比 ,可以看出 动态包含指定的jsp页面会生JSP,静态包含会将另一个网页中的内容写入当前JSP中

taglib指令标签

导入自定义好的标签库,如JSTL,JSP标准标签库

  1. 首先导入jstl.jar 包
  2. 在JSP页面中使用taglib指令标签
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

JSP九大内置对象

内置对象(也称隐式对象),即准备好的对象,不需要我们手动去实例化的对象.

JSP本质式Servlet,在JSP文件转译之后,生成Java代码,在运行时JSP为我们准备了9个可以使用内置对象,这9个对象不需要我们去实例化,直接供我们使用,内置对象完全由JSP自行去维护

JSP九个内置对象分别是:

内置对象类型
pageContextjavax.servlet.jsp.PageContext
requestjavax.servlet.http.HttpServletRequest
sessionjavax.servlet.http.HttpSession
applicationjavax.servlet.ServletContext
responsejavax.servlet.http.HttpServletResponse
outjavax.servlet.jsp.JspWriter out
configjavax.servlet.ServletConfig
pagejava.lang.Object
exceptionjava.lang.Throwable

pageContex 代表整个JSP页面

request 每当客户端请求JSP页面时,JSP引擎会生成一个Request对象代表这个请求

session 用来跟踪客户端请求的会话

Application 项目启动就存在在对应ServletContext,配置一些全局信息,

Response 响应客户端

out 打印流 ,将JSP中的网页打印

page 当前JSP对象本身 this

config 代表每个JSP本身独有的一些信息,对应ServletConfig

exception 异常对象,在错误提示页上使用,需要在page指令标签中加入 isErrorpage=true 才具有该对象

四个域对象

域对象名称作用范围
pageContextpage域当前页面内可用
requestreqeust域单次请求
sessionsession域单次会话
applicationapplication域项目运行

实例

```jsp

<%
/pageContext域中放入数据/
pageContext.setAttribute(“msg”,“pageContextMessage”);
User user = new User(2,“小白”,“12345”);
pageContext.setAttribute(“user”,user);
%>

pageContext域中取出数据


${pageScope.msg}

${pageScope.user.name}


从request域中取出数据
${requestScope.msg}
${requestScope.user.name}

从session域中取出数据
${sessionScope.msg}
${sessionScope.users[1].name}

从Application域中取出数据
${applicationScope.msg}
${applicationScope.userMap.a.name}
${applicationScope.userMap.x}
```

EL表达式

EL(Expression Language) 是为了使JSP写起来更简单. 表达语言的灵感来自于ECMAScript 和 XPath,它提供了在JSP中表达式的方法,让JSP的代码更加简化

缺点:

EL表达式取出域对象中的数据,但是仍然避免不了还是要在页面中书写一些java代码.这种嵌入JAVA代码的处理比较繁琐,容易出错,且代码不容易维护

EL 表达式域中取值

pageScope

对应pageContext域

<%
  /*pageContext域中放入数据*/
  pageContext.setAttribute("msg","pageContextMessage");
  User user = new User(2,"小白","12345");
  pageContext.setAttribute("user",user);
%>
pageContext域中取出数据
<br>
${pageScope.msg}<br>
${pageScope.user.name}<br>

requestScope

对应request域

从request域中取出数据
<br>
${requestScope.msg}<br>
${requestScope.user.name}<br>

sessionScope

对应session域

从session域中取出数据<br>
${sessionScope.msg}<br>
${sessionScope.users[1].name}<br>

applicationScope

对应Application域

从Application域中取出数据<br>
${applicationScope.msg}<br>
${applicationScope.userMap.a.name}<br>

EL运算

算数运算符 + - * / %

  <%--
    + 如果有字符串 会尝试转成数字
    转换失败会
    HTTP状态 500 - 内部服务器错误
    java.lang.NumberFormatException: For input string: "assa"
  --%>
  EL+运算<br>
  ${10+10}<br>
  ${'10'+10}<br>
  <%--${'assa'+10}<br>--%>

  <%--
  EL表达式 除运算 除0会出现异常 会返回Infinity
  --%>
  EL除运算<br>
  ${10/0}<br>

比较运算符

运算符写法描述
==eqequals
>gtgreater then
<ltlower then
>=gegreater then or equals
<=lelower then or equals
!=nenot equals
  <%--
    EL比较运算
    gt >
    lt <
    == eq
  --%>
  EL比较运算<br>
  ${10 gt 0}<br>
  ${10 lt 0}<br>
  ${10 eq 0}<br>

逻辑运算符 : || or && and

EL逻辑运算<br>
<%
    int score=(int)(Math.random()*101);
    pageContext.setAttribute("score",score);
  %>
  ${score}:
  ${score ge 90? "A":""}
  ${score ge 80 and score lt 90? "B":""}
  ${score ge 70 and score lt 80? "B":""}
  ${score ge 60 and score lt 70? "D":""}
  ${score lt 60? "E":""}<br>

三目运算符: ${条件 ? 表达式1 : 表达式2}

判空运算符: empty

判断null值 ${empty user ? "uesr未找到":user.name}<br>
判断空数组 ${empty arr}<br>
判断空集合 ${empty list}<br>

JSTL

JSTL(Java server pages standarded tag library,即JSP标准标签库

取代传统直接在页面上嵌入Java程序的做法,以提高程序的阅读性、维护性和方便性。在jstl中, 提供了多套标签库, 用于方便在jsp中完成或简化相关操作.

  • core 核心标签库 ,简称c
  • format 格式化标签库 ,简称fmt
  • function 函数标签库 ,简称fn

使用步骤:

  1. 首先导入jstl.jar 包
  2. 在JSP页面中使用taglib指令标签

JSTL核心标签库

JSTL操作域对象

标签描述对应方法
c:set向域对象中放入数据setAttribute
c:out从域对象中取出数据getAttribute
c:remove从域对象中移除数据removeAttribute

实例

<%--导入jstl core标签库--%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--向四个域中放入数据   setAttribute--%>
<c:set var="msg" value="pageScopeMsg" scope="page" ></c:set>
<c:set var="msg" value="requestScopeMsg" scope="request" ></c:set>
<c:set var="msg" value="sessionScopeMsg" scope="session" ></c:set>
<c:set var="msg" value="applicationScopeMsg" scope="application" ></c:set>
<%--从四个域中取出数据--%>
${pageScope.msg}<br>
 ${requestScope.msg}<br>
 ${sessionScope.msg}<br>
 ${applicationScope.msg}<br>
 <%--四个域中c out 标签取出域对象中的数据  getAttribute--%>
<c:out value="${pageScope.msg}" default="page未找到"></c:out><br>
<c:out value="${requestScope.msg}" default="request未找到"></c:out><br>
<c:out value="${sessionScope.msg}" default="session未找到"></c:out><br>
<c:out value="${applicationScope.msg}" default="application未找到"></c:out><br>

 <%--c remove 移除指定域中的数据的 removeAttribute --%>
<c:remove var="msg" scope="page"></c:remove>
<c:remove var="msg" scope="session"></c:remove>
<c:remove var="msg" scope="request"></c:remove>
<c:remove var="msg" scope="application"></c:remove>

c:if标签

<%--导入jstl core标签库--%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
 pageContext.setAttribute("score",(int)(Math.random()*101));
%>
<%--
  c:if
  test 判断条件
  scope 操作的域对象
  var 保存数据变量名
--%>
分数${score}
<c:if test="${score ge 90}" scope="page" var="f1">A</c:if>
<c:if test="${score ge 80 and score lt 90}" scope="page" var="f1">B</c:if>
<c:if test="${score ge 70 and score lt 80}" scope="page" var="f2">C</c:if>
<c:if test="${score ge 60 and score lt 70}" scope="page" var="f3">D</c:if>
<c:if test="${score lt 60}" scope="page" var="f4">E</c:if>
<%--输出var--%>
${f1}<br>
${f2}<br>
${f3}<br>
${f4}<br>

c:choose 标签

<%--导入jstl core标签库--%> 
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%pageContext.setAttribute("score",(int)(Math.random()*101));%>
分数:${score}
<c:choose>
   <c:when test="${score ge 90 }">A</c:when>
   <c:when test="${score ge 80 }">B</c:when>
   <c:when test="${score ge 70}">C</c:when>
   <c:when test="${score ge 60}">D</c:when>
   <c:otherwise>E</c:otherwise>
</c:choose>

c:foreach标签

c:foreach属性如下

属性描述是否必要默认值
items要被循环的信息
begin开始的元素(0=第一个元素,1=第二个元素)0
end最后一个元素(0=第一个元素,1=第二个元素)Last element
step每一次迭代的步长1
var代表当前条目的变量名称
varStatus代表循环状态的变量名称

c:forEach打印99乘法表

<%--导入jstl core标签库--%> 
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
      var 指定变量名
      begin 变量初始值
      step 步长
      end 变量目标值
      循环执行一次相当于在pageContext域 放入一个值 i=1;
 --%>
 <c:forEach var="i" begin="1" end="10" step="1">
     <c:forEach var="j" begin="1" end="${i}" step="1">
         ${j}*${i}=${i*j}&nbsp;
     </c:forEach>
     <br>
 </c:forEach>

c:forEach动态生成表格

<%--
       var 变量中间将名
       items foreach 要遍历的集合
       varStatus 当前遍历元素的一些状态信息
       index: 索引, 从0开始
       count: 计数, 从1开始
       first: boolean, 表示是否是第一个
       last: boolean, 表示是否是最后一个
       current: 对象, 当前迭代的对象值
  --%>
 <table cellspacing="0px" cellpadding="0px">
       <tr>
           <th>索引</th>
           <th>序号</th>
           <th>编号</th>
           <th>姓名</th>
           <th>密码</th>
           <th>是不是第一个</th>
           <th>是不是最后一个</th>
           <th>姓名</th>
       </tr>
       <c:forEach var="user" items="${requestScope.users}"  varStatus="us">
           <tr>
               <td>${us.index}</td>
               <td>${us.count}</td>
               <td>${user.id}</td>
               <td>${user.name}</td>
               <td>${user.password}</td>
               <td>${us.first}</td>
               <td>${us.last}</td>
               <td>${us.current.name}</td>
           </tr>
       </c:forEach>
   </table>

JSTL格式化标签库

​ 格式化标签库,也叫作fmt标签,是JTSL中的第二大组成部分,主要解决数据显示格式问题,让JSP页面的数据格式更加规范

fmt:formatNumber标签

fmt:formatNumber标签有如下属性:

属性描述是否必要默认值
value要显示的数字
typeNUMBER,CURRENCY,或 PERCENT类型Number
pattern指定一个自定义的格式化模式用与输出
currencyCode货币码(当type="currency"时)取决于默认区域
currencySymbol货币符号 (当 type="currency"时)取决于默认区域
groupingUsed是否对数字分组 (TRUE 或 FALSE)true
maxIntegerDigits整型数最大的位数
minIntegerDigits整型数最小的位数
maxFractionDigits小数点后最大的位数
minFractionDigits小数点后最小的位数
var存储格式化数字的变量Print to page
scopevar属性的作用域page

pattern属性

符号描述
0代表一位数字
E使用指数格式
#代表一位数字,若没有则显示 0,前导 0 和追尾 0 不显示。
.小数点
,数字分组分隔符
;分隔格式
-使用默认负数前缀
%百分数
?千分数
¤货币符号,使用实际的货币符号代替
X指定可以作为前缀或后缀的字符
'在前缀或后缀中引用特殊字符

实例

<%--
        CURRENCY 货币
        NUMBER   数字
        PERCENT  %
--%>
<%--<fm:formatNumber value="${emp.sal}" type="PERCENT"></fm:formatNumber>--%>
<%--自定义格式--%>
<fmt:formatNumber value="${emp.sal}"  pattern="¥###,###.00#"> </fmt:formatNumber>

fmt:formatDate标签

​ 日期格式化标签是fmt标签中专门用于处理日期格式的标签

fmt:formatDate标签有如下属性:

属性描述是否必要默认值
value要显示的日期
typeDATE, TIME, 或 BOTHdate
dateStyleFULL, LONG, MEDIUM, SHORT, 或 DEFAULTdefault
timeStyleFULL, LONG, MEDIUM, SHORT, 或 DEFAULTdefault
pattern自定义格式模式
timeZone显示日期的时区默认时区
var存储格式化日期的变量名显示在页面
scope存储格式化日志变量的范围页面
代码描述实例
G时代标志AD
y不包含纪元的年份。如果不包含纪元的年份小于 10,则显示不具有前导零的年份。2002
M月份数字。一位数的月份没有前导零。April & 04
d月中的某一天。一位数的日期没有前导零。20
h12 小时制的小时。一位数的小时数没有前导零。12
H24 小时制的小时。一位数的小时数没有前导零。0
m分钟。一位数的分钟数没有前导零。45
s秒。一位数的秒数没有前导零。52
S毫秒970
E周几Tuesday
D一年中的第几天180
F一个月中的第几个周几2 (一个月中的第二个星期三)
w一年中的第几周r27
W一个月中的第几周2
<%--
    type="DATE" 日期
    type="TIME" 时间
    type="BOTH" 日期和时间
    dateStyle="LONG"  长格式的时间
    dateStyle="SHORT" 短格式的时间
 	dateStyle="FULL"  完整格式的时间
--%>
<%--<fmt:formatDate value="${emp.hiredate}" type="DATE" dateStyle="LONG"></fmt:formatDate>--%>
<%-- <fmt:formatDate value="${emp.hiredate}" type="BOTH"></fmt:formatDate>--%>
<%--<fmt:formatDate value="${emp.hiredate}" type="TIME"></fmt:formatDate>--%>
<fmt:formatDate value="${emp.hiredate}" pattern="yyyy年MM月dd日 HH时mm分ss秒 E"></fmt:formatDate>

实例

<%@ page import="com.test.pojo.Emp" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fm" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
    <title>Title</title>
    <style type="text/css">
        table{
            margin: 0 auto;
            border: 1px solid salmon;
        }
        table td,th{
            border: 1px solid salmon;
        }

    </style>
</head>
<body>
    <table cellpadding="0px" cellspacing="0px">
        <th>员工编号</th>
        <th>姓名</th>
        <th>职位</th>
        <th>上级</th>
        <th>入职日期</th>
        <th>工资</th>
        <th>补助</th>
        <th>部门号</th>
        <th>部门名</th>
        <th>薪资级别</th>
        <th>职务级别</th>
        <c:forEach items="${empAll}" var="emp">
        <tr>
            <td>${emp.empno}</td>
            <td>${emp.ename}</td>
            <td>${emp.job}</td>
            <td>${empty emp.mgr?"没有上级":emp.mgr}</td>
            <td>
                <%--
                    type="DATE" 日期
                    type="TIME" 时间
                    type="BOTH" 日期和时间
                    dateStyle="LONG"  长格式的时间
                    dateStyle="SHORT" 短格式的时间
                    dateStyle="FULL"  完整格式的时间
                    pattern="yyyy年MM月dd日 HH时mm分ss秒 E" 自定义格式
                --%>
                 <%--<fmt:formatDate value="${emp.hiredate}" type="DATE" dateStyle="LONG"></fmt:formatDate>--%>
                 <fmt:formatDate value="${emp.hiredate}" pattern="yyyy年MM月dd日 HH时mm分ss秒 E"></fmt:formatDate>
            </td>
            <td>
               <%--
                   type="PERCENT"   %
                   type="CURRENCY"  货币
                   type="NUMBER"    数字
                   pattern="¥###,###.00#" 自定义格式
               --%>
               <%--<fm:formatNumber value="${emp.sal}" type="PERCENT"></fm:formatNumber>--%>
               <fmt:formatNumber value="${emp.sal}"  pattern="¥###,###.00#"> </fmt:formatNumber>
            </td>
            <td>${emp.comm}</td>
            <td>${emp.deptno}</td>
            <td>${emp.dept.dname}</td>
            <td>${emp.salgrade.grade}</td>
            <td>
                <c:choose >
                    <c:when test="${emp.sal ge 4000}">G</c:when>
                    <c:when test="${emp.sal ge 3000}">F</c:when>
                    <c:when test="${emp.sal ge 2000}">E</c:when>
                    <c:when test="${emp.sal ge 1500}">D</c:when>
                    <c:when test="${emp.sal ge 1000}">C</c:when>
                    <c:when test="${emp.sal ge 500}">B</c:when>
                    <c:when test="${emp.sal lt 500}">A</c:when>
                </c:choose>
            </td>
        </tr>
        </c:forEach>
    </table>
</body>
</html>
               type="CURRENCY"  货币
               type="NUMBER"    数字
               pattern="¥###,###.00#" 自定义格式
           --%>
           <%--<fm:formatNumber value="${emp.sal}" type="PERCENT"></fm:formatNumber>--%>
           <fmt:formatNumber value="${emp.sal}"  pattern="¥###,###.00#"> </fmt:formatNumber>
        </td>
        <td>${emp.comm}</td>
        <td>${emp.deptno}</td>
        <td>${emp.dept.dname}</td>
        <td>${emp.salgrade.grade}</td>
        <td>
            <c:choose >
                <c:when test="${emp.sal ge 4000}">G</c:when>
                <c:when test="${emp.sal ge 3000}">F</c:when>
                <c:when test="${emp.sal ge 2000}">E</c:when>
                <c:when test="${emp.sal ge 1500}">D</c:when>
                <c:when test="${emp.sal ge 1000}">C</c:when>
                <c:when test="${emp.sal ge 500}">B</c:when>
                <c:when test="${emp.sal lt 500}">A</c:when>
            </c:choose>
        </td>
    </tr>
    </c:forEach>
</table>
```
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值