当前位置: 代码迷 >> JavaScript >> JSP学习(3)
  详细解决方案

JSP学习(3)

热度:469   发布时间:2012-12-24 10:43:14.0
JSP学习(三)

三:动作语法(action(JSP_0300_Action工程)

?

1<jsp:include>(include文件夹下的程序)

用于动态包含JSP程序或HTML文件等

除非这个指令会被执行到,否则它是不会被TomcatJSP?Engine编译。

格式:

<jsp:include?page=“URLSpec”?flush=“true”/>

<jsp:include?page=“URLSpec”?flush=“true”>

<jsp:param?name=“ParamName”?value=“paramValue”/>

</jsp:include>

jsp:param用来设定include文件时的参数和对应的值

jsp:include和编译指令@include的区别

1.@include编译指令是在JSP程序的转换时期就将file属性所指定的程序内容嵌入,然后再编译执行;而jsp:include指令在转换时期是不会被编译的,只有在客户端请求时期如果被执行到才会被动态的编译载入

2.@include不能带参数,?<jsp:include>可以动态包含的文件和被包含文件用的是同一个request对象

?

?

2<jsp:forward>(forward文件夹下的程序)

???jsp:param用于将一个jsp的内容传送到page所指定的JSP程序或者Servlet中处理(URL)

格式:

<jsp:forward?page=“urlSpec”?flush=“true”/>

<jsp:forward?page=“urlSpec”>

<jsp:param?name=“paramName”?value=“paramValue”/>

</jsp:forward>

<jsp:param>用于指定参数和其对应的值

?

<jsp:forward>response.sendRedirect的区别

<jsp:forward>

使用同一个request

forward后的语句不会继续发送给客户端

速度快

服务器内部转换,

可以传参数

response.sendRedirect

是不同的request

send后的语句会继续执行,除非return

速度慢

需要到客户端的往返,可以转到任何页面

可以传参数,直接写在url后面

?

?

3<jsp:useBean>(testbean文件夹下的程序)

通过jsp:useBean,可以在JSP中使用定义好的Bean

?

Bean的基本要素:

1必须要有一个不带参数的构造器。在JSP元素创建Bean时会调用空构造器

2Bean类应该没有任何公共实例变量,也就是说,不允许直接访问实例变量,变量名称首字母必需小写

3通过getter/setter方法来读/写变量的值,并且将对应的变量首字母改成大写

?

jsp:useBean各项参数含义:

id:对象实例名称

scope:Bean作用的范围,默认为page,对整个jsp页面有效

class:Bean类名称(全名)

type:Bean实例类型,可以是本类,或其父类,或实现的接口,默认为本类

?

Scope各项参数的意义:

page:仅涵盖使用JavaBean的页面

PageBean.jsp/CounterBean.java

request:有效范围仅限于使用JavaBean的请求

RequestBean.jsp/RequestBean2.jsp/CounterBean.java

session:有效范围在用户整个连接过程中(整个会话阶段均有效)

SessionBean.jsp/Session2.jsp/CounterBean.java

application:有效范围涵盖整个应用程序。也就是对整个网站均有效

Application.jsp/Application2.jsp/CounterBean.java

jsp:useBean>?
创建一个Bean实例并指定它的名字和作用范围.?


JSP?语法?
jsp:useBean?id="beanInstanceName"?scope="page/request/session/application"?
{?
class="package.class"? ?
type="package.class"? ?
class="package.class"?type="package.class"? ?
beanName="{package.class?%=?expression?%}"?type="package.class"?
}?
{?
/>? ?
>?other?elements?/jsp:useBean>?
}?
例子?
jsp:useBean?id="cart"?scope="session"?class="session.Carts"?/>?
jsp:setProperty?name="cart"?property="*"?/>?
jsp:useBean?id="checking"?scope="session"?class="bank.Checking"?>?
jsp:setProperty?name="checking"?property="balance"?value="0.0"?/>?
/jsp:useBean>?
描述?
jsp:useBean>用于定位或示例一个JavaBeans组件。<jsp:useBean>首先会试图定位一个Bean实例,如果这个Bean不存在,那么<jsp:useBean>就会从一个class或模版中进行示例。?


为了定位或示例一个Bean,<jsp:useBean>会进行以下步聚,顺序如下:?
通过给定名字和范围试图定位一个Bean.?
对这个Bean对象引用变量以你指定的名字命名.?
如果发现了这个Bean,将会在这个变量中储存这个引用。如果你也指定了类型,那么这个Bean也设置为相应的类型.?
如果没有发现这个Bean,将会从你指定的class中示例,并将此引用储存到一个新的变量中去。如果这个class的名字代表的是一个模版,那么这个Beanjava.beans.Beans.instantiate示例.?
如果<jsp:useBean>已经示例(不是定位)了Bean,同时<jsp:useBean>和</jsp:useBean>中有元素,那么将会执行其中的代码.?
jsp:useBean>元素的主体通常包含有<jsp:setProperty>元素,用于设置Bean的属性值。正如上面第五步所说的,?<jsp:useBean>的主体仅仅只有在<jsp:useBean>示例Bean时才会被执行,如果这个Bean已经存在,?<jsp:useBean>能够定位它,那么主体中的内容将不会起作用?

属性以及用法?
id="beanInstanceName"?
在你所定义的范围中确认Bean的变量,你能在后面的程序中使用此变量名来分辨不同的Bean?
这个变量名对大小写敏感,必须符合你所使用的脚本语言的规定,在Java?Programming?Language中,这个规定在Java?Language?规范已经写明。如果这个Bean已经在别的<jsp:useBean>中创建,那么这个id的值必须与原来的那个id值一致.?


scope="page? ?request? ?session? ?application"?
Bean存在的范围以及id变量名的有效范围。缺省值是page,以下是详细说明:?

page?-?你能在包含<jsp:useBean>元素的JSP文件以及此文件中的所有静态包含文件中使用Bean,直到页面执行完毕向客户端发回响应或转到另一个文件为止。?
 ?
request?-?你在任何执行相同请求的Jsp文件中使用Bean,直到页面执行完毕向客户端发回响应或转到另一个文件为止。你能够使用Request对象访问Bean,比如request.getAttribute(beanInstanceName)?

session?-?从创建Bean开始,你就能在任何使用相同sessionJsp文件中使用Bean.这个Bean存在于整个Session生存周期内,任何在分享此?SessionJsp文件都能使用同一Bean.注意在你创建BeanJsp文件中<%?@?page?%>指令中必须指定session=true?

application?-?从创建Bean开始,你就能在任何使用相同applicationJsp文件中使用Bean.这个Bean存在于整个application生存周期内,任何在分享此applicationJsp文件都能使用同一Bean.?


class="package.class"?
使用new关键字以及class构造器从一个class中示例一个bean.这个class不能是抽象的,必须有一个公用的,没有参数的构造器.这个package的名字区别大小写。?

type="package.class"?
如果这个Bean已经在指定的范围中存在,那么写这个Bean一个新的数据库类型?。如果你没有使用classbeanName指定typeBean将不会被示例.packageclass的名字,区分大小写.?

beanName="{package.class? ?<%=?expression?%}"?type="package.class"?
使用java.beans.Beans.instantiate方法来从一个class或连续模版中示例一个Bean,同时指定Bean的类型。?

beanName可以是packageclass也可以是表达式,它的值会传给Beans.instantiate.tupe的值可以和Bean相同。?

package?和?class?名字区分大小写.?

?

?

4:<jsp:getProperty>

<jsp:getProperty?name=“beanName”?property=“propertyName”/>

相当于beanName.getPropertyName()方法调用(getXxx()方法)

?

获取Bean的属性值,用于显示在页面中

JSP?语法

jsp:getProperty?name="beanInstanceName"?property="propertyName"?/

例子

jsp:useBean?id="calendar"?scope="page"?class="employee.Calendar"?/

h2

Calendar?of?jsp:getProperty?name="calendar"?property="username"?/

/h2

描述

这个<jsp:getProperty>元素将获得Bean的属性值,并可以将其使用或显示在JSP页面中.在你使用<jsp:getProperty>之前,你必须用<jsp:useBean>创建它.

?

jsp:getProperty>元素有一些限制:

你不能使用<jsp:getProperty>来检索一个已经被索引了的属性

你能够和JavaBeans组件一起使用<jsp:getProperty,但是不能与Enterprise?Bean一起使用。

属性

name="beanInstanceName"

bean的名字,由<jsp:useBean>指定

property="propertyName"

所指定的Bean的属性名。

?

技巧:

sunJSP参考中提到,如果你使用<jsp:getProperty>来检索的值是空值,那么NullPointerException将会出现,同时如果使用程序段或表达式来检索其值,那么在浏览器上出现的是null(空).

?

?

5:<jsp:setProperty>

<jsp:setProperty?name=“beanName”?

property=“propertyName”?|property=“*”

value=“property?value”?|param=“paramName”/>

相当于beanName.setPropertyName(value)方法调用(setXxx()方法)


设置Bean中的属性值.?
JSP语法?
jsp:setProperty?
name="beanInstanceName"?
{?
property=?"*"? ?
property="propertyName"?[?param="parameterName"?]? ?
property="propertyName"?value="{string? ?<%=?expression?%}"?
}?
/>?
例子?
jsp:setProperty?name="mybean"?property="*"?/>?
jsp:setProperty?name="mybean"?property="username"?/>?
jsp:setProperty?name="mybean"?property="username"?value="Steve"?/>?
描述?
jsp:setProperty>元素使用Bean给定的setter方法,在Bean中设置一个或多个属性值。你在使用这个元素之前必须得使?用<jsp:useBean>声明此Bean.因为,<jsp:useBean>和<jsp:setProperty>是联系在一起的,同时这他们使用的?Bean实例的名字也应当相匹配(就是说,在<jsp:setProperty>中的name的值应当和<jsp:useBean>中id的值相同)?

你能使用多种方法利用<jsp:setProperty>来设定属性值?:?

通过用户输入的所有值(被做为参数储存中request对象中)来匹配Bean中的属性?
通过用户输入的指定的值来匹配Bean中指定的属性?
在运行时使用一个表达式来匹配Bean的属性?
每一种设定属性值的方法都有其特定的语法,下面我们会来讲解?

属性及其用法?
name="beanInstanceName"?
表示已经在<jsp:useBean>中创建的Bean实例的名字.?

property="*"?
储存用户在Jsp输入的所有值,用于匹配Bean中的属性。在Bean中的属性的名字必须和request对象中的参数名一致.?

从客户传到服器上的参数值一般都是字符类型?,这些字符串为了能够在Bean中匹配就必须转换成其它的类型,下面的表中列出了Bean属性的类型以及他们的转换方法.?

把字符串转化为其它类型的方法.?Property?类型?

方法?
boolean?or?Boolean?
java.lang.Boolean.valueOf(String)?
byte?or?Byte?
java.lang.Byte.valueOf(String)?
char?or?Character?
java.lang.Character.valueOf(String)?
double?or?Double?
java.lang.Double.valueOf(String)?
integer?or?Integer?
java.lang.Integer.valueOf(String)?
float?or?Float?
java.lang.Float.valueOf(String)?
long?or?Long?
java.lang.Long.valueOf(String)?

如果request对象的参数值中有空值,那么对应的Bean属性将不会设定任何值。同样的,如果Bean中有一个属性没有与之对应的Request参数值,那么这个属性同样也不会设定.?

property="propertyName"?[?param="parameterName"?]?
使用request中的一个参数值来指定Bean中的一个属性值。在这个语法中,property指定Bean的属性名,param指定request中的参数名.?

如果bean属性和request参数的名字不同,那么你就必须得指定propertyparam?,如果他们同名,那么你就只需要指明property就行了.?

如查参数值为空(或未初始化),对应的Bean属性不被设定.?

property="propertyName"?value="{string??%=?expression?%}"?
使用指定的值来设定Bean属性。这个值可以是字符串,也可以是表达式。如果这个字符串,那么它就会被转换成Bean属性的类型(查看上面的表).如果它是一个表达式,那么它类型就必须和它将要设定的属性值的类型一致。?

如果参数值为空,那么对应的属性值也不会被设定。另外,你不能在一个<jsp:setProperty>中同时使用paramvalue?

技巧?
如果你使用了property="*",那么Bean的属性没有必要按Html表单中的顺序排序

?

  相关解决方案