JSP、EL和JSTL

1 JSP

1.1 什么是JSP?

JSP(全称JavaServer Pages)是由Sun Microsystems公司主导创建的一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTMLXML或其他格式文档的Web网页,然后返回给请求者。JSP文件在运行时会被其编译器转换成更原始的Servlet代码。

1.2 JSP的原理

index.jsp的页面如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <h1>Hello World!</h1>
  </body>
</html>

JSP文件在运行时会被其编译器转换成更原始的Servlet代码如下:

/*
 * Generated by the Jasper component of Apache Tomcat
 * Version: Apache Tomcat/8.5.31
 * Generated at: 2022-04-08 12:18:34 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,
                 org.apache.jasper.runtime.JspSourceImports {

  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 static final java.util.Set<java.lang.String> _jspx_imports_packages;

  private static final java.util.Set<java.lang.String> _jspx_imports_classes;

  static {
    _jspx_imports_packages = new java.util.HashSet<>();
    _jspx_imports_packages.add("javax.servlet");
    _jspx_imports_packages.add("javax.servlet.http");
    _jspx_imports_packages.add("javax.servlet.jsp");
    _jspx_imports_classes = null;
  }

  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 java.util.Set<java.lang.String> getPackageImports() {
    return _jspx_imports_packages;
  }

  public java.util.Set<java.lang.String> getClassImports() {
    return _jspx_imports_classes;
  }

  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 java.lang.String _jspx_method = request.getMethod();
    if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
      response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");
      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("  <h1>Hello World!</h1>\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);
    }
  }
}

HTML页面的内容在_jspService这个方法中执行。

1.3 JSP的脚本

JSP中定义Java代码的语法如下(直接在JSP中写Java代码会导致后续难以回沪,因此被EL表达式替代了):

	1. <%  代码 %>:定义的java代码,在service方法中。service方法中可以定义什么,该脚本中就可以定义什么。
	2. <%! 代码 %>:定义的java代码,在jsp转换后的java类的成员位置。
	3. <%= 代码 %>:定义的java代码,会输出到页面上。输出语句中可以定义什么,该脚本中就可以定义什么。

1.4 指令和注释

指令:

* 作用:用于配置JSP页面,导入资源文件
* 格式:
    <%@ 指令名称 属性名1=属性值1 属性名2=属性值2 ... %>
* 指令名称分类如下:
    1. page:配置JSP页面的
        * contentType:等同于response.setContentType()
            1. 设置响应体的mime类型以及字符集
            2. 设置当前jsp页面的编码(只能是高级的IDE才能生效,如果使用低级工具,则需要设置pageEncoding属性设置当前页面的字符集)
        * import:导包
        * errorPage:当前页面发生异常后,会自动跳转到指定的错误页面
        * isErrorPage:标识当前也是是否是错误页面。
            * true:是,可以使用内置对象exception
            * false:否。默认值。不可以使用内置对象exception
    2. include:页面包含的。导入页面的资源文件
        * <%@include file="top.jsp"%>
    3. taglib:导入资源
        * <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
            * prefix:前缀,自定义的

注释:

1. html注释:
    <!-- -->:只能注释html代码片段
2. jsp注释:推荐使用
    <%-- --%>:可以注释所有

1.5 9大内置对象

	变量名					真实类型						作用
pageContext				PageContext					当前页面共享数据,可以获取其他八个内置对象
request					HttpServletRequest			一次请求访问的多个资源(转发)
session					HttpSession					一次会话的多个请求间
application				ServletContext				所有用户间共享数据
response				HttpServletResponse			响应对象
page					Object						当前页面(Servlet)的对象  this
out						JspWriter					输出对象,数据输出到页面上
config					ServletConfig				Servlet的配置对象
exception				Throwable					异常对象

2 EL表达式

2.1 什么是EL表达式?

MVC模式设计程序,JSP只是视图,视图的任务就是显示响应,而不是在JSP中做任何关于程序控制和业务逻辑的事情。所以,在JSP页面中应该尽可能少的、或者是完全不出现Java代码。EL表达式的出现就是尽量减少JSP页面中的Java代码,使得JSP页面的处理程序编写起来更加简洁,便于开发和维护。

2.2 语法

${表达式}

JSP默认支持EL表达式的。如果要忽略EL表达式,有如下两种设置方法:

  • 设置JSPPage指令中:isELIgnored="true" 忽略当前JSP页面中所有的EL表达式
  • \${表达式} :忽略当前这个EL表达式

2.3 EL表达式的使用

1. 运算:
    * 运算符:
        1. 算数运算符: + - * /(div) %(mod)
        2. 比较运算符: > < >= <= == !=
        3. 逻辑运算符: &&(and) ||(or) !(not)
        4. 空运算符: empty
            * 功能:用于判断字符串、集合、数组对象是否为null或者长度是否为0
            * ${empty list}:判断字符串、集合、数组对象是否为null或者长度为0
            * ${not empty str}:表示判断字符串、集合、数组对象是否不为null 并且 长度>0
2. 获取值
    1. el表达式只能从域对象中获取值
    2. 语法:
        1. ${域名称.键名}:从指定域中获取指定键的值
            * 域名称:
                1. pageScope		--> pageContext
                2. requestScope 	--> request
                3. sessionScope 	--> session
                4. applicationScope --> application(ServletContext* 举例:在request域中存储了name=张三
            * 获取:${requestScope.name}

        2. ${键名}:表示依次从最小的域中查找是否有该键对应的值,直到找到为止。
        3. 获取对象、List集合、Map集合的值
            1. 对象:${域名称.键名.属性名}
                * 本质上会去调用对象的getter方法

            2. List集合:${域名称.键名[索引]}

            3. Map集合:
                * ${域名称.键名.key名称}
                * ${域名称.键名["key名称"]}
3. 隐式对象:
    * el表达式中有11个隐式对象
    * pageContext:获取jsp其他八个内置对象
    	${pageContext.request.contextPath}:动态获取虚拟目录
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>$Title$</title>
</head>
<body>
<h3>测试运算符</h3>
${5 + 3}
${5 mod 3}
<h3>测试EL表达式从域对象中获取值</h3>
<%
    pageContext.setAttribute("A","A");
    request.setAttribute("B","B");
    session.setAttribute("C","C");
    application.setAttribute("D","D");
%>
${pageScope.A}
${requestScope.B}
${sessionScope.C}
${applicationScope.D}
${A}
${B}
${C}
${D}
<h3>测试EL表达式从ListMap中获取值</h3>
<%
    List<String> list = new ArrayList<>();
    list.add("AA");
    list.add("BB");
    list.add("CC");
    list.add("DD");
    request.setAttribute("list",list);

    Map<String,String> map = new HashMap<String,String>();
    map.put("AAA","AAA");
    map.put("BBB","BBB");
    map.put("CCC","CCC");
    map.put("DDD","DDD");
    request.setAttribute("map",map);
%>
${list.get(0)}
${list.get(1)}
${list.get(2)}
${list.get(3)}
${map.get("AAA")}
${map.get("BBB")}
${map.get("CCC")}
${map.get("DDD")}
<h3>测试EL表达式从pageContext获取其他8个内置对象</h3>
${pageContext.request.contextPath}
</body>
</html>

3 JSTL

3.1 什么是JSTL?

JSTLJava server pages standarded tag library,即JSP标准标签库)是由JCPJava community Proces)所制定的标准规范,它主要提供给Java Web开发人员一个标准通用的标签库.JSTL标识库的作用是减少JSP文件的Java代码,使Java代码与HTML代码分离,所以JSTL标识库符合MVC设计理念。MVC设计理念的优势是将动作控制、数据处理、结果显示三者分离。

3.2 JSTL标签库的引入和使用

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

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Date" %>
<%@ 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" %>
<html>
<head>
    <title>testJSTL</title>
</head>
<body>
<h3>测试if标签</h3>
<%
    request.setAttribute("name", "HPeng");
    List<Integer> list = new ArrayList();
    list.add(1);
    list.add(2);
    list.add(3);
    request.setAttribute("list", list);
%>
<c:if test="${pageContext.request.getAttribute('name') == 'HPeng'}">
    <h4>${pageContext.request.getAttribute('name')}</h4>
</c:if>
<c:if test="${pageContext.request.getAttribute('name') == 'HHu'}">
    <h4>${pageContext.request.getAttribute('name')}</h4>
</c:if>
<h3>测试choose标签</h3>
<c:choose>
    <c:when test="${pageContext.request.getAttribute('name')=='HPeng'}">
        <h4>Hello ${pageContext.request.getAttribute('name')}</h4>
    </c:when>
    <c:otherwise>
        <h4>Hello Other!</h4>
    </c:otherwise>
</c:choose>
<h3>测试foreach标签</h3>
<c:forEach items="${requestScope.list}" var="Number" varStatus="s">
    ${Number}
</c:forEach>
</body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是聪聪黄吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值