文章目录
JSP简简介
JSP,全称JavaServer Pages ,是由Sun公司主导创建的一种动态网页技术标准。
- 动态生成网页数据,不是动态效果的网页
- JSP在HTML中嵌入Java代码
- JSP是服务端技术
- 由应用服务器来编译和执行嵌入的Java代码,然后生成整个页面信息返回给客户端
JSP运行原理
当浏览器第一次发送请求一个JSP资源是,JSP加载引擎会将一个.jsp文件转换成一个Servlet的.java文件
将HTML代码编入Servlet中,然后运行这个Servlet,将数据响应给浏览器。
JSP执行过程
- 客户端发出Request请求
- JSP Container(容器) 将JSP转译Servlet的源代码.java文件
- 将产生的Servlet源码进行编译,生成字节码.class文件
- 将.class 字节码文件加载进入内存,运行Servlet
- 通过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标准标签库
- 首先导入jstl.jar 包
- 在JSP页面中使用taglib指令标签
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
JSP九大内置对象
内置对象(也称隐式对象),即准备好的对象,不需要我们手动去实例化的对象.
JSP本质式Servlet,在JSP文件转译之后,生成Java代码,在运行时JSP为我们准备了9个可以使用内置对象,这9个对象不需要我们去实例化,直接供我们使用,内置对象完全由JSP自行去维护
JSP九个内置对象分别是:
内置对象 | 类型 |
---|---|
pageContext | javax.servlet.jsp.PageContext |
request | javax.servlet.http.HttpServletRequest |
session | javax.servlet.http.HttpSession |
application | javax.servlet.ServletContext |
response | javax.servlet.http.HttpServletResponse |
out | javax.servlet.jsp.JspWriter out |
config | javax.servlet.ServletConfig |
page | java.lang.Object |
exception | java.lang.Throwable |
pageContex 代表整个JSP页面
request 每当客户端请求JSP页面时,JSP引擎会生成一个Request对象代表这个请求
session 用来跟踪客户端请求的会话
Application 项目启动就存在在对应ServletContext,配置一些全局信息,
Response 响应客户端
out 打印流 ,将JSP中的网页打印
page 当前JSP对象本身 this
config 代表每个JSP本身独有的一些信息,对应ServletConfig
exception 异常对象,在错误提示页上使用,需要在page指令标签中加入 isErrorpage=true 才具有该对象
四个域对象
域对象 | 名称 | 作用范围 |
---|---|---|
pageContext | page域 | 当前页面内可用 |
request | reqeust域 | 单次请求 |
session | session域 | 单次会话 |
application | application | 域项目运行 |
实例
```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>
比较运算符
运算符 | 写法 | 描述 |
---|---|---|
== | eq | equals |
> | gt | greater then |
< | lt | lower then |
>= | ge | greater then or equals |
<= | le | lower then or equals |
!= | ne | not 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
使用步骤:
- 首先导入jstl.jar 包
- 在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}
</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 | 要显示的数字 | 是 | 无 |
type | NUMBER,CURRENCY,或 PERCENT类型 | 否 | Number |
pattern | 指定一个自定义的格式化模式用与输出 | 否 | 无 |
currencyCode | 货币码(当type="currency"时) | 否 | 取决于默认区域 |
currencySymbol | 货币符号 (当 type="currency"时) | 否 | 取决于默认区域 |
groupingUsed | 是否对数字分组 (TRUE 或 FALSE) | 否 | true |
maxIntegerDigits | 整型数最大的位数 | 否 | 无 |
minIntegerDigits | 整型数最小的位数 | 否 | 无 |
maxFractionDigits | 小数点后最大的位数 | 否 | 无 |
minFractionDigits | 小数点后最小的位数 | 否 | 无 |
var | 存储格式化数字的变量 | 否 | Print to page |
scope | var属性的作用域 | 否 | 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 | 要显示的日期 | 是 | 无 |
type | DATE, TIME, 或 BOTH | 否 | date |
dateStyle | FULL, LONG, MEDIUM, SHORT, 或 DEFAULT | 否 | default |
timeStyle | FULL, LONG, MEDIUM, SHORT, 或 DEFAULT | 否 | default |
pattern | 自定义格式模式 | 否 | 无 |
timeZone | 显示日期的时区 | 否 | 默认时区 |
var | 存储格式化日期的变量名 | 否 | 显示在页面 |
scope | 存储格式化日志变量的范围 | 否 | 页面 |
代码 | 描述 | 实例 |
---|---|---|
G | 时代标志 | AD |
y | 不包含纪元的年份。如果不包含纪元的年份小于 10,则显示不具有前导零的年份。 | 2002 |
M | 月份数字。一位数的月份没有前导零。 | April & 04 |
d | 月中的某一天。一位数的日期没有前导零。 | 20 |
h | 12 小时制的小时。一位数的小时数没有前导零。 | 12 |
H | 24 小时制的小时。一位数的小时数没有前导零。 | 0 |
m | 分钟。一位数的分钟数没有前导零。 | 45 |
s | 秒。一位数的秒数没有前导零。 | 52 |
S | 毫秒 | 970 |
E | 周几 | Tuesday |
D | 一年中的第几天 | 180 |
F | 一个月中的第几个周几 | 2 (一个月中的第二个星期三) |
w | 一年中的第几周r | 27 |
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>
```