虽然JSP据说听一遍就行了,但……
朴实且无关的知识
添加框架支持:普通的Maven项目是没有Web支持的,如果想让普通项目变成Web项目,需要添加Web支持(右键项目->添加框架支持)
自闭和标签:
普通的标签<h1>...</h1>
自闭和标签<h1/>
当然,必须是有功能的标签才能这么写,否则就是空标签
前置工作
在pom.xml中添加依赖
<dependencies>
<!--JSTL表达式依赖-->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<!--Servlet依赖-->
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>5.0.0</version>
</dependency>
<!--standard标签库-->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<!--JSP依赖-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
一共四个包,
servlet-api
、jsp-api
、jstl-api
、standard
,在Maven仓库挑选适合的版本即可,其中jstl-api
和standard
是使用JSTL和EL表达式的依赖
JSP语法
- JSP表达式
<%= 变量或表达式 %>
(等同于EL表达式${ 变量或表达式 }
)- JSP脚本片段
<% Java代码 %>
- 脚本片段与HTML穿插
<% Java代码 %>
<标签名>html代码或文本</标签名>
<% Java代码 %>
比如说:
<% for(int i = 0; i < n; i++){ %>
<h1>随便写点什么</h1>
<% } %>
就是写n句“随便写点什么”的作用
再比如:
<% for(int i = 0; i < n; i++){ %>
<h1>写了第<%= i+1 %>句话</h1>
<% } %>
是html中插入JSP表达式
会从1到n写“写了第x句话”
只要你想,甚至可以无限套娃- JSP声明
<%! 函数、静态代码块、全局变量等 %>
- 注释
<%-- 注释内容 --%>
注意:JSP的注释不会显示在网页源码上,而HTML的注释会- 导入包
<%@ page import="包名" %>
注意,这个导入包与在java中相同,如果用IDEA的话,会自动导入- 错误页面A
首先在正确的地方新建一个jsp文件作为error页面,页面内容可以是文本,也可以导入图片或者两者都有(如果遇到JSP没有模板的问题,可以参考这篇文章——【IntelliJ IDEA】使用idea解决新建jsp文件而找不到jsp文件模版的新建选项)
导入图片的话在<body>中写<img src="图片路径" alt="图片无法显示的提示">
然后在请求后可能出现错误的jsp文件开头写<%@ page errorPage="Web或Webapp文件夹下error页面jsp文件路径名" %>
示例:
这里打不开图片的原因是我的图片路径错误了,改成<img src="${pageContext.request.contextPath}/img/error.jpg" alt="500error">
就行了,即在前面加上${pageContext.request.contextPath}代表取得部署的应用程序的绝对路径- 错误页面B
如果不知道自己写的JSP可能会报错,就可能会忘记设置错误页面
所以可以使用这种一了百了的方式——直接在web.xml里面标明错误页面<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>
- 拼接页面
用到了<%@include file="相对web文件夹的文件路径"%>
指令,比如我在web文件夹下新建一个common文件夹,在里面建了header.jsp和footer.jsp两个文件,如图
然后在需要加页眉和页脚的jsp中用include指令就可以实现页面的拼接了<%-- Created by IntelliJ IDEA. User: hoppi Date: 2021/5/13 Time: 13:16 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Home</title> </head> <body> <%@include file="common/header.jsp"%> <h1>It's a Demo</h1> <%@include file="common/footer.jsp"%> </body> </html>
效果:
JSP标签可以起到相同的作用,<jsp:include page="/common/header.jsp"/>
和<%@include file="common/header.jsp"%>
的效果是相同的,原理有细微差别,前者是引用文件,后者是拼接代码,并且标签引用文件中的的代码互不影响,include指令则容易出现重名的问题
JSP九大内置对象
- pageContext
- request
- response
- session
- application(ServletContext)
- config(ServletConfig)
- out
- page
- exception
用来存放信息的对象:1、2、4、5
这些对象可以用来存放信息,也可以通过自己的getAttribute
方法取出信息
然而,我们可以直接通过pageContext来取出所有这些信息,用到的方法是findAttribute
Tip:在页面输出信息的时候最好用EL表达式${ }
,因为如果找不到值JSP表达式<%= %>
会输出null,而EL表达式不会。另,EL表达式会直接取attribute中的值,JSP表达式则必须在之前的代码中定义该对象才行
这些对象保存信息的作用域:
- pageContext:
只在当前页面有效- request:
只在一次请求中有效,转发请求会携带此对象中的信息- session:
只在一次会话中有效- application:
在服务器中有效
JSP常用标签
包含标签 <jsp:include page=“xx.jsp”/>
比如:
<%@ page contentType="text/html;charset=UTF-8"%>
<html>
<head>
<title>Home</title>
</head>
<body>
<jsp:include page="/common/header.jsp"/>
<h1>饮茶,OK?</h1>
<jsp:include page="/common/footer.jsp"/>
</body>
</html>
注意:包含标签是直接引用文件,故不会出现重名,举个例子,在上面代码中
header.jsp
文件里添加一行<% char a = 'v'; %> <%= a %>
在
footer.jsp
文件里添加一行<% int a = 114514; %> <%= a %>
更新资源
转发标签<jsp:forward page=“xx.jsp”/>
没什么好注意的
附加信息标签<jsp:param name=“xx” value=“xx”/>
这个标签通常与其他jsp标签一起用,使用此标签可以实现传值
比如
<-- 这是index.jsp文件 --> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Home</title> </head> <body> <jsp:include page="common/header.jsp"/> <jsp:include page="forgotten.jsp"> <jsp:param name="name" value="hoppinging"/> </jsp:include> <jsp:include page="common/header.jsp"/> </body> </html>
<-- 这是forgotten.jsp文件 --> <%@ page contentType="text/html;charset=UTF-8" %> <html> <head> <title>The Forgotten</title> </head> <body> <img src="${pageContext.request.contextPath}/img/TheForgotten.png" alt="The Forgotten"> <br> user: <%= request.getParameter("name")%> </body> </html>
forgotten.jsp就是一张图片+取出参数语句
效果:
JSTL常用标签
JSTL标签库的使用是为了弥补HTML标签的不足,说明请参考JSTL标签库
我们只需要掌握核心标签的使用,至于SQL标签或XML标签这种,一般是用的时候查就好了,当然,不掌握也没事,主要是为了让代码看起来更整齐
使用JSTL标签库需要在JSP文件开头声明引用
比如用JSTL核心标签就要写<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
核心标签具体用法如图
注意:导入标签库Tomcat可能会报错,像
org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:55)
这种的,是因为Tomcat服务器中没有JSTL的包,这时需要从项目中找到这个包,复制到Tomcat的lib目录下,如图所示
当然如果你用的Tomcat10(我用的这个,太垃圾不推荐使用),那么以上方法不适用,请参考这篇文章,然后同样把JSTL包复制到Tomcat的lib下就好了
尚待解决的问题:我的<c:if>和<c:choose>标签无法使用,查了很多方法,也不知道怎么解决,有大佬有好的方法欢迎留言_(:з」∠)_