您的位置:首页 > Web前端 > JavaScript

JSP—JSP简介(JSP语法、九大隐式对象、常用标签)

2016-02-28 17:40 603 查看

1. JSP概述

1.1 认识JSP

1.1.1 JSP简介

JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据。

1.1.2 JSP入门案例

在jsp页面中输出当前时间

在WebContent目录下建立一个1.jsp,写入以下内容:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>jsp入门(输出时间)</title>
</head>
<body>
当前时间:
<%
Date date = new Date();
out.write(date.toLocaleString());
%>

</body>
</html>


在浏览器中地址栏输入:http://localhost:8080/day08/1.jsp,回车:



1.1.3 JSP原理简介

上面演示了一个JSP,现在思考几个问题:

1)Web服务器是如何调用并执行一个jsp页面的?

2)Jsp页面中的html排版标签是如何被发送到客户端的?

3)Jsp页面中的java代码服务器是如何执行的?

4)Web服务器在调用jsp时,会给jsp提供一些什么java对象?

回答:

1)首先我们要知道的是,在浏览器中访问Web应用中的任何资源,其实都是在访问一个Servlet,其实在访问1.jsp的时候,服务器会将1.jsp翻译成_1_jsp.java,我是用Eclipse建立的Web工程,我的_1_jsp.java的目录在“D:\eclipse\eclipse_work\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\work\Catalina\localhost\day08\org\apache\jsp”。



打开_1_jsp.java,发现它继承了org.apache.jasper.runtime.HttpJspBase类,这个类其实是HttpServlet的一个子类,所以_1_jsp其实是一个Servlet。

2)3)不管是html标签,还是java代码,其实都是在_1_jsp这个Servlet的_jspService()方法中使用调用了相关的代码。查看_1_jsp.java:



4)查看_1_jsp.java:



上面的都是可以直接使用的java对象,除此之外,还可以直接使用request和response。

1.1.4 JSP的最佳实践

不管是JSP还是Servlet,虽然都可以用于开发动态Web资源。但这由于这两门技术各自的特点,在长期的软件实践中,人们逐渐把Servlet作为Web应用中的控制组件来使用,而把JSP技术作为数据显示模板来使用。

其原因为,程序的数据通常需要美化后再输出:

1)让jsp既用java代码产生动态数据,又做美化导致页面难以维护。

2)让servlet既产生数据,又在里面嵌套html代码美化数据,同样也会导致程序可读性差,难以维护。

3)因此最好的办法是根据这两门技术的特点,让它们各自负责各的,Servlet只负责响应请求产生数据,并把技术通过转发技术带给jsp,数据的显示由jsp来做。

2. JSP语法

2.1 JSP模板元素

JSP页面中的HTML内容称之为JSP模版元素。

JSP模版元素定义了网页的基本骨架,即定义了页面的结构和外观。

2.2 JSP表达式

JSP脚本表达式(expression)用于将程序数据输出到客户端。

语法:<%= 变量或表达式 %>

举例:当前时间:<%= new java.util.Date() %>

JSP引擎在翻译脚本表达式时,会将程序数据转成字符串,然后在相应位置用out.print(…) 将数据输给客户端。

JSP脚本表达式中的变量或表达式后面不能有分号(;)。

2.3 JSP脚本片断

SP脚本片断(scriptlet)用于在JSP页面中编写多行Java代码。

语法:

<%
多行java代码
%>


注意:

1)JSP脚本片断中只能出现java代码,不能出现其它模板元素, JSP引擎在翻译JSP页面中,会将JSP脚本片断中的Java代码将被原封不动地放到Servlet的_jspService方法中。

2)JSP脚本片断中的Java代码必须严格遵循Java语法,例如,每执行语句后面必须用分号(;)结束。

3)在一个JSP页面中可以有多个脚本片断,在两个或多个脚本片断之间可以嵌入文本、HTML标记和其他JSP元素。

举例:

多个脚本片断中的代码可以相互访问,犹如将所有的代码放在一对<%%>之中的情况。如:out.println(x);

4)单个脚本片断中的Java语句可以是不完整的,但是,多个脚本片断组合后的结果必须是完整的Java语句,例如:

<%
for (int i=1; i<5; i++) {
<H1>www.it315.org</H1>
%>
<H1>www.it315.org</H1>
<%	}
%>


2.4 JSP声明

JSP页面中编写的所有代码,默认会翻译到servlet的_jspService方法中, 而Jsp声明中的java代码被翻译到

_jspService方法的外面。语法:

<%!
java代码
%>


注意:

1)JSP声明可用于定义JSP页面转换成的Servlet程序的静态代码块、成员变量和方法 。

2)多个静态代码块、变量和函数可以定义在一个JSP声明中,也可以分别单独定义在多个JSP声明中。

3)JSP隐式对象的作用范围仅限于Servlet的_jspService方法,所以在JSP声明中不能使用这些隐式对象。

<%!
static
{
System.out.println("loading Servlet!");
}
private int globalVar = 0;
%>


2.5 JSP注释

JSP注释的格式:

<%-- 注释信息 --%>

JSP引擎在将JSP页面翻译成Servlet程序时,忽略JSP页面中被注释的内容。

2.6 JSP指令

JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。在JSP 2.0规范中共定义了三个指令:page指令、Include指令和taglib指令。

JSP指令的基本语法格式:

<%@ 指令 属性名="值" %>

举例:<%@ page contentType="text/html;charset=gb2312"%>

如果一个指令有多个属性,这多个属性可以写在一个指令中,也可以分开写。例如:

<%@ page contentType="text/html;charset=gb2312"%>

<%@ page import="java.util.Date"%>

也可以写作:

<%@ page contentType="text/html;charset=gb2312" import="java.util.Date"%>

2.6.1 Page指令

page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面中的什么地方,它作用的都是整个JSP页面,为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个JSP页面的起始位置。

详见
jsp page指令详解

案例:使用page指令解决JSP中文乱码

JSP程序存在有与Servlet程序完全相同的中文乱码问题:

1)输出响应正文时出现的中文乱码问题

2)读取浏览器传递的参数信息时出现的中文乱码问题

JSP引擎将JSP页面翻译成Servlet源文件时也可能导致中文乱码问题 :

1)JSP引擎将JSP源文件翻译成的Servlet源文件默认采用UTF-8编码,而JSP开发人员可以采用各种字符集编码来编写JSP源文件,因此,JSP引擎将JSP源文件翻译成Servlet源文件时,需要进行字符编码转换。

2)如果JSP文件中没有说明它采用的字符集编码,JSP引擎将把它当作默认的ISO8859-1字符集编码处理。

如何解决JSP引擎翻译JSP页面时的中文乱码问题:

1)通过page指令的contentType属性说明JSP源文件的字符集编码

2)page指令的pageEncoding属性说明JSP源文件的字符集编码

2.6.2
include

include指令用于引入其它JSP页面,如果使用include指令引入了其它JSP页面,那么JSP引擎将把这两个JSP翻译成一个servlet。所以include指令引入通常也称之为静态引入。

语法:

<%@ include file="relativeURL"%>

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

细节:

1)被引入的文件必须遵循JSP语法。

2)被引入的文件可以使用任意的扩展名,即使其扩展名是html,JSP引擎也会按照处理jsp页面的方式处理它里面的内容,为了见明知意,JSP规范建议使用.jspf(JSP fragments)作为静态引入文件的扩展名。

3)由于使用include指令将会涉及到2个JSP页面,并会把2个JSP翻译成一个servlet,所以这2个JSP页面的指令不能冲突(除了pageEncoding和导包除外)。

复习下之前学过的request的动态包含

静态包含和动态包含的区别:

静态包含发生在:JSP---->java文件阶段。动态包含发生在:执行class文件阶段。动态加入。

静态包含:只生成一个java文件,动态包含:生成多个class文件。

静态包含页面:
<%@include file="static.jsp" %><br>
动态包含页面
<jsp:include page="dynamic.jsp" flush="true"/>


动态包含也可以使用:request.getRequestDispatcher("/dynamic.jsp").include(request, response)实现

2.6.3 taglib指令

Taglib指令用于在JSP页面中导入标签库。

3 JSP内置对象

JSP引擎在调用JSP对应的_jspServlet时,会传递或创建9个与web开发相关的对象供_jspServlet使用。JSP技术的设计者为便于开发人员在编写JSP页面时获得这些web对象的引用,特意定义了9个相应的变量,开发人员在JSP页面中通过这些变量就可以快速获得这9大对象的引用。

3.1 request对象

request 对象是 javax.servlet.httpServletRequest类型的对象。 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数等)。request对象的作用域为一次请求。详情请看Servlet—HttpServletRequest

3.2 response对象

response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response对象也具有作用域,它只在JSP页面内有效。详情请看Servlet—HttpServletResponse

3.3 session对象

session 对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。session对象内部使用Map类来保存数据,因此保存数据的格式为 “Key/value”。 session对象的value可以使复杂的对象类型,而不仅仅局限于字符串类型。详情请看Servlet—Session

3.4 application对象

application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。与session对象相比,application对象生命周期更长,类似于系统的“全局变量”。详情请看Servlet—ServletConfig、ServletContext

3.5 config 对象

config 对象的主要作用是取得服务器的配置信息。通过 pageConext对象的 getServletConfig() 方法可以获取一个config对象。当一个Servlet 初始化时,容器把某些信息通过 config对象传递给这个 Servlet。 开发者可以在web.xml
文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。详情请看Servlet—ServletConfig、ServletContext

3.6page
对象

page 对象代表JSP本身,只有在JSP页面内才是合法的。 page隐含对象本质上包含当前 Servlet接口引用的变量,类似于Java编程中的 this 指针。

3.7 pageContext 对象

pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用 pageContext对象。详情请看JSP—九大隐式对象之pageContext

3.8 out 对象

out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。详情请看JSP—九大隐式对象之out

3.9 exception 对象

exception 对象的作用是显示异常信息,只有在包含 isErrorPage="true" 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。excepation对象和Java的所有对象一样,都具有系统提供的继承结构。exception 对象几乎定义了所有异常情况。在Java程序中,可以使用try/catch关键字来处理异常情况;
如果在JSP页面中出现没有捕获到的异常,就会生成 exception 对象,并把 exception 对象传送到在page指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象。

4 JSP常用标签

JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护。

<jsp:forward>

<jsp:forward>标签用于把请求转发给另外一个资源。

语法:<jsp:forward page="relativeURL | <%=expression%>" />

page属性用于指定请求转发到的资源的相对路径,它也可以通过执行一个表达式来获得。

<jsp:include>

<jsp:include>标签用于把另外一个资源的输出内容插入进当前JSP页面的输出内容之中,这种在JSP页面执行时的引入方式称之为动态包含。

语法:<jsp:include page="relativeURL | <%=expression%>" flush="true|false" />

page属性用于指定被引入资源的相对路径,它也可以通过执行一个表达式来获得。

flush属性指定在插入其他资源的输出内容时,是否先将当前JSP页面的已输出的内容刷新到客户端。

<jsp:param>

当使用<jsp:include>和<jsp:forward>标签引入或将请求转发给其它资源时,可以使用<jsp:param>标签向这个资源传递参数。

例如:

<jsp:include page="relativeURL | <%=expression%>">
<jsp:param name="parameterName" value="parameterValue|<%= expression %>" />
</jsp:include>


<jsp:param>标签的name属性用于指定参数名,value属性用于指定参数值。在<jsp:include>和<jsp:forward>标签中可以使用多个<jsp:param>标签来传递多个参数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息