JSP

一、什么是JSP

Java Server Pages:Java服务器端页面,也和servlet一样,用于动态web开发。
最大的特点

  • 写jsp就像在写html
  • 区别:
    Html只能给用户提供静态的数据
    JSP页面可以嵌入Java代码,为用户提供动态数据。

二、JSP原理

在idea的tomcat下有个work目录,下面会将jsp文件转化为java文件

浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet
JSP最终会被转换成一个java类
JSP本质上就是一个servlet
jsp被转换成java类后都会继承org.apache.jasper.runtime.HttpJspBase类,该类有三大方法

  • _jspInit()
  • _jspDestory()
  • _jspService()

我们可以自己新建一个类,继承该类。此时需要在pom中添加maven依赖。
在这里插入图片描述
在pom.xml中加入对应的jar包,maven依赖

<!-- https://mvnrepository.com/artifact/tomcat/jasper-runtime -->
<dependency>
    <groupId>tomcat</groupId>
    <artifactId>jasper-runtime</artifactId>
    <version>5.5.23</version>
</dependency>

org.apache.jasper.runtime.HttpJspBase可以写全名,也可以只写HttpJspBase。此时对应的Service()方法中的参数也会对应显示全名或只显示简单类名。

当继承org.apache.jasper.runtime.HttpJspBase

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 {
      }

当直接继承HttpJspBase

 public void _jspService(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {

    }

jsp被生成的类中包含的内容

  1. 判断请求
  2. 内置了一些对象
 	final javax.servlet.jsp.PageContext pageContext;   // 页面上下文
    javax.servlet.http.HttpSession session = null;   // session
    final javax.servlet.ServletContext application;   //applicationContext
    final javax.servlet.ServletConfig config;    //config
    javax.servlet.jsp.JspWriter out = null;    //out
    final java.lang.Object page = this;      //当前页
    HttpServletRequest httpServletRequest;
    HttpServletResponse httpServletResponse;
    javax.servlet.jsp.JspWriter _jspx_out = null;     
    javax.servlet.jsp.PageContext _jspx_page_context = null;
  1. 输出页面前增加的代码
response.setContentType("text/html");
      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;
  1. 以上这些对象,可以在jsp页面直接使用
${pageContext}

${sessionScope.get()}
${applicationScope.clear()}

jsp执行原理:
在这里插入图片描述
在webapp下新建一个hello.jsp,当执行之后会在C:\Users\Administrator.IntelliJIdea2019.3\system\tomcat\Unnamed_Javaweb_session_cookie_2\work\Catalina\localhost\Javaweb_session_cookie_war\org\apache\jsp目录下找到对应的Java和class文件
在这里插入图片描述
在JSP页面中
只要是Java代码就会原封不动的输出
如果是html代码,会被转换为:

out.write("<html>\n");

以这种格式输出到前端

参考文献:https://blog.csdn.net/panhaigang123/article/details/78920002

三、JSP基本语法

jsp表达式

<%--  jsp表达式
     作用:
     用于将程序的输出,输出到客户端
     <%= 变量或表达式%>
     --%>
  <%= new java.util.Date()%>

jsp脚本片段

<%--  jsp脚本片段--%>
  <%
    int sum = 0;
    for (int i = 0; i < 100; i++) {
      sum += i;
    }
    out.print("sum = "+sum);
  %>

脚本片段的再实现

<%
    int x = 10;
    out.print(x);
  %>
  <p>这是一个正常的jsp文档</p>
  <%
    out.println(x);
    int y = 2;
    out.println(y);
  %>
<%
    for (int i = 0; i < 5; i++) {
  %>
  <h1>hello,world <%= i%></h1>
  <%
    }
  %>

jsp声明

<%!
    static {
      System.out.println("Loading servlet");
    }
    public int globalVar = 0;
    public void test(){
      System.out.println("进入了test方法");
    }

  %>

jsp声明:会被编译到jsp生成的Java类中!其他的,就会被生成到_jspService()方法中!
在jsp中嵌入Java代码即可。

<%%>
<%=%>
<%! %>
<%-- 注释--%>

jsp的注释不会在客户端显示,而html的注释会在客户端查看源代码中显示

四、jsp指令

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@include file="common/header.jsp"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 自定义错误页面--%>
<%@page errorPage="error/500.jsp" %>
<%-- 显式地声明一个错误页面--%>
<%@ page isErrorPage="true" %>
<%--  导包--%>
<%@ page import="java.util.Date" %>
<%--  @include会将两个页面合二为一
      因此不能重新定义同名变量
      --%>
<%@include file="/common/header.jsp"%>
<h1>网页主体</h1>
<%@include file="/common/footer.jsp"%>
<hr/>
<%--  jsp标签
      jsp:include拼接页面,本质还是三个--%>
<jsp:include page="common/header.jsp"/>
<h1>网页主体</h1>
<jsp:include page="common/footer.jsp"/>

五、JSP九大内置对象

  • pageContext 存东西
  • request 存东西
  • response
  • session 存东西
  • application [ServletContext] 存东西
  • config [ServletConfig]
  • page 几乎不用
  • out
  • exception
    pageContext < request<session<application???
    session和application中的东西可以在其他页面访问到。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--    内置对象--%>
<%
    pageContext.setAttribute("name1","tom");  //保存的数据只在一个页面中有效
    request.setAttribute("name2","jerry");    //保存的数据只在一次请求中有效,请求转发会携带该数据
    session.setAttribute("name3","喜羊羊");    //保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
    application.setAttribute("name4","灰太狼");   //保存的数据只在一次会话中有效,从打开服务器到关闭服务器
%>
<%--    脚本片段的java代码,会被原封不动的生成到jsp对应的Java文件中,
      因此这里面的语法规则必须遵循Java语法规则--%>
<%
    String name1 = (String) pageContext.findAttribute("name1");
    String name2= (String) pageContext.findAttribute("name2");
    String name3 = (String) pageContext.findAttribute("name3");
    String name4 = (String) pageContext.findAttribute("name4");
    String name5 = (String) pageContext.findAttribute("name5");
%>
<%--   使用EL表达式进行输出,EL表达式输出的内容,必须是全局的--%>
<h1>取出的值为:</h1>
<h2>${name1}</h2>
<h2>${name2}</h2>
<h2>${name3}</h2>
<h2>${name4}</h2>
<h2>${name5}</h2>
<hr/>
<p>分隔符</p>
<%=name5%>
</body>
</html>

pageContext.setAttribute("name6","hhh",PageContext.SESSION_SCOPE);
    session.setAttribute("name6","hhh");

request
session
application
各自的作用域可参考:添加链接描述

六、JSP标签、JSTL标签、EL表达式

EL表达式

  • 获取数据
  • 执行运算
  • 获取web开发的常用对象
  • 调用Java方法

JSP标签

<%--<jsp:include page=""--%>
<jsp:forward page="jsptag2.jsp">
    <jsp:param name="name1" value="tom"/>
    <jsp:param name="name2" value="jerry"/>
</jsp:forward>

jstl表达式
JSTL标签库的使用就是为了弥补html的缺陷,它有许多自定义标签可以供我们使用,标签的功能和Java代码一样。
JSTL标签时使用步骤

  1. 导入对应的标签库
  2. 使用你所需的方法。
  3. 导包错误
  • 核心标签
    在这里插入图片描述
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="coreif.jsp" method="get">
    <input type="text" name="username" value="${param.username}"/>
    <input type="submit">
</form>
<c:out value="欢迎进入登录页面!"/>
<c:if test="${param.username=='admin'}" var = "isAdmin">
    <c:out value="欢迎进入管理员模式"/>
</c:if>
<c:out value="${isAdmin}"/>

</body>
</html>

c:when

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
    <title>Title</title>
</head>
<body>
<c:set var="score" value="85"/>
<c:choose>
    <c:when test="${score>=90}">
            你的成绩为优秀
    </c:when>
    <c:when test="${score>=80}">
        你的成绩为良好
    </c:when>
</c:choose>

</body>
</html>

c:forEach

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    ArrayList<String> people = new ArrayList<>();
    people.add(0,"yon");
    people.add(1,"张三");;
    people.add(2,"张si");
    people.add(3,"张仨");
    people.add(4,"张四");
    people.add(5,"张五");
    people.add(6,"张六");
    request.setAttribute("list",people);
    for (int i = 0; i < 7; i++) {
        out.print(people.get(i));
    }
%>
<hr/>
<c:forEach var="people" items="${list}">
    <c:out value="${people}"/>
</c:forEach>
<hr/>
<c:forEach begin="0" end="6" step="2" items="${list}" var="people">
    <c:out value="${people}"/>
</c:forEach>
</body>
</html>

  • 格式化标签
  • sql标签
  • xml标签
Logo

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

更多推荐