1.1JSP基础语法
我们进行创建web项目如下所示:javaweb-jsp:
之后我们进行导入包到pom.xml:
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
</dependency>
我们还需要进行导入一个别的包:jstl-api:
我们进入Maven仓库进行查找:https://mvnrepository.com
我们点击第一个,如下所示:
我们进入界面之后,点击1.2,进行复制到pom.xml:
<!-- 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>
我们导入之后,jstl包会依赖一个包,我们同样在Maven仓库里面进行搜索。
我们点击进去复制即可:
<!-- https://mvnrepository.com/artifact/taglibs/standard -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
我们导入进去如下所示:
我们所需要导入的依赖的包如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>untitled2</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>javaweb-jsp</artifactId>
<packaging>war</packaging>
<name>javaweb-jsp Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--JSP 依赖-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<!--Servlet 依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</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>
</dependencies>
</project>
任何语言都有自己的想法,JAVA中有,JSP作为java技术的一种应用,他拥有一些自己扩充的语法(了解,知道即可),java所有语法都支持!
我们了解热部署:热部署就是你改变了代码不需要重启服务器页面上的内容会自动刷新改变
我们之后进行Tomcat的配置。然后我们进行编写index.jsp。之后点击运行如下所示:
<html>
<head>
<title>$Title$</title>
</head>
<body>
$END$
</body>
</html>
我们配置过程如下所示:
在这个过程中,我们需要将main下面进行完善目录:
之后我们点击运行,如下所示:
我们发现成功的运行出来了。
我们在点击运行的时候,我们发现如下所示:
其中Redeploy是把项目重新发布。Restart server为重新启动tomcat。Update classes and resources为及时更新class和资源。
选择Update classes and resources不用再重启项目了,比较快捷。
出现这个选项我们可以再配置tomcat的时候选择war exploded即可:jsp里面进行编写如下所示:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--以上的<% %>里面的内容为Java里面的内容--%>
<html>
<head>
<title>$Title$</title>
</head>
<body>
$END$
<%--注释的格式--%>
<%--JSP表达式--%>
<%=new java.util.Date()%><%--其中=之后可以写java的东西,进行取出内容--%>
</body>
</html>
点击Update classes and resources,如下所示:
我们发现java的实现已经被打印出来了。一切的Java代码都是原封不动的进行输出。
JSP表达式:
<%--注释的格式--%>
<%--JSP表达式
作用:用来将程序的结果输出到客户端--%>
<%=变量或者表达式 %> 相当于out.print
<%=new java.util.Date()%><%--其中=之后可以写java的东西,进行取出内容--%>
%--以上的<% %>里面的内容为Java里面的内容--%>
JSP脚本片段:
<hr>
<%--JSP脚本片段,可以写多行代码--%>
<%--println可以换行,只要我们写了标签,JSP源码会自动帮我们进行转义--%>
<%
int sum=0;
for (int i=1;i<=100;i++){
sum+=i;
}
out.println("<h1>Sum="+sum+"</h1>");
%>
我们进行运行如下所示:
脚本片段的再实现:
我们的代码如下所示:
<%
int x=10;
out.println(x);
%>
<p>这是一个JSP文档</p>
<%
int y=20;
out.println(y);
%>
<hr>
我们进行运行之后如下所示:
我们再进行如下代码所示:
<%
for (int i = 0; i < 5; i++) {
%>
<h1>hello,rgf</h1>
<%
}
%>
运行界面如下所示:
同时我们也可以往标签里面进行嵌入东西:
<%--在代码中嵌入html元素--%>
<%
for (int i = 0; i < 5; i++) {
%>
<h1>hello,rgf <%=i%></h1>
<%
}
%>
我们运行之后如下所示:
我们找到该文件的源码进行查看:
源码文件夹如下所示:
C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2022.1\tomcat\060f05dc-727f-4cf1-b15f-3fc617a8a14b\work\Catalina\localhost\javaweb_jsp_war_exploded\org\apache\jsp
我们打开进入如下所示:
我们所写的代码都是在_jspService方法里面,能够被它请求处理。
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('\n');
out.write('\n');
out.print(new java.util.Date()); //直接打印输出
out.write('\n');
out.write("\n");
out.write("<hr>\n");
out.write('\n');
out.write('\n');
int sum=0;
for (int i=1; i<=100; i++){
sum+=i;
}
out.println("<h1>Sum="+sum+"</h1>"); //for循环里面嵌套了一个输出
out.write('\n');
out.write('\n');
int x=10;
out.println(x);
out.write("\n");
out.write("<p>这是一个JSP文档</p>\n");
int y=20;
out.println(y);
out.write("\n");
out.write("<hr>\n");
out.write('\n');
for (int i = 0; i < 5; i++) {
out.write("\n");
out.write("<h1>hello,rgf ");
out.print(i);
out.write("</h1>\n");
}
out.write("\n");
out.write("</body>\n");
out.write("</html>\n");
JSP声明
我们进行编写代码看是否会出现在jspService方法外面:代码如下所示:
<%--static是静态代码块,globalVar为全局变量--%>
<%!
static {
System.out.println("Loading Servlet!");
}
private int globalVar=0;
public void rgf(){
System.out.println("进入了方法rgf");
}
%>
我们运行之后,进入源码如下所示:
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports {
static {
System.out.println("Loading Servlet!");
}
private int globalVar=0;
public void rgf(){
System.out.println("进入了方法rgf");
}
我们发现我们所编写的方法没有进入jspService方法里面,而是在方法外面,这样子的作用域更高了。
JSP声明:会被编译到JSP生成java的类中!其他的就会被生成到jspService方法中!(在方法里面的可以调用方法外面的,在方法外面的作用域更高一些)
在JSP中,嵌入java代码即可。
但是其中的代码,我们看着不是很舒服:
<%--在代码中嵌入html元素--%>
<%for (int i = 0; i < 5; i++) {
%>
<h1>hello,rgf <%=i%></h1>
<% } %>
我们可以进行修改如下所示:
<%--在代码中嵌入html元素--%>
<%for (int i = 0; i < 5; i++) {
%>
<%request.setAttribute("i",String.valueOf(i)); %>
<h1>hello,rgf ${i}</h1>
<% } %>
其中,通过${ }这种方式取出来,被称为EL表达式,EL表达式是获取共享对象中的值。
<%%> //片段
<%=%> //表达式,输出一个值
<%! %> //定义一些全局的方法
<%-- --%> //JSP的注释
<!-- --> //html的注释
JSP与HTML的注释是有区别的,如下所示:
<%--我是JSP的注释--%>
<!--我是html的注释-->
我们进行运行之后如下所示:
我们发现的确界面没有显示注释内容。我们查看源码如下所示:
我们发现html的注释依旧可以被查看。JSP的注释无法查看了
JSP的注释不会再客户端显示,HTML就会。
1.2JSP指令
我们创建一个新的jsp2.jsp,输入如下代码:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
int x=1/0;
%>
</body>
</html>
运行之后如下所示:
我们发现出错了,异常为除数不能为0.。那我们如何定制错误页面呢:
(1)500错误界面配置:
(1)我们自定义过程如下所示:

autoFlush为自动刷新,buffer为被缓存,errorPage为错误页面,extends为继承,import为可以导入一些资源。info为写一些该类信息,写一些pageEncoding的编码。isErrorPage是否是错误页面。
其中import,应用如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@page import="java.util.*" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
$END$
<%--注释的格式--%>
<%--JSP表达式
作用:用来将程序的结果输出到客户端--%>
<%=new Date()%><%--其中=之后可以写java的东西,进行取出内容--%>
<%--以上的<% %>里面的内容为Java里面的内容--%>
<hr>
我们将util包导入进去之后,我们输出时间可以直接new该包下面的类即可。
我们创建错误界面如下所示:我们新建一个error的项目,然后创建500.jsp:
500.jsp的代码如下所示:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>title</title>
</head>
<body>
<h1>自定义500错误的界面</h1>
</body>
</html>
我们再jsp2.jsp的代码如下所示:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--定制错误页面--%>
<%@ page errorPage="error/500.jsp" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
int x=1/0;
%>
</body>
</html>
我们点击运行后如下所示:
我们发现该界面非常简陋,之后我们再网站上进行搜索界面,截图保存到本地。导入到webapps里面的img文件夹下。
如下所示:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>title</title>
</head>
<body>
<h1>自定义500错误的界面</h1>
<img src="${pageContext.request.contextPath}/img/500.png" alt="500">
</body>
</html>
我们所设置的文件夹如下所示:
之后我们点击运行如下所示:
我们所使用图片可以直接拖进img文件夹下。同时图片可以通过截图的形式进行存储,最好用png格式的图。当然,jpeg格式的图片也可以。
如果我们代码没有问题:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--定制错误页面--%>
<%@ page errorPage="error/500.jsp" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
int x=1/1;
%>
</body>
</html>
则不会调跳转到错误页面:
(2)手动配置404界面:
我们也可以手动的进行更改错误界面:
首先我们再error目录下创建404.jsp,之后我们去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_3_1.xsd"
version="3.1"
metadata-complete="true">
<error-page>
<error-code>404</error-code>
<location>/error/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error/500.jsp</location>
</error-page>
</web-app>
修改了web.xml,就要重启tomcat。
之后我们利用同样的步骤,将图片存到img里面,设置404.jsp的代码如下所示:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>自定义404错误的界面</h1>
<img src="${pageContext.request.contextPath}/img/404.png" alt="404">
</body>
</html>
我们运行之后如下所示:
<%@ include file="" %>使用这个来进行提取公共页面。
<%@page ....这边会有很多参数%>
<%@ page errorPage="error/500.jsp" %>
<%@ include file="" %>
<%@ include file="" %>使用这个来进行提取公共页面。
公共的页面文件一般会起一个名字叫common,我们设立该文件夹。
我们设立头部和底部的代码,然后将该文件嵌入jsp2:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<h1>我是Header</h1>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<h1>我是Footer</h1>
这两个页面不是完整的,我们可以把这两个页面嵌进jsp3.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%@include file="common/header.jsp"%>
<h1>网页主体</h1>
<%@include file="common/footer.jsp"%>
</body>
</html>
我们运行之后如下所示:
我们也可以单独进行访问:
我们要找准目标文件下的文件夹,要把路径找对。
我们发现还有好多标签:
我们设置代码如下所示:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%@include file="common/header.jsp"%>
<h1>网页主体</h1>
<%@include file="common/footer.jsp"%>
<%--JSP标签--%>
<jsp:include page="common/header.jsp"/>
<h1>网页主体</h1>
<jsp:include page="common/footer.jsp"/>
</body>
</html>
我们发现标签里面的page代表一个页面,这个页面是当前web下面的页面,我们需要再前面加一个web路径,即加一个/。而上面的file为一个文件。
我们运行之后如下所示:
两者之间是存在不同之处的:我们进入源码进行查看:
我们发现static包含了一个页面,这个页面是我们要导入进去的页面。
static {
_jspx_dependants = new java.util.HashMap<java.lang.String,java.lang.Long>(2);
_jspx_dependants.put("/common/header.jsp", Long.valueOf(1662718252375L));
_jspx_dependants.put("/common/footer.jsp", Long.valueOf(1662718252432L));
}
我们正常写的页面都在public void _jspService里面:
out.write("<h1>我是Header</h1>\r\n");
out.write("\r\n");
out.write("<h1>网页主体</h1>\r\n");
out.write("\r\n");
out.write("<h1>我是Footer</h1>\r\n");
out.write("\r\n");
out.write("\r\n");
out.write('\r');
out.write('\n');
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "/common/header.jsp", out, false);
out.write("\r\n");
out.write("<h1>网页主体</h1>\r\n");
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "/common/footer.jsp", out, false);
我们发现下面的代码去引用的,是拿到了这个文件。而这个文件被它前面的static静态资源包含进去了
而上面的输出是直接包含进去的。将两个合二为一了。
为了更加形象的看出他俩的区别,我们如下所示:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<h1>我是Footer</h1>
<%
int i=0;
%>
之后进入jsp3.jsp进行设置:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--会将两个页面合二为一--%>
<%@include file="common/header.jsp"%>
<h1>网页主体</h1>
<%
int i=10;
%>
<%@include file="common/footer.jsp"%>
<%--JSP标签
jsp:include:拼接页面,本质还是三个。一般用这个,灵活性更高
--%>
<jsp:include page="/common/header.jsp"/>
<h1>网页主体</h1>
<jsp:include page="/common/footer.jsp"/>
</body>
</html>
我们按照逻辑来看,再上面的代码里面,就会将两个int i全部放进去,运行之后如下所示:
我们进入IDEA发现错误如下所示:
错误原因是int i重名了。
我们直接再下面填写int i的时候,发现直接报错了:
我们将上面的全部删除后如下所示:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--JSP标签
jsp:include:拼接页面,本质还是三个。一般用这个,灵活性更高
--%>
<jsp:include page="/common/header.jsp"/>
<h1>网页主体</h1>
<jsp:include page="/common/footer.jsp"/>
<%
int i=10;
%>
</body>
</html>
运行后如下所示: