目录
一、JSP是什么?
JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。 网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。 JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。
1.JSP和HTML的区别
- HTML只给用户提供静态的数据
- JSP页面中可以嵌入JAVA代码,为用户提供动态数据
JSP本质上是一个Servlet,在第一次访问jsp页面时,他需要先编译成servlet程序,再编译成servlet字节码(.class文件),再动态生成HTML页面返回给客户端(浏览器)
可以通过观察tomcat的work目录来观察jsp都做了些啥
二、JSP的使用
1.导入依赖
jakarta版本:
<dependencies>
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>5.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jakarta.servlet.jsp</groupId>
<artifactId>jakarta.servlet.jsp-api</artifactId>
<version>3.0.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
javax版本:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
2.JSP的基本语法
脚本片段
脚本片段可以包含任意量的Java语句、变量、方法或表达式
语法格式:
<% 代码片段 %>
具体例子:
<html>
<head><title>Hello World</title></head>
<body>
Hello World!<br/>
<%
out.println("Your IP address is " + request.getRemoteAddr());
%>
</body>
</html>
JSP表达式
一个JSP表达式中包含的脚本语言表达式,先被转化成String,然后插入到表达式出现的地方。表达式元素中可以包含任何符合Java语言规范的表达式,但是不能使用分号来结束表达式
语法格式
<%= 表达式 %>
具体例子
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
<p>
今天的日期是: <%= (new java.util.Date()).toLocaleString()%>
</p>
</body>
</html>
JSP注释
语法格式
<%-- 该部分注释在网页中不会被显示--%>
注:jsp注释和html注释的区别
语法 | 描述 |
---|---|
<%-- 注释 --%> | JSP注释,注释内容不会被发送至浏览器甚至不会被编译 |
<!-- 注释 --> | HTML注释,通过浏览器查看网页源代码时可以看见注释内容 |
JSP声明
一个声明语句可以声明一个或多个变量、方法,供后面的Java代码使用
语法格式:
<%! declaration; [ declaration; ]+ ... %>
具体例子
<html>
<head><title>Hello World</title></head>
<body>
Hello World!<br/>
<%!
static {
System.out.println("Loading Servlet");
}
private int globalVar = 0;
public void method(){
System.out.println("进入了方法!");
}
%>
</body>
</html>
JSP声明会被编译到JSP生成Java的类中!其他的代码会被生成到_jspService方法中!
JSP声明:
其他代码
JSP指令
JSP指令用来设置与整个JSP页面相关的属性。
指令 | 描述 |
---|---|
<%@ page … %> | 定义页面的依赖属性,比如脚本语言、error页面、缓存需求等等 |
<%@ include … %> | 包含其他文件(如公共页面footer,header) |
<%@ taglib … %> | 引入标签库的定义,可以是自定义标签 |
具体例子:
<%--@include会将两个页面合二为一--%>
<%-- 如果代码有java片段,可能会导致重复定义问题 --%>
<%@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的九大内置对象和四大作用域
1.九大内置对象
- PageContext 存东西
- Request 存东西
- Session 存东西
- Application (即SerlvetContext) 存东西
- Response
- config (即SerlvetConfig)
- out 输出到页面
- page ,不用了解
- exception
2.四大作用域
四个存东西的对象的作用范围
- pageContext:只在一个页面保留数据
- request:只在一个请求中保存数据
- session:在一次会话中保存数据,仅供单个用户使用
- application:在整个服务器中保存数据,全部用户共享
<%
pageContext.setAttribute("name1","a");
//保存的数据只在一个页面中有效
request.setAttribute("name2","b");
//保存的数据只在一次请求中有效,请求转发会携带这个数据
session.setAttribute("name3","c");
//保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
application.setAttribute("name4","d");
//保存的数据只在服务器中有效,从打开服务器到关闭服务器(就是ServletContext)
%>
<%
//简单来说从pageContext取出,通过寻找的方式
//作用域从底层到高层:page-->request-->session-->application
//类似于双亲委派机制(JVM)
String name1 = (String)pageContext.findAttribute("name1");
String name2 = (String)pageContext.findAttribute("name2");
String name3 = (String)pageContext.findAttribute("name3");
String name4 = (String)pageContext.findAttribute("name4");
%>
<%
<%=name1%>
<%=name2%>
<%=name3%>
<%=name4%>
${name5}
<%--EL表达式输出不存在的数据会自动过滤掉,但是<%=name5%>不会,会输出null--%>
%>
<%--使用EL表达式别忘了添加isELIgnored="false"开头--%>
注意pageContext的findAttribute和getAttribute的区别pageContext.findAttribute()与pageContext.getAttribute()的区别
四、JSP标准标签库、EL表达式
导入依赖
jakarta版本:
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jakarta.servlet.jsp.jstl</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
如果使用旧的阿里云镜像可能无法下载到jakarta.servlet.jsp.jstl依赖
javax版本:
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
1.JSP标准标签库(JSTL)
JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。
- 核心标签(重点掌握)
- 格式化标签
- SQL标签
- XML 标签
2.EL表达式${ }
注意:jsp中可能存在EL表达式原样输出的问题
解决:jsp中添加<%@ page isELIgnored=“false” %>
- 获取数据
- 执行运算
- 获取web开发的常用对象
Tips
可以在web.xml设置相应的错误代码跳转到哪个页面
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>