unit08-JSP、EL、JSTL

JSP概述

什么是JSP

JSP和Servlet都是由SUN公司提供的动态Web资源开发技术。

JSP看起来像一个HTML,但和HTML不同的是,JSP中可以书写Java代码,可以通过Java代码展示动态的数据。

静态Web资源:任何人在任何条件下访问时,看到的都是相同的效果,这样的资源叫做静态Web资源。(html、css、js等)
动态Web资源:不同的人,在不同的条件下访问时,看到的都是不同的效果,这样的资源叫做动态Web资源。(Servlet、jsp、php、.NET等)

JSP本质上是一个Servlet程序

思考1:为什么要学习JSP?

  • Servlet是一段Java程序,适合处理业务逻辑,但是Servlet不适合向浏览器输出一个html网页。

  • html可以作为页面返回,但是html是一个静态Web资源,无法展示动态数据。

  • 而JSP也是页面的开发技术,也可以作为页面返回,并且JSP中可以书写Java代码,可以通过Java代码展示动态的数据。

  • 因此,JSP的出现即解决了Servlet不适合输出页面的问题,也解决了HTML无法展示动态数据的问题!

思考2:为什么说JSP本质是一个Servlet?

在JSP第一次被访问时,会翻译成一个Servlet程序。访问JSP后看到的html网页,其实是翻译后的Servlet执行的结果。(也就是说,访问JSP后看到的网页,是JSP翻译后的Servlet输出到浏览器的。)

JSP执行过程

访问服务器中的JSP文件,其执行过程为:

  1. 当浏览器请求服务器中的某一个JSP文件(例如:localhost/09-jsp/test.jsp),服务器会根据请求资源的路径去寻找该文件:

  2. 如果找到了,JSP翻译引擎会将JSP翻译成一个Servlet程序(JSP----> xxx.java----> xxx.class),然后Servlet程序再执行,执行的结果是向浏览器输出一个HTML网页!

  3. 如果没有找到,服务器将会响应一个404页面,通知浏览器请求的资源不存在。

访问服务器中的HTML文件,其执行过程为:

  1. 当浏览器请求服务器中的某一个HTML文件时(例如:localhost/09-jsp/test.html),服务器会根据请求资源的路径去寻找该文件:

  2. 如果找到了,服务器会将html文件的内容作为响应实体发送给浏览器,浏览器再解析html并显示在网页上。

  3. 如果没有找到,服务器将会响应一个404页面,通知浏览器请求的资源不存在。

  4. 修改JSP模版

    修改JSP模版步骤: 点击菜单栏中的 window --> Preferences,出现如下窗口:

  5. 点击edit编辑JSP模版,修改为如下:
  6. <%@ page language="java" pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8"/>
    <title></title>
    </head>
    <body>
    ${cursor}
    </body>
    </html>
  7. JSP语法

    模版元素

    模板元素是指写在JSP中的html内容

    或者除了JSP特有内容以外的其他内容称之为模板元素

    模板元素在翻译后的Servlet中,被out.write原封不动的发送给浏览器,由浏览器负责解析并显示。

  8. JSP表达式

    格式:<%= 常量、变量、表达式 %>

    作用:计算表达式的结果,将结果输出到浏览器中,由浏览器负责解析并显示。

    <%= "Hello JSP..." %>
    <% String name = "林青霞"; %>
    <%= name %>
    <%= 100+123 %>
    <%= Math.random() %>
  9. JSP脚本片段

    格式:<% 若干Java语句 %>

    作用:在翻译后的Servlet中,将脚本片段中的Java语句复制粘贴到Servlet的对应的位置执行。例如:

    在JSP中代码如下:

    <!-- 在页面上输出5行"hello JSP" -->
    <%
        for(int i=0; i<5; i++){
            out.write("Hello JSP...<br/>");
        }
    %>
  10. 在翻译后的Servlet中代码如下:
  11. ...
    for(int i=0; i<5; i++){
        out.write("Hello JSP...<br/>");
    }
    ...
  12. 另外,在某一个脚本片段中的Java代码可以是不完整的,但是在JSP中所有的脚本片段加在一起,必须是完整符合Java语法。例如,在JSP中代码如下:
  13. <% for(int i=0;i<5;i++){ %>
            Hello JSP~~~<br/>
    <% } %>
  14. 在翻译后的Servlet中:
  15. for(int i=0;i<5;i++){ 
      out.write("\r\n");
      out.write("\t\t\tHello JSP~~~<br/>\r\n");
      out.write("\t");
  16. JSP注释

    格式:<%-- JSP注释内容 --%>

    作用:(1)为代码添加解释说明 (2)将一些暂时不需要执行的代码注释掉。

    在JSP翻译时,注释内容不会参与翻译,而是直接被丢弃

     

    面试题:考察JSP中的JSP注释、Java注释、html注释

    <%-- 
    <% out.write( "aaaaa<br/>" ); %>
     --%>
    <% //out.write( "bbbbb<br/>" ); %>
    <!-- 
    <% out.write( "ccccc<br/>" ); %>
     -->
  17. 问题:(1)上面输出的三行内容,在访问时,会显示哪一行内容?

    第一行被JSP注释给注释了,JSP注释的内容不会参与翻译,也不会执行,更不会发送给浏览器,也不会在浏览器上显示。

    第二行被Java注释给注释了,放在脚本片段中的内容会参与翻译,会将其中的Java代码复制到翻译后的Servlet中,但由于代码被注释了,所以不会执行,也不会发送给浏览器,更不会在浏览器上显示。

    第三行被html注释给注释了,html注释在JSP中是模板元素,注释本身会发送给浏览器,注释中的脚本片段会参与翻译,其中的java代码也会执行,也会将内容(ccccc)发送给浏览器,但由于发送到浏览器后的ccccc被html注释包裹,因此也不会显示在浏览器上。

    (2)上面输出的三行内容,哪一行会发送到浏览器中?(不管是否显示)

    其中第三行内容会发送到浏览器中,但不会显示,因为前后有html注释。

    JSP指令

    指令的格式:<%@ 指令名称 若干属性声明... %>

    指令的作用:用于指挥JSP解析引擎如何将一个JSP翻译成一个Servlet程序。

    1、page指令:用于声明JSP的基本属性信息(比如JSP使用的编码,JSP使用的开发语言等)

    <%@ page language="java"%>
    -- language属性用于指定当前JSP使用的开发语言,目前只有java语言支持

    <%@ page import="java.util.Date"%>
    -- import属性用于导入包,如果不导入包,在使用其他包下的类时,就需要在类名前面加上包路径,例如: java.util.Date date = new java.util.Date();

    <%@ page pageEncoding="UTF-8"%>
    -- pageEncoding属性是用于指定当前JSP使用的编码,Eclipse工具会根据这个编码保存JSP文件。
    保证pageEncoding属性指定的编码和JSP文件保存时使用的编码相同,可以避免JSP文件出现乱码!

  18. 2、taglib指令:用于引入JSTL标签库或者其他的自定义标签库

    后面讲解JSTL标签库时会讲解!

    JSP标签技术

    在JSP页面中写入大量的java代码会导致JSP页面中html代码和java代码混杂在一起,会造成jsp页面结构的混乱,导致后期难于维护,并且代码难以复用。

    于是在JSP的2.0版本中,sun提出了JSP标签技术,推荐使用标签来代替JSP页面中java代码,并且推荐,JSP2.0以后不要在JSP页面中出现任何一行java代码。

  19. EL表达式

    格式:${ 常量/表达式/变量 } (放在EL中的变量得先存入域中,才可以获取变量的值)

    作用:(1)计算放在其中的表达式的结果,将结果输出在当前位置。

    (2)主要作用:用于从域对象中获取数据,将获取到的数据输出在当前位置。

    域对象:pageContext、request、session、application

    1、获取常量、表达式、变量的值(变量得先存入域中)

  20.  

    ${ "hello el" } 
    hello el    <br/>
    ${ 100+123 }
    ${ 12*12 > 143 ? "yes" : "no" } <br/>

    <% 
        String name = "马云";
        request.setAttribute( "name123" , name );
    %>
    ${ name123 }
    <%= request.getAttribute("name123") %>
    <%-- 在EL表达式中书写变量,底层会根据变量名到四个作用域中寻找该名称的属性值
        如果找到对应的属性值, 就直接返回, 输出到当前位置; 如果找不到就接着寻找
        直到找完四个作用域, 最后还找不到就什么都不输出!
        到四个作用域中寻找的顺序为: pageContext->request->session->application
     --%>

  21.  

    2、获取作用域中数组或集合中的元素

    Servlet中的代码:

    //声明一个数组, 为数组添加元素, 并将数组存入到域中
    String[] names = {"刘德华", "郭富城", "张学友", "黎明" };
    request.setAttribute( "names", names );
    //将请求转发到jsp, 在JSP中获取域中的数组中的元素
    request.getRequestDispatcher( "/02-el.jsp" ).forward(request, response);
  22.  

    JSP中的代码:
  23.  

    <%-- 获取从Servlet转发带过来的域中的数组中的元素 --%>
    ${ names[0] } <%-- 刘德华 --%>
    ${ names[1] } <%-- 郭富城  --%>
    ${ names[2] } <%-- 张学友 --%>
    ${ names[3] } <%-- 黎明 --%>

  24.  

     

    3、获取作用域中map集合中的元素

    Servlet中的代码:

    //声明一个map集合,为集合添加元素, 并将map集合存入到域中
    Map map = new HashMap();
    map.put( "name" , "尼古拉斯赵四" );
    map.put( "age" ,  28 );
    map.put( "addr", "中国" );
    request.setAttribute( "map1", map );
    //将请求转发到jsp, 在JSP中获取域中的数组中的元素
    request.getRequestDispatcher( "/02-el.jsp" ).forward(request, response);
  25.  

     

    JSP中的代码:
  26.  

     

     

    ${ map1.name } <%-- 尼古拉斯赵四 --%>
    ${ map1.age } <%-- 28 --%>
    ${ map1.addr } <%-- 中国 --%>

    4、获取作用域中JavaBean对象的属性值

  27.  

     

     

     

     

    Bean:指可重用的组件
    JavaBean:指Java中可重用的组件
    业务Bean:专门用于处理业务逻辑(例如:处理注册请求时,在将用户的注册信息保存到数据库之前,需要对注册薪资进行校验)
    实体Bean:是专门用于封装数据的(例如:User user = new User() ...)

    Servlet中的代码:

  28. //声明一个User对象, 为对象的属性赋值, 并将User对象存入到域中
    User u1 = new User();
    u1.setName( "刘德华" );
    u1.setAge( 18 );
    u1.setAddr( "中国香港" );
    request.setAttribute( "user" , u1 );

    //将请求转发到jsp, 在JSP中获取域中的数组中的元素
    request.getRequestDispatcher( "/02-el.jsp" ).forward(request, response);

  29.  

    JSP中的代码:

    <%-- 
    ${ user.getName() }
    ${ user.getAge() }
    ${ user.getAddr() } --%>
    <hr/>
    <%-- user.name 底层调用的仍然是 getName()方法--%>
    ${ user.name }
    <%-- user.age 底层调用的仍然是 getAge()方法--%>
    ${ user.age }
    <%-- user.addr 底层调用的仍然是 getAddr()方法--%>
    ${ user.addr }

     

    JSTL标签库

    JSTL标签库是为JavaWeb开发人员提供的一套标准通用的标签库;

    JSTL标签库和EL配合使用可以取代JSP中大部分的Java代码;

    在使用JSTL标签库之前需要完成:

  30. 导入JSTL的开发包

  31.  

     

     

    在使用JSTL标签库的JSP中引入JSTL(taglib指令)
  32.  

     

     

     

     

    其中常用的标签如下:

    1、<c:set></c:set> -- 用于往域中添加属性,或者修改域中已有的属性值

    c:set 标签属性总结:

    (1)var -- 指定存入作用域中的属性名称
    (2)value -- 指定存入作用域中属性的值
    (3)scope -- 指定将属性存入哪一个作用域中,默认值是page,表示pageContext域
    可取值: a)page表示pageContext域 b)request表示request域
        c)session表示session域 d)application表示ServletContext域
  33.  

     

    代码示例:
  34.  

     

     

     

    <%-- request.setAttribute("name", "张三"); --%>
    <c:set var="name" value="张三" scope="request"/>
    ${ name }

    <% String job = "java开发工程师"; %>
    <c:set var="job" value="<%= job %>" scope="request"/>
    ${ job }

    <c:set var="name" value="张三丰" scope="request"/>
    ${ name }

    2、<c:if></c:if> -- 构造简单的 if…else…结构语句

    c:if 标签属性总结:

    test属性 -- 指定一个布尔表达式,当表达式的结果为true时,将会执行(输出)c:if标签中的内容,如果表达式结果为false,将不会输出c:if标签中的内容

    代码示例:往域中存入一个成绩, 根据成绩判断成绩所属的等级

  35.  

     

     

     

     

    <c:if test="${ 3>5 }">yes</c:if>
    <c:if test="${ 3<=5 }">no</c:if>
    <hr>
    <!-- 根据成绩判断成绩所属的等级 -->
    <c:set var="score" value="-35"/>
    <c:if test="${ score>=80 and score<=100 }">您的成绩属于: 优秀!</c:if>
    <c:if test="${ score>=60 and score<80 }">您的成绩属于: 中等!</c:if>
    <c:if test="${ score>=0 and score<60 }">您的成绩属于: 不及格!</c:if>
    <c:if test="${ score<0 or score>100 }">您的成绩有误!</c:if>

    3、<c:forEach></c:forEach> -- 对集合或数组等中元素进行循环遍历或者是执行指定次数的循环.

    (1) 遍历域中数组或集合中的元素

    (2) 遍历域中map集合中的元素

    (3) 遍历0~100之间的整数,将是3的倍数的数值输出到浏览器中

    ​c:forEach 标签属性总结: 
  36. (1)items: 指定需要遍历的集合或数组
    (2)var: 指定用于接收遍历过程中的每一个元素
    (3)begin: 指定循环从哪儿开始
    (4)end: 指定循环到哪儿结束
    (5)step: 指定循环时的步长, 默认值是1
    (6)varStatus: 用于表示循环遍历状态信息的对象, 这个对象上有如下属性:
        first属性: 表示当前遍历是否是第一次, 若是, 则返回true;
        last属性: 表示当前遍历是否是最后一次, 若是, 则返回true;
        count属性: 记录当前遍历是第几次

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <!-- jsp的表达式符号,其中可以写java代码,可以将结果输出 -->
    <%=Math.random() %>
    <!--  从request对象的map集合中取数据-->
    <%=request.getAttribute("name") %>
    
    
    
</body>
</html>

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  version="3.1">
      

</web-app>
 

package com.tedu;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestParam extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        //响应内容给浏览器(暂时不要输出中文数据)alt+shift+L
        //处理响应正文乱码
        response.setContentType("text/html;charset=utf-8");
        //获取输出流,向浏览器响应数据
        PrintWriter out = response.getWriter();
        
        /**
         * 获取请求中的参数:
         * 1.需要保证浏览器发请求访问当前Servlet时,请求中特有参数
         * 2.request.getParameter(String paramName)
         * 根据请求参数的名字(username)获取对应的参数值(张飞)
         * 3.request.getParamValues(String paramName)
         * 根据请求参数的名字获取的所有参数值组成的数组
         */
        //获取请求中的username和age
        String username=request.getParameter("username");
        System.out.println(username);
        String age=request.getParameter("age");
        System.out.println(age);
        String[] like=request.getParameterValues("age");
        System.out.println(Arrays.toString(like));
        
        out.write("测试request获取请求参数.....");

    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}
 

package com.tedu;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestParam02 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        //响应内容给浏览器(暂时不要输出中文数据)alt+shift+L
        //处理响应正文乱码
        response.setContentType("text/html;charset=utf-8");
        //获取输出流,向浏览器响应数据
        PrintWriter out = response.getWriter();
        
        //处理POST提交中文参数时的乱码问题
        request.setCharacterEncoding("utf-8");
        
        
        /**
         * 获取请求中的user和like
         * alt+shift+L--抽取本地变量
         */
        String user = request.getParameter("user");
        System.out.println(user);
        String[] like = request.getParameterValues("like");
        System.out.println(Arrays.toString(like));
        
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}
 

 

package com.tedu;

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

/**
 * author: bjzhangsz@tedu.cn
 * datetime: 2021年2月23日 下午11:42:53
 */
public class TestScope extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        
        //====================================
                System.out.println("TestScope.doGet方法执行了....");
                //往request对象的map集合中存入数据
                request.setAttribute("name", "刘德华");
                
                
                /**
                 * 将请求转发给index.jsp(转发时会将request对象中的map集合中的数据也带过去)
                 * localhost:8080/day08-reqres/TestScope
                 * localhost:8080/day08-reqres/index.jsp
                 * http://localhost/day08-reqres/index.jsp
                 */
                request.getRequestDispatcher("index.jsp").forward(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

 

package com.tedu;

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

/**
 * author: bjzhangsz@tedu.cn
 * datetime: 2021年2月23日 下午11:54:59
 */
public class TestWriter extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.write("你好");//utf-8
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

 

package com.tedu.forward;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        //响应内容给浏览器(暂时不要输出中文数据)alt+shift+L
        //处理响应正文乱码
        response.setContentType("text/html;charset=utf-8");
        //获取输出流,向浏览器响应数据
        PrintWriter out = response.getWriter();
        //==================================================
        System.out.println("AServlet.doGet方法执行了.....");
        
        /**
         * 从当前Servlet将请求转发到BServlet
         * http://localhost:8080/day08-reqres/AServlet
         * http://localhost:8080/day08-reqres/BServlet
         */
        request.getRequestDispatcher("BServlet").forward(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}
 

 

package com.tedu.forward;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class BServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        //响应内容给浏览器(暂时不要输出中文数据)alt+shift+L
        //处理响应正文乱码
        response.setContentType("text/html;charset=utf-8");
        //获取输出流,向浏览器响应数据
        PrintWriter out = response.getWriter();
        //==================================================
        System.out.println("BServlet.doGet方法执行了.....");
        //由BServlet给出回应
        out.write("Hello BServlet...."+new Date());
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}
 

package com.tedu.redirect;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        //响应内容给浏览器(暂时不要输出中文数据)alt+shift+L
        //处理响应正文乱码
        response.setContentType("text/html;charset=utf-8");
        //获取输出流,向浏览器响应数据
        PrintWriter out = response.getWriter();
        //==================================
        System.out.println("CServlet.doGet方法执行了....");
    
        /**
         * 1.从当前Servlet重定向到DServlet-reqres/CServlet
         * http://localhost:8080/day08-reqres/CServlet
         * http://localhost:8080/day08-reqres/DServlet
         */
        //response.sendRedirect("DServlet");
        response.sendRedirect("http://localhost:8080/day08-reqres/DServlet");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}
 

package com.tedu.redirect;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        //响应内容给浏览器(暂时不要输出中文数据)alt+shift+L
        //处理响应正文乱码
        response.setContentType("text/html;charset=utf-8");
        //获取输出流,向浏览器响应数据
        PrintWriter out = response.getWriter();
        //======================================
        System.out.println("DServlet.doGet方法执行了....");
        //向浏览器做出响应
        out.write("Hello DServlet..."+new Date());
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}
 

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>day14-jsp</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>

 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>jsp的语法</title>
</head>
<body>
    <h3>1.JSP的表达式:其中可以写常量/变量/表达式</h3>
    <%="Hello JSP" %>
    Hello JSP<br/>
    <%=12*34>400 ? "yes" : "no" %>
      <%=12*34 %>
    
     <%--  在eclipse中编辑JSP文件,经常会出现报错(有语法错误)
    判断是否报错的方法:将报错的整行代码选中--剪切--保存文件,
    再将剪切的代码粘贴回原位置,再保存
    --%>
    <% String name="马云"; %>
    <%=name %>
    
    <h3>JSP的脚本片段</h3>
    <%--  out是JSP的九大隐式对象之一
    相当于response.getWriter()
    page/request/response/config/application/exception/
    pageCountext/out/session
    --%>
    <% 
        for(int i=0;i<5;i++){
            out.write("Hello JSP<br/>");
        }
    %>
</body>
</html>

 

<%@page import="com.tedu.pojo.User"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.HashMap"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL表达式</title>
</head>
<body>
    <h1>1、获取常量、表达式、变量的值(变量得先存入域中)</h1>
    ${"Hello EL" }
    ${123+321 }
    ${Math.random() }
    <hr/>
    <%
        String name="韩少云";
    //往request域中添加属性,属性名是字符串,属性值可以是任意类型
        request.setAttribute("name123", "孙尚香");
        
    %>
    jsp表达式:<%=name %>
    <hr/>
    EL表达式:${name123 }
    <%--
    在EL表达式中书写变量,并不会直接获取这个变量的值,而是根据变量的
    名字(例如:name),到四大作用域中寻找该名称对应的属性值,并且寻找
    的顺序是按照域的范围大小,按照从小到大的顺序去寻找,如果找到了就
    直接输出该属性对应的值(即使后面还有,也不会再找了);如果找不到,就
    什么也不输出!
    域的范围从小到大的顺序是:
    pageCountext<request<session<application
     --%>
    
    <h1>2、获取作用域中数组或集合中的元素</h1>
    <%
        //声明一个数组,并设置初始值,再将数组存入到域中
        String[] nameArr={"刘沛霞","齐雷","刘昱江","张久军","陈子枢"};
        request.setAttribute("names", nameArr);
    %>
    ${names[0] }
    ${names[1] }
    ${names[2] }
    ${names[3] }
    ${names[4] }
    <%--
    如果将上面的数组换成集合存入域中,通过EL获取域中的集合中的元素,格式不变!
     --%>
    
    
    <h1>3、获取作用域中map集合中的元素</h1>
    <%
        //声明一个map集合,并往map中添加元素,再将map集合存入域中
        Map<String,Object> map=new HashMap<String,Object>();
        map.put("name", "尼古斯.赵四");
        map.put("age", 35);
        map.put("addr", "中国");
        request.setAttribute("map", map);
    %>
    ${map.name }
    ${map.age }
    ${map.addr }
    
    
    <h1>4、获取作用域中JavaBean对象的属性值</h1>
    <%
        //声明一个user对象,并给对象的属性赋值,再将user对象存入域中
        User u1=new User();
        u1.setName("郭富城");
        u1.setAge("18");
        u1.setAddr("中国香港");
        request.setAttribute("user", u1);
    %>
    <%-- ${user.getName() }
    ${user.getAge() }
    ${user.getAddr() } --%>
    
    <%--下面的写法是上面的简写形式,调用的仍然是对应的getXxxx方法 --%>
    ${user.name }
    ${user.age }
    ${user.addr }
    
    
    
    
    
    
    
    
    
    
    
    
    
</body>
</html>

 

 

<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <!--  引入JSTL标签库中核心标签库-->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSTL标签库</title>
</head>
<body>

    <h3>1.c:set标签--往域中添加属性或者修改已有的属性值</h3>
    <%--
    实例:往域中添加一个属性,属性名为name,属性值为"张三"
    request.setAttribute("name","张三")
     --%>
    <%--
    如果不指定scope属性,默认是存入到pageContext域中
     --%>
     <c:set var="name" value="张三" scope="request"/>
     <%--
     如果不指定scope属性,默认是存入到pageContext域中
      --%>
      <c:set var="name" value="李四" scope="page"/>
     ${pageScope.name }
     ${requestScope.name }
     <%--如果往同一个域中添加两次同名的属性,但值不同,后面的值会覆盖前面的 --%>
      <c:set var="name" value="张三丰" scope="request"/>
      ${requestScope.name }
     
    <h3>2.c:if标签--用于构造简单的if...else结构</h3>
    <%--
    实例:判断成绩所属的等级
     --%>
     <c:set var="scope" value="85" scope="request"/>
     <%--
     test属性指定一个布尔值,如果为true,则输出C:if标签中的内容,否则就不输出
      --%>
      <c:if test="${scope>=80 && scope <=100}">您的成绩为:优秀</c:if>
      <c:if test="${scope>=60 && scope <80}">您的成绩为:中等</c:if>
      <c:if test="${scope>=0 && scope <60}">您的成绩为:不及格</c:if>
      <c:if test="${scope<0 || scope >100}">成绩不合法!</c:if>
    
    
    <h3>3.c:forEach标签--用于遍历数组或者集合,或者执行指定次数的循环</h3>
    
    <h3>1.遍历域中的数组或集合中的元素</h3>
    <%
        //声明一个数组,并往数组中添加一些元素,将数组存入到域中
        String[] nameArr={"张三","李四","王五","赵六"};
        request.setAttribute("names", nameArr);
        //for(String name:nameArr){}
    %>
    <c:forEach items="${names }" var="name">
        ${name }<br/>
    </c:forEach>
    
    
    
    <h3>2.遍历域中的map集合中的元素</h3>
    
    <%
        //声明一个map集合,并往map中添加元素,再将map集合存入域中
        Map<String,Object> map=new HashMap<String,Object>();
        map.put("name", "尼古斯.赵四");
        map.put("age", 35);
        map.put("addr", "中国");
        request.setAttribute("map", map);
    %>
    <c:forEach items="${map }" var="entry">
        ${entry }<br/>
    </c:forEach>
    <hr/>
    
    <c:forEach items="${map }" var="entry">
        ${entry.key }:${entry.value}<br/>
    </c:forEach>
    
    <h3>3.遍历1-100之间所有的整数,将是3的倍数的数值输出</h3>
    <c:forEach begin="1" end="100" var="i" step="1">
        ${i%3==0 ? i : "" }
    </c:forEach>
    <hr/>
    <c:forEach begin="1" end="100" var="i" step="1">
        <c:if test="${i%3==0 }">${i }</c:if>
    </c:forEach>
    
    
    
    
    
    
    
    
    
</body>
</html>

 

 


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

    <h1>day14-jsp....index.html....</h1>
    
</body>
</html>

 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

    <h1>day14-jsp....index.jsp....</h1>
    <%=Math.random() %>
</body>
</html>

 

 

package com.tedu.pojo;

/**
 * 用于封装用户信息的类--POJO
 * POJO(Plain Old Java Object)简单Java对象
 * @author huawei
 *
 */
public class User {

    private String name;
    private String age;
    private String addr;
    //如果要添加有参构造函数,一定要将无参的构造函数也加上
    
    //提供对应的get和set方法
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
    public String getAddr() {
        return addr;
    }
    public void setAddr(String addr) {
        this.addr = addr;
    }
    
}
 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值