Skip to content

7. JSP

JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。

Sun公司于1998年发布JSP第一版,目前最新版本是随Java EE 7一起发布的JSP 2.3版。

JSP技术的特点:

  • JSP是一种服务器端脚本语言,其出现降低了Servlet编写页面的难度。JSP本质上就是Servlet,实际上JSP是首先被翻译成Servlet后才编译运行的,因此JSP能够实现Servlet所能够实现的所有功能。

  • 相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据。

7.1 第一个jsp

<%--
  Created by IntelliJ IDEA.
  User: root
  Date: 2020/12/11
  Time: 9:45
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>欢迎访问jsp</h1>
<%
    // http://127.0.0.1:8080/web/first.jsp
    //Java代码
    System.out.println("第一个JSP");
%>
</body>
</html>

通过 http://127.0.0.1:8080/web/first.jsp 请求后,在idea的tomcat目录中会发现如下文件

7.2 JSP运行原理

JSP同Servlet一样,都运行在Servlet容器中。当用户第一次访问JSP页面时,JSP页面的处理过程:

7.3 JSP页面基本结构

JSP页面就是带有JSP元素的常规Web页面,它由模板文本和JSP元素组成。 在一个JSP页面中,所有非JSP元素的内容称为模板文本(template text)。模板文本可以是任何文本,如:HTML、XML,甚至可以是纯文本。 JSP并不依赖于HTML,它可以采用任何一种标记语言。模板文本通常被直接传递给浏览器。在处理一个JSP页面请求时,模板文本和JSP元素所生成的内容会合并,合并后的结果将作为响应内容发送给浏览器。 JSP有三种类型的元素: 脚本元素(scripting element)、指令元素(directive element)和动作元素(action element)。

7.3.1 脚本元素

脚本

<% %>

表达式

<%= %>

声明

<%! %>

注释

  • html: <!-- --> 随着html发送给客户端
  • java脚本的注释 // /* */ 随着翻译保留到Java文件
  • jsp的注释 <%-- 注释的内容--%> 只在jsp中使用,java和浏览器都看不见。
html
<%--
  Created by IntelliJ IDEA.
  User: root
  Date: 2020/12/11
  Time: 9:45
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>欢迎访问jsp</h1>

<!-- html -->




<%--  jsp的注释 : 不会出现源文件  <% %>      --%>
<%
    // http://127.0.0.1:8080/web/first.jsp
    //Java代码

    /***
     * doc注释
     */
    System.out.println("第一个JSP");
%>


<%
    //脚本
    String show = request.getParameter("show");
    if (show != null && !"".equals(show)) {
%>

<h1>显示标题</h1>

<%
    }
%>



表达式: <%=1+2%>




<%--声明变量--%>
<%!  int numa = 900;
%>

<%--声明方法--%>
<%!
    void sayHello(){
        System.out.println("hellowold ");
    }
%>



<%
    sayHello();
%>


</body>
</html>

7.3.2 指令元素

  • Page

    • jsp文件编码问题:
      • pageEncoding: 告诉tomcat服务器使用什么编码翻译jsp文件(jsp->java文件)
      • contentType: tomcat服务器发送给浏览器的数据编码(tomcat服务器->浏览器)
    • 异常错误相关的:
      • errorPage: 指定当前jsp页面的错误处理页面。
      • isErorrPage: 指定当前页面是否为错误处理页面。false,不是错误处理页面,则不能使用exception内置对象;true,是错误处理页面,可以使用exception内置对象。

    ​ 针对servlet后端的代码异常,可以指定异常类型,跳转的页面,web.xml中而配置

    xml
     <error-page>
            <exception-type>java.lang.ArithmeticException</exception-type>
            <location>/error/error.jsp</location>
        </error-page>

    针对http code代码配置异常页面,比如404

    xml
    <error-page>
          <error-code>404</error-code>
            <location>/error/404.jsp</location>
        </error-page>
  • include指令

  • 静态包含

  • include指令的作用是在页面翻译期间引入另一个文件,被包含的文件可以是JSP、HTML或文本文件。

  • 语法:<%@include file="文件"%>

  • include指令会先将当前JSP和被包含的文件融合到一起形成一个Servlet再进行编译执行;因此包含文件时,必须保证新合并生成的文件符合JSP语法规则。例如,当前文件和被包含文件的不能同时定义同名的变量,否则当前文件将不能编译通过,会提示Duplicate local variable错误。

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

<div>共同的头部信息</div>

在需要的位置

<%@include file="header.jsp"%>

header.jsp 没有产生 翻译的 Java文件

  • taglib :

    • jstl导包
    xml
    <dependency>
          <groupId>jstl</groupId>
          <artifactId>jstl</artifactId>
          <version>1.2</version>
        </dependency>
  • 在jsp中引入tablib

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

    使用taglib

    html
    <body>
    
    <%
    
        List list = new ArrayList();
        list.add(1);
        list.add(1);
        list.add(1);
        list.add(1);
        list.add(1);
        list.add(1);
        list.add(1);
        request.setAttribute("list",list);
    
    %>
    
    <table cellspacing="0" cellpadding="0" border="1" width="80%" align="center">
        <tr>
            <td>序号</td>
            <td>姓名</td>
            <td>年龄</td>
        </tr>
    
    
        <c:forEach items="${list}" var="num" varStatus="stat">
          <tr>
              <td>${stat.index}</td>
              <td>姓名${stat.index}</td>
              <td>年龄${stat.index}</td>
          </tr>
        </c:forEach>
    </table>
    
    
    
    </body>

7.3.3 动作元素

虽然JSP页面仅用作数据显示模块,希望不嵌套任何java业务逻辑代码,但在实际开发中不引入一点业务逻辑是不可能的,但引入业务逻辑会导致页面代码可维护性、可读性降低,因此Sun公司允许用户开发自定义标签封装页面的java代码,以便jsp页面不出现一行java代码, 在jsp页面中也内置了一些标签(动作元素),开发人员使用这些标签可以完成页面的一些常用业务逻辑。 JSP标签也称之为Jsp Action(JSP动作)元素,它用于在JSP页面中提供业务逻辑功能。 JSP规范定义了一系列标准动作,常用有下列几种:

<jsp:include>标签

动态包含

java
<jsp:include page="header.jsp"/>

<jsp:forward>标签

<jsp:param>标签

代码

html
<%--include 动作--%>
<%--
<jsp:include page="header.jsp">
    <jsp:param name="name" value="action Param"/>
</jsp:include>
--%>


<%--forward动作--%>
<jsp:forward page="user/user_list.jsp">
    <jsp:param name="title" value="UserList"/>
</jsp:forward>

useBean、setProperty 、getProperty

7.3.4 javaBean规范

什么是JavaBean

JavaBean 是一种JAVA语言写成的可重用组件,是一个遵循特定写法的Java类,它通常具有如下特点:

  • 这个Java类必须具有一个无参的构造函数
  • 属性必须私有化。
  • 私有化的属性必须通过public类型的方法暴露给其它程序,并且方法的命名也必须遵守一定的命名规范。

JavaBean可分为两种:

  1. ​ 一种是有用户界面(UI,User Interface)的JavaBean,例如一些GUI组件(按钮、文本框、报表组件等);
  2. ​ 另一种是没有用户界面、主要负责封装数据、业务处理的JavaBean。JSP通常访问的是后一种JavaBean。

JSP与JavaBean搭配使用,具有以下优势:

  • JSP页面中的HTML代码与Java代码分离,便于页面设计人员和Java编程人员的分工与维护;

  • 使JSP更加侧重于生成动态网页,业务处理由JavaBean来完成,使系统更趋于组件化、模块化。

JavaBean的这些优势,使系统具有了更好的健壮性和灵活性,使得JSP+JavaBean和JSP+Servlet+JavaBean的组合设计模式成为目前开发Java Web应用的主流模式(MVC等Web开发模式后续讲解)

Released under the MIT License.