侧边栏壁纸
  • 累计撰写 106 篇文章
  • 累计创建 19 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

十二、JSP(JavaEE 零基础笔记)

zero
2020-04-11 / 0 评论 / 0 点赞 / 17 阅读 / 17457 字
温馨提示:
本文最后更新于 2024-07-06,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

12.1、什么是jsp,它有什么作用?

  • jsp的全称时 java server pages。Java的服务器页面。

  • jsp的主要作用是替代Servlet程序回传html页面的数据。

  • 因为Servlet程序回传html页面数据是一件非常繁琐的事情,开发成本和维护成本都极高。

// 用Servlet回传
public class PringHtml extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 通过响应的回传流回传html页面数据
        resp.setContentType("text/html; charset=UTF-8");
        PrintWriter writer = resp.getWriter();
        writer.write("<!DOCTYPE html> \r\n");
        writer.write("<html lang=\"en\"> \r\n");
        writer.write("<head> \r\n");
        writer.write("  <meta charset=\"UTF-8\"> \r\n");
        writer.write("  <title>Title</title> \r\n");
        writer.write("</head> \r\n");
        writer.write("<body> \r\n");
        writer.write("<h1>hello world</h1> \r\n");
        writer.write("</body> \r\n");
        writer.write("</html> \r\n");
        writer.flush();
    }
}
<%--用jsp回传--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title
 
lt;/title> </head> <body> hello world </body> </html>

jsp小结

jsp如何访问:

​ jsp页面和html页面一样,都是存放在web目录下,访问也跟访问html页面一样。

比如:

​ web目录

​ a.html 页面 访问地址是 ========>>>>>>>> http://ip:port/工程路径/a.html

​ b.jsp 页面 访问地址是 ========>>>>>>>> http://ip:port/工程路径/b.jsp

12.2、jsp的本质是什么

​ jsp页面本质是一个Servlet程序

​ 当我们第一次访问jsp页面的时候。Tomcat服务器会帮我们把jsp页面翻译成为一个java源文件,并且对它进行编译成为.calss字节码程序,我们打开java源文件不难发现其里面的内容是:

十二、JSP(JavaEE 零基础笔记)-图片一.png

​ 我们跟踪源代码发现,HttpJspBase类。他直接地继承了HttpServlet类,也就是说,jsp翻译出来的java类,它间接继承了HttpServlet类吗,也就是说,翻译出来的是一个Servlet程序

十二、JSP(JavaEE 零基础笔记)-图片二.png

总结

​ 通过翻译的java源代码我们就可以得到结果,jsp就是Servlet程序

​ 大家也可以去观察翻译出来的Servlet程序的源代码,不难发现,其底层也是通过输出流,回传html代码给客户端

12.3、jsp的三种语法

1、jsp头部page指令

​ jsp的page指令可以修改jsp页面中一些重要的属性,或者行为。

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

属性

说明

language

表示jsp翻译后是什么语言文件。暂时只支持java

contentType

表示jsp返回的数据类型是什么,也是源码中response.setContentType()参数值

pageEncoding

表示当前jsp页面文件本身的字符集

import

跟java源代码中一样,用于导包、导类

下面属性是个 out 输出流使用

属性

说明

autoFlush

设置当 out 输出流缓冲区满了之后,是否自动刷新缓冲区,默认是true

buffer

设置 out 缓冲区的大小,默认是8kb

属性

说明

errorPage

设置当jsp页面运行时出错,自动跳转去的错误页面路径

isErrorPage

设置当前jsp页面是否是错误信息页面,默认是false,如果是true可以获取异常信息

session

设置访问当前jsp页面,是否创建HttpSession对象。默认是true

extends

设置jsp翻译出来的java类默认继承谁

2、jsp中的常用脚本

  • 声明脚本(极少使用)

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

    • 作用是:可以给jsp翻译出来的java类定义属性和方法甚至是静态代码块,内部类等

    <%@ page import="java.util.Map" %>
    <%@ page import="java.util.HashMap" %><%--
    Created by IntelliJ IDEA.
    User: FlamingYouth
    Date: 2021/9/25
    Time: 21:39
    To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
    <%-- 1、声明类属性 --%>
      <%!
          private Integer id;
          private String name;
          private static Map<String,Object> map;
      %>
    
    <%-- 2、声明static静态代码块 --%>
      <%!
          static {
              map = new HashMap<String,Object>();
              map.put("key1","value1");
              map.put("key2","value2");
              map.put("key3","value3");
          }
      %>
    <%-- 3、声明类方法 --%>
      <%!
          public int abc() {
              return 12;
          }
      %>
    <%-- 4、声明内部类 --%>
      <%!
          public static class A {
              private Integer id = 12;
              private String abc = "abc";
          }
      %>
    
    
    
  • 表达式脚本(常用)

    • 表达式脚本的格式是:<%=表达式%>

    • 表达式脚本的作用是:在jsp页面上输出数据

    • 表达式脚本的特点

    • 所有的表达式脚本都会被翻译到_jspService方法中

    • 所有的表达式脚本都会被翻译成为out.print()输出到页面上

    • 由于表达式脚本翻译的内容都在_jspService方法中的对象都可以直接使用

    <%=12%>
    <%=12.12%>
    <%="我是字符串"%>
    <%=map%>
  • 代码脚本

    • 代码脚本的格式:<% java语句 %>

    • 代码脚本的作用:可以在jsp页面中,编写我们自己需要的功能(写的是java语句)

    <%--1、代码脚本 if语句--%>
    <%
      int a = 1;
      if (a == 1) {
          System.out.println(true);
      }else {
          System.out.println(false);
      }
    %>
    <%--2、代码脚本 for语句--%>
    <%
      for (int i = 0; i < 2 ; i++) {
          System.out.println(i);
      }
    %>
    <%--3、翻译后java文件中_jspService方法内的代码都可以写--%>
    <%
      String username = request.getParameter("username");
      System.out.println(username);
    %>
    <%=username%>
    • 代码脚本的特点是:

    • 代码脚本翻译之后都在_jspService方法中

    • 代码脚本由于翻译到_jspService方法中,所以在jspService方法中的现有对象都可以直接使用

    • 还可以有多个代码脚本块组合完成一个完成的java语句

    • 代码脚本还可以和表达式脚本一起组合使用。在jsp页面上输出数据

      <%
        for (int i = 0; i < 9 ; i++) {
      %>
      
      <%
        }
      %>

3、jsp中的三种注释

  • html 注释

    html注释会被翻译到java源代码中,在_japService方法里,以out.witer输出到客户端

  • java 注释

    <%
    // 单行注释
    /* 多行注释 */
    %>

    java注释会翻译到java源代码中

  • jsp 注释

    <%-- 这是jsp注释 --%>

    jsp注释可以注掉,jsp页面中所有代码

4、jsp的九大内置对象

参数

名称

request

请求对象

response

响应对象

pageContext

jsp的上下文对象

session

会话对象

application

ServletContext对象

config

ServletConfig对象

out

jsp输出流对象

page

指向当前jsp的对象

exception

异常对象

5、jsp四大域对象

四个域对象分别是:

参数

继承类

解释

pageContext

PageContextImpl类

当前jsp页面范围内有效

request

HttpServletRequest类

一个请求内有效

session

HttpSession类

一个会话范围内有效(打开浏览器访问服务器,直到关闭浏览器)

application

ServletContext类

整个web工程范围内都有效(只要web工程不停止,数据都在)

域对象是可以像Map一样存取数据的对象,四个域对象的功能一样,不同的是它们对数据的存取范围。

虽然四个域对象都可以存取数据,在使用上它们是有优先顺序的

四个与在使用的时候,优先顺序分别是,他们从小到大的范围的顺序

pageContext ====>>> request====>>> session====>>> application

6、jsp中的out输出和response.getWriter输出的区别

response中表示响应,我们经常用于设置返回给客户端的内容(输出),out也是给用户做输出使用的

十二、JSP(JavaEE 零基础笔记)-图片三.png

由于jsp翻译之后,底层源代码都是使用out来进行输出,所以一般情况下。我们在jsp页面中统一使用out来进行输出,避免打乱页面输出内容的顺序

out.wite() 输出字符串没有问题

out.print() 输出任意数据都没有问题(都转换成字符串后调用的wite输出)

深入源码,浅出结论:在jsp页面中,可以统一使用out.print()进行输出

7、jsp的常用标签

  • 静态包含

    <%--
      <%@ include file=""%> 就是静态包含
    file 属性指定你要包含的jsp页面的路径
    地址中第一个斜杠 / 表示为 http://ip:port/工程路径/ 映射到代码的web目录
    
    静态包含的特点:
        1、静态包含不会翻译被包含的jsp页面
        2、静态包含其实是把被包含的jsp页面的代码拷贝到包含的位置执行输出
    --%>
    <%@ include file="/include/footer.jsp"%>
  • 动态包含

    <%--
       这是动态包含
    page 属性指定你要包含的jsp页面的路径
    地址中第一个斜杠 / 表示为 http://ip:port/工程路径/ 映射到代码的web目录
    
    动态包含的特点:
        1、动态包含会把包含的jsp页面也翻译成为java代码
        2、动态包含底层代码使用如下代码去调用被包含的jsp页面执行输出
            JspRuntimelibrary.include(request, respose, "/include/footer.jsp", out, false);
          3、动态包含,还可以传递参数
    --%>
    
  • 标签-转发

    <%--
       这是标签-转发,他的功能就是请求转发
    page 属性指定你要包含的jsp页面的路径
    地址中第一个斜杠 / 表示为 http://ip:port/工程路径/ 映射到代码的web目录
    --%>
    

0

评论区