java jsp

.

### 社么是jsp

JSP (Java Server Pages)是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。

  jsp就是一个servlet,
JSP与Java Servlet一样,是在服务器端执行的,通常返回给客户端的就是一个HTML文本,因此客户端只要有浏览就能浏览。
.
JSP可用一种简单易懂的等式表示为:HTML+Java= JSP。
在JSP页面中,可分为JSP程序代码和其他程序代码两部分。 JSP程序代码全部写在<%和%>之间, 其他代码部分如JavaScript和HTML代码按常规方式写 入。换句话说,在常规页面中插入JSP元素, 即构成了JSP页面。

### jsp工作原理

当客户端请求浏览JSP页面时,JSP服务器在把页面传递给客户端之前,先将JSP页面编译成Servlet(纯Java代码),然后由Java编译器生成的服务器小程序编译为Java字节码,最后再转换成纯HTML代码,这样客户端接收到的只是HTML代码。

JSP到Servlet的编译过程一般在第一次页面请求时进行。因此,如果希望第一个用户不会由于JSP页面编译成Servlet而等待太长的时间,希望确保Servlet已经正确地编译并装载,你可以在安装JSP页面之后自己请求一下这个页面。

### jsp强势

       (1) 一次编写,到处运行。除了系统之外,代码不用做任何更改。
(2) 系统的多平台支持基本上可以在所有平台上的任意环境中开发, 在任意环境中进行系统部署,在任意环境中扩展。相比 ASP/. net的局限性是显而易见的。
(3) 强大的可伸缩性。从只有一个小的 Jar文件就可以运行Se rvlet/JSP,到由多台服务器进行集群和负载均衡, 到多台Application进行事务处理, 消息处理, 一台服务器到无数台                  
                服务器,Java显示了一个巨大的生命力

JSP

        (4) 多样化和功能强大的开发工具支持。这一点与ASP很像, Java已经有了许多非常优秀的开发工具, 而且许多可以免费得到,并且其中许                           多已经可以顺利的运行于多种平台之下。
(5) 支持服务器端组件web应用需要强大的服务器端组件来支持, 开发人员需要利用其他工具设计实现复杂功能的组件供web页面调 用,以增强系统性能。JSP可以使用成熟的JAVA BEANS 组件来实现复杂商务功能。
.
.

### jsp弱势

       (1) 与ASP一样,Java的一些优势正是它致命的问题所在。 正是由于为了跨平台的功能,为了极度的伸缩能力,所以极大的 增加了产品的复杂性。
(2)  Java的运行速度是用class常驻内存来完成的所以它在一些情况下所使用的内存比起用户数量来说确实是“ 最低性能价格比”了。从另一方面, 它还需要硬盘空间来储存一系列的.java文件和. class文件,以及对应的版本文件。
.
.

### jsp页面结构

         
           
JSP程序的成分主要有如下四种:
注释(Comment)、
指令(Directive)、
脚本元素(Scripting Element)、
动作(Action 标签)。
JSP指令用来从整体上控制Servlet的结构; 脚本元素用来嵌入Java代码, 这些Java代码将成为转换得到的Servlet的一部分; 动作用来引入现有的组件或者控制JSP引擎的行为。

为了简化脚本元素,JSP定义了一组由容器实现和管理的对象(内置对象)。这些内置对象在JSP页面中可以直接使用,不需要JSP页面编写者实例化。通过存取这些内置对象,可以实现与JSP页面Servlet环境的互访。

###jsp内置对象

Jsp内置对象

功能

主要方法

out

向客户端输出数据

print() println() flush() clear() isAutoFlush() getBufferSize()   close() …………

request

向客户端请求数据

getAttributeNames() getCookies() getParameter() getParameterValues() setAttribute() getServletPath() …………..

response

封装了jsp产生的响应,然后被发送到客户端以响应客户的请求

addCookie() sendRedirect() setContentType()

flushBuffer() getBufferSize() getOutputStream()

sendError() containsHeader()……………

application

 

 

config

表示Servlet的配置,当一个Servlet初始化时,容器把某些信息通过此对象传递给这个Servlet

getServletContext() getServletName() getInitParameter()   getInitParameterNames()……………

page

Jsp实现类的实例,它是jsp本身,通过这个可以对它进行访问

flush()………

pagecontext

为JSP页面包装页面的上下文。管理对属于JSP中特殊可见部分中己经命名对象的该问

forward() getAttribute() getException() getRequest() getResponse()   getServletConfig()

getSession() getServletContext() setAttribute()

removeAttribute() findAttribute() ……………

session

用来保存每个用户的信息,以便跟踪每个用户的操作状态

getAttribute() getId()   getAttributeNames() getCreateTime() getMaxInactiveInterval()

invalidate() isNew()

exception

反映运行的异常

getMessage()…………

 

一.request对象:

对象 封装了用户提交的信息通过调用该对象相应的方法可以获取封装的信息, 即使用该对象可以获取用户提交信息。 它是HttpServletRequest的实例。
  

JSP

下面介绍request的常用方法:
1,getParameter();使用如下 String str=request.getParameter();
2,setAttribute(); 和getAttribute(); removeAttribute(); getMethod();getProtocol(); getReqeustURI();getRemoteAddr( );getServerPort();和 getServerName();

二.response对象:

对客户的请求做出 动态的响应,向客户端发送数据。

三.session对象

1.什么是 sessionsession对象是一个JSP内置对象, 它在第一个JSP页面被装载时自动创建,完成会话期管理。
从一个客户打开浏览器并连接到服务器开始, 到客户关闭浏览器离开这个服务器结束,被称为一个会话。 当一个客户访问一个服务器时, 可能会在这个服务器的几个页面之间反复连接,反复刷新一个页面, 服务器应当通过某种办法知道这是同一个客户, 这就需要session对象。
2.session对象的ID: 当一个客户首次访问服务器上的一个JSP页面时, JSP引擎产生一个session对象, 同时分配一个String类型的ID号, JSP引擎同时将这个ID号发送到客户端, 存放在Cookie中, 这样session对象和客户之间就建立了一一对应的关系。 当客户再访问连接该服务器的其他页面时, 不再分配给客户新的session对象,直到客户关闭浏览器后, 服务器端该客户的session对象才取消, 并且和客户的会话对应关系消失。 当客户重新打开浏览器再连接到该服务器时, 服务器为该客户再创建一个新的session对象。
3.session对象存在一定时间过期问题, 所以存在session中的名值对会在一定时间后失去, 可以通过更改session有效时间来避免这种情况。 同时编程时尽量避免将大量有效信息存储在session中, request是一个不错的替代对象。

四.application对象

1.什么是 application:
服务器启动后就产生了这个application对象, 当客户在所访问的网站的各个页面之间浏览时, 这个application对象都是同一个,直到服务器关闭。 但是与session不同的是, 所有客户的application对象都是同一个, 即所有客户共享这个内置的application对象。
2.application对象常用方法:
(1)public void setAttribute(String key,Object obj): 将参数Object指定的对象obj添加到applicatio n对象中,并为添加的对象指定一个索引关键字。
(2)public Object getAttribute(String key): 获取application对象中含有关键字的对象。

五.out对象

out对象是一个输出流,用来向客户端输出数据。 out对象用于各种数据的输出。

六.page java.lang.Object

对应this关键字。JSP网页本身, page对象是当前页面转换后的Servlet类的实例。 从转换后的Servlet类的代码中,可以看到这种关系: Object page = this;在JSP页面中,很少使用page对象。

七.config

jav
  

jsp validator相关的错误

[1]
  ax.servlet. ServletConfig 的实例,该实例代表该JSP 的配置信息。常用的方法有
getInitParameter(String paramNarne) 及getInitParameternarnes() 等方法。
事实上, JSP 页面通常无须配置,也就不存在配置信息。因此, 该对象更多地在Servlet 中有效。

八.exception

java.lang.Throwable 的实例,该实例代表其他页面中的异常和错误。 只有当页面是错误处理页面,即编译指令page 的isErrorPage 属性为true 时,该对象才可以使用。常用的方法有getMessage() 和printStackTrace()等。

九. pageContext

javax.servlet.jsp.PageContext 的实例,该对象代表该JSP 页面上下文,使用该对象可以访问页面中的共享数据。 常用的方法有getServletContext() 和getServletConfig()等。
//使用pageContext 设置属性,该属性默认在page 范围内
pageContext. setAttribute("page" , "hello") ;
//使用request 设置属性,该属性默认在request 范围内
request. setAttribute ("request" , "hello");
//使用pageContext将属性设置在request 范围中
pageContext.setAttribute(" request2" , "hello" , pageContext.REQUEST_SCOPE);
// 使用session将属性设置在session 范围中
session.setAttribute("session" , "hello");
// 使用pageContext将属性设置在session范围中
pageContext.setAttribute(" session2" , "hello" , pageContext.SESSION_SCOPE);
// 使用application将属性设置在application 范围中
application. setAttribute ("app" , "hello") ;
//使用pageContext 将属性设置在application 范围中
pageContext.setAttribute(" app2" , "hello" , pageContext.APPL 工CATION_SCOPE) ;

. 

### jsp@1.注释

JSP注释分为HTML注释和隐藏注释两种。

JSP隐藏注释语句在JSP页面执行的时候会被忽略,不会执行。并且注释语句信息不会被送到客户端的浏览器中,也就是说,用户通过查看源文件是无法看到这些注释信息的,所以称之为隐藏注释。

HTML注释和JSP注释的不同之处在于HTML注释在客户端浏览器能通过查看源文件而被查看到。

4.2.1 JSP隐藏注释

JSP注释语句的语法:

<%--comment--%>

4.2.2 HTML注释

HTML注释语句的语法:

<!--该注释可以被查看-->

<!--该页面生成于 <%= (new java.util.Date()).toLocaleString() %> -->

在客户端的HTML源代码中显示为:

<!--该页面生成于October 15, 2006 -->

### jsp@2指令directive ={page,include,taglib}

.在JSP页面中,可以使用JSP指令来指定页面的有关 输出方式、引用包、加载文件、缓冲区、出错处理等相关设置,主要作用是用来于JSP引擎之间进行沟通。

JSP指令常用以下形式:

<%@ directive attribute=”value”%>

可以将多个属性写在一个语句中:

<%@ directive attribute1="value1" attribute2="value2" attributeN="valueN" %>

主要的三种指令是page include指令taglib,下面对三种指令进行详细说明。

4.3.1 page指令(默认都是true!!!)

在JSP文件中,可以通过<%@ page %>命令定义整个JSP页面的属性通过这个命令定义的属性会对该JSP文件和包含进来的JSP页面起作用。此命令的语法比较复杂一些,下面就是语法定义:

<%@ page

[ language="java" ]

[ extends="package.class" ]

[ import="{package.class | package.*}, ..." ]

[ session="true | false" ]

[ buffer="none | 8kb | sizekb" ]

[ autoFlush="true | false" ]

[ isThreadSafe="true | false" ]

[ info="text" ]

[ errorPage="relativeURL" ]

[ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ]

[ isErrorPage="true | false" ]

%>

下面是使用Page命令的几个小例子:

<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" buffer="5kb" autoFlush="false" errorPage=" error.jsp " %>

通过Page命令,你可以为整个JSP页面定义上面提到的全局属性,其中除了“import”之外,其他的都只能引用一次,import属性和Java语言中的import非常相似,可以在JSP页面中多次使用它。

关于<%@ page %>的位置可以不去考虑,放在任何地方都可以很好的工作,但出于良好的编程习惯,建议放在JSP页面的顶部几乎所有的JSP页面顶部都可以找到指令page。

1.language属性

定义JSP页面使用的脚本语言,若使用JSP引擎支持Java以外的语言,可指定所使用的语言种类。默认语言为Java

language=”java”

指明JSP文件中使用的脚本语言,目前只能使用Java。

2.contentType属性

contentType属性定义了JSP页面字符编码和页面响应的MIME类型。默认的MIME类型是text/html,默认的字符集是ISO-8859-1。例如:

<%@ page  contentType="text/html;charset=gb2312"  language="java" import="java.sql.*" %>

3.import属性

该属性用于JSP引入Java包中的类,如果你要包含多个包的话,将这些包的名称用逗号隔开放在一个import中,或者使用多个import分别声明。它是唯一可以多次指定的属性。

在使用Java包中的元素之前一定要先声明该包的import引用。下面一些Java包,是默认包含的,不用再在JSP页面中声明。

java.lang.*

javax.servlet.*

javax.servlet.jsp.*

javax.servlet.http.*

4.extends属性

定义此JSP页面产生的Servlet是继承自哪个父类。请特别谨慎使用这一功能,因为,服务器也许已经定义了一个JSP规范对不完全理解其隐意的情况下使用此属性提出警告。

5.isErrorPage属性

isErrorPage="true|false"

默认值为“true”,设置是否显示错误信息。如果为true,可以看到出错信息,如果为false,就看不到了。

6.errorPage属性

errorPage="relativeURL"

设置处理异常事件的JSP文件的位置。表示如果发生异常错误,网页会被重新指向一个URL页面。错误页面必须在其page指令元素中指定isErrorPage="true"。

7.session属性

session="true|false"

默认值为“true”,定义是否在JSP页面使用HTTP的session。如果值为true,则可以使用session对象;如果值为false,那么JSP页面就不被加入到session中,session内置对象则不能使用,而同时会造成Bean的scope属性值只能是“page”。

8.Buffer属性

buffer="none|8kb|sizekb"

为内置对象out指定发送信息到客户端浏览器的信息缓存大小。kb为单位。默认值是8kb.你也可以自行指定缓存的大小。也可以设置为“none”,那么就没有缓冲区,所有的输出都不经缓存而直接输出。

9.autoFlush属性

autoFlush="true|false"

指定是否当缓存填满时自动刷新,输出缓存中的内容。如果为true,则自动刷新。否则,当缓存填满后,可能会出现严重的错误当你把buffer设置为none时,就不能将autoFlush设置为false。

10.isThreadSafe属性

isThreadSafe="true|false"

指定JSP页面是否支持多线程访问。默认值是ture,表示可以同时处理多个客户请求,但是你应该在JSP页面中添加处理多线程的同步控制代码。如果设置为false,JSP页面在一个时刻就只能响应一个请求。

11.info属性

info="text"

指定任何一段字符串,该字符串被直接加入到翻译好的页面中。可以通过Servlet.getServletInfo()方法得到。

4.3.2 include指令

Include指令的功能是在JSP编译时插入包含的文件。包含的过程是静态的。它可以把内容分成更多可管理的元素,如包括普通页面的页眉或页脚的元素。包含的文件可以是JSP、HTML、文本或是Java程序。

include指令的语法:

<%@ include file="relativeURL" %>

其中只有一个file属性,这个属性指定了被包含文件的路径。

如果路径是以"/"开头的,那么这个路径应该就是相对于JSP应用程序上下文而言的。而如果以目录名或文件名开头则是以JSP文件所在路径为当前路径而言。例如:

"header.jsp"

"/templates/onlinestore.html"

"/beans/calendar.jsp"

在JSP中,你可以用Include指令将JSP文件,HTML文件,或Text文件包含到一个JSP文件中,这种包含是静态包含,也就是说当使用这种方法包含文件的时候,会将被包含文件的内容插入包含文件中,替换掉<%@ include %>这行语句。如果你包含的是一个JSP文件,那么包含在这个文件中的JSP程序将被执行。

当你使用Include包含一个文件的时候,一定要注意,在被包含文件中不能含有<html>,</html>,<body>,</body>等HTML元素,否则的话会导致执行错误因为被包含的文件会整个加入到JSP文件中去,这些标记会与JSP文件中类似的标记相冲突。

使用包含文件有以下一些优点:

(1)被包含文件可以在多个文件中被使用,实现了代码共享和重用

(2)当被包含文件修改后,包含此文件的JSP文件的执行结果也发生变化,这样就提高修改效率,为维护提供方便。

4.3.3 taglib指令

taglib指令的功能是使用标签库定义新的自定义标签在JSP页面中启用定制行为。

taglib指令的语法:

<%@ taglib uri="URIToTagLibrary" prefix="tagPrefix" %>

例如

<%@ taglib uri="http://www.jspcentral.com/tags" prefix="public" %>

<public:loop

</public:loop>

<% @ taglib %>指令声明此JSP文件使用了自定义的标签,同时引用标签库,也指定了标签的前缀。

这里自定义的标签有标签和元素之分。因为JSP文件能够转化为XML,所以了解标签和元素之间的联系很重要。标签只不过是一个在意义上被抬高了点的标记,是JSP元素的一部分。JSP元素是JSP语法的一部分,和HTML一样有开始标记和结束标记。元素可以包含其它的文本,标记,元素。使用自定义标签之前必须使用<% @ taglib %>指令,而且可以在一个页面中多次使用,但是同一前缀只能引用一次。

URI根据标签的前缀对自定义的标签进行唯一的命名prefix="tagPrefix",在自定义标签前的前缀,比如,在<public:loop>中的public,如果不写public,就是不合法的。请不要用jsp, jspx, java, javax, servlet, sun, 和sunw作为前缀。

### jsp@3脚本元素

.JSP脚本元素用来插入Java代码, 这些Java代码将出现在由当前JSP页面生成的Servlet 中。
脚本元素有三种格式:
声明格式<%! declaration; %>,其作用是把声明加入到Servlet类(在任何方法之外)
表达式格式<%= expression %>,作用是计算表达式并输出其结果;
Scriptlet格式<% code %>,作用是把代码插入到Servlet的service方法。

4.4.1 JSP声明

JSP声明用来声明JSP程序中的变量、实例、方法和类。

声明是以<%!为起始,以%>结尾。在JSP程序中,在使用一个变量或引用一个对象的方法和属性前,必须先对使用的变量和对象进行声明。声明后,你才可以在后面的程序中使用它们。

JSP的声明可以让你定义页面一级的变量以保存信息或定义该JSP页面可能需要的方法。其内容必须是一个采用page指令所定义的语言编写和完整有效的声明。JSP内置对象在声明元素中不可见,此时声明的变量作为编译单元的成员变量处理。

其语法如下:

<%! declaration; %>

例如:

<%! int i=0; %>

<%! int a,b,c; %>

注意:

1.编译JSP时,脚本小程序生成于jspService()方法的内部,而声明却生成于jspService()方法之外,与源文件合成一体。使用<%! %>方式所声明的变量为全局变量,即表示若同时n个用户在执行此JSP网页时将会共享此变量。因此应尽量少用声明变量,若要使用变量时,请直接在scriptlet之中声明使用即可。

2.每一个声明仅在一个页面中有效,如果你想每个页面都用到一些声明,最好把它们写成一个单独的JSP页面或单独的Java类,然后用<%@ include %>或<jsp:include >动作元素包含进来。

由于声明不会有任何输出,因此它们往往和JSP表达式或脚本小程序结合在一起使用。例如,下面的JSP代码片断输出自从服务器启动(或Servlet类被改动并重新装载以来)当前页面被请求的次数:

<%! private int accessCount = 0; %>

自从服务器启动以来页面访问次数为:

<%= ++accessCount %>

4.4.2 JSP表达式

JSP表达式用来计算输出Java数据表达式的结果被自动转换成字符型数据,结果可以作为HTML的内容,显示在浏览器窗口中。JSP表达式包含在“<%= %>”标记中,不以分号结束,除非在加引号的字符串部分使用分号。开始字符和结束字符之间必须是一个完整合法的Java表达式。可以是复杂的表达式,在处理这个表达式的时候按照从左向右的方式来处理。

其语法如下:

<%= expression %>

例如:

<%= i %>

<%= "Hello" %>

<%= a+b %>

下面的代码显示页面被请求的日期/时间:

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

为简化这些表达式,JSP预定义了一组可以直接使用的对象变量。内置对象在表达式中可见。对于JSP表达式来说,最重要的几个内置对象及其类型如下,后面我们将详细介绍这些内置对象。

(1)request:HttpServletRequest。

(2)response:HttpServletResponse。

(3)session:和request关联的HttpSession。

(4)out:PrintWriter,用来把输出发送到客户端。

例如:

Your hostname: <%= request.getRemoteHost() %>

4.4.3脚本小程序

如果要完成的任务比简单的表达式复杂时,可以使用JSP脚本小程序(Scriptlet)。脚本小程序中可以包含有效的程序片段,只要是合乎Java本身的标准语法即可。通常我们核心程序都写在这里,是我们实际编写的JSP程序的主要部分。

JSP脚本小程序的语法如下:

<% Java Code %>

由于JSP和其他一些嵌入式语言一样,都会嵌在HTML语言内部使用,所以JSP页面中是由一段一段的JSP程序嵌在HTML语言里面组成的。脚本小程序能够包含要用到的变量或方法的声明和表达式。和JSP表达式一样,脚本小程序可以访问所有内置对象,所有的内建对象在小脚本中可见。例如,如果你要向结果页面输出内容,可以使用out变量。

<%

String queryData = request.getQueryString();

out.println("Attached GET data: " + queryData);

%>

注意:在程序段中定义的变量是局部变量,且程序段中的“表达式”必须使用“;”作为结束符,程序片段并不局限于一行代码中。

编译JSP时,编译器在jspService()方法中只简单地不作修改地包含脚本小程序的内容。当Web服务器响应请求时,Java代码就会运行。在脚本片段周围可能有纯粹的HTML代码,在这些地方,代码片段可以使你创建执行代码的条件,或调用另外的代码片段。

例如,下面的JSP片断混合了HTML语言和脚本小程序:

<% if (Math.random() < 0.5) { %>

Have a <B>nice</B> day!

<% } else { %>

Have a <B>lousy</B> day!

<% } %>

上述JSP代码将被转换成如下Servlet代码:

if (Math.random() <0.5) {

out.println("Have a <B>nice</B> day!");

}

Else

 {

out.println("Have a <B>lousy</B> day!");

}

### jsp@动作  标签

JSP动作利用XML语法格式的标记来控制Servlet引擎的行为。动作组件用于执行一些标准的常用的JSP页面。利用JSP动作可以动态地插入文件、重用JavaBean组件、把用户重定向到另外的页面、为Java插件生成HTML代码。

JSP动作元素包括:

jsp:include:当页面被请求时引入一个文件。

jsp:forward:请求转到一个新的页面。

jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记

jsp:useBean:寻找或者实例化一个JavaBean。

jsp:setProperty:设置JavaBean的属性。

jsp:getProperty:输出某个JavaBean的属性。

4.5.1 include动作元素

<jsp:include>动作元素表示在JSP文件被请求时包含一个静态的或者动态的文件

语法:

<jsp:include page="path" flush="true" />

其中,page="path"表示相对路径,或者为相对路径的表达式。flush="true"表示缓冲区满时会被清空,一般使用flush为true,它默认值是false。

例如:

inc.jsp

<%= 2 + 2 %>

test.jsp

Header

<jsp:include page="inc.jsp"/>

Footer

运行结果:4

【例4.5】 下面的JSP页面把4则新闻摘要插入到 “WhatsNew.jsp”页面。改变新闻摘要时只需改变new文件夹下的四个具体新闻文件,而主JSP页面却可以不作修改:

WhatNews.jsp

<HTML>

<HEAD>

<TITLE>What's New</TITLE>

</HEAD>

<BODY BGCOLOR="#FDF5E6" TEXT="#000000" LINK="#0000EE"

      VLINK="#551A8B" ALINK="#FF0000">

<CENTER>

<TABLE BORDER=5 BGCOLOR="#EF8429">

  <TR><TH class="TITLE">

      What's New at JspNews.com</TABLE>

</CENTER>

<P>

Here is a summary of our four most recent news stories:

<OL>

  <LI><jsp:include page="news/Item1.html" flush="true"/>

  <LI><jsp:include page="news/Item2.html" flush="true"/>

  <LI><jsp:include page="news/Item3.html" flush="true"/>

  <LI><jsp:include page="news/Item4.html" flush="true"/>

</OL>

</BODY>

</HTML>

一般而言,不能直接从文件名称上来判断一个文件是动态的还是静态的。但是<jsp:include>能够自行判断此文件是动态的还是静态的,于是能同时处理这两种文件。如果包含的只是静态文件,那么只是把静态文件的内容加到JSP网页中;如果包含的是动态文件,那么把动态文件的输出加到JSP网页中。被包含的动态文件和主文件会被JSP Container分别编译执行。

前面已经介绍过include指令,它是在JSP文件被转换成Servlet的时候引入文件,而这里的jsp:include动作不同,插入文件的时间是在页面被请求的时候。jsp:include动作的文件引入时间决定了它的效率要稍微差一点,而且被引用文件不能包含某些JSP代码(例如不能设置HTTP头),但它的灵活性却要好得多。

include指令是在JSP文件执行时被转换成Servlet的时候,将被包含文件调入到主文件,然后二者一起被JSP容器编译,产生一个Servlet.

<jsp:include>动作是在JSP文件被请求时,被包含文件和主文件分别被JSP容器编译,产生两个Servlet,然后将被包含文件的Servlet调入到主文件的Servlet中。因此同样引入文件,使用include指令要比使用<jsp:include>动作的响应速度快。

4.5.2 forword动作元素

<jsp:forward>将客户端所发出来的请求,从一个JSP页面转交给另一个页面(可以是一个 HTML文件,JSP 文件,PHP文件,CGI文件,甚至可以是一个Java程序段。

语法:

<jsp:forward page={"relativeURL"|"<%= expression %>"}/>

page属性包含的是一个相对URLpage的值既可以直接给出,也可以在请求的时候动态计算,如下面的例子所示:

<jsp:forward page="/utils/errorReporter.jsp" /.>

<jsp:forward page="<%= someJavaExpression %>" />

有一点要特别注意,<jsp:forward>标签之后的程序将不能被执行。

例如

<%

     out.println("会被执行!!! ");

%>

<jsp:forward page="other.jsp" />

<%

     out.println("不会执行!!!");

%>

上面这个范例在执行时,会打印出“会被执行!!!”,随后马上会转入到other.jsp的网页中,至于out.println("不会执行!!! ")将不会被执行。

【例4.6】该实例需要四个文件:login.jsp,test.jsp,ok.htm,no.htm

首先看一下login.jsp

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

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />

</head>

<body>

<center>

<form method=get  action="test.jsp">

username<input type=text name=username>

<br><br>

password<input type=password name=password>

<br><br>

<input type=submit value="确定">

</form>

</center>

</body>

</html>

test.jsp代码如下:

<html>

<%

string username=request.getparameter("username");

if(username.trim().equals("abc"))

{%>

<jsp:forward page="ok.html" />

<%}

else

{%>

<jsp:forward page="no.html" />

<%}

%>

</html>

ok.htm和no.htm非常简单,可以分别写为:

<html>ok</html>

<html>no</html>

运行效果是当你输入用户名为abc时,页面会自动跳转到ok.htm页面,否则跳到no.htm页面。

4.5.3 plugin动作元素

jsp:plugin动作用来根据浏览器的类型,插入通过Java插件运行Java Applet所必需的OBJECT或EMBED元素。

语法:

<jsp:plugin

type="bean|applet"

code="classFileName"

codebase="classFileDirectoryName"

[name="instanceName"]

[align="bottom|top|middle|left|right"]

[height="displsyPixels"]

[width="displsyPixels"]

[hspace="leftRightPixels"]

[vspace="topButtomPixels"]

[jreversion="java的版本"]

[<jsp:params>

[<jsp:param name="parameterName" value="参数的值"/>]

</jsp:params>]

[<jsp:fallback> 这里是在不能启动插件的时候,显示给用户的文本信息</jsp:fallback>]

</jsp:plugin>

Plugin中的各个属性如下:

(1)type="bean|applet"

插件将执行的对象的类型,必须指定。

(2)code="classFileName"

插件将执行的java类文件的名称,在名称中必须包含扩展名,且此文件必须在用"codebase"属性指明的目录下。

(3)codebase="classFileDirectoryName"

包含插件将运行的java类的目录或指相对这个目录的路径。

4.5.4. param动作元素

param动作元素用于传递参数。我们还可以使用<jsp:param>将当前JSP页面的一个或多个参数传递给所包含的或是跳转的JSP页面。该动作元素必须和<jsp:include>、<jsp:plugin>、<jsp:forward>动作一起使用。

和<jsp:include>一起使用的语法如下:

<jsp:include page="相对的URL值"|"<% =表达式%> " flush="true">

<jsp:param name="参数名1" value="{参数值|<%=表达式 %>}"/>

<jsp:param name="参数名2" value="{参数值|<%=表达式 %>}"/>

</ jsp:include>

和<jsp: forward>一起使用的语法如下:

<jsp:forward page="path"} >

<jsp:param name="paramname" value="paramvalue" />

</jsp:forward>

<jsp:param>中name指定参数名,value指定参数值。参数被发送到一个动态文件,参数可以是一个或多个值。要传递多个参数,则可以在一个jsp文件中使用多个<jsp:param>将多个参数发送到一个动态文件中。如果用户选择使用<jsp:param>标签的功能,那么被重定向的目标文件就必须是一个动态的文件。

例如:

<jsp:include page="scripts/login.jsp">

<jsp:param name="username" value="Aqing" />

<jsp:param name="password" value="123456"/>

</jsp:include>

4.5.5 useBean及setProperty和getProperty动作元素

1.useBean动作元素

<jsp:useBean>动作用来查找或实例化一个JSP页面使用的JavaBean组件。javaBean是特殊类型的java类,它与普通java类相比主要区别是包含了两种特殊的方法:setXXX( )(设置属性值的方法)、getXXX( )(取属性值的方法)。

在程序中可把逻辑控制、数据库操作放在javabeans组件中,然后在jsp文件中调用它。这个功能非常有用,因为它使得我们既可以发挥Java组件重用的优势,同时也避免了损失JSP区别于Servlet的方便性。所以<jsp:useBean>动作几乎是JSP最重要的用法。

其语法形式:

<jsp:usebean id="name" scope="page | request | session | application"  typespec />

其中typespec有以下几种可能的情况:

class="classname" | class="classname" type="typename" | beanname="beanname" type="typename" | type="typename" |

<jsp:useBean id="name" class="package.class" />

注意必须使用class或type,但不能同时使用class和beanname。beanname表示bean的名字,其形式为“a.b.c”。

只有当第一次实例化Bean时才执行Body部分,如果是利用已有的Bean实例则不执行Body部分,jsp:useBean并非总是意味着创建一个新的Bean实例。

获得Bean实例之后,要修改Bean的属性既可以通过jsp:setProperty动作进行,也可以在脚本小程序中利用id属性所命名的对象变量,通过调用该对象的方法显式地修改其属性。当说“某个Bean有一个类型为X的属性foo”时,就意味着“这个类有一个返回值类型为X的getfoo方法,还有一个setfoo方法以X类型的值为参数”。

通过jsp:setProperty和jsp:getProperty修改和提取Bean的属性。

useBean动作元素属性如下:

(1)id用来引用Bean实例的变量。如果能够找到id和scope相同的Bean实例,jsp:useBean动作将使用已有的Bean实例而不是创建新的实例

(2)class指定Bean的完整包名,表明bean具体是对哪个类的实例化。

(3)scope指定Bean的有效范围,可取四个值分别为:page,request,session和application。默认值是page,表示该Bean只在当前页面内可用(保存在当前页面的PageContext内),有效范围是当前页面。request表示该Bean在当前的客户请求内有效(保存在ServletRequest对象内)。有效范围在一个单独客户请求的生命周期内。session表示该Bean对当前HttpSession内的所有页面都有效。有效范围是整个用户会话的生命周期内。最后,如果取值application,则表示该Bean对所有具有相同ServletContext的页面都有效。有效范围是应用的生命周期内。

scope之所以很重要,是因为jsp:useBean只有在不存在具有相同id和scope的对象时才会实例化新的对象;如果已有id和scope都相同的对象则直接使用已有的对象,此时jsp:useBean开始标记和结束标记之间的任何内容都将被忽略。

(4)type指定引用该对象的变量的类型,它必须是Bean类的名字、超类名字、该类所实现的接口名字之一。请记住变量的名字是由id属性指定的。

(5)beanName指定Bean的名字。如果提供了type属性和beanName属性,允许省略class属性。

2.setProperty动作元素

<jsp:setproperty>标签表示用来设置bean中的属性值。在JSP表达式或Scriptlet中读取Bean属性通过调用相应的getXXX方法实现,或者更一般地,使用jsp:getProperty动作。

可以使用两种语法实现方式:

(1)在jsp:usebean后使用jsp:setproperty:

<jsp:usebean id="myuser"/>

<jsp:setproperty name="user" property="user"/>

在这种方式中,jsp:setproperty将被执行。

(2)jsp:setproperty出现在jsp:usebean标签内:

<jsp:usebean id="myuser">

<jsp:setproperty name="user" property="user"/>

</jsp:usebean>

在这种方式中,jsp:setproperty只会在新的对象被实例化时才将被执行。

在<jsp:setproperty>中的name值应和<jsp:usebean>中的id值相同。我们既可以通过jsp:setProperty动作的value属性直接提供一个值,也可以通过param属性声明Bean的属性值来指定请求参数,还可以列出Bean属性表明它的值应该来自请求参数中的同名变量。该动作的含义是使用bean中相应的set()方法设置一个或多个属性的值,值的来源是通过value属性明确给出,或者利用request对象中相应的参数。

<jsp:setproperty>动作有下面四个属性:

(1)name用来表明对哪个bean实例执行下面的动作,这个值和动作<jsp:useBean>中定义的id必须对应起来,包括大小写都必须一致。这个属性是必须的。

(2)property用来表示要设置哪个属性。如果property的值是"*",表示用户在可见的JSP页面中输入的全部值,存储在匹配的bean属性中。匹配的方法是:bean的属性名称必须与输入框的名字相同。property  property属性是必需的。它表示要设置哪个属性。有一个特殊用法:如果property的值是“*”,表示所有名字和Bean属性名字匹配的请求参数都将被传递给相应的属性set方法。这个属性也是必须的。

(3)value属性是可选的。该属性用来指定Bean属性的值。字符串数据会在目标类中通过标准的valueOf方法自动转换成数字、boolean、Boolean、byte、Byte、char、Character。例如,boolean和Boolean类型的属性值(比如“true”)通过Boolean.valueOf转换,int和Integer类型的属性值(比如“42”)通过Integer.valueOf转换。

value和param不能同时使用,但可以使用其中任意一个。

(4)param属性是可选的。它指定用哪个请求参数作为Bean属性的值。如果当前请求没有参数,则什么事情也不做,系统不会把null传递给Bean属性的set方法。因此,你可以让Bean自己提供默认属性值,只有当请求参数明确指定了新值时才修改默认属性值。

例如,下面的代码片断表示:如果存在numItems请求参数的话,把numberOfItems属性的值设置为请求参数numItems的值;否则什么也不做。

<jsp:setProperty name="orderBean"

property="numberOfItems"

param="numItems" />

如果同时省略value和param,其效果相当于提供一个param且其值等于property的值进一步利用这种借助请求参数和属性名字相同进行自动赋值的思想,你还可以在property(Bean属性的名字)中指定“*”,然后省略value和param。此时,服务器会查看所有的Bean属性和请求参数,如果两者名字相同则自动赋值。

3.getProperty元素

<jsp:getproperty>标签表示获取bean的属性的值并将之转化为一个字符串,然后将其插入到输出的页面中。该动作实际是调用了bean的get()方法。

在使用<jsp:getproperty>之前,必须用<jsp:usebean>来创建它。不能使用<jsp:getproperty>来检索一个已经被索引了的属性。

语法如下:

<jsp:getProperty name="beanInstanceName" property="propertyName"/>

jsp:getProperty有两个必需的属性,即:name,表示Bean的名字;property,表示要提取哪个属性的值。

例如

<jsp:useBean id="itemBean" ... />

<UL>

<LI>Number of items:

<jsp:getProperty name="itemBean" property="numItems" />

<LI>Cost of each:

<jsp:getProperty name="itemBean" property="unitCost" />

</UL>

.

.

.

.

.

.

.

### jsp@小结 面试题

本章小结

一个JSP页面主要由注释、指令、脚本元素、动作元素的内容组成。   

1.注释包括HTML注释和JSP隐藏注释。

2.指令包括:      

(1)page:用来定义整个JSP页面的属性和相关功能。

(2)include:用来指定JSP文件被编译时需要插入的资源,可以是文本、代码、HTML文件或JSP文件。

(3)taglib:页面使用者用来自定义标签。

3.脚本元素

(1)声明:用来定义在程序中使用的实体,它是一段Java代码,可以声明变量,也可以声明方法。格式:<%! 开始声明 %>  例如:<%! int  i;%>。

(2)表达式:格式:<%=表达式%>  最后是没有分号的.例如:<%=1+2+3%>。

(3)Scriptlet:格式:<%java代码%>。

4.在JSP中的动作指令包括:Include、 Forward、 UseBean、 GetProperty、 SetProperty、 Plugin。

(1)include指令:表示包含一个静态的或者动态的文件。子句能让你传递一个或多个参数给动态文件,也可在一个页面中使用多个指令来传递多个参数给动态文件。

(2)forward指令:表示重定向一个静态html/jsp的文件,或者是一个程序段。

(3)Plugin指令:用于在浏览器中播放或显示一个对象(典型的就是Applet和Bean),而这种显示需要浏览器的Java插件。一般来说,元素会指定对象是Applet还是Bean,同样也会指定class的名字和位置,另外还会指定将从哪里下载这个Java插件。

(4)useBean指令:表示用来在JSP页面中创建一个Bean实例并指定它的名字以及作用范围。

(5)setProperty指令:用来为一个Bean的属性赋值。若在jsp:useBean后使用,jsp:setProperty将被执行。若jsp:setProperty出现在jsp:useBean标签内,jsp:setProperty只会在新的对象被实例化时才将被执行。注意name值应当和useBean中的id值相同。

(6)getProperty指令:表示获取Bean的属性的值并将之转化为一个字符串,然后将其插入到输出的页面中。

课后习题

一.填空题

1. JSP文件不需要引入                      类包。

2.一个JSP页面主要包含                  、                   、                  、                    等成分。

3.三种JSP指令分别是                      、                     、                       。

4.三种脚本元素分别是                     、                     、                     。

5.jsp:useBean动作指令的作用是                                                                               。

二.选择题

1.JSP的默认应用语言是(   )

        A JSP                 B Servlet               C Java               D JavaScript

2.下列哪种方式不属于JSP脚本元素语法(   )

        A <%! int i=0; %>                              B <%= "Hello" %>

        C <% out.println("Hello "); %>          D <%@ language="java" %>

3.jsp:forward动作的page属性的作用是(   )

                A 定义JSP文件名                            B 定义JSP文件的传入参数

                C 定义JSP文件的文件头信息         D 定义JSP文件的相对地址

三.简答题

1.jsp有哪些页面成分?作用分别是什么?

2.JSP中动态include与静态include的区别?


我们都知道在JSP中include有两种形式,分别是

<%@ include file=” ”%>

<jsp:include page=” ” flush=”true”/>

以下是对include 两种用法的区别,主要有两个方面的不同:

1.执行时间上:

<%@ include file=”relativeURI”%> 是在翻译阶段执行

<jsp:include page=”relativeURI” flush=”true” /> 在请求处理阶段执行.

2.引入内容的不同:

<%@ include file=”relativeURI”%>引入静态文本(html,jsp),在JSP页面被转化成servlet之前和它融和到一起.

<jsp:include page=”relativeURI” flush=”true” />引入执行页面或servlet所生成的应答文本.

3.另外在两种用法中file和page属性都被解释为一个相对的URI.如果它以斜杠开头,那么它就是一个环境相关的路径.将根据赋给应用程序的URI的前缀进行解释,如果它不是以斜杠开头,

那么就是页面相关的路径,就根据引入这个文件的页面所在的路径进行解释。

3.jsp有哪些动作元素?作用分别是什么?

4.简述JSP的几种注释方式。

1、jsp有哪些内置对象作用分别是什么

答:JSP共有以下9种基本内置组件(可与ASP的6种内部组件相对应): 

 request 用户端请求,此请求会包含来自GET/POST请求的参数 

   response 网页传回用户端的回应 

   pageContext 网页的属性是在这里管理 

   session 与请求有关的会话期 

   application servlet 正在执行的内容 

   out 用来传送回应的输出

   config servlet的构架部件 

   page JSP网页本身 

   exception 针对错误网页,未捕捉的例外

2、jsp有哪些动作作用分别是什么

答:JSP共有以下6种基本动作

   jsp:include:在页面被请求的时候引入一个文件。 

   jsp:useBean:寻找或者实例化一个JavaBean。 

   jsp:setProperty:设置JavaBean的属性。 

   jsp:getProperty:输出某个JavaBean的属性。 

   jsp:forward:把请求转到一个新的页面。 

   jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记

3、JSP中动态INCLUDE与静态INCLUDE的区别?

答:动态INCLUDE用jsp:include动作实现

   它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数

   静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面

4。JSP的常用指令

isErrorPage(是否能使用Exception对象),isELIgnored(是否忽略表达式)

5JSPServlet有哪些相同点和不同点,他们之间的联系是什么? 
答:JSPServlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是"servlet"
ServletJSP最主要的不同点在于Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。JSP的情况是JavaHTML可以组合成一个扩展名.jsp的文件
JSP侧重于视图,Servlet主要用于控制逻辑。 

6。Jsp和Servlet中的请求转发分别如何实现?

   JSP的转发请求可通过<jsp:forward>标准动作来完成; Servlet转发请求可通过forward() 方法来实现。

7.jsp有哪些隐式对象?作用分别是什么?

   request request表示HttpServletRequest对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie, header, 和session数据的有用的方法。 

response response表示HttpServletResponse对象,并提供了几个用于设置送回 浏览器的响应的方法(如cookies,头信息等) 

out out 对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。 

pageContext pageContext表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各种范围的名字空间、servlet相关的对象的API,并且包装了通用的servlet相关功能的方法。 

session session表示一个请求的javax.servlet.http.HttpSession对象。Session可以存贮用户的状态信息 

application applicaton 表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息 

config config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。 

page page表示从该页面产生的一个servlet实例
     exception 表示JSP页面运行时产生的异常

8.两种跳转方式分别是什么?有什么区别? 
答:有两种,分别为: 
<jsp:include page="included.jsp" flush="true"> 
<jsp:forward page= "nextpage.jsp"/> 
前者页面不会转向include所指的页面,只是显示该页的结果,主页面还是原来的页面。执行完后还会回来,相当于函数调用。并且可以带参数.后者完全转向新页面,不会再回来。相当于go to 语句。

.

你可能感兴趣的:(java)