文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Web-6-深入理解JSP:探索其核心概念和特性

2024-11-30 10:40

关注

JSP

今日目标:

理解 JSP 及 JSP 原理

能在 JSP中使用 EL表达式 和 JSTL标签

1、JSP 概述

JSP(全称:Java Server Pages):Java 服务端页面。是一种动态的网页技术,其中既可以定义 HTML、JS、CSS等静态内容,还可以定义 Java代码的动态内容,也就是 JSP = HTML + Java。如下就是jsp代码。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Hello JSP


    
    <%
        System.out.println("你好 Java代码");
    %>

在浏览器地址栏输入:http://localhost:8080/jsp/01_Hello_JSP.jsp 显示结果为:

思考:JSP 能做什么呢?

JSP 作用:简化开发,避免了在Servlet中直接输出HTML标签。

2、JSP 快速入门

接下来我们做一个简单的快速入门代码。

(1)搭建环境

创建一个maven的 web 项目,项目结构如下:

pom.xml 文件内容如下:



    4.0.0

    com.zbbmeta
    07_JSP
    1.0-SNAPSHOT

    war

    
        11
        11
    

    
        
            javax.servlet
            javax.servlet-api
            4.0.1
            provided
        

    

(2)导入 JSP 依赖

在 dependencies 标签中导入 JSP 的依赖,如下:



    javax.servlet.jsp
    jsp-api
    2.2
  
    provided

(3)创建 jsp 页面

在项目的 webapp 下创建jsp页面。

通过上面方式创建一个名为 hello.jsp 的页面。

(4)编写代码

在 hello.jsp 页面中书写 HTML 标签和 Java 代码,如下:

<%--
  Created by IntelliJ IDEA.
  User: zbb
  Date: 0029
  Time: 0:32
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Hello JSP


    
    <%
        System.out.println("你好 Java代码");
    %>

(5)测试

启动服务器并在浏览器地址栏输入 http://localhost:8080/jsp/01-hello-jsp.jsp,我们可以在页面上看到如下内容。

在 idea 的控制台看到输出的 你好 Java代码 内容。

3、JSP 原理

思考:为什么还可以写 Java 代码呢?

因为JSP 本质上就是一个 Servlet。

打开 _01_002dhello_002djsp_jsp.java 文件,来查看里面的代码。

public final class _01_002dhello_002djsp_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports {

可以看出其继承 HttpJspBase 这个类,那我们在看该类的继承关系。到资料中的找如下目录: apache-tomcat-9.0.65-src\java\org\apache\jasper\runtime(可自行到Tomcat官网下载src压缩包) ,该目录下就有 HttpJspBase 类,查看该类的继承关系。

public abstract class HttpJspBase extends HttpServlet implements HttpJspPage {

可以看到该类继承了 HttpServlet ;那么 _01_002dhello_002djsp_jsp 这个类就间接的继承了 HttpServlet ,也就说明 _01_002dhello_002djsp_jsp 是一个 servlet

在HttpJspBase类中我们发现了Servlet类中的一个重要方法service(HttpServletRequest request, HttpServletResponse response)。

public final void service(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
    {
        _jspService(request, response);
    }
    @Override
    public abstract void _jspService(HttpServletRequest request,
                                     HttpServletResponse response)
        throws ServletException, IOException;

发现service方法调用了一个抽象方法_jspService 思考:java基础中抽象方法由谁实现?

抽象方法由其子类去实现

所以查看 _01_002dhello_002djsp_jsp 类的代码,可以看到有一个名为 _jspService() 的方法,该方法就是每次访问 jsp 时自动执行的方法。

而在 _jspService() 方法中可以看到往浏览器写标签的代码:

out.write("\r\n");
      out.write("\r\n");
      out.write("\r\n");
      out.write("\r\n");
      out.write("    Hello JSP\r\n");
      out.write("\r\n");
      out.write("\r\n");
      out.write("    \r\n");
      out.write("    ");

        System.out.println("你好 Java代码");
    
      out.write("\r\n");
      out.write("\r\n");
      out.write("\r\n");

前我们自己写 servlet 时,现有由Tomcat自动生成这部分代码,这也就是JSP的作用:简化Servlet的开发。

4、JSP 脚本

JSP脚本用于在 JSP页面内定义 Java代码.

(1)JSP 脚本分类

JSP 脚本有如下三个分类:

创建02script.jsp,并书写内容。

<%
        String name = "张三";
        //注意:最好泛型不要省略
        List listStrs = new ArrayList();
        listStrs.add("王五");
        listStrs.add("老六");
        listStrs.add("赵四");
    %>

通过浏览器访问 02script.jsp 后,查看转换的 _02script_jsp.java 文件,name和listStrs 变量定义在了 _jspService() 方法中。

String name = "张三";
        //注意:最好泛型不要省略
        List listStrs = new ArrayList();
        listStrs.add("王五");
        listStrs.add("老六");
        listStrs.add("赵四");

在 02script.jsp 中书写。

<%=name%>
<%=listStrs%>

通过浏览器访问 02script.jsp 后,查看转换的 _02script_jsp.java 文件,该脚本的内容被放在了 out.print() 中,作为参数。

out.print(name);
      out.write("\r\n");
      out.write("    ");
      out.print(listStrs);

浏览器输出结果:

在 hello.jsp 中书写。

<%!
    String address="河南";
    void test(){
        System.out.println(address);
    }
%>

通过浏览器访问 02script.jsp 后,查看转换的 _02script_jsp.java 文件,该脚本的内容被放在了成员位置。

(2)JSP 缺点

通过上面的案例,我们可以看到 JSP 的很多缺点。

由于 JSP页面内,既可以定义 HTML 标签,又可以定义 Java代码,造成了以下问题:

思考:那为什么我还要介绍和学习JSP 呢?

接下来我们来学习第三阶段,使用 EL表达式  JSTL 标签库替换 JSP 中的 Java 代码。

5、EL 表达式

(1)概述

EL(全称Expression Language )表达式语言,用于简化 JSP 页面内的 Java 代码。

EL 表达式的主要作用是 获取数据。其实就是从域对象中获取数据,然后将数据展示在页面上。

而 EL 表达式的语法也比较简单,**${expression}** 。 例子:

${name}:获取域中存储的key为name的数据
可以理解为从map集合中获取key为name对应的value值

(2)代码演示

package com.zbbmeta.servlet;

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("/el")
public class ELServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //get请求
        // 1.准备数据
        String name = "张三";
        String address = "广东省广州市天河区";
        Integer age = 30;
        // 2.存储数据到request域中
        request.setAttribute("name", name);
        request.setAttribute("address", address);
        request.setAttribute("age", age);
        // 3.转发到jsp
         request.getRequestDispatcher("03el.jsp").forward(request, response);
        // request.getRequestDispatcher("/04if.jsp").forward(request, response);
        // request.getRequestDispatcher("/05foreach.jsp").forward(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //post请求
        doGet(request, response);
    }
}

注意:此处需要用转发,因为转发才可以使用 request 对象作为域对象进行数据共享。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    EL


    <%--取出request存储的数据--%>
    姓名: ${name} 
地址: ${address}
年龄: ${age}
不存在的: ${address1}

(3)域对象

JavaWeb中有四大域对象,分别是:

el 表达式获取数据,会依次从这4个域中寻找,直到找到为止。而这四个域对象的作用范围如下图所示:

例如: ${name},el 表达式获取数据,会先从page域对象中获取数据,如果没有再到 requet 域对象中获取数据,如果再没有再到 session 域对象中获取,如果还没有才会到 application 中获取数据,,如果application中没有获取到数据,也不会报错。

6、JSTL标签

(1)概述

JSP标准标签库(Jsp Standarded Tag Library) ,使用标签取代JSP页面上的Java代码。如下代码就是JSTL标签。


上面代码看起来是不是比 JSP 中嵌套 Java 代码看起来舒服好了。而且前端工程师对标签是特别敏感的,他们看到这段代码是能看懂的。

JSTL 提供了很多标签,这里只对两个最常用的标签进行讲解, 标签和  标签。

JSTL 使用也是比较简单的,分为如下步骤:


    jstl
    jstl
    1.2

(2)if 标签

:相当于 if 判断.


    true


    false

代码演示:

package com.zbbmeta.servlet;

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("/ifservlet")
public class IFServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //get请求
        // 1.准备数据
        String name = "张三";
        String address = "广东省广州市天河区";
        Integer age = 30;
        // 2.存储数据到request域中
        request.setAttribute("name", name);
        request.setAttribute("address", address);
        request.setAttribute("age", age);
        // 3.转发到jsp
         request.getRequestDispatcher("04if.jsp").forward(request, response);
        // request.getRequestDispatcher("/05foreach.jsp").forward(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //post请求
        doGet(request, response);
    }
}
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    JSTL的if标签


    <%-- c:if:来完成逻辑判断,替代java中的if --%>
    <%--c:if 条件直接使用boolean类型--%>
    
        true
    
    
        false
    

    <%--c:if 条件从作用域中取出数据比较, 要访问 /demo01 这个Servlet, Servlet会保存age到request中,这边才能取到age--%>
    
        未成年
    
    
        成年
    

注意: 在该页面已经要引入 JSTL核心标签库。

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

(3)forEach 标签

:相当于 for 循环。java中有增强for循环和普通for循环,JSTL 中的  也有两种用法

用法一

类似于 Java 中的增强for循环。涉及到的  中的属性如下:

如下代码,是从域对象中获取名为 students 数据,该数据是一个集合;遍历遍历,并给该集合中的每一个元素起名为 student,是 Student对象。在循环里面使用 EL表达式获取每一个Brand对象的属性值。


         
             ${sta.count}
             ${student.name}
             ${student.address}
             ${student.age}
             
                 启用
             
             
                 禁用
             
             修改 删除
         
    

代码演示:

package com.zbbmeta.entity;

public class Student {
    private String name;
    private String address;
    private Integer age;

    private Integer status;

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Student(String name, String address, Integer age, Integer status) {
        this.name = name;
        this.address = address;
        this.age = age;
        this.status = status;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", address='" + address + '\'' +
                ", age=" + age +
                ", status=" + status +
                '}';
    }
}
package com.zbbmeta.servlet;

import com.zbbmeta.entity.Student;
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;
import java.util.ArrayList;
import java.util.List;

@WebServlet("/forservlet")
public class ForeachServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //get请求
        // 1.准备数据
        List students = new ArrayList<>();
        students.add(new Student("王五","广东省广州市天河区",30,0));
        students.add(new Student("李四","广东省江门市",40,1));
        students.add(new Student("老刘","广东省珠海市香洲区",60,0));

        // 2.存储数据到request域中
        request.setAttribute("students", students);
        // 3.转发到jsp
         request.getRequestDispatcher("/05foreach.jsp").forward(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //post请求
        doGet(request, response);
    }
}
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    JSTL的foreach标签





<%--c:forEach标签: 遍历 items属性: 要遍历的数据 var属性: 变量名,保存遍历到元素 varStatus属性: 遍历时的状态 index: 索引,从0开始 count: 计数器,从1开始 --%>
序号 姓名 地址 年龄 操作
${sta.count} ${student.name} ${student.address} ${student.age} 启用 禁用 修改 删除

用法二

类似于 Java 中的普通for循环。涉及到的  中的属性如下

实例代码:

从0循环到10,变量名是 i ,每次自增1。


<%--类似于普通for循环--%> ${i}

05foreach.jsp完整代码。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    JSTL的foreach标签





<%--c:forEach标签: 遍历 items属性: 要遍历的数据 var属性: 变量名,保存遍历到元素 varStatus属性: 遍历时的状态 index: 索引,从0开始 count: 计数器,从1开始 --%>
序号 姓名 地址 年龄 操作
${sta.count} ${student.name} ${student.address} ${student.age} 启用 禁用 修改 删除

<%--类似于普通for循环--%> ${i}
来源:今日头条内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯