JSP丶EL丶JSTL

版权声明:如需转载或引用请声明原文网址 https://blog.csdn.net/u013087359/article/details/81973843

1. JSP

1. 1 本质

  • JSP会被应用服务器解析(以Tomcat为例)为Servlet
  • Tomcat安装路径的work目录下可以查看解析后的Servelt源码
/*
 * Generated by the Jasper component of Apache Tomcat
 * Version: Apache Tomcat/7.0.52
 * Generated at: 2018-08-22 21:41:16 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 {


        int num2=2;
        private void method(){
            //成员方法不可以调用其他成员方法内部定义的变量,包括JSP的serice()内置的9大变量          
            //out.write(num1);  //报错
        }       

  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 javax.el.ExpressionFactory _el_expressionfactory;
  private org.apache.tomcat.InstanceManager _jsp_instancemanager;

  public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
    return _jspx_dependants;
  }

  public void _jspInit() {
    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
    _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
  }

  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("<!DOCTYPE html>\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("<meta charset=\"UTF-8\">\r\n");
      out.write("<title>Insert title here</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");
      out.write("\t\r\n");
      out.write("\t");
      out.write('\r');
      out.write('\n');
      out.write('   ');

        int num1=1; 

        //service()方法内部可以调用成员方法和变量
        out.print(num2);
        method();

      out.write("\r\n");
      out.write("\t\r\n");
      out.write("\t");
      out.write('\r');
      out.write('\n');
      out.write('   ');
      out.write('\r');
      out.write('\n');
      out.write('   ');
      out.print(num1 );
      out.write("\r\n");
      out.write("\t\r\n");
      out.write("\t");
      out.write('\r');
      out.write('\n');
      out.write('   ');
      out.write("\r\n");
      out.write("</body>\r\n");
      out.write("</html>");
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try { 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);
    }
  }
}

1.2 JSP脚本

  • 解析后的源码请看上面
    <%-- 以下内容会被解析到service()方法内 --%>
    <% 
        int num1=1; 

        //service()方法内部可以调用成员方法和变量
        out.print(num2);
        method();
    %>

    <%-- 输出内容到页面上,等同out.print(num1) --%>
    <%-- 以下内容会被解析到service()方法内 --%>
    <%=num1 %>

    <%-- 以下代码会被解析为成员变量和成员方法 --%>
    <%!
        int num2=2;
        private void method(){
            //成员方法不可以调用其他成员方法内部定义的变量,包括JSP的serice()内置的9大变量          
            //out.write(num1);  //报错
        }       
    %>

1.3 JSP指令

  • <%@page %>
<%-- 导入包 --%>
<%@page import="java.util.List"%>

<%-- isErrorPage表示当前jsp是否错误页面,默认为false,--%>
<%-- errorPage表示当前页面发生错误时跳转的页面--%>
<%@page isErrorPage="false" errorPage="error.jsp"%>

<%-- 新建jsp默认选项--%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
  • <%@include file="被包含的页面路径" %>
    <%-- 包含其他页面 --%>
    <%-- 当前页面和被包含的页面会被解析到同一个Servlet中 --%>
    <%@include file="/include2.jsp" %>
    <%@include file="/include3.html" %>
  • <%@ taglib uri="标签库地址" prefix="前缀"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c"%>

1.4 JSP内置对象

对象名称 类型 描述
out javax.servlet.jsp.JspWriter 用于页面输出
request javax.servlet.http.HttpServletRequest 得到用户请求信息
response javax.servlet.http.HttpServletResponse 服务器向客户端的回应信息
config javax.servlet.ServletConfig 服务器配置,可以取得初始化参数
session javax.servlet.http.HttpSession 用来保存用户的信息
application javax.servlet.ServletContext 所有用户的共享信息
page java.lang.Object 指当前页面转换后的Servlet类的实例
pageContext javax.servlet.jsp.PageContext JSP的页面容器,可以获取其他八个内置对象
exception java.lang.Throwable 表示JSP页面所发生的异常,在错误页中才起作用

1.5 pageContext域对象

    //在pageContext域对象中存储数据,作用域是当前页面
    pageContext.setAttribute("name", "zhangsan");

    //在request域对象中存储数据,作用域是单次请求
    pageContext.setAttribute("name", "lisi",PageContext.REQUEST_SCOPE);
    //作用跟上一句代码一样
    request.setAttribute("name","lisi");

    //在session域对象中存储数据,作用域是有效会话
    pageContext.setAttribute("name", "wangwu",PageContext.SESSION_SCOPE);
    //作用跟上一句代码一样
    session.setAttribute("name", "wangwu");

    //在application域对象中存储数据,作用域是整个web应用
    pageContext.setAttribute("name", "zhaoliu",PageContext.APPLICATION_SCOPE);
    //作用跟上一句代码一样
    application.setAttribute("name", "zhaoliu");
    //作用跟上一句代码一样
    this.getServletContext().setAttribute("name", "zhaoliu");

    //从小作用域到大作用域中逐一查找数据,查找成功则返回
    String name=(String)pageContext.findAttribute("name");
    //页面输出zhangsan
    out.write(name);

2. EL表达式

2.1 从作用域中获取各种类型数据

    <%
        int num=1;
        Student student1=new Student("zhangsan",23);

        Student student2=new Student("lisi",24);
        List<Student> list=new ArrayList<Student>();
        list.add(student1);
        list.add(student2);

        Map<String,Student> map=new HashMap<String,Student>();
        map.put("zhangsan",student1);

        pageContext.setAttribute("num", num);
        request.setAttribute("student", student1);
        session.setAttribute("list", list);
        application.setAttribute("map", map);
    %>

    <%-- ${}作用是把表达式结果输出到页面上 --%>

    <%-- 从pageScope域中获取普通变量 --%>
    ${pageScope.num}
    <%-- 从request域中获取JavaBean的属性值 --%>
    ${requestScope.student.name}
    <%-- 从session域中获取集合项 --%>
    ${sessionScope.list[1].age}
    <%-- 从application域中获取Map中的JavaBean --%>
    ${applicationScope.map["zhangsan"].name}
    ${applicationScope.map.zhangsan.name}
    <%-- 没有指定作用域,则从小到大作用域查找,查找则返回 --%>
    ${num}

2.2 EL表达式内置对象

    <%-- 特殊字符不能用点号.只能用双引号[]括住 --%>

    <%-- 获取请求参数的单个值 --%>
    ${param.username}
    <%-- 获取请求参数的多个值 --%>
    ${paramValues.hobby[0]}
    <%-- 获取请求头的单个值 --%>
    ${header.Host}
    <%-- 获取请求头的多个值 --%>
    ${headerValues["User-Agent"][0]}
    <%-- 获取web.xml的context-param的全局变量 --%>
    ${initParam.globalParam}
    <%-- 获取指定名字的cookie;value是固定语法,表示获取该cookie的值 --%>
    ${cookie.lastLoginDate.value }
    <%-- pageContext对象可以获取其他八大jsp内置对象 --%>
    ${pageContext.request.contextPath}

3. JSTL标签库

3.1 导入JSTL标签库jar包

  Eclipse需要导入jstl标签库jar包才能使用,MyEclipse自带jar包

3.2 JSP页面引入JSTL标签库

  <%-- 在jsp页面引入jstl核心标签库,uri是标签库路径,prefix是别名 --%>
  <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

3.3 JSTL核心库的使用

    <!-- 把值为1的变量num存放进request域中 -->
    <c:set var="num"  value="1" scope="request"></c:set>

    <%-- jstl一般与el表达式一起使用 --%>  

    <%-- if条件表达式,test表示布尔值的el表达式值 --%>
    <c:if test="${num==1 }">
        <span style="color:green">正确</span>
    </c:if>
    <c:if test="${num!=1 }">
        <span style="color:red">错误</span>
    </c:if>

    <%--  带else的条件表达式 --%>
    <c:choose>
        <c:when test="${num==1}">
            <span style="color:green">正确</span>
        </c:when>
        <c:otherwise>
            <span style="color:red">错误</span>
        </c:otherwise>
    </c:choose>

    <%--  var变量别名,begin起始下标(包含),end结束下标(包含),step增长步长 --%>
    <c:forEach var="i" begin="0" end="10" step="1">
        ${i}
    </c:forEach>

    <%
        List<String> list=new ArrayList<String>();
        list.add("zhangsan");
        list.add("lisi");
        list.add("wangwu");
        pageContext.setAttribute("list", list);
    %>
    <%-- items遍历的集合,varStatus遍历的信息,s.index表示当前遍历的序号,从0开始 --%>
    <c:forEach var="name" items="${list}" varStatus="s">
        <span style='color:${s.index%2==0?"green":"red"}'>${name}</span>
    </c:forEach>


    <%
        Map<String,Integer> map=new HashMap<String,Integer>();
        map.put("zhangsan", 23);
        map.put("lisi",24);
        map.put("wangwu",25);
        pageContext.setAttribute("map", map);
    %>

    <%-- 遍历Map集合,m.key表示获取键,m.value表示获取值 --%>
    <c:forEach var="m" items="${map }">
        ${m.key} ${m.value }<br/>
    </c:forEach>

猜你喜欢

转载自blog.csdn.net/u013087359/article/details/81973843
今日推荐