一、什么是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脚本元素
(1)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"%>上面的例子中有两段普通脚本,都用<%%>括住,两段之间有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的输出:
<!DOCTYPE html>
<html>
<head>
<title>Test</title>
<head>
<body>
<%
int i = 10;
while(i>=1){
i = i-1;
%>
<h1>JSP基础语法</h1>
<%
}
%>
</body>
</html>
(3)JSP表达式
<%= 表达式%>如:
<%@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>
3、JSP指令元素
JSP 指令(directive)用来设置整个JSP页面相关的属性,影响由 JSP 页面生成的 servlet 的整体结构,如网页的编码方式和脚本语言。相关的语法如<%@ directive attribute="value" %>
指令 描述
- <%@ 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)
可以得到页面为
注意这里inclued的作用是将Test1.jsp和Test2.jsp合起来形成一个.java文件,最后编译为一个.class文件,而不是生成两个java文件再进行调用。
(3)taglib定义一个标签库以及自定义标签的前缀
<%@ taglib uri="uri" prefix="prefixOfTag" %> //是uri不是url哦
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix ="bean" %>在自定义标签库中,我们可以把复杂的业务逻辑功能都封装在标签库中了。而不必在jsp中写具体的代码。这样,jsp代码与java编码能力不必强制耦合在一起。
<%@ taglib uri= "http://struts.apache.org/tags-logic" prefix ="logic" %>
4、JSP动作元素
<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动作的比较:
- 指令执行速度相对较快,灵活性较差(只编译一个文件,但是一旦有一个文件发生变化,两个文件都要重新编译)
- 动作执行速度相对较慢,灵活性较高
- 在使用时,如果是静态页面,则使用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,可以看到如下页面: