Web高级五 JSP & EL & JSTL

第一章 JSP

1.概述

1.1 JSP是什么

java Server Pages,中文Java服务器页面

本质 : 简化的Servlet设计,动态网页技术标准,技能书写Servlet代码又能书写HTML代码

1.2 在JSP中书写代码

需求 : 

  1. 在jsp页面上获取当前日期,并将其格式化成字符串"yyyy-MM-dd HH:mm:ss";

  2. 将这个字符串展示在浏览器上;

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--
1. 在jsp页面上获取当前日期,并将其格式化成字符串"yyyy-MM-dd HH:mm:ss";
2. 将这个字符串展示在浏览器上;
--%>
<%
    Date date = new Date();
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String format1 = format.format(date);
    System.out.println("format1"= + format1);
    response.getWriter().println(format1);
    LocalDateTime now = LocalDateTime.now();
    response.getWriter().println(now);
    LocalDate now1 = LocalDate.now();
    response.getWriter().println(now1);
    LocalTime now2 = LocalTime.now();
    response.getWriter().println(now2);
%>
</body>
</html>

2.JSP的运行原理

IntilliJ IDEA借助tomcat发布web项目的机制是动态发布(为每一个web项目创建一个单独的发布文件)。我们可以通过tomcat其中日志中的CATALINA_BASE路径找到我们当前这个JSP页面在tomcat中的位置 :

找到这个目录后,会看到以下3个文件夹:

打开tomcat目录:

打开demo01_jsp.java文件后,发现我们在JSP页面上写的代码都在_jspService方法中      

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("\r\n");
      out.write("\r\n");
      out.write("\r\n");
      out.write("\r\n");
      out.write("\r\n");
      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('\r');
      out.write('\n');
    Date date = new Date();
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String format1 = format.format(date);
    System.out.println("format1 = " + format1);
    response.getWriter().println(format1);
    LocalDateTime now = LocalDateTime.now();
    response.getWriter().println(now);
    LocalDate now1 = LocalDate.now();
    response.getWriter().println(now1);
    LocalTime now2 = LocalTime.now();
    response.getWriter().println(now2);
      out.write("\r\n");
      out.write("</body>\r\n");
      out.write("</html>\r\n");
  1. <% java代码 %>中书写的代码被直接解析成java代码

  2. html部分都被out.write(" ")方法以字符串的形式拼接,然后响应给浏览器

  3. 在这个java文件中有个_jspService,这个方法有两个参数request,response。由此可看出JSP本质上就是一个Servlet。

3.JSP中书写java代码的三种方式

在JSP页面的body标签中,可以直接书写html代码和JS代码。但是,如果在JSP页面中书写java代码。必须遵循固定的格式,才能够生效;

JSP页面中书写java代码有三种方式:1.脚本片段;2.脚本声明;3.脚本表达式

方式一 :脚本片段

脚本片段指的是一段java代码。书写格式:<% java 代码 %>

【示例】 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--
    response.getWriter().println()任意数据
    response.getWriter().write//只能输出字符  字符数组 字符串
--%>
<%
    response.getWriter().println("hello jsp");
    response.getWriter().write(65);
%>
</body>
</html>

方式二 : 脚本声明

脚本片段虽然可以嵌入java代码,但是如果,我们要给当前的jsp中定义一些成员方法或者成员变量,就行需要一个新的技术——脚本声明。

脚本声明的格式:<%! Java代码 %>

【示例】声明成员变量 

<%@ page contentType="text/html;charset=UTF‐8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%‐‐
成员变量 int num = 0;
 public void method(){}
‐‐%>
<%!
    int num = 10;
    public void method(){}
%>
</body>
</html>

方式三 : 脚本表达式

虽然脚本声明和脚本片段已经可以书写Java代码了,但是如果我们要使用java代码向页面输出一些内容,还是需要使用原来的response对象,比较繁琐,因此,我们需要一个更加简便的方式,可以代替response向页面输出内容——这个就是脚本表达式。

脚本表达式的格式:<%= 内容 %> 等价于:out.print(内容)

【示例】在页面输出信息

<%@ page contentType="text/html;charset=UTF‐8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    out.println("hello out");
    response.getWriter().println("response");
%>
<%="内容"%>
</body>
</html>

小结 :

  1. 脚本表达式 <%= str %> :在页面输出内容,在service方法中起作用;

  2. 脚本片段 <%  %> :在service方法中,原样输出的代码片段;

  3. 脚本声明 <%! String str = "内容" %> :定义成员变量;

write() 和 print()区别

  1. write() : 仅支持输出字符类型数据,字符,字符数组,字符串等

  2. print() : 可以将各种类型(包括Object)的数据通过默认编码转换成bytes字节形式,这些字节都通过write(int c)方法被输出。

response.getWriter().println();

response.getWriter().write('c');

out和response.getWriter的类不一样,一个是JspWriter,另一个是java.io.PrintWriter。

response.getWriter().println();和out.write(); 区别

  1. 执行原理不同:JspWriter相当于一个带缓存功能的printWriter,它不是直接将数据输出到页面,而是将数据刷新到response的缓冲区后再输出,response.getWriter直接输出数据(response.print()),所以(out.print)只能在其后输出。

  2. out为jsp的内置对象,刷新jsp页面,自动初始化获得out对象,所以使用out对象是需要刷新页面的,而response.getWriter()响应信息通过out对象输出到网页上,当响应结束时它自动被关闭,与jsp页面无关,无需刷新页面。

4.JSP页面常用对象

JSP页面中书写的代码最终都会翻译到_jspService()方法中, 这个方法中有两个入参:

HttpServletRequest对象 HttpServletResponse对象。

所以说,JSP的本质就是一个Servlet。我们可以直接在JSP页面上使用这两个对象。


第二章 EL表达式

1.EL概述

1.1 引入

脚本表达式在JSP页面上书写起来比较麻烦。而在页面上取值在开发中使用的又比较多,所以Sun公司为了简化在页面上的取值操作。

${表达式内容}

1.2 EL 简介

EL全称: Expression Language

作用:代替jsp中脚本表达式的功能,简化对java代码的操作,从【域对象】中取值。 EL表达式简化<%= %>方式取值

EL语法表达式的格式:${表达式内容}

2.EL取值

2.1 JSP的四大域对象

page域    request域    session域    application域

通常用EL表达式${表达式内容}从域对象取值

2.2 EL表达式从四大域中取值

2.3 EL表达式搜索数据

EL表达式取值的时候也可以不指定域,如果取值的时候不指定域对象。就会按照从page域--->request域--->session域--->servletContext域从小到大逐级根据name属性值查找。

2.4 EL表达式从cookie中取值

格式 : ${cookie.cookie名称.value}    取出单个cookie的值

3.EL运算符

EL表达式的运算符主要有以下几类:算术运算,关系运算,逻辑运算,三元运算,empty运算符。

3.1 算术运算

进行算术运算的符号,主要包括:加,减,乘,除

3.2  关系运算

关系运算符是判断两个数据的大小关系的,关系运算符有:==,!=,<,<=,>,>=

3.3 逻辑运算

逻辑运算符包括:&& ,||,!

3.4 三元运算

表达式1 ? 表达式2 : 表达式3

${n1>=n2?"正确":"错误!"}

3.5 empty运算

${empty 表达式};

 : not empty 可以用在EL表达式中,判断非空的情况

EL表达式小结

EL : Expression Language

EL语法 : ${表达式}

作用 : 简化脚本表达式的取值,简化<%= request.getAttribute("name") %> ===> ${name}

jsp的四大域对象
    page域    pageContext pageContext.setAttrubute() pageContext.getAttribute() JSP特有 作用范围:当前的JSP页面

    request域    request request.setAttribute() request.getAttribute() 作用范围:一次请求和响应之间

    session域    session session.setAttribute() session.getAttribute() 作用范围:会话期间(多次请求和响应)

    servletContext域    application application.setAttribute() application.getAttribute() 作用范围:整个项目;


jsp从四大域中取值(指定域对象)

    ${pageScope.name}

    ${requestScope.name}

    ${sessionScope.name}

    ${applicationScope.name}


JSP搜索域对象中的值:page --- request --- session --- servletContext

    ${name}

第三章 JSTL标签库

1.JSTL概述

1.1 JSTL引入

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>JSTL</title>
</head>
<body>
<%
    int[] arr = {123,456,789};
    for (int i : arr) {
        out.println("<h1>"+i+"</h1>");
    }
%>
</body>
</html>

1.2 JSTL是什么

标准标签库(The JavaServer Pages Standard Tag Library),简称JSTL

使用JSTL可以解决用户选用不同WEB厂商的自定义标签时的困惑,JSP规范同时也允许WEB容器厂商按JSTL标签库的标准提供自己的实现,以获取最佳性能

1.3 JSTL核心标签库

2.JSTL标签引用

2.1 安装JSTL

JSTL标签是将一段java代码功能封装成一个标签来使用。所以,我们使用JSTL标签之前必须导入被封装的java代码---jar包。JSTL标签库主要依赖以下两个jar包:

在IDEA的web项目的WEB-INF目录下创建一个lib文件夹,然后将jar包复制到这个文件夹里。选中这些jar包,右键---add as library即可将jar包导入到项目中。

2.2 将标签库资源引入JSP页面

在JSP页面中通过以下标签,通过taglib标签引入JSTL资源

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  1. prefix:是jstl标签在使用的时候的前缀;
  2. uri:是标签库的资源路径;

2.3 在JSP页面中使用JSTL标签

在JSP页面中书写"<c: ",如果出现如下图的提示则说明标签库引入成功,我们可以根据提示信息使用自己需要的标签。

3.常用JSTL标签

3.1 c:if标签

3.1.1 c:if标签的作用

<c:if test="条件判断" >标签的作用相当于java中的if判断语句

3.1.2 属性

test : if的判断条件

3.2 c:foreach标签

3.2.1 c:foreach标签的作用

<c:foreach>标签的作用相当于java中的for循环

3.2.2 c:foreach标签的属性


 

var:在不循环对象的时候,保存的是控制循环的变量;在循环对象的时候,保存的是被循环对象中的元素
items:指定要循环的对象
varStatus:保存了当前循环过程中的信息(循环的开始、结束、步长、次数等)
begin:设置循环的开始
end:设置循环的结束
step:设置步长——间隔几次循环,执行一次循环体中的内容

3.3 choose标签

3.3.1 choose标签作用

<c:choose>标签用于指定多个条件选择的组合边界,它必须与<c:when>和<c:otherwise>标签一起使用。

三个标 签组合发挥java代码if(){}else if(){} else{}语句的作用。

3.3.2 choose标签子标签

<c:when>,相当于else if(){}。

<c:when>标签含有test属性,作用与if相同<c:otherwise>,相当于else{}。

3.3.3 choose标签注意事项

三个标签必须组合使用,一组标签中不能出现两个<c:otherwise>

3.3.4 choose标签演示

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/switchServlet")
public class SwitchServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //实现switch功能
        int temp = 7;
        switch (temp){
            case 1:
                System.out.println("T1");
                break;
            case 2:
                System.out.println("T2");
                break;
            case 3:
                System.out.println("T3");
                break;
            case 4:
                System.out.println("T4");
                break;
            case 5:
                System.out.println("T5");
                break;
             default:
                 System.out.println("你输入错误!");
        }
        //转发到servlet
        request.setAttribute("temp",temp);
        //转发到choose.jsp
        request.getRequestDispatcher("/choose.jsp").forward(request,response);
    }
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<c:choose>
    <c:when test="${temp == 1}">
        <c:out value="T1"></c:out>
    </c:when>
    <c:when test="${temp == 2}">
        <c:out value="T2"></c:out>
    </c:when>
    <c:when test="${temp == 3}">
        <c:out value="T3"></c:out>
    </c:when>
    <c:when test="${temp == 4}">
        <c:out value="T4"></c:out>
    </c:when>
    <c:when test="${temp == 5}">
        <c:out value="T5"></c:out>
    </c:when>
    <c:otherwise>
        <c:out value="输入有误"></c:out>
    </c:otherwise>
</c:choose>
</body>
</html>

访问对应的URL

效果 :

猜你喜欢

转载自blog.csdn.net/wenzhengzheng/article/details/83218299