栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java服务器页面:JSP

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java服务器页面:JSP

目录

1.JSP技术的基础概念

1.1 什么是 JSP?

1.2 什么是JSP的主要作用?

1.3 为什么使用JSP? 

1.3 如何创建一个 jsp 动态页面程序 ?

2.jsp 的运行原理(要求知道)

3.jsp 的三种语法(重点掌握)

3.1 jsp 头部的 page 指令

3.2 jsp 中的三种常用脚本

3.3 jsp 中的三种注释 

4.jsp 九大内置对象

5.jsp 四大域对象

6.jsp 中 out 输出流 和 response.getwriter()输出流

7.jsp 的常用标签(***重点****)

7.1 jsp 静态包含

7.2 jsp 动态包含 

7.3 jsp 标签-转发

练习题

练习一:在 jsp 页面中输出九九乘法口诀表

练习二:jsp 输出一个表格,里面有 10 个学生信息。


1.JSP技术的基础概念

1.1 什么是 JSP?
JSP(全称 Java Server Pages)是由 Sun 公司专门为了解决动态生成 HTML 文档的技术。

1.2 什么是JSP的主要作用?

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

1.3 为什么使用JSP? 

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

 

1.3 如何创建一个 jsp 动态页面程序 ?

      创建过程(略),放置于web目录下,访问方式跟html类似。

2.jsp 的运行原理(要求知道)

jsp 的本质 ,其实是一个 Servlet 程序。 

        首先我们去找到我们 Tomcat 的目录下的 workCatalinalocalhost 目录。当我们发布 08_jsp 工程。并启动 Tomcat 服务器后。我们发现 在 workCatalinalocalhost 目录下多出来一个 08_jsp   目录。

         然后,定位到部署地址,发现 workCatalinalocalhost 目录下多出来一个08_jsp 目录,且08_jsp内部是空的,但是访问pringHtml.jsp文件后,08_jsp下马上会生成 orgapachejsp 目录。 并且在会中有两个文件。

注意:如果已经部署过的项目,需要先定位至部署地址删除原有缓存文件,以便观察。 

 pringHtml _jsp.class 文件很明显是 index_jsp.java 源文件编译后的字节码文件。  那么 pringHtml _jsp.java 是个什么内容呢 ?  生成的 java 文件名,是以原来的文件名加上 _jsp 得到。 xxxx_jsp.java 文件的名字
我们打开 pringHtml _jsp.java 文件查看里面的内容: 发现,生成的类继承于 HttpJspBase 类。这是一个 jsp 文件生成 Servlet 程序要继承的基类!

        于是,我们关联源代码。去查看一下 HttpJspBase 类的内容。从源码的类注释说明中,我们发现。 HttpJspBase 这个类就是所有 jsp 文件生成 Servlet 程序需要去继承的基类。并且这个 HttpJspBase 类继承于 HttpServlet 类。所以 jsp 也是一个 Servlet 小程序。

总结:通过翻译的java源代码我们就可以得到结果:JSP就是Servlet程序。 大家也可以通过去观察翻译出来的Servlet程序员的源代码,不难发现。其底层实现,也是通过输出流。把HTML页面数据回传给客户端。
package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;

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

  private static final javax.servlet.jsp.JspFactory _jspxFactory =
          javax.servlet.jsp.JspFactory.getDefaultFactory();

  private static java.util.Map _jspx_dependants;

  private static final java.util.Set _jspx_imports_packages;

  private static final java.util.Set _jspx_imports_classes;

  static {
    _jspx_imports_packages = new java.util.HashSet<>();
    _jspx_imports_packages.add("javax.servlet");
    _jspx_imports_packages.add("javax.servlet.http");
    _jspx_imports_packages.add("javax.servlet.jsp");
    _jspx_imports_classes = null;
  }

  private volatile javax.el.ExpressionFactory _el_expressionfactory;
  private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;

  public java.util.Map getDependants() {
    return _jspx_dependants;
  }

  public java.util.Set getPackageImports() {
    return _jspx_imports_packages;
  }

  public java.util.Set getClassImports() {
    return _jspx_imports_classes;
  }

  public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
    if (_el_expressionfactory == null) {
      synchronized (this) {
        if (_el_expressionfactory == null) {
          _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
        }
      }
    }
    return _el_expressionfactory;
  }

  public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
    if (_jsp_instancemanager == null) {
      synchronized (this) {
        if (_jsp_instancemanager == null) {
          _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
        }
      }
    }
    return _jsp_instancemanager;
  }

  public void _jspInit() {
  }

  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 {

    if (!javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
      final java.lang.String _jspx_method = request.getMethod();
      if ("OPTIONS".equals(_jspx_method)) {
        response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
        return;
      }
      if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method)) {
        response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
        response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP 只允许 GET、POST 或 HEAD。Jasper 还允许 OPTIONS");
        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("rn");
      out.write("rn");
      out.write("rn");
      out.write("rn");
      out.write("    使用pringHtml.jsprn");
      out.write("rn");
      out.write("rn");
      out.write("    这是一个html页面数据rn");
      out.write("rn");
      out.write("rn");
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try {
            if (response.isCommitted()) {
              out.flush();
            } else {
              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);
    }
  }
}

3.jsp 的三种语法(重点掌握)

3.1 jsp 头部的 page 指令

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

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
  •  4个基本设置属性
基本设置属性
                    属性名称                                   属性作用
language 属性 表示 jsp 翻译后是什么语言文件。暂时只支 java 。
contentType 属性 表示 jsp 返回的数据类型是什么。也是源码中 response.setContentType() 参数值
pageEncoding 属性 表示当前 jsp 页面文件本身的字符集。
import 属性 跟 java 源代码中一样。用于导包,导类。
  • 2个out输出流相关属性 
两个out 输出流相关属性
                 属性名称                        属性作用
autoFlush 属性 设置当 out 输出流缓冲区满了之后,是否自动刷新冲级区。默认值是 true 。
buffer 属性 设置 out 缓冲区的大小。默认是 8kb

  •  4个页面设置相关属性
页面设置相关属性
          属性名称                属性作用备注
errorPage 属性 设置当 jsp 页面运行时出错,自动跳转去的错误页面路径。 errorPage 表示错误后自动跳转去的路径 。 这个路径一般都是以斜杠打头,它表示请求地址为 http://ip:port/ 工程路径 / 映射到代码的 Web 目录。
isErrorPage 属性 设置当前 jsp 页面是否是错误信息页面。默认是 false 。如果是 true 可以 获取异常信息。
session 属性 设置访问当前 jsp 页面,是否会创建 HttpSession 对象。默认是 true 。
extends 属性 设置 jsp 翻译出来的 java 类默认继承谁。

3.2 jsp 中的三种常用脚本

  • 声明脚本(极少使用)
声明脚本的格式是: <%! 声明 java 代码 %> 作用:可以给 jsp 翻译出来的 java 类定义属性和方法甚至是静态代码块。内部类等。
练习:         1、声明类属性         2、声明 static 静态代码块         3、声明类方法         4、声明内部类

代码示例如下: 

<%--1、声明类属性--%>
    <%!
        private Integer id;
        private String name;
        private static Map map;
    %>
<%--2、声明static静态代码块--%>
    <%!
        static {
            map = new HashMap();
            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 页面上输出数据。
表达式脚本的特点:         1、所有的表达式脚本都会被翻译到 _jspService() 方法中         2、表达式脚本都会被翻译成为 out.print() 输出到页面上         3、由于表达式脚本翻译的内容都在 _jspService() 方法中 , 所以 _jspService() 方法中的对象都可以直接使用。         4、表达式脚本中的表达式不能以分号结束。
练习:         1. 输出整型         2. 输出浮点型         3. 输出字符串         4. 输出对象

示例代码如下:

    <%=12 %> 
<%=12.12 %>
<%="我是字符串" %>
<%=map%>
<%=request.getParameter("username")%>

 翻译对照如下:

  • 代码脚本 
代码脚本的格式是:         <%                 java 语句         %> 代码脚本的作用是:可以在 jsp 页面中,编写我们自己需要的功能(写的是 java 语句)。
代码脚本的特点是:         1、代码脚本翻译之后都在 _jspService 方法中         2、代码脚本由于翻译到 _jspService() 方法中,所以在 _jspService() 方法中的现有对象都可以直接使用。         3、还可以由多个代码脚本块组合完成一个完整的 java 语句。         4、代码脚本还可以和表达式脚本一起组合使用,在 jsp 页面上输出数据
练习:         1. 代码脚本 ----if 语句         2. 代码脚本 ----for 循环语句         3. 翻译后 java 文件中 _jspService 方法内的代码都可以写

示例代码如下:

<%--练习:--%>
<%--1.代码脚本----if 语句--%>
    <%
        int i = 13 ;
        if (i == 12) {
    %>
            国哥好帅
    <%
        } else {
    %>
        国哥又骗人了!
    <%
        }
    %>

<%--2.代码脚本----for 循环语句--%> <% for (int j = 0; j < 10; j++) { %> <% } %>
第 <%=j + 1%>行
<%--3.翻译后java文件中_jspService方法内的代码都可以写--%> <% String username = request.getParameter("username"); System.out.println("用户名的请求参数值是:" + username); %>

 翻译之后的对比,如下:

3.3 jsp 中的三种注释 
  • html 注释

格式:

特点:html 注释会被翻译到 java 源代码中。在_jspService 方法里,以 out.writer 输出到客户端。 

  •  java 注释

 格式:   

        <%
            // 单行java注释
            
        %>

特点:java 注释会被翻译到 java 源代码中。

  • jsp 注释 

格式:

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

特点: jsp 注释可以注掉jsp 页面中所有代码。不会被翻译到源代码。

4.jsp 九大内置对象

jsp 中的内置对象,是指 Tomcat 在翻译 jsp 页面成为 Servlet 源代码后,内部提供的九大对象,叫内置对象。

 

5.jsp 四大域对象
JSP四大域对象
                    对象名称                                     对象作用域
pageContext (PageContextImpl 类 ) 当前 jsp 页面范围内有效
request (HttpServletRequest 类 ) 一次请求内有效
session (HttpSession 类 ) 一个会话范围内有效(打开浏览器访问服务器,直到关闭浏览器)
application (ServletContext 类 ) 整个 web 工程范围内都有效(只要 web 工程不停止,数据都在),可用服务器部署以及重启进行测试。

  • 域对象是可以像 Map 一样存取数据的对象。四个域对象功能一样。不同的是它们对数据的存取范围。
  • 虽然四个域对象都可以存取数据。在使用上它们是有优先顺序的。
        四个域在使用的时候,优先顺序分别是,他们从小到大的范围的顺序。         pageContext ====>>> request ====>>> session ====>>> application

 scope.jsp 页面

scope2.jsp 页面

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

        由于 jsp 翻译之后,底层源代码都是使用 out 来进行输出,所以一般情况下。我们在 jsp 页面中统一使用 out 来进行输出。避 免打乱页面输出内容的顺序。         out.write() 输出字符串没有问题         out.print() 输出任意数据都没有问题(都转换成为字符串后调用的 write 输出)         深入源码,浅出结论:在 jsp 页面中,可以统一使用 out.print() 来进行输出

7.jsp 的常用标签(***重点****)

7.1 jsp 静态包含 ​​​​​​​

​​​​​​​格式:

        <%@ include file=""%> 就是静态包含

        file 属性指定你要包含的jsp页面的路径。 地址中第一个斜杠 / 表示为http://ip:port/工程路径/ 映射到代码的web目录

静态包含的特点:

        1、静态包含不会翻译被包含的jsp页面。

        2、静态包含其实是把被包含的jsp页面的代码拷贝到包含的位置执行输出。

代码示例如下:

​​​​​​​<%@ include file="/include/footer.jsp"%>

7.2 jsp 动态包含 

格式:     这是动态包含
        page 属性是指定你要包含的jsp页面的路径
        动态包含也可以像静态包含一样。把被包含的内容执行输出到包含位置

动态包含的特点:
    1、动态包含会把包含的jsp页面也翻译成为java代码
    2、动态包含底层代码使用如下代码去调用被包含的jsp页面执行输出。
      JspRuntimeLibrary.include(request, response, "/include/footer.jsp", out, false);
    3、动态包含,还可以传递参数

代码实例如下:

    
         
         
    

动态包含底层原理如下:

7.3 jsp 标签-转发

是请求转发标签,它的功能就是请求转发 ,page 属性设置请求转发的路径。

实例代码如下:

练习题

练习一:在 jsp 页面中输出九九乘法口诀表
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Title
    


    <%-- 练习一:在jsp页面中输出九九乘法口诀表 --%>
    

九九乘法口诀表 <% for (int i = 1; i <= 9; i++) { %> <% for (int j = 1; j <= i ; j++) { %> <% } %> <% } %>
<%=j + "x" + i + "=" + (i*j)%>

练习二:jsp 输出一个表格,里面有 10 个学生信息。

Student 类:

package com.atguigu.pojo;

public class Student {
    private Integer id;
    private String name;
    private Integer age;
    private String phone;
}

 SearchStudentServlet 程序:

package com.atguigu.servlet;

import com.atguigu.pojo.Student;

import javax.servlet.ServletException;
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;

public class SearchStudentServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取请求的参数
        // 发sql语句查询学生的信息
        // 使用for循环生成查询到的数据做模拟
        List studentList = new ArrayList();
        for (int i = 0; i < 10; i++) {
            int t = i + 1;
            studentList.add(new Student(t,"name"+t, 18+t,"phone"+t));
        }
        // 保存查询到的结果(学生信息)到request域中
        req.setAttribute("stuList", studentList);
        // 请求转发到showStudent.jsp页面
        req.getRequestDispatcher("/test/showStudent.jsp").forward(req,resp);
    }
}

showStudent.jsp 页面:

%@ page import="java.util.List" %>
<%@ page import="com.atguigu.pojo.Student" %>

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


    Title
    


<%--练习二:jsp输出一个表格,里面有10个学生信息。--%>
    <%
        List studentList = (List) request.getAttribute("stuList");
    %>
    
    <% for (Student student : studentList) { %>
        
    <% } %>
    
编号 姓名 年龄 电话 操作
<%=student.getId()%> <%=student.getName()%> <%=student.getAge()%> <%=student.getPhone()%> 删除、修改
摘自: 尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版_哔哩哔哩_bilibili0基础如何学起?宋红康30天搞定Java核心:BV1Kb411W75N一键三连呀【点赞、投币、收藏】呀~本视频涵盖核心技术点有:Servlet程序、Filter过滤器、Listener监听器、jsp页面、EL表达式、JSTL标签库、jQuery框架、Cookie技术、Session会话、JSON使用、Ajax请求,并在讲解知识点过程中会带领大家完成一个书城项目。相对于旧版,本版本使用idea进行开https://www.bilibili.com/video/BV1Y7411K7zz?p=172

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/855244.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号