### 社么是jsp
### jsp工作原理
当客户端请求浏览JSP页面时,JSP服务器在把页面传递给客户端之前,先将JSP页面编译成Servlet(纯Java代码),然后由Java编译器生成的服务器小程序编译为Java字节码,最后再转换成纯HTML代码,这样客户端接收到的只是HTML代码。
JSP到Servlet的编译过程一般在第一次页面请求时进行。因此,如果希望第一个用户不会由于JSP页面编译成Servlet而等待太长的时间,希望确保Servlet已经正确地编译并装载,你可以在安装JSP页面之后自己请求一下这个页面。
### jsp强势
JSP
### jsp弱势
### 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
二.response对象:
对客户的请求做出 动态的响应,向客户端发送数据。三.session对象
1.什么是 session:session对象是一个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添加到application对象中,并为添加的对象指定一个索引关键字。 (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
javjsp validator相关的错误
[1]八.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注释语句的语法:
在客户端的HTML源代码中显示为:
### jsp@2指令directive ={page,include,taglib}
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元素,否则的话会导致执行错误。因为被包含的文件会整个加入到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",在自定义标签前的前缀,比如,在
### jsp@3脚本元素
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表达式或脚本小程序结合在一起使用。例如,下面的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 nice day!
<% } else { %>
Have a lousy day!
<% } %>
上述JSP代码将被转换成如下Servlet代码:
if (Math.random() <0.5) {
out.println("Have a nice day!");
}
Else
{
out.println("Have a lousy 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动作元素
语法:
其中,page="path"表示相对路径,或者为相对路径的表达式。flush="true"表示缓冲区满时会被清空,一般使用flush为true,它默认值是false。
例如:
inc.jsp
<%= 2 + 2 %>
test.jsp
Header
Footer
运行结果:4
【例4.5】 下面的JSP页面把4则新闻摘要插入到 “WhatsNew.jsp”页面。改变新闻摘要时只需改变new文件夹下的四个具体新闻文件,而主JSP页面却可以不作修改:
WhatNews.jsp
VLINK="#551A8B" ALINK="#FF0000">
Here is a summary of our four most recent news stories:
一般而言,不能直接从文件名称上来判断一个文件是动态的还是静态的。但是
前面已经介绍过include指令,它是在JSP文件被转换成Servlet的时候引入文件,而这里的jsp:include动作不同,插入文件的时间是在页面被请求的时候。jsp:include动作的文件引入时间决定了它的效率要稍微差一点,而且被引用文件不能包含某些JSP代码(例如不能设置HTTP头),但它的灵活性却要好得多。
include指令是在JSP文件执行时被转换成Servlet的时候,将被包含文件调入到主文件,然后二者一起被JSP容器编译,产生一个Servlet.
4.5.2 forword动作元素
语法:
page属性包含的是一个相对URL。page的值既可以直接给出,也可以在请求的时候动态计算,如下面的例子所示:
有一点要特别注意,
例如
<%
out.println("会被执行!!! ");
%>
<%
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="" %>
test.jsp代码如下:
<%
string username=request.getparameter("username");
if(username.trim().equals("abc"))
{%>
<%}
else
{%>
<%}
%>
ok.htm和no.htm非常简单,可以分别写为:
ok
no
运行效果是当你输入用户名为abc时,页面会自动跳转到ok.htm页面,否则跳到no.htm页面。
4.5.3 plugin动作元素
jsp:plugin动作用来根据浏览器的类型,插入通过Java插件运行Java Applet所必需的OBJECT或EMBED元素。
语法:
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的版本"] [ [ ] [
Plugin中的各个属性如下:
(1)type="bean|applet"
插件将执行的对象的类型,必须指定。
(2)code="classFileName"
插件将执行的java类文件的名称,在名称中必须包含扩展名,且此文件必须在用"codebase"属性指明的目录下。
(3)codebase="classFileDirectoryName"
包含插件将运行的java类的目录或指相对这个目录的路径。
4.5.4. param动作元素
param动作元素用于传递参数。我们还可以使用
和
jsp:include>
和
例如:
4.5.5 useBean及setProperty和getProperty动作元素
1.useBean动作元素
在程序中可把逻辑控制、数据库操作放在javabeans组件中,然后在jsp文件中调用它。这个功能非常有用,因为它使得我们既可以发挥Java组件重用的优势,同时也避免了损失JSP区别于Servlet的方便性。所以
其语法形式:
其中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动作元素
可以使用两种语法实现方式:
(1)在jsp:usebean后使用jsp:setproperty:
在这种方式中,jsp:setproperty将被执行。
(2)jsp:setproperty出现在jsp:usebean标签内:
在这种方式中,jsp:setproperty只会在新的对象被实例化时才将被执行。
在
(1)name用来表明对哪个bean实例执行下面的动作,这个值和动作
(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的值;否则什么也不做。
property="numberOfItems" param="numItems" /> 如果同时省略value和param,其效果相当于提供一个param且其值等于property的值。进一步利用这种借助请求参数和属性名字相同进行自动赋值的思想,你还可以在property(Bean属性的名字)中指定“*”,然后省略value和param。此时,服务器会查看所有的Bean属性和请求参数,如果两者名字相同则自动赋值。 在使用 语法如下: jsp:getProperty有两个必需的属性,即:name,表示Bean的名字;property,表示要提取哪个属性的值。 例如3.getProperty元素
.
.
.
.
.
.
.
### 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动作实现 4。JSP的常用指令 isErrorPage(是否能使用Exception对象),isELIgnored(是否忽略表达式) 5、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么? 6。Jsp和Servlet中的请求转发分别如何实现? JSP的转发请求可通过 7.jsp有哪些隐式对象?作用分别是什么? request request表示HttpServletRequest对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie, header, 和session数据的有用的方法。 8.两种跳转方式分别是什么?有什么区别? |
.