JSP基础知识总结

时间:2022-10-25 13:37:21

一、什么是JSP

网页有两种类型,一种是静态网页,一种是动态网页,动态网页需要用到相关的技术标准,例如ASP,CGI(分享一个关于CGI的博客:CGI是什么),Servlet等,java中常用Servlet和jsp,这里我们来介绍jsp。
利用java语言来书写动态网页有两种方法,一种是利用Servlet技术,一种是利用JSP,JSP全名为Java Server Pages,中文名叫java服务器页面,JSP从根本上来讲也是简化的Servlet,JSP页面经过服务器的处理后,将会生成java类,而这个类又是继承了servlet类,所以从根本上jsp就是servlet。
它和静态的网页区别在于它内嵌了java代码,可以进行逻辑判断、循环和调取数据库资料等操作,jsp文件的后缀为.jsp,因为利用了java语言,和java一样,具有跨平台特性。


二、JSP基础语法

1、静态数据

静态数据指html的标记语言,例如<head></head>、<body></body>、<span></span>等。也成为JSP模版元素,它定义了网页的基本骨架,即定义了页面的结构和外观。html相关的语法可以查看w3cschool,链接: HTML教程


2、JSP脚本元素

JSP的脚本元素包含:声明(declaration)、表达式(express)、脚本(Scriplets),具体内容如下:

(1)JSP声明脚本

JSP声明用于在JSP 中声明合法的 变量方法,这里很关键的一点是, Jsp声明中的java代码被翻译到_jspService方法的外面,而JSP页面中编写的其他代码,默认会翻译到servlet的_jspService方法内部,也就是说,我们书写的JSP代码,除了声明脚本,其他的都相当于JAVA类中一个方法内的语句,声明的变量是局部变量,所以在JSP其他语句中是不能新建方法的,声明脚本在方法外部,这是很大的区别。
语法格式为:
<%! 代码内容 %> 
利用<%%>括住并有 !  号在代码前端。
具体使用如
<%!
int age = 21;
String name = "Z-HaiSome";
public void myName(){
System.out.println("my name is "+Z-HaiSome+" ,I'm "+age+" years old");
}
%>
在下面的普通脚本中就可以调用这的方法。

(2)JSP普通脚本

普通脚本的语法为:
<% JSP脚本语句; %>
<%%>内可以写java的基础语法,和java一致。如
<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<title>Test</title>
<head>
<body>
<%
   int i = 10;
   while(i>=1){
      i = i-1;
%>
   <h1>JSP基础语法</h1>
<%
   }
%>
</body>
</html>
上面的例子中有两段普通脚本,都用<%%>括住,两段之间有html的标签,这段例子的作用是循环输出“JSP基础语法”这一个句子。在脚本语句之间书写的HTML标签会被当成String语句参与。在servlet里可以看出,HTML的句子都是通过out.write()方法输出的,将这段jsp放在Tomcat 的webapps\ROOT文件夹中,命名为Test.jsp,访问网页后,在Tomcat的work\Catalina\localhost\ROOT\org\apache\jsp文件夹中可以找到Test_jsp.java文件,在这个java文件的_jspService方法中可以看到HTML的输出: 
JSP基础知识总结

(3)JSP表达式

JSP表达式用来插在HTML中进行文本输出,语法为
<%= 表达式%>
如:
<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<title>Test</title>
<head>
<body>
<%="JSP基础总结"%>
<%
String name = "Z-HaiSome";
%>
<h1>我的名字是:<%=name%></h1>
</body>
</html>
浏览器输出结果为
JSP基础知识总结


3、JSP指令元素

JSP 指令(directive)用来设置整个JSP页面相关的属性,影响由 JSP 页面生成的 servlet 的整体结构,如网页的编码方式和脚本语言。相关的语法如

<%@ directive attribute="value" %>


JSP指令由<%@%>包围在一起。指令可以有很多个属性,它们以键值对的形式存在,并用逗号隔开,JSP中的三种指令标签:
指令 描述
  • <%@ page ... %> 定义网页依赖属性,比如脚本语言、error页面、缓存需求等等
  • <%@ include ... %> 包含其他文件
  • <%@ taglib ... %> 引入标签库的定义

(1)page指令为当前页面提供相关说明

page 指令可以定义下列属性:import、contentType、pageEncoding、session、isELIgnored(只限 JSP 2.0)、buffer、autoFlush、info、errorPage、isErrorPage、isThreadSafe、language 和 extends。

import
使一个JAVA导入声明被插入到最终页面文件。
contentType
规定了生成内容的类型。当生成非HTML内容或者当前字符集character set并非默认字符集时使用。
errorPage
处理HTTP请求时,如果出现异常则显示该错误提示信息页面。
isErrorPage
如果设置为TRUE,则表示当前文件是一个错误提示页面。
isThreadSafe
表示最终生成的servlet是否安全线程(threadsafe)。

例如:

<%@page language="java" import="java.sql.*" pageEncoding="utf-8"%>
这里设置页面语言为java,导入数据库包,页面编码方式为utf-8。

import 是 page 的属性中惟一允许在同一文档中多次出现的属性,page指令可以出现在代码的任何地方,但是为了方便理解代码,一般放在首行。


(2)include指令引入其他的JSP页面

include可引入其它JSP页面,JSP引擎将把这引入的JSP和当前的JSP翻译成一个servlet,include指令引入也称之为静态引入。

语法为

<%@ include file="relativeURL"%>

其中的file属性用于指定被引入文件的路径。路径以“/”开头,表示代表当前web应用。

例如:

创建一个Test1.jsp,用Notepad++打开,设置为使用UTF-8编码

<%@page language="java" pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<title>测试1</title>
</head>
<body>
</br>测试1的内容
<%@ include file="/Test2.jsp"%>
</body>
</html>


创建一个Test2.jsp,设置为使用UTF-8编码

<%@page language="java" pageEncoding="utf-8"%>

</br>测试2的内容


两个文件放在Tomcat中webapps的ROOT内,打开浏览器,输入http://localhost:8080/Test1.jsp并进入(记得先开启Tomcat)

可以得到页面为

JSP基础知识总结

注意这里inclued的作用是将Test1.jsp和Test2.jsp合起来形成一个.java文件,最后编译为一个.class文件,而不是生成两个java文件再进行调用。

(3)taglib定义一个标签库以及自定义标签的前缀

JSP允许用户使用自定义标签库,在JSP1.1版本中就增加了自定义标签库。自定义标签库可以看作一种优秀的组件。自定义标签库是自定义标签的集合,如logic标签库等,是人们为了某种特定的用途或者目的,将一些标记放到一起而形成的一种库。在一个团队中协同工作的开发者们可能会为各自的项目创建一些非常特定化的自定义标记库,同时也会创建一个通用自定义标记库,以供当前使用。
相关语法为:
<%@ taglib uri="uri" prefix="prefixOfTag" %>  //是uri不是url哦
其中,uri属性确定标签库的位置,prefix属性指定标签库的前缀。
导入后就可以使用其中的标签,具体如:
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix ="bean" %> 
<%@ taglib uri= "http://struts.apache.org/tags-logic" prefix ="logic" %> 
在自定义标签库中,我们可以把复杂的业务逻辑功能都封装在标签库中了。而不必在jsp中写具体的代码。这样,jsp代码与java编码能力不必强制耦合在一起。 
这里链接一个taglib实例: taglib实例

4、JSP动作元素

上面讲到过指令元素,指令元素是对整个JS页面的设定,是在生成servlet时起作用的,而这里讲到的JSP动作元素,是在 请求处理阶段起作用。
JSP动作元素通过 XML语法书写。利用JSP动作可以动态地插入文件、重用JavaBean组件、把用户重定向到另外的页面、为Java插件生成HTML代码。动作元素的语法为:
<jsp:action_name attribute="value" />


JSP规范定义了一系列的标准动作,它用JSP作为前缀,可用的标准动作元素如下:

jsp:include
和子过程类似,JAVA SERVLET暂时接管对其它指定的JSP页的请求和响应。当处理完该JSP页后就马上把控制权交还当前JSP页。这样JSP代码就可以在多个JSP页*享而不用复制。
jsp:param
可以在jsp:include, jsp:forward或jsp:params块之间使用。指定一个将加入请求的当前参数组中的参数。
jsp:forward
用于处理对另一个JSP或SERVLET的请求和响应。控制权永远不会交还给当前JSP页。
jsp:plugin
Netscape Navigator的老版本和Internet Explorer使用不同的标签以嵌入一个applet。这个动作产生为嵌入一个APPLET所需要的指定浏览器标签。
jsp:fallback
如果浏览器不支持APPLETS则会显示的内容。
jsp:getProperty
从指定的JavaBean中获取一个属性值。
jsp:setProperty
在指定的JavaBean中设置一个属性值。
jsp:useBean
创建或者复用一个JavaBean变量到JSP页。
这里说一下include动作,前面已经介绍过include指令,它是在JSP文件被转换成Servlet的时候引入文件,而这里的jsp:include动作不同,插入文件的时间是在页面被请求的时候,也可以称为动态引入。

Include指令和Include动作的比较:

  • 指令执行速度相对较快,灵活性较差(只编译一个文件,但是一旦有一个文件发生变化,两个文件都要重新编译)
  • 动作执行速度相对较慢,灵活性较高
  • 在使用时,如果是静态页面,则使用Include指令;如果是动态页面,则使用Include动作。

include动作和include指令的区别可以看看其他博客:include动作和include指令的区别

这里我们举个例子,新建两个文件在webapps的Test文件夹中,命名为index.jsp和include.jsp

index.jsp输入以下代码:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>include动作测试</title>
</head>
<body>
现在的时间是:
<jsp:include page="include.jsp" flush="true"/>
</body>
</html>

include.jsp输入以下代码:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%= (new java.util.Date()).toLocaleString()%>

在浏览器中通过Tomcat打开index.jsp,可以看到如下页面:

JSP基础知识总结