JSP

发布时间 2023-06-29 11:18:38作者: 云归处、

JSP

什么是JSP?

Java Server pages:java服务器端页面,和Servlet一样,用于动态web技术

最大的特点:

  • 写jsp就像在写HTML
  • 区别:
    • HTML只能提供静态数据,
    • JSP页面可以嵌入java代码,为用户提供动态数据

JSP原理

浏览器向服务器发送请求,不管访问什么资源,其实都是在访问servlet

项目中jsp文件在本机下载tomcat目录(或idea的tomcat目录中) work目录下文件中的jsp文件

  • JSP最终会被转为java类

  • JSP本质就是一个servlet

  • 例如一个jsp文件中的“”一行在最终转换的java文件可能被转换为“out.write("\n")”,当然这只是该java文件中的一小部分。但是至少反映了jsp的作用:减少程序员的代码量,减少繁琐的过程

  • servlet(jsp转换的java文件)中关于jsp的方法:!

  • jsp最终转换的java文件中的步骤:

    1. 判断请求

    2. 内置对象

  1. 输出页面前相关设置

 以上对象我们可以在写jsp时直接用
  1. 输出我们写的页面

原理图:

在jsp中:只要是java代码就会原封不动,html格式out.write(html代码)进行转换

JSP基础语法和指令

JSP基础语法

学习前我们需要在pom.xml中导入四个依赖:

<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<!--servlet-->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
<!--jsp-->
<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>javax.servlet.jsp-api</artifactId>
    <version>2.3.3</version>
    <scope>provided</scope>
</dependency>
<!-- jstl表达式依赖-->
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl-api -->
<dependency>
    <groupId>javax.servlet.jsp.jstl</groupId>
    <artifactId>jstl-api</artifactId>
    <version>1.2</version>
</dependency>
<!--Standard标签库-->
<!-- https://mvnrepository.com/artifact/taglibs/standard -->
<dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
</dependency>
  • JSP表达式:
<%--jsp表达式:将程序的输出,输出到客户端--%>
<%--   格式:<%=java变量或者表达式%>         --%>
<%= new java.util.Date()%>
  • JSP脚本片段:
<%--JSP脚本片段:可以写多行,多个脚本片段可以理解为再一个函数中可以相互调用-%>
<%
    int sum=0;
    for (int i = 0; i < 100; i++) {
        sum+=i;
    }
    out.print("<h1>sum="+sum+"</h1>");
%>
<%
 out.print("<h1>sum="+sum+"</h1>");
%>
  • 脚本片段的再实现:
<%
    for (int i = 0; i < 5; i++) {
%>
<h1>
    Hello World
</h1>
<%
    }
%>

html和jsp脚本片段可以来回嵌套

  • JSP声明
<%!
    static {
        System.out.println("Hello World");
    }
    private  int a = 0;
    public  void  Method(){
        System.out.println("进入方法方法");
    }
%>

JSP声明会被编译到jsp生成的java类中!而其他的会被生成到一个其中_jspService方法中

所以,jsp的层级会相比其他高一些

JSP指令

  • 三种指令标签:

    • <%@ page ... %>:定义网页依赖属性,比如脚本语言、error页面、缓存需求等等
    • <%@ include ... %> :包含其他文件
    • <%@ taglib ... %>:引入标签库的定义
  • page:相关属性

例如:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--导入包--%>
<%@ page import="java.util.Date" %>
<%--定制错误页面:当发生错误如500定向到定制错误页面--%>
<%@page errorPage="error.jsp" %>
<%--声明这是一个错误页面--%>
<%@page isErrorPage="true" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%=1/0%>
</body>
</html>

另外还有可以再web.xml中定制错误页面:

<error-page>
    发生404错误时
    <error-code>404</error-code>
    <location>/error.jsp</location>
</error-page>
<error-page>
    发生500错误时
    <error-code>500</error-code>
    <location>/error2.jsp</location>
</error-page>
  • include:通过include指令来包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是该JSP文件的一部分,会被同时编译执行。

    Include指令的语法格式如下:

    <%@ include file="文件相对 url 地址" %>
    

    例子:

    会将几个页面合二为一
    <%@include file="/header.jsp"%>
    <h1>Hello World</h1>
    <%@include file="/footer.jsp"%>
    

    jsp标签:

    拼接页面,本质还是三个
    <jsp:include page=""></jsp:include>
    <h1>Hello World</h1>
    <jsp:include page=""></jsp:include>
    
    还有其他jsp标签:例如
    <jsp:body></jsp:body>
    <jsp:attribute name=""></jsp:attribute>
    
  • taglib:Taglib指令引入一个自定义标签集合的定义,包括库路径、自定义标签。语法:

     <%@ taglib uri="uri" prefix="prefixOfTag" %>
    

九大内置对象

  • request

  • response

  • pageContext

  • page

  • session

  • application [servletContext]

  • out

  • exception

  • config [servletConfig]

<%
//   下面四个 都可以存放数据和对应的取数据(getAttribute)(可以提供一种内置对象的get取得所有的)
    pageContext.setAttribute("a",1);//只在这一个页面有效
    request.setAttribute("b",2);//在一次请求中有效,请求转发会携带该数据
    session.setAttribute("c",3);//一次会话中有效(打开到关闭浏览器)
    application.setAttribute("d",4);//服务器中有效(打开到关闭服务器)

//寻找机制从底层到高层
    int a = (int)pageContext.getAttribute("a");
    int b = (int)pageContext.getAttribute("b");
	int b = (int)request.getAttribute("b");
%>

request:客户端向服务器发生请求,存储用户看完了就没用的,比如新闻

session:客户端向服务器发生请求,用户看完一会还有用,如购物车

application::客户端向服务器发生请求,产生的数据一个用户用完了,其他用户还需要用的,比如:聊天数据

EL表达式

四大作用:

  • 获取数据
  • 执行运算
  • 获取web开发常用对象
  • 调用java方法
<%
    int a = 1;
%>

<h1>${a}</h1>
<form action="index.jsp" method="get">
    <input type="text" name="username" value="${param.username}">
    <input type="submit" value="登录">
</form>

JSP标签

<%--转发:打开该页面跳到error.jsp,但url不变--%>
<jsp:forward page="/error.jsp">
<%--    传递参数--%>
    <jsp:param name="name" value="lihua"/>
    <jsp:param name="age" value="15"/>
</jsp:forward>
在error.jsp中得到传递的参数
<h1>名字:<%=request.getParameter("name")%></h1>
<h1>年龄:<%=request.getParameter("age")%></h1>

这只是一个例子:jsp还有很多,可以自行查阅

JSTL表达式

JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。定义了许多标签弥补一定html标签的不足。

引用核心标签库的语法如下:

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

核心标签有:

还有sql标签,xml标签等

可以参考JSP 标准标签库(JSTL) | 菜鸟教程 (runoob.com)

使用JSTL标签步骤:

  • 引入对应taglib
  • 使用其中的方法

在导入jstl核心标签库发现出错,最终手动将D:\Maven\apache-maven-3.6.3-bin\apache-maven-3.6.3\maven-repo\javax\servlet\jstl\1.2中的jstl-1.2.jar包复制粘贴到tomcat中D:\tomcat\apache-tomcat-9.0.75-windows-x64\apache-tomcat-9.0.75\lib解决,可能是因为tomcat和maven的版本冲突

c:if例子:

<%@ 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="jsp.jsp" method="get">
    <input type="text" name="username" value="${param.username}">
    <input type="submit" value="登录">
</form>
<%--判断如果提交的用户名是管理员,就登录成功--%>
<%--var表示把判断结果的真假值赋给var中的参数--%>
<c:if test="${param.username=='admin'}" var="isAdmin">
    <c:out value="管理员欢迎你"></c:out>
</c:if>
<c:out value="${isAdmin}"></c:out>
</body>
</html>

结果:

<%--定义一个变量score值为85--%>
<c:set var="score" value="85"></c:set>
<%--判断--%>
<c:choose>
    <c:when test="${score>90}"></c:when>
    <c:when test="${score>80}"></c:when>
</c:choose>
<%--for-each--%>
<c:forEach var="people" items="${list}">
    <c:out value="${people}"></c:out>
    <br>
</c:forEach>
<%--for-i--%>
<c:forEach begin="" end="" step=""></c:forEach>