JavaWeb从0开始学(二)-----JSP基本语法与编译指令
在上一节中我们学习了如何搭建一个简单的Web应用,并且已经知晓了一个JSP页面主要由静态的HTML内容和动态的Java脚本共同组成。JSP的基本语法共有JSP注释、JSP声明、输出JSP表达式与JSP程序片段四种,用来控制动态向页面输出内容的。现在我们就一起来学习JSP的这几种基本语法。
(一)JSP的基本语法
1.JSP注释语句
JSP注释用于标注在程序开发过程中的开发提示,不会输出到客户端。
JSP注释的格式如下:
<%--我是JSP注释的内容--%>
其实我们可以发现JSP的注释与HTML的注释十分类似,下面是HTML的注释格式:
<!--我是HTML注释的内容-->
下面我们通过一个例子来体会一下这二者在JSP页面中的区别:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
<title>注释实例</title>
</head>
<body>
下面的是JSP注释:<br>
<%--我是JSP注释--%><br>
下面的是HTML注释:<br>
<!--我是HTML注释-->
</body>
</html>
在浏览器中浏览该页面,并且右击查看网页源代码,我们会看到JSP注释消失了,如下图所示:

这表明JSP注释只在服务器端有效,但是并不会作为HTML代码的一部分发送到客户端。
2.JSP脚本语句
(1)JSP声明
JSP声明用于声明Servlet类的成员变量和方法
JSP的声明格式如下:
<%! 声明内容 %>
下面来看一个使用JSP声明的示例页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
<title>JSP声明</title>
</head>
<%!
public int count;
public String sayHello(){
return "hello";
}
%>
<body>
<%
//这行代码的意思是向屏幕输出count的值后再加1
out.println(count++);
%>
<br/>
<%
//这行代码的意思是输出sayHello方法的返回值
out.println(sayHello());
%>
</body>
</html>
当我们在浏览器中查看时,可以看到count的值与字符hello的输出。
对于JSP声明有下列三点需要注意:
- 可以一次性声明多个变量和方法,前提是符合Java语法。
- 一个声明仅在一个页面中有效
- 声明的变量为全局变量,所有执行此JSP页面的用户会共享此变量。
在JSP声明中声明方法似乎不需要任何类作为载体而独立存在,事实上并不是这样。根据我们学过的知识我们知道JSP实质 就是Servlet,JSP会被转化为一个Servlet实例。而我们在JSP页面中声明的内容会被转换为对应Servlet实例的成员变量和成员方法。
下面我们打开F:\Tomcat\work\Catalina\localhost\myThreeProject\org\apache\jsp下的.java文件,我们会看到如下的java代码:
* generation to assist with modification tracking.
*/
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports {
public int count;
public String sayHello(){
return "hello";
}
...
}
以上就是由JSP页面转换成的的Servlet类,我们可以看到count变量与sayHello方法是这个类的成员。
由于JSP声明的变量与方法会转换为对应Servlet实例的成员变量与成员方法,所以我们可以对JSP声明部分定义的变量和方法使用private和public等访问控制符,也可以使用static,但是不能使用abstract修饰声明部分的方法,因为抽象方法将导致JSP对应的Servlet变成抽象类,从而导致无法实例化。
(2)输出JSP表达式
JSP提供了如下方式的输出表达式语法:
<%=JSP表达式%>
值得注意的是JSP表达式后面不能有分号。
下面来看一个实例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
<title>输出JSP表达式</title>
</head>
<%!
public int count;
public String sayHello(){
return "hello";
}
%>
<body>
<%=count++%>
<br/>
<%=sayHello()%>
</body>
</html>
可以看到这个页面与前一个页面的区别仅仅是把out.println输出语句替换成了'=',这两个页面的执行效果是一致的。其实,JSP/Servlet引擎在解释执行JSP页面时会把'='替换成Servlet实例类中的out输出语句。
(3)JSP程序片段
JSP脚本中可以包含任何可执行性代码
JSP程序片段简称Scriptlet,就是脚本小部件的意思。我们可以通过Scriptlet把代码嵌入到静态HTML页面中去,JSP的核心代码也都是写在这里面的。同样,它的内容也是包裹在'<%%>'中,如下所示:
<% 代码 %>
下面我们来看一个例子:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
<title>JSP脚本</title>
</head>
<body>
<%
String name = "Jom";
if (name.equals("Jom")){
%>
He is Jom.
<% } else { %>
He is not Jom.
<% } %>
</body>
</html>
输出结果为:
He is Jom.
下面我们打开此项目生成的.java文件
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
...
try {
...
out.write("\r\n");
out.write("<!DOCTYPE html>\r\n");
out.write("<html>\r\n");
out.write(" <head>\r\n");
out.write(" <title>JSP脚本<title>\r\n");
out.write(" </head>\r\n");
out.write(" \r\n");
out.write(" <body>\r\n");
out.write(" ");
String name = "Jom";
if (name.equals("Jom")){
out.write(" \r\n");
out.write(" He is Jom.\r\n");
out.write(" ");
} else {
out.write("\r\n");
out.write(" He is not Jom.\r\n");
out.write(" ");
}
out.write("\r\n");
out.write(" </body>\r\n");
out.write("</html>");
}
...
}
我们可以看出,JSP脚本与静态的HTML内容已经全部被转换为_jspService方法的可执行代码。由此我们可以得出两个结论:
- 我们可以在JSP脚本中声明变量,只是声明的只是局部变量。
- JSP脚本中不能定义方法,因为按照java语法,方法中不能定义方法。
(二)JSP编译指令
JSP编译指令用于提供整个JSP网页的相关信息、设定JSP网页的相关属性,例如网页的编码方式、语法等。JSP编译指令语法如下:
<%@ 指令名 属性1="属性值1" 属性2="属性值2" ... %>
编译指令都有默认值,所以我们无需为每个指令设置值。常见的编译指令有page、include、taglib三个,下面主要介绍page、include两个指令,关于taglib指令在后续章节中会详细学习。
1.page指令
page指令定义了JSP文件的全局属性,可以指定所使用的的脚本语言、JSP对应的Servlet所实现的接口等。
page指令的语法格式如下:
<%@ page 属性1="属性值1" 属性2="属性值2" ... %>
page指令常用的属性见下图(图片来源于网络):

值得注意的是,contentType的charset属性和pageEncoding属性都涉及JSP网页的编码方式,但是两者有所区别。contentType的charset属性是指服务器发送给客户端时的内容编码方式,pageEncoding是JSP文件本身的编码方式。另外,errorPage属性实质是JSP的异常处理机制,JSP脚本不要求强制处理异常,包括checked异常。
使用page指令需要注意一下几点:
- page指令作用于整个页面,包括静态的包含文件,不包括动态的包含文件。
- page指令在一个页面中可以出现多次,除了import属性外,其他属性只能出现一次。
- 为了JSP程序的可读性,我们一般将page指令置于顶部
2.include指令
使用include指令可以将外部文件包含进当前JSP页面,这个外部文件可以是JSP文件、HTML文件或者文本文件。
include指令的语法格式如下:
<%@ include 属性1="属性值1" 属性2="属性值2" ... %>
这种包含是静态包含,即将被包含文件插入到JSP指定的位置,解析这个页面,同时把目标文件的其他编译指令也包含进来。
下面来看一个使用静态导入的示例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>静态include测试</title>
</head>
<body>
<%@include file="text.jsp" %>
</body>
</html>
在这个JSP页面里包含了当前路径下的text.jsp文件,该文件里只有一条JSP输出语句:
<%
out.println("我是text.jsp文件,我被index.jsp文件调用了!");
%>
下面我们启动这个项目,在浏览器中我们会看到如下的输出:

我们发现text.jsp文件里的内容在index.jsp文件里被成功执行了。下面我们再打开对应的.java文件,我们会看到如下部分内容:
out.write("\r\n");
out.write("<html>\r\n");
out.write(" <head>\r\n");
out.write(" <title>静态include测试itle>\r\n");
out.write(" </head>\r\n");
out.write(" \r\n");
out.write(" <body>\r\n");
out.write(" ");
out.write("\r\n");
out.write("<html>\r\n");
out.write(" <head>\r\n");
out.write(" <title>JSP-include调用</title>\r\n");
out.write(" </head>\r\n");
out.write(" \r\n");
out.write(" <body>\r\n");
out.write(" \r\n");
out.write(" ");
out.println("我是text.jsp文件,我被index.jsp文件调用了!");
out.write("\r\n");
out.write(" </body>\r\n");
out.write("</html>");
out.write("\r\n");
out.write(" </body>\r\n");
out.write("</html>");
我们发现,在该包含文件被引入处那条语句被执行了。所以,我们得出结论:include指令将包含的页面与本页面融合成一个了页面。
鉴于此,如果多数JSP网页包含相同的内容,我们可以将这些相同的内容单独放在一个文件中,其他JSP页面通过include指令将这个文件包含。这样做不仅可以提高开发效率还有利于网站的维护。
下面以下图总结本次学习内容(图片来源于网络):

以上就是本次学习内容,下次我们将学习JSP的动作指令。
JavaWeb从0开始学(二)-----JSP基本语法与编译指令的更多相关文章
- JavaWeb从0开始学(一)-----搭建第一个Web应用程序与JSP工作原理
以往学习的时候大多是看完书或者看完视频,动手实践一下就OK了.然而过了一段时间我发现东西都忘差不多了,需要复习才能重新掌握.现在开始学习JavaWeb了,我将在这里记录自己的学习的一点一滴,不仅便于自 ...
- 02.JSP的3个编译指令
本章介绍JSP的3个编译指令,在JSP中常见的编译指令有如下3个: 1.page:用于针对当前页面的指令. 2.include:用于指定包含另一个页面. ...
- 二、JSP的3个编译指令,7个动作指令,9个内置对象
JSP 3个编译指令 1) page指令(基本不需要用到,使用默认即可) 主要属性: 1.Language:指定脚本所采用的语言类型,现在只支持java 2.Extends:定义当前jsp产生的se ...
- jsp 的 3 个编译指令
JSP 的编译指令是通知 JSP 引擎的消息,它不直接生成输出. 常见的编译指令有如下三个: 1.page:该指令是针对当前页面的指令 2.include:用于指定包含另一个页面 3.taglib:用 ...
- 从0开始学Java——JSP和Servlet——jsp转servlet出错的三个典型场景
由于jsp终究是要转换为servlet的java文件,然后再编译为.class文件,最后才执行,那么在这过程的任何一个步骤都可能有问题,主要包括三个方面,下面逐一分析: 一.JSP转换为Servlet ...
- 从0开始学Java——JSP&Servlet——Tomcat和Apache的区别
从<JSP & Servlet 学习笔记>的第一章,了解到web容器:“Web容器是Servlet/jsp唯一认得的http服务器”. 在Java中,容器的类型有多种,这里要说的是 ...
- 从0开始学java——JSP&Servlet——web容器搜索class的路径顺序
在web应用程序如果要用到某个类,会按照如下的顺序来搜索: 1)在WEB-INF/classes目录下搜索: 2)如果该目录下没有,则会到WEB-INF/lib目录下的jar文件中搜索: 3)如果还没 ...
- 从0开始学Java——JSP&Servlet——HttpServletRequest相关的几个路径信息
在HttpServletRequest中有几个获取路径的接口:getRequestURI/getContextPath/getServletPath/getPathInfo 这些接口互相之间有什么区别 ...
- 从0开始学Java——JSP&Servlet——如何部署web应用程序
web容器要求应用程序部署时,需要像下面这样组织其目录结构: 手动去创建这样的目录结构还是挺麻烦的,所幸我们有开发工具,所以可以像下面这样来部署一个web项目. 1)确认程序代码已经完成: 2)在ec ...
随机推荐
- jQ小图标上下滑动特效
嗯,又到了,夜静饥寒的时候,手指颤抖,回望去,屋内满是寂静,寥寥绰影,咳咳咳,想我程序员之路还没到终点...就...咳咳咳 好了日常神经结束,还要涂我的唇膏.还剩下,最后一章,js动画(四),明天放上 ...
- Markdown使用教程
Markdown 是一种 轻量级标记语言,主要特点是:使用易读易写的纯文本格式编写文档,然后转换成有效的XHTML(或者HTML)文档". 本文参考了:语法手册.简书介绍. 常用语法 一.标 ...
- 分享一个基于thrift的java-rpc框架
简单介绍 这是一个简单小巧的Java RPC框架,适用于Java平台内.为系统之间的交互提供了.高性能.低延迟的方案.适合在集群数量偏少的情况下使用(50台以下集群环境).当然.它也可以在大型集群环境 ...
- 【G】开源的分布式部署解决方案(一) - 开篇
做这个开源项目的意义是什么?(口水自问自答,不喜可略过) 从功能上来说,请参考 预告篇,因自知当时预告片没有任何含金量,所以并没有主动推送到首页,而是私下的给一些人发的. 从个人角度上来说,我希望.n ...
- bzoj1061--线性规划
线性规划裸题... 根据题目很容易可以得到线性规划方程(以样例为例): Min(2*x1+5*x2+2*x3) x1+ 0+ 0>=2 x1+x2+ 0>=3 0+x2+x3>=4 ...
- 使用PMD进行代码审查
很久没写博客了,自从上次写的设计模式的博客被不知名的鹳狸猿下架了一次之后兴趣大减,那时候就没什么兴致写博客了,但是这段时间还没有停下来,最近也在研究一些其他的东西,目前有点想做点东西的打算,但好像也没 ...
- ArcGIS制图表达Representation实战篇2-河流渐变与符号旋转
ArcGIS制图表达Representation实战篇2-河流渐变与符号旋转 by 李远祥 上一章节主要是从实战中使用规则和几何效果,如何分解制图规则.本章主要还是通过一些特殊要求如河流线宽渐变和符号 ...
- [Netty] - Netty IN ACTION(导言)
最近没什么事儿做,刚好看到有需要网络编程的知识,java中有NIO和IO两种不同的方式,但是NIO的编写比较麻烦,刚好找到一个成熟的网络框架Netty.接下来的一个月就准备将Netty IN ACTI ...
- 随机生成并排序 C,去同,有序数组合并排序
#include<iostream> #include<stdlib.h> #include<time.h> using namespace std; int ma ...
- Extjs mvc
MVC的模式,模型(Models)和控制器(Controllers) Model模型 是字段和它们的数据的集合,例如User模型带有username和password字段,模型知道如何持久化自己的数据 ...