javaweb(3)之JSP&EL&JSTL
JSP(Java Server Page)
介绍
什么是 JSP ?
从用户角度看,JSP 就是一个网页。
从开发者角度看,它其实就是一个继承了 Servlet 的 java 类,所以可以直接说 JSP 就是一个 Servlet。
为什么会有 JSP ?
HTML 通常情况下用来显示一成不变的静态内容,但实际上大部分我们需要的网页上是需要显示一些静态数据的,这些动作都涉及到了逻辑处理,这些都需要代码辅助完成。
HTML 中是不支持写 java 代码的,而JSP 里面可以写 java 代码。
查看 JSP 翻译后的文件示例:
/* * Generated by the Jasper component of Apache Tomcat * Version: Apache Tomcat/7.0.92 * Generated at: 2019-01-04 07:39:33 UTC * Note: The last modified time of this file was set to * the last modified time of the source file after * generation to assist with modification tracking. */ package org.apache.jsp; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent { private static final javax.servlet.jsp.JspFactory _jspxFactory = javax.servlet.jsp.JspFactory.getDefaultFactory(); private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants; private volatile javax.el.ExpressionFactory _el_expressionfactory; private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager; public java.util.Map<java.lang.String,java.lang.Long> getDependants() { return _jspx_dependants; } public javax.el.ExpressionFactory _jsp_getExpressionFactory() { if (_el_expressionfactory == null) { synchronized (this) { if (_el_expressionfactory == null) { _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory(); } } } return _el_expressionfactory; } public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() { if (_jsp_instancemanager == null) { synchronized (this) { if (_jsp_instancemanager == null) { _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig()); } } } return _jsp_instancemanager; } public void _jspInit() { } public void _jspDestroy() { } public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException { 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("\r\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("<h1>hhhh</h1>\r\n"); out.write("</body>\r\n"); out.write("</html>\r\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); } } }例:
指令
page
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
- 参数:
- contentType:告知浏览器当前 JSP 的 MIME 类型和以何编码来解析该 JSP 返回的内容。
- pageEncoding:指定 JSP 内容的编码。
- extends:指定 JSP 翻译成 java 文件后继承的类。
- import:导包使用。
- session:可选 true 或 false,默认为 true。指定当前 JSP 能否直接使用 session 对象。
查看 JSP 翻译后的 java 文件可以发现,session 如果指定为 true,在 _jspService 方法中就会声明一个 session 变量,并通过 pageContext.getSession() 赋值;如果 session 指定为 false,那么就不会声明这个变量,即后续不能直接使用 session。
- errorPage:指定当前 JSP 出错时跳转到的页面。
- isErrorPage:可选 true 或 false,指定当前 JSP 是不是错误页,默认 false。如果指定为 true,在当前 JSP 中就可以直接使用 exception 对象。
include
<%@include file="page.jsp" %>
将指定 JSP 文件包含到当前 JSP。
- 示例:
-
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>page1</title> </head> <body> <% String str = "hello";%> <%=str%> <h1>这是 page1 的内容</h1> </body> </html>page1.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>page2</title> </head> <body> <%@include file="page1.jsp" %> <h1>这是 page2 的内容</h1> </body> </html>
page2.jsp
/* * Generated by the Jasper component of Apache Tomcat * Version: Apache Tomcat/7.0.92 * Generated at: 2019-01-04 08:25:20 UTC * Note: The last modified time of this file was set to * the last modified time of the source file after * generation to assist with modification tracking. */ package org.apache.jsp; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; public final class page2_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent { private static final javax.servlet.jsp.JspFactory _jspxFactory = javax.servlet.jsp.JspFactory.getDefaultFactory(); private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants; static { _jspx_dependants = new java.util.HashMap<java.lang.String,java.lang.Long>(1); _jspx_dependants.put("/page1.jsp", Long.valueOf(1546590314039L)); } private volatile javax.el.ExpressionFactory _el_expressionfactory; private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager; public java.util.Map<java.lang.String,java.lang.Long> getDependants() { return _jspx_dependants; } public javax.el.ExpressionFactory _jsp_getExpressionFactory() { if (_el_expressionfactory == null) { synchronized (this) { if (_el_expressionfactory == null) { _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory(); } } } return _el_expressionfactory; } public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() { if (_jsp_instancemanager == null) { synchronized (this) { if (_jsp_instancemanager == null) { _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig()); } } } return _jsp_instancemanager; } public void _jspInit() { } public void _jspDestroy() { } public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException { 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("\r\n"); out.write("<html>\r\n"); out.write("<head>\r\n"); out.write(" <title>page2</title>\r\n"); out.write("</head>\r\n"); out.write("<body>\r\n"); out.write("\r\n"); out.write("<html>\r\n"); out.write("<head>\r\n"); out.write(" <title>page1</title>\r\n"); out.write("</head>\r\n"); out.write("<body>\r\n"); String str = "hello"; out.write('\r'); out.write('\n'); out.print(str); out.write("\r\n"); out.write("<h1>这是 page1 的内容</h1>\r\n"); out.write("</body>\r\n"); out.write("</html>\r\n"); out.write("\r\n"); out.write("<h1>这是 page2 的内容</h1>\r\n"); out.write("</body>\r\n"); out.write("</html>\r\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); } } }page2_jsp.java:page2翻译后的java文件
查看翻译后文件可以发现,include 指令就是将指定 JSP 文件的内容拿到自己对应的类中执行输出。
taglib
<%@ taglib prefix="" uri="" %>
引入标签库。
- 参数:
- prefix:别名。
- uri:标签库地址。
动作标签
include
<jsp:include page="page1.jsp"></jsp:include>
作用和 include 指令一样,也是将指定 JSP 页包含到当前 JSP 页中。
- 示例:
-
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>page1</title> </head> <body> <% String str = "hello";%> <h1>这是 page1 的内容</h1> <%=str%> </body> </html>page1.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>page2</title> </head> <body> <jsp:include page="page1.jsp"></jsp:include> <h1>这是 page2 的内容</h1> </body> </html>
page2.jsp
/* * Generated by the Jasper component of Apache Tomcat * Version: Apache Tomcat/7.0.92 * Generated at: 2019-01-04 08:49:08 UTC * Note: The last modified time of this file was set to * the last modified time of the source file after * generation to assist with modification tracking. */ package org.apache.jsp; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; public final class page2_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent { private static final javax.servlet.jsp.JspFactory _jspxFactory = javax.servlet.jsp.JspFactory.getDefaultFactory(); private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants; private volatile javax.el.ExpressionFactory _el_expressionfactory; private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager; public java.util.Map<java.lang.String,java.lang.Long> getDependants() { return _jspx_dependants; } public javax.el.ExpressionFactory _jsp_getExpressionFactory() { if (_el_expressionfactory == null) { synchronized (this) { if (_el_expressionfactory == null) { _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory(); } } } return _el_expressionfactory; } public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() { if (_jsp_instancemanager == null) { synchronized (this) { if (_jsp_instancemanager == null) { _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig()); } } } return _jsp_instancemanager; } public void _jspInit() { } public void _jspDestroy() { } public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException { 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("\r\n"); out.write("<html>\r\n"); out.write("<head>\r\n"); out.write(" <title>page2</title>\r\n"); out.write("</head>\r\n"); out.write("<body>\r\n"); org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "page1.jsp", out, false); out.write("\r\n"); out.write("<h1>这是 page2 的内容</h1>\r\n"); out.write("</body>\r\n"); out.write("</html>\r\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); } } }page2_jsp.java:page2翻译后的java文件
查看翻译后文件可以发现,与 include 指令不同的是:该标签是将指定 JSP 文件执行后返回的内容拿到当前 JSP 中直接输出,而不是将代码拿到当前 JSP 中执行。
forward
<jsp:forward page="page2.jsp"></jsp:forward>
请求转发功能。
相当于执行如下代码:
request.getRequestDispatcher("page2.jsp").forward(request, response);还可以搭配 param 标签传递参数:
<jsp:forward page="page2.jsp"> <jsp:param name="name" value="zhangsan"></jsp:param> <jsp:param name="age" value="20"></jsp:param> </jsp:forward>- 示例:
-
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>page1</title> </head> <body> <jsp:forward page="page2.jsp"> <jsp:param name="name" value="zhangsan"></jsp:param> <jsp:param name="age" value="20"></jsp:param> </jsp:forward> <h1>这是 page1 的内容</h1> </body> </html>page1.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>page2</title> </head> <body> <h1>这是 page2 的内容</h1> <hr> <% String name = request.getParameter("name"); Integer age = Integer.parseInt(request.getParameter("age")); %> name:<%=name%> <br> age:<%=age%> </body> </html>
page2.jsp
/* * Generated by the Jasper component of Apache Tomcat * Version: Apache Tomcat/7.0.92 * Generated at: 2019-01-04 09:18:25 UTC * Note: The last modified time of this file was set to * the last modified time of the source file after * generation to assist with modification tracking. */ package org.apache.jsp; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; public final class page1_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent { private static final javax.servlet.jsp.JspFactory _jspxFactory = javax.servlet.jsp.JspFactory.getDefaultFactory(); private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants; private volatile javax.el.ExpressionFactory _el_expressionfactory; private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager; public java.util.Map<java.lang.String,java.lang.Long> getDependants() { return _jspx_dependants; } public javax.el.ExpressionFactory _jsp_getExpressionFactory() { if (_el_expressionfactory == null) { synchronized (this) { if (_el_expressionfactory == null) { _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory(); } } } return _el_expressionfactory; } public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() { if (_jsp_instancemanager == null) { synchronized (this) { if (_jsp_instancemanager == null) { _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig()); } } } return _jsp_instancemanager; } public void _jspInit() { } public void _jspDestroy() { } public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException { 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("\r\n"); out.write("<html>\r\n"); out.write("<head>\r\n"); out.write(" <title>page1</title>\r\n"); out.write("</head>\r\n"); out.write("<body>\r\n"); out.write("\r\n"); if (true) { _jspx_page_context.forward("page2.jsp" + "?" + org.apache.jasper.runtime.JspRuntimeLibrary.URLEncode("name", request.getCharacterEncoding())+ "=" + org.apache.jasper.runtime.JspRuntimeLibrary.URLEncode("zhangsan", request.getCharacterEncoding()) + "&" + org.apache.jasper.runtime.JspRuntimeLibrary.URLEncode("age", request.getCharacterEncoding())+ "=" + org.apache.jasper.runtime.JspRuntimeLibrary.URLEncode("20", request.getCharacterEncoding())); return; } out.write("\r\n"); out.write("<h1>这是 page1 的内容</h1>\r\n"); out.write("</body>\r\n"); out.write("</html>\r\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); } } }page1_jsp.java:page1翻译后的java文件
可以看到,参数的携带实际上是将我们通过 param 标签指定的参数先 URL 编码,然后通过 ? 方式拼接到 URL 后面。
9个内置对象
所谓内置对象,就是我们可以直接在 JSP 中使用的已经创建好的对象,有九个如下:
application
它实际上就是 javax.servlet.ServletContext 类的实例,点击查看详细。
request
它是 javax.servlet.http.HttpServletRequest 类的实例,点击查看详细。
session
它是 javax.servlet.http.HttpSession 类的实例,点击查看详细。
pageContext
它是 javax.servlet.jsp.PageContext 类的实例,当前 JSP 的上下文对象,其它几个内置对象也可以通过它获取到。
application 即 ServletContext 实例之前就说过,它在整个应用程序内被共享。
request 仅在一次请求内有效。
session 在一次会话内有效。
而新引入的 pageContext 则只是在当前 JSP 范围内有效,即每个 JSP 都有它独立的 pageContext 对象。
config
它是 javax.servlet.ServletConfig 类的实例,点击查看详细。
exception
它是 java.lang.Throwable 类的实例,JSP 报错时抛出的异常对象。
当 JSP 中 page 指令的 isErrorPage 参数值指定为 true 时,才可直接使用 exception 对象。out
它是 javax.servlet.jsp.JspWriter 类的实例。
- 示例:
-
<%@ page contentType="text/html;charset=UTF-8" isErrorPage="true" language="java" %> <html> <head> <title>Title</title> </head> <body> <% out.write("这是 out 输出的内容"); %> <% response.getWriter().write("这是 response.getWriter() 输出的内容"); %> </body> </html>
page.jsp
可以看到在代码中 response.getWriter() 是后输出的,但是实际访问时它却是先输出的。这是因为 out 对象输出的内容会放到 response 的缓冲区中, response.getWriter() 的内容输出后才会接着输出 out 对象输出的内容。而通过查看 JSP 对应 java 代码我们知道,JSP 页面内容就是使用 out 对象输出的,所以得出结论:当我们在 JSP 中使用 response.getWriter() 输出内容时,在浏览器渲染后 response.getWriter() 输出的内容会出现在页面的最顶部。
page
它是当前 JSP 翻译成 java 类的实例。
response
它是 javax.servlet.http.HttpServletResponse 类的实例,点击查看详细。
EL(Expression Language)
介绍
EL 表达式可以帮助我们简化 JSP 中的 java代码。
取值
在四大作用域中取值
<%@ page contentType="text/html;charset=UTF-8" isErrorPage="true" language="java" %> <html> <head> <title>Title</title> </head> <body> <% pageContext.setAttribute("str", "from pageContext"); request.setAttribute("str", "from request"); session.setAttribute("str", "from session"); application.setAttribute("str", "from application"); %> ${pageScope.str} <br> ${requestScope.str} <br> ${sessionScope.str} <br> ${applicationScope.str} <br> <%--在 el 表达式中不指定 scope 直接使用 name,会依次在 pageContext->request->session->application --%> ${str} </body> </html>
page.jsp
取array和list中的值
<%@ page import="java.util.List" %> <%@ page import="java.util.ArrayList" %> <%@ page contentType="text/html;charset=UTF-8" isErrorPage="true" language="java" %> <html> <head> <title>Title</title> </head> <body> <% String[] array = {"a", "b", "c", "d"}; pageContext.setAttribute("array", array); List list = new ArrayList(); list.add(11); list.add(22); list.add(33); list.add(44); pageContext.setAttribute("list", list); %> ${array[0]},${array[1]},${array[2]},${array[3]} <hr/> ${list[0]},${list[1]},${list[2]},${list[3]} </body> </html>
page.jsp
取map中的值
<%@ page import="java.util.HashMap" %> <%@ page import="java.util.Map" %> <%@ page contentType="text/html;charset=UTF-8" isErrorPage="true" language="java" %> <html> <head> <title>Title</title> </head> <body> <% String[] array = {"aa", "bb"}; Map map = new HashMap(); map.put("name1", "zhangsan"); map.put("name2", "lisi"); map.put("name3", "wangwu"); map.put("name4", "zhaoliu"); pageContext.setAttribute("map", map); %> ${map["name1"]},${map["name2"]},${map.name3},${map.name4} </body> </html>
page.jsp
取对象属性的值
package com.zze.bean; public class User { private String name; private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }com.zze.bean.User
<%@ page import="com.zze.bean.User" %> <%@ page contentType="text/html;charset=UTF-8" isErrorPage="true" language="java" %> <html> <head> <title>Title</title> </head> <body> <% User user = new User(); user.setName("张三"); user.setAge(18); pageContext.setAttribute("user", user); %> 姓名:${pageScope.user.name} <br> 年龄:${user.age} </body> </html>
page.jsp
11个隐式对象
隐式对象即在 EL 表达式中能直接使用的对象,有 11 个如下:
pageContext
就是 JSP 内置对象的 pageContext。
pageScope
当前 JSP 页的 Map 域。
requestScope
当前请求的 Map 域。
sessionScope
当前会话的 Map 域。
applicationScope
当前应用程序的 Map 域。
header
请求头键和值的 Map。
headerValues
请求头键和值的 Map,值为数组结构。
param
请求参数的参数名和值的 Map。
paramValues
请求参数的参数名名和值的 Map,值为数组结构。
initparam
所有初始化参数的 Map(这里的初始化参数指的是全局初始化参数)。
cookie
所有 Cookie 的键和值 Map。
JSTL(Java Standard Tag Library)
介绍
JSTL 是一个不断完善的开放源代码的 JSP 标签库。
它的作用是简化 JSP 中代码中 java 代码的编写,即替换 <% %> 写法,一般与 EL 表达式配合使用。
使用
1、 导包: jstl.jar、standard.jar 。
2、在 JSP 中使用 taglib 指令引入标签库。
set
将指定 key-value 值存放到域对象。
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>set</title> </head> <body> <%-- 参数: var:名称 value:值 scope:默认为 page ,还有 request、session、application 选项 为 page 时,相当于 <% pageContext.setAttribute("名称","值"); %> 为 request 时,相当于 <% request.setAttribute("名称","值"); %> 为 session 时,相当于 <% session.setAttribute("名称","值"); %> 为 application 时,相当于 <% application.setAttribute("名称","值"); %> --%> <c:set var="age" value="18" scope="page"></c:set> ${age} </body> </html>
set.jsp
if
简单的 if 条件判断。
<%@ page contentType="text/html;charset=UTF-8" isErrorPage="true" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>if</title> </head> <body> <c:set var="age" value="18" scope="page"></c:set> <%-- 参数: test:条件表达式 var:指定变量接收条件表达式结果 scope:标识条件表达式中的变量从哪个域中取 下面代码相当于: --%> <% Integer age = Integer.parseInt(pageContext.getAttribute("age").toString()); boolean flag = age >= 18; pageContext.setAttribute("flag", flag); if (flag) { %> 成年人 <% } %> <c:if test="${age>=18}" var="flag" scope="page"> 成年人 </c:if> ${flag}
if.jsp
forEach
循环。
<%@ page import="com.zze.bean.User" %> <%@ page import="java.util.ArrayList" %> <%@ page import="java.util.List" %> <%@ page contentType="text/html;charset=UTF-8" isErrorPage="true" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>forEach</title> </head> <body> <%-- for 循环 参数: begin:起始数字 end:结束数字 var:定义一个变量代指当前遍历对象 step:增幅 --%> <c:forEach begin="1" end="10" var="item" step="2"> ${item} </c:forEach> <% List<User> userList = new ArrayList<User>(); userList.add(new User("张三", 18)); userList.add(new User("李四", 19)); userList.add(new User("王五", 20)); pageContext.setAttribute("userList", userList); %> <hr> <%-- foreach 循环 参数: begin:起始下标从 0 开始 end:结束下标 step:下标增幅 var:定义一个变量代指当前遍历对象 items:指定要遍历的可迭代对象 varStatus:定义一个保存了当前遍历信息的对象,有如下属性: begin:当前遍历的起始下标从 0 开始 end:当前遍历的结束下标 step:当前遍历的下标增幅 count:当前遍历的是第几个,从 1 开始 current:代指当前遍历对象,和 var 定义的变量指向同一个地址 first:当前遍历对象是否是第一个 last:当前遍历对象是否是最后一个 index:当前遍历对象的下标 --%> <c:forEach begin="0" end="${userList.size()}" step="2" var="user" items="${userList}" varStatus="s"> user.name:${user.name},user.age:${user.age},s.step:${s.step},s.begin:${s.begin},s.end:${s.end},s.count:${s.count},s.current:${s.current},s.current == user:${s.current == user},s.first:${s.first},s.last:${s.last}<br> </c:forEach> </body> </html>
forEach.jsp
补充
CRUD实例下载
自定义标签库
最简单的标签库
1、创建一个标签处理类,该类需要继承 SimpleTagSupport 类,重写 doTag 方法:
package com.zze.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;
public class HelloTag extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
getJspContext().getOut().print("<h1>Hello My Tag!!!</h1>");
}
}
com.zze.tag.HelloTag
2、在 WEB-INF 下创建标签库配置文件:
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>tag created by zze</description>
<tlib-version>1.0</tlib-version>
<short-name>myTag</short-name>
<!--标签库唯一标识-->
<uri>zze.test</uri>
<tag>
<description>Outputs Hello</description>
<!--标签名称-->
<name>helloTag</name>
<tag-class>com.zze.tag.HelloTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
WEB-INF/tld/mytag.tld
3、在 jsp 中使用:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="mytag" uri="zze.test"%>
<html>
<head>
<title>自定义标签库测试</title>
</head>
<body>
<mytag:helloTag/>
</body>
</html>

index.jsp
带属性的标签库
1、创建一个标签处理类,声明一个属性并给它 setter ,重写 doTag 方法:
package com.zze.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;
import java.util.HashMap;
public class TableTag extends SimpleTagSupport {
private String map;
public void setMap(String map) {
this.map = map;
}
@Override
public void doTag() throws JspException, IOException {
HashMap<String, Integer> maps = (HashMap<String, Integer>) (getJspContext().getAttribute(map));
Object[] array = maps.keySet().toArray();
for (String str : maps.keySet()) {
getJspContext().getOut().write("<tr>");
getJspContext().getOut().write("<td>");
getJspContext().getOut().write(str);
getJspContext().getOut().write("</td>");
getJspContext().getOut().write("<td>");
getJspContext().getOut().write("" + maps.get(str));
getJspContext().getOut().write("</td>");
getJspContext().getOut().write("</tr>");
}
}
}
com.zze.tag.TableTag
2、在 WEB-INF 下创建标签库配置文件:
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>tag created by zze</description>
<tlib-version>1.0</tlib-version>
<short-name>myTag</short-name>
<uri>zze.test</uri>
<tag>
<name>tr</name>
<tag-class>com.zze.tag.TableTag</tag-class>
<body-content>empty</body-content>
<attribute>
<!--声明一个属性-->
<name>map</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
</tag>
</taglib>
WEB-INF/tld/mytag.tld
3、在 jsp 中使用:
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="mytag" uri="zze.test" %>
<html>
<head>
<title>自定义标签库测试</title>
</head>
<body>
<%
HashMap<String, Integer> maps = new HashMap<String, Integer>();
maps.put("张三", 18);
maps.put("李四", 23);
maps.put("王五", 23);
pageContext.setAttribute("map", maps);
%>
<table border="1">
<mytag:tr map="map"/>
</table>
</body>
</html>

index.jsp
javaweb(3)之JSP&EL&JSTL的更多相关文章
- JavaWeb之JSP & EL & JSTL
JSP & EL & JSTL JSP Java Server Page 什么是JSP 从用户角度看,就是一个网页.从程序员角度看,就是一个Java类,它继承Servlet,所以可以说 ...
- JavaEE之动态页面技术(JSP/EL/JSTL)
动态页面技术(JSP/EL/JSTL) JSP技术 jsp脚本和注释 jsp脚本: 1)<%java代码%> ----- 内部的java代码翻译到service方法的内部 2)<%= ...
- jsp&el&jstl mvc和三层架构
jsp:java在html中插入java 一.JSP技术 1.jsp脚本和注释 jsp脚本:(翻译成servlet,源码位置apache-tomcat-7.0.52\work\Catalina\loc ...
- 动态页面技术JSP/EL/JSTL
本节内容: jsp脚本和注释 jsp运行原理 jsp指令(3个) jsp内置/隐式对象(9个) jsp标签(动作) EL技术 JSTL技术 JavaEE的开发模式 动态页面技术:就是在html中嵌入j ...
- 《JavaWeb从入门到改行》JSP+EL+JSTL大杂烩汤
title: Servlet之JSP tags: [] notebook: javaWEB --- JSP是什么 ? JSP就是Servlet,全名是"JavaServer Pages&qu ...
- JavaWeb之动态页面技术JSP/EL/JSTL
一.JSP技术 1.jsp脚本和注释 jsp脚本: 1)<%java代码%> ----- 内部的java代码翻译到service方法的内部 2)<%=java变量或表达式> - ...
- JavaWeb基础Day17 (JSP EL表达式 jstl标签库 beanutil工具类)
JSP jsp的实质就是指在html界面中嵌入Java代码 jsp脚本 <% Java代码 %> 相当于写在service方法中. <%=java 变量或者表达式 %> ...
- JavaWeb 补充(JSP&EL&JSTL)
1. JSP: 1. 指令 2. 注释 3. 内置对象 2. MVC开发模式 3. EL表达式 4. JSTL标签 5. 三层架构 JSP: 1. 指令 * 作用:用于 ...
- 回锅的美食:JSP+EL+JSTL大杂烩汤
title: Servlet之JSP tags: [] notebook: javaWEB --- JSP是什么 ? JSP就是Servlet,全名是"JavaServer Pages&qu ...
随机推荐
- ios 适配iOS11&iPhoneX的一些坑
前阵子项目开发忙成狗,就一直没做iOS11的适配,直到XcodeGM版发布后,我胸有成竹的在iPhoneX上跑起项目,整个人都凉透了...下面总结一下我遇到的坑,不是很全面,日后补充. 导航栏 导航栏 ...
- iOS最新Mac OS X 10.11之后 安装cocoapods及使用详解
iOS 最新版 CocoaPods 的安装流程 一.安装方法: 1.移除现有Ruby默认源 gem sources --remove https://rubygems.org/ 为了提高安装的成功几率 ...
- underrun || overrun
Underrun(underflow) In computing, buffer underrun or buffer underflow is a state occurring when a bu ...
- c++ 格式字符串说明
C++的格式化字符串经常用作格式化数字的输出.字符串合并和转换等等很多场合. 1. 格式化规定符 ━━━━━━━━━━━━━━━━━━━━━━━━━━ 符号 作用 ─ ...
- clientHeight scrollHeight offsetHeight
<div style="height:200px;padding:10px;border:1px solid green;"></div> 对于上面的di ...
- iOS开发之--在UIWindow上展示/移除一个View
代码如下: 展示 UIWindow *window = [[UIApplication sharedApplication].windows lastObject]; [window addSubvi ...
- jQuery UI =>jquery-ui.js中sortable方法拖拽对象位置偏移问题
今天要处理sortable方法处理的对象,拖拽的时候,位置偏移的问题. 按理应该是鼠标在哪,对象就跟着在哪的 百度了一下问题,http://blog.csdn.net/samed/article/de ...
- [git/GitHub] git push 时报错:fatal: remote error: You can't push to git://github.com/user/xxx.git(已解决)
当使用 git push 时,提示以下错误: fatal: remote error: You can't push to git://github.com/user/xxx.git Use ht ...
- 在cmd启动一个win32程序,printf把信息输出到启运它的那个CMD窗口
#define ProcessBasicInformation 0 typedef struct { DWORD ExitStatus; DWORD PebBaseAddress; DWORD Aff ...
- Go语言基础之数组
Go语言基础之数组 本文主要介绍数组(array)及它的基本使用. Array(数组) 数组是同一种数据类型元素的集合. 在Go语言中,数组从声明时就确定,使用时可以修改数组成员,但是数组大小不可变化 ...