JSP

什么是JSP

​ jsp是把html静态资源转换为动态资源的一种技术,简单点说就是一个servlet,在servlet中写html代码。比如:在servlet中写

out.println("<h1>Hello<h1>");

JSP原理

执行过程在这里插入图片描述

​ jsp页面的执行过程是用户请求服务器->服务加载jsp页面并把jsp页面转为.java的文件->在通过类加载器转为.class文件->返回服务器,最后展示给用户。

jsp本质

1、找到idea的空间,并找到运行的项目
在这里插入图片描述

2、在本项目下找到jsp文件夹。只有运行到了具体的jsp页面才会有响应的jap页面转为java文件。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FtjCSmsa-1605257723915)(C:\Users\a\AppData\Roaming\Typora\typora-user-images\image-20201113095633192.png)]

3、打开文件

​ 可以看到jsp文件实现JspSourceImports、和JspSourceDependent接口。

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

4、通过寻找发现JspSourceImports继承HttpServelt类,所以说jsp就是一个servlet
在这里插入图片描述

jsp源码分析

​ 通过jsp生成的java文件

/*
 * Generated by the Jasper component of Apache Tomcat
 * Version: Apache Tomcat/8.5.59
 * Generated at: 2020-11-13 01:52:51 UTC
 * Note: The last modified time of this file was set to
 *       the last modified time of the source file after
 *       generation to assist with modification tracking.
 */
package org.apache.jsp;

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

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


  public java.util.Set<java.lang.String> getPackageImports() {
    return _jspx_imports_packages;
  }

  public java.util.Set<java.lang.String> 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 {

    final java.lang.String _jspx_method = request.getMethod();
    if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
      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("\n");
      out.write("\n");
      out.write("<html>\n");
      out.write("  <head>\n");
      out.write("    <title>$Title$</title>\n");
      out.write("  </head>\n");
      out.write("  <body>\n");
      out.write("  $END$\n");
      out.write("  </body>\n");
      out.write("</html>\n");
    } 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);
    }
  }
}

是不是和servlet一样,都有init、service、Destroy方法,而且我们在页面写的jsp代码被转换为java代码.

      out.write("\n");
      out.write("\n");
      out.write("<html>\n");
      out.write("  <head>\n");
      out.write("    <title>$Title$</title>\n");
      out.write("  </head>\n");
      out.write("  <body>\n");
      out.write("  $END$\n");
      out.write("  </body>\n");

在这个文件中还定义了如下参数:

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;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;

其实这几个参数就是jsp中的内置对象,jsp中的内置对象是九个,为什么只有上面7个呢?还有两个就是request、response.

JSP基础语法

JSP表达式

<%= %>标签表示是表达式输出或者变量输出

<%= new Date()%>
<% int i=10;%>
<br>
<%=i%>

JSP脚本片段

<% %>标签写的代码只存在service方法中,所以这里的写法和在java中的写法一样。同样也可以和html标签混合使用,因为这个文件最终通过java的方式来写,也就是说通过 out.write(" <span class="katex--inline">Title</span>\n");的方式来响应。

<% for (int z=0;i<10; i++){%>
  <h1><%System.out.println("标签:"+z);%></h1>
<%}%>

JSP声明

<%! %>标签写的代码不存在service方法中,也就是同个这个标签我们可以声明成员变量及其方法等,和java的操作一样

<%!
public Date  getMyDate(){
 return new Date();
}
%>
<%out.print("通过自定义方法获得的时间是"+getMyDate());%>

通过生成的jav文件可以看到我们定义的方法是不在service中:

在这里插入图片描述

JSP中的注释

<%-- --%>jsp的标签只在原码中显示,通过浏览器查看是看不到的。

<%--<% int i=10;%>--%>

JSP指令

jsp的指令有三个:page(设置页面的属性)、include(把其他文件导入本文件)、taglib。

page

<%@ page xx%>jsp的指令有很多,这里我只举例几个常用。

<%@ page import="java.util.Date" %>//导包
<%@ page contentType="text/html;charset=UTF-8" language="java" %>/。//设置响应内型
<%@ page errorPage="exciption.jsp" %>//出现404就装发到指定的页面
案例:error-page

我们故意制造错误用1/0;

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page errorPage="exciption.jsp" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
	<% int i=1/0;%>
  </body>
</html>

创建异常页面


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>异常页面</h1>
</body>
</html>

错误页面


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>错误页面</h1>
</body>
</html>

结果:可以发现地址栏没变是转发到我们设定的页面
在这里插入图片描述

web.xml设置错误页面

如果非要分响应码来做响应的页面,那么需要配置web.xml。

如:

web.xml

<?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_4_0.xsd"
         version="4.0">
    <error-page>
        <error-code>404</error-code><!--当响应码为-->
        <location>/error.jsp</location><!--响应这个页面-->
    </error-page>
    <error-page>
        <error-code>500</error-code>
        <location>/exciption.jsp</location>
    </error-page>
</web-app>

在这里插入图片描述

include

这个指令是把其他的东西加载到本页中。

案例:

创建头文件Head.jsp

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

创建尾部Footer.jsp

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

创建Hello.js

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%@include file="Head.jsp"%>
我是Hello
<%@include file="Footer.jsp"%>
</body>
</html>
扩展

通过标签导入文件

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<jsp:include page="Head.jsp"></jsp:include>
我是Hello页面,通过jsp:include page标签导入的
<jsp:include page="Footer.jsp"></jsp:include>
</body>
</html>

总结:<jsp:include page=“Footer.jsp”></jsp:include>和指令<%@include file=“Footer.jsp”%>导入文件表面上看上去没有区别,但是在生成的java文件中有区别。

指令导入的文件只把另外的文件写道本java文件中,标签导入文件是把文件通过链接的方式导入。

指令导入的文件不可以出现相同的两给变量。标签的由于不在同一个方法中,所以可以定义相同的变量。

9大内置对象

​ jsp中的内置对象都在service中,所以只能在操作service中的数据。

pageContext//页面有用
session //一次会话有用
application//服务器不关闭就有用
config//配置文件
out//输出 
page//页面
request//一次请求
response//响应
exception//异常

重点掌握:

pageContext//页面有用

request//一次请求

session //一次会话有用

application//服务器不关闭就有用

上面4个都有作用域,也就是说可以存储东西,其取值的范围和上面顺序一样。pageContext作用域最小,只在本页读写。request一次请求读写,不多可以转发。session //一次会话有用,application//服务器不关闭就有用

EL表达式:

​ EL表达式的功能:

​ 获得数据

​ 执行运算

​ 获取web中开发的常用对象

EL表达式格式:

	${ }

获得数据:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
   <%! int i=10;
      String age="23";%>
   <% request.setAttribute("name","张三");%>
  <h1>获得的age的值${age}</h1>
  <h1>通过EL计算  ${10*3/1%4}</h1>
   <h1>通过EL获得request中的值:${requestScope.name}</h1>
  </body>
</html>

JSTL标签库

什么是jstl标签库?

jstl其实就是对html的不住之处做改进,他自定义了许多标签供我们使用,标签的功能和java一样。

根据JSTL标签所提供的功能,可以将其分为5个类别。

核心标签、格式化标签、SQL 标签、XML 标签、JSTL 函数

使用JSTL

1、使用任何库,你必须在每个 JSP 文件中的头部包含 标签。

核心库的:<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>在IDEA中可能会出现解析失败JSTL这个原因是项目部署时没把JSTLjar包导入服务器中,需要手动导入。

2、maven导入jar包:

    <dependency>
        <groupId>taglibs</groupId>
        <artifactId>standard</artifactId>
        <version>1.1.2</version>
    </dependency>

3.重点掌握的标签

1、<c:if test="" var="">,test表示判断添加先当于if()中的“()"功能 ,把得到的值赋给var

2、 <c:choose >、<c:when test="">、<c:otherwise >;choose:先当switch、wher:先当于case、otherwise:当执行条件都不满足时执行

3、 <c:forEach items="${strings}" var=“str” >;items:表示将要遍历的值、var:表示把items的值赋值给他、begin:表示从什么地方开始、end:什么地方结束、step:每次增加多少

<% int i=90;
    ArrayList<String> strings = new ArrayList<>();
    strings.add("张三");
    strings.add("张飞");
    strings.add("王五");
    strings.add("李四");
    request.setAttribute("strings",strings);
 %>

<%--

--%>
<c:if test="${i>=60}" var="" >
  <h3>及格</h3>
</c:if>
<c:if test="${i>=60}" var="" >
  <h3></h3>不及格</h3>
</c:if>

<%--
choose:先当switch
wher:先当于case
otherwise:当执行条件都不满足时执行
--%>
<h1>c:choose</h1>
  <c:choose>
    <c:when test="${i>=60}">
      <h3>choose及格</h3>
    </c:when>
     <c:when test="${i<60}">
        <h3>choose不及格</h3>
        </c:when>
  </c:choose>
<c:otherwise></c:otherwise>

  <h1>c:forEach</h1>
<%--
items:表示将要遍历的值
var:表示把items的值赋值给他
begin:表示从什么地方开始
end:什么地方结束
step:每次增加多少
--%>
   <c:forEach items="${strings}" var="str" >
       <c:out value="${str }"></c:out>
   </c:forEach>
  <c:forEach var="index" items="${strings}" begin="0" end="2" step="1">
      <c:out value="${index}"></c:out><br>
  </c:forEach>

JAVABean

javabean是什么

javabean其实就是一个很普通的类,主要用于ORM(对象关系映射)。

javabean中应该有构造方法,成员变量,及其成员变量的get/set方法。

JSP中使用javaBean

1、javabean

package com.taxing.test;

public class Studen {
    private String name;
    private String pass;

    public Studen() {
    }

    public Studen(String name, String pass) {
        this.name = name;
        this.pass = pass;
    }

    public String getName() {
        return name;
    }

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

    public String getPass() {
        return pass;
    }

    public void setPass(String pass) {
        this.pass = pass;
    }

    @Override
    public String toString() {
        return "Studen{" +
                "name='" + name + '\'' +
                ", pass='" + pass + '\'' +
                '}';
    }
}

2、jsp

获得bean
<jsp:useBean id="std" class="com.taxing.test.Studen" scope="page"></jsp:useBean>
  设置数据
    <jsp:setProperty name="std" property="name" value="小红"></jsp:setProperty>
  <jsp:setProperty name="std" property="pass" value="1234"></jsp:setProperty>
  获得数据
  <jsp:getProperty name="std" property="name"/>
  <jsp:getProperty name="std" property="pass"/>


Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐