0%

JSP语法

JSP学习笔记之JSP语法

搭建开发环境

新建一个普通Maven项目作为主工程(project),以后的代码演示都在该主工程内新建子模块(module)进行。(注意,一个子模块就是一个web应用程序。具体怎么创建工程和子模块,可以访问这里:传送门)。

JSP页面开发,用到以下依赖(将下边的依赖配置语句,放到主工程的pom.xml文件中):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    <dependencies>
<!-- servlet依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<!-- jsp依赖-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
</dependency>
<!-- JSTL表达式的依赖-->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<!-- standard标签库的依赖-->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
</dependencies>

Tomcat配置,使用热部署的方式,提高开发效率。(web项目部署时,选择exploded结尾的artifacts)

JSP基础语法

任何语言都有自己的语法。Java中有,JSP中也有。JSP作为java技术的一种应用,它拥有自己扩充的语法(了解,知道即可),Java所有语法都支持。观看下边的JSP语法之前,建议先去复习一下JSP原理

注释

1
2
<%--这是JSP注释(不会被发送到浏览器端)--%>
<!--这是HTML注释-->

JSP表达式

<%= 变量或者表达式%> 可以使用el表达式代替,${变量或表达式}。注意:使用JSP表达式取值,若不存在会返回null,而使用EL表达式则不会返回东西。

1
2
3
4
5
6
7
8
9
10
11
<%--JSP表达式
作用:用来将程序的输出,输出到客户端
<%= 变量或者表达式%> 可以使用el表达式代替,${变量或表达式}
--%>
现在的时间是:<%= new java.util.Date() %>

或(在前边导入需要的包)

<%--导入需要用到的包--%>
<%@ page import="java.util.*" %>
现在的时间是:<%= new Date() %>

JSP脚本片段

<% java代码 %>,这里和普通Java代码还是有点不一样的,因为JSP类中封装了一些对象我们可以直接使用,例如下边的out。(JSP页面最终是会被转换为servlet类的,不记得了可以点这里复习一下)

1
2
3
4
5
6
7
8
<%--jsp脚本片段--%>
<%
int sum = 0;
for (int j = 1; j <= 100; j++) {
sum += j;
}
out.println("计算1加到100的和:"+sum);
%>
1
2
3
4
5
6
7
8
9
10
<%--在代码中嵌入HTML元素--%>
<%
for (int i = 1; i < 5; i++) {
%>

<h3>我是第<%= i%>句话</h3>

<%
}
%>

以上演示的表达式、脚本片段都保存在_jspService()方法。(要查看下图中的work目录里的java代码,点这里

JSP声明

想定义一些方法或变量在_jspService()方法(类内),我们需要使用标签<%! %>

1
2
3
4
5
6
7
8
9
10
11
12
<%--在方法_jspService外定义方法或变量(不能使用内置对象了,例out)--%>
<%!
public void show(){
System.out.println(hello);
}
String hello = "hello world!";
%>

<%--调用该方法--%>
<% show();%>

<%--扩展:定义在static块中,不调用也会自动执行一遍--%>

在方法_jspService外定义方法或变量,不能使用内置对象了,例out。因为这些内置对象是在方法_jspService内定义的。

总结

JSP声明,会被编译到JSP生成的java的类中,_jspService方法外。其他的,就会被生成到_jspService方法内。

1
2
3
4
5
6
7
8
9
导包:<%@ page import="java.util.*" %>

JSP注释:<%-- --%> <!--这是HTML注释-->

JSP表达式:<%= %>

JSP脚本:<% %>

JSP声明:<%! %>

定制错误页面

页面中设置

在JSP页面的中添加语句<%@page errorPage="错误页面地址" %>。显式声明当前页面为错误页面,使用语句isErrorPage="true",需要到web.xml中设置默认错误页面。

关于“错误页面地址”,地址问题可以看看这里复习一下。这里我把文件放到webapp文件夹内,该文件夹在编译后就是web应用程序的根目录,所以这里可以使用绝对路径/myerror.jsp,或相对路径myerror.jsp

web.xml中设置

只设置location不设置错误代码,则被设置为默认错误页面,所有错误类型都会显示该页面

1
2
3
4
<!--  默认错误页面-->
<error-page>
<location>/myerror.jsp</location>
</error-page>

根据错误代码,不同错误类型自定义不同错误页面。

1
2
3
4
5
<!--  404错误页面-->
<error-page>
<error-code>404</error-code>
<location>/404error.jsp</location>
</error-page>

下图中,我把在页面中设置的错误页面注释掉了。

JSP指令

1
<%@page  ...   %> //可以定制错误页面,errorPage=""
1
<%@include file=""%>//可以引入文件(例如:模板。但是不推荐)

模板

有两种方式可以给JSP页面应用模板

方式一:<jsp:include page="jsp文件"/>

1
2
3
4
5
6
7
<%--jsp标签,jsp:include,拼接页面,本质还是多个页面(链接引用)。灵活性更高,推荐使用--%>

<jsp:include page="hearder.jsp"/>
<div>
<h1>我是主体部分</h1>
</div>
<jsp:include page="footer.jsp"/>

方式二:<%@include file="jsp文件"%>

1
2
3
4
5
6
7
<%--@include会将多个页面合在一起 --%>

<%@include file="hearder.jsp"%>
<div>
<h1>我是主体部分</h1>
</div>
<%@include file="footer.jsp"%>

我们看看demo01.jsp文件转换成java程序后:@include的方式,将代码拼接起来。jsp:include的方式,依然还是引用。

为什么不推荐第二种方式呢?看下边的例子:

@include的方式,将代码拼接起来。若模板文件与当前文件中有重名的变量,就会报错。

但是jsp:include的方式,却不会报错。

若图片不能正常显示,请在浏览器中打开

欢迎关注我的其它发布渠道