资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,*,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,jsp程序设计入门第12章Struts2框架基础,jsp程序设计入门第12章Struts2框架基础jsp程序设计入门第12章Struts2框架基础此文档下载自官网,除本页,其余未修改,可直接删除本页,此文档下载自官网,除本页,其余未修改,可直接删除本页,本章内容,Struts 2是基于MVC设计模式的Web应用程序开发框架,它是由Struts和WebWork发展而来的。,本章首先讨论Struts 2框架的体系结构,Action类的使用、OGNL表达式语言、Struts 2标签,接下来介绍Struts 2的国际化和用户输入校验,最后介绍了使用Tiles插件构建页面布局。,本章内容,12.1,Struts 2,框架概述,12.2,注册,/,登录系统,12.3 OGNL,12.4 Struts 2,常用标签,12.5 Struts 2,的国际化,12.6,用户输入校验,12.7,用,Tiles,实现页面布局,12.1 Struts 2框架概述,Apache Struts是用于开发Java Web应用程序的开源框架。,Struts提供了Web应用开发的优秀框架,是世界上应用最广泛的MVC框架。然而,随着Web应用开发需求的日益增长,Struts 已不能满足需要,修改Struts框架成为必要。,Apache Struts小组和另一个Java EE框架WebWork联手共同开发一个更高级的框架Struts 2。,12.1 Struts 2,框架概述,Struts 2结合了Struts和WebWork的共同优点,对开发者更友好,具有支持Ajax、快速开发和可扩展等特性。它已成为构建、部署和维护动态的、可扩展的Web应用框架。Struts 2并不是Struts的简单升级,可以说Struts 2是一个既新又不新的MVC框架。,Struts 2的设计思想和核心架构与WebWork是完全一致的,同时它又吸收了Struts的一些优点。也就是说,Struts 2是集WebWork和Struts两者设计思想之优点而设计出来的新一代MVC框架。,12.1.1 Struts 2框架的组成,Struts 2框架是基于MVC设计模式的Web应用开发框架,它主要包括控制器、Action对象、视图JSP页面和配置文件等,如图12.1所示。,图12.1 Struts 2的MVC架构,控制器,过,滤,器,模型,Action,视 图,Web,浏览器,JSP,拦,截,器,JavaBeans,控制器:控制器由过滤器、拦截器或,Action,组件实现。,模型:模型由,JavaBeans,实现,它可实现业务逻辑。,视图:通常由,JSP,页面实现,也可以由,Velocity Template,、,FreeMarker,或其他表示层技术实现。,配置文件:,Struts 2,框架提供一个名为,struts.xml,配置文件,使用它来配置应用程序中的组件。,Struts 2,标签:,Struts 2,提供了一个功能强大的标签库,该库提供了大量标签,使用这些标签可以简化,JSP,页面的开发。,12.1.2,Struts 2,开发环境的构建,运行Struts 2的平台必须满足下面需求:Servlet API 2.4、JSP API 2.0、Java 5。,1.,下载,Struts 2,库文件,开发Struts 2应用程序必须安装Struts 2库文件。可以到Apache Struts Web站点下载库文件包,地址为:。,目前的最新版本是2.3.8。,假设这里下载的是struts-2.3.8-all.zip,它是完整发布软件包,其中包括示例应用程序、文档、所有的库文件和源代码。,将该文件解压到一个临时目录中,其中lib目录中存放的是Struts 2的所有库文件,将下列文件复制到WEB-INFlib目录中:,1.,下载,Struts 2,库文件,asm-3.3.jar,asm-commons-3.3.jar,asm-tree-3.3.jar,commons-,commons-io-2.0.1.jar,commons-lang3-3.1.jar,1.,下载,Struts 2,库文件,freemarker-2.3.19.jar,javassist-3.11.0.GA.jar,ognl-3.0.6.jar,struts2-core-2.3.8.jar,xwork-core-2.3.8.jar,1.,下载,Struts 2,库文件,要使,Web,应用程序支持,Struts 2,功能,需要在,web.xml,文件中声明一个核心过滤器类和映射,代码如下:,2.,在,web.xml,中添加过滤器,struts2,org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter,struts2,/*,2.,在,web.xml,中添加过滤器,配置文件用来指定,URL,、,Java,类和视图页面,(,如,index.jsp,),之间的关系。在开发环境下配置文件应保存在,src,目录中,。,下面是,struts.xml,文件代码:,3.,创建,struts.xml,配置文件,/index.jsp,3.,创建,struts.xml,配置文件,提示:可以将Struts 2自带的一个名为struts2-blank应用程序导入到Eclipse中,在该应用程序中已经完成了各种配置,在此基础上进行开发会更方便。,3.,创建,struts.xml,配置文件,12.1.3 Struts 2,应用的开发步骤,开发,Struts 2,应用程序大致需,3,个基本步骤。,创建,Action,动作类;,创建结果视图;,修改配置文件,struts.xml,。,动作类在Struts 2中充当控制器,由它处理用户的动作。,当用户在视图页面中触发一个动作时(点击超链接或提交表单),请求将经由过滤器发送到一个Action动作类。,Struts将根据配置文件struts.xml中的信息确定要执行的Action对象。,1.,创建,Action,动作类,Action对象调用execute()方法执行业务逻辑或数据访问逻辑。,Action类执行后根据结果选择一个资源发送给客户。资源可以是服务器视图页面,也可能是PDF文件、Excel电子表格等。,当客户请求URL与某个动作名匹配时,Struts 2将使用struts.xml文件中的映射处理请求。,动作映射在struts.xml文件中使用标签定义。,1.,创建,Action,动作类,视图用来响应用户请求、输出处理结果。视图通常使用,JSP,页面实现。,2.,创建视图页面,struts.xml文件主要用来建立动作Action类与视图的映射。在其中为每个动作定义一个映射,它根据动作名确定执行哪个Action类,根据Action类的执行结果确定请求转发到哪个视图页面。,3.,修改,struts.xml,配置文件,12.1.4 一个简单的应用程序,假设创建一个向客户发送一条消息的应用程序,应完成下面,3,步:,(,1,)创建一个,Action,类(控制器)控制与用户、模型和视图的交互。,(,2,)创建一个服务器页面表示消息(视图)。,(,3,)在,struts.xml,文件中建立,Action,类与视图的映射。,动作是客户单击,HTML,页面中的超链接向,Web,服务器发送一个特定请求。动作类的,execute(),方法被执行并返回,SUCCESS,结果。,Struts,根据该结果返回一个视图页面(本例中是,hellouser.jsp,)。,下面是,HelloUserAction,类的定义。,1.,创建,Action,动作类,package com.action;,import com.opensymphony.xwork2.ActionSupport;,public class HelloUserAction extends,ActionSupport,private String message;/,动作属性,/,省略,getter,方法和,setter,方法,Override,public String,execute(),throws Exception,setMessage,(Hello Struts User);,return SUCCESS;,1.,创建,Action,动作类,程序,12.2 index.jsp,该页面中使用了,Struts,的,标签。要使用,Struts,的标签,应该使用,taglib,指令导入标签库:,该指令指定了,Struts,标签的,prefix,和,uri,属性值。,Struts,标签以前缀“,s”,开头,如,标签用来产生一个,URL,,它的,action,属性用来指定动作名,这里是,hello,。当用户点击该链接时将向容器发送,hello.action,请求动作。,2.,创建视图页面,创建下面的,JSP,页面,hellouser.jsp,来显示,HelloUserAction,动作类的,message,属性值,代码如下。,程序,12.3 hellouser.jsp,页面中,标签显示,HelloUserAction,动作类的,message,属性值。通过在,value,属性中的,message,告诉,Struts,框架调用动作类的,getMessage(),。,2.,创建视图页面,index.jsp,页面,Basic Struts 2 Application-Welcome,Welcome To Struts 2!,Hello User,hellouser.jsp,页面,Hello User!,编辑,struts.xml,文件,在,元素中添加,定义,修改后的代码如下。,/index.jsp,/hellouser.jsp,3.,修改,struts.xml,配置文件,访问,index.jsp,页面,当用户单击该页面中的“,Hello User”,链接。,4.,程序的运行,(1),容器接收对资源,hello.action,的请求,根据,web.xml,文件的配置将所有请求转发到,org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter,过滤类,该类对象是进入框架的入口点。,(2)Struts,框架在,struts.xml,文件中查找名为,hello,的动作映射,发现该映射对应于,HelloUserAction,类,,Struts,实例化该类,然后调用其,execute(),方法。,(3),在,execute(),方法中调用,setMessage(),方法设置,message,属性值并返回,SUCCESS,。框架检查,struts.xml,文件中的动作映射,并告诉容器执行结果页面,hellouser.jsp,。,(4),在处理,hellouser.jsp,页面时,标签,将调用,HelloUserAction,对象的,getMessage(),方法,返回,message,的值,将响应发送给浏览器。,5.,程序的执行过程,假设在,index.jsp,页面中通过表单提供用户名信息,在,hellouser.jsp,页面中显示用户名。,在,index.jsp,页面中添加下面的表单标签:,6.,显示个性化信息,HelloUserAction,类必须定义一个名为,userName,的成员变量和一个名为,setUserName(),的,public,方法,,Action,对象会自动接收表单域的值。,private String userName;,public String getUserName(),return userName;,public void setUserName(String userName),this.userName=userName;,6.,显示个性化信息,在,execute(),方法设置,message,属性值:,if(userName!=null),setMessage(getMessage()+userName);,访问,index.jsp,页面,在用户名文本框中输入,Hacker,,单击“提交”按钮,显示的页面如下。,6.,显示个性化信息,12.1.5 Action,动作类,Struts 2,应用程序可以完成的每一个操作都称之为一个动作。,例如,点击一个超链接是一个动作,,输入表单数据后点击提交按钮也是一个动作。,创建各种动作是,Struts 2,开发中最重要的任务。有些动作很简单,例如把控制权转交给一个,JSP,页面,而有些动作需要进行一些逻辑处理,这些逻辑需要写在动作类里。,处理这些动作使用动作类。,动作类其实质就是,Java,类,它们可以有属性和方法,但必须遵守下面规则。,每个属性都必须有一个,getter,方法和一个,setter,方法。动作属性的名字必须遵守与,JavaBeans,属性名同样的命名规则。动作的属性可以是任意类型,而不仅仅是,String,类型。,12.1.5 Action,动作类,动作类必须有一个不带参数的构造方法。如果没有提供构造方法,,Java,编译器会自动提供一个默认构造方法。,每个动作类至少有一个方法供,Struts 2,在执行这个动作时调用。,一个动作类可以包含多个动作方法。在这种情况下,动作类可以为不同的动作提供不同的方法。例如,一个名为,UserAction,的动作类可以有,login(),和,logout(),方法,并让它们分别对应,User_login,和,User_logout,动作。,12.1.5 Action,动作类,Struts 2,定义了一个,com.opensymphony.xwork2.Action,接口,所有的动作类都可以实现该接口,该接口中定义了,5,个常量和一个,execute(),方法,如下所示:,1.Action,接口,public interface Action,public final static String SUCCESS=success;,public final static String ERROR=error;,public final static String INPUT=input;,public final static String LOGIN=login;,public final static String NONE=none;,public String,execute(),throws Exception;,1.Action,接口,编写动作类通常继承,ActionSupport,类,它是,Action,接口的实现类,该类还实现了,Validateable,接口、,TextProvider,等接口。,设置校验错误的方法、,返回校验错误的方法,。,设置和返回动作消息的方法,。,返回国际化信息的方法,。,2.ActionSupport,类,ActionSupport,类是,Struts 2,的默认动作处理类,即如果配置的,Action,没有指定,class,属性,系统自动使用,ActionSupport,类作为动作处理类。,在,Struts 2,中,动作类不一定必须实现,Action,接口,任何,普通的,Java,对象,(,Plain Old Java Objects,,,POJO,)只要定义,execute(),方法就可以作为动作类使用。,2.ActionSupport,类,下面的,MyAction,类是最简单的动作类。,public class MyAction,public String execute()throws Exception,/,执行某些操作,return success;,注意,,MyAction,类没有实现任何接口和扩展任何类。动作执行将调用这里的,execute(),方法,该方法不带参数,返回一个,String,对象。,2.ActionSupport,类,12.1.6,配置文件,struts.xml,文件,主要用来建立动作,Action,类与视图的映射。,该文件是以,为根元素的,XML,文件。,允许出现在,和,之间的直接子元素包括,package,、,constant,、,bean,和,include,,这些元素还可包含若干子元素。,12.1.6,配置文件,struts.xml,文件,DTD,的完整定义在,struts2-core-2.3.8.jar,文件中,文件名为,struts-2.3.dtd,。,下面对几个比较重要的元素进行讨论。,1.package,元素,元素用来把动作组织成不同的包(package)。一个典型的struts.xml文件可以有一个或多个包。,package元素的作用是对配置的信息进行逻辑分组。使用该元素可以将具有类似特征的action等配置信息定义为一个逻辑配置单元,这样可以避免重复定义。,1.package,元素,package,元素的常用属性,name,是指定该包的名称,其他包可使用此名称引用该包,extends,指定当前包继承哪一个已经定义的包,namespace,为这个包指定一个,URL,映射地址,abstract,指定当前包为抽象的,即该包中不能包含,action,的定义,1.package,元素,在,package,中可以配置的信息包括,action,result,interceptor,/example/HelloWorld.jsp,/example/Login.jsp,Menu,/example/1.jsp,用于定义一个动作。每个动作都必须有一个名字,属性:,name,指定动作名称,class,指定动作完整类名,缺省为,ActionSupport,类,method,指定执行动作的方法名,缺省为,execute(),方法,2,.action,元素,如果动作有与之对应的动作类,则必须使用,class,属性指定动作类的完整名称。此外,还可以指定执行动作类的哪个方法。下面是一个例子。,2,.action,元素,如果给出了,class,属性但没有给出,method,属性,动作方法的名字将默认为,execute(),。下面两个,action,元素的含义是等价的。,2,.action,元素,用来指定结果类型,即定义在动作完成后将控制权转到哪里。,元素对应动作方法的返回值。动作方法在不同的情况下可能会返回不同的值,一个元素可能会有多个元素,每个对应着动作方法的一种返回值。,3,.result,元素,比如,若某个方法有“,success”,和“,input”,两种返回值,就必须提供两个,元素。例如,下面的,元素包含两个,元素。,/jsp/Confirm.jsp,/jsp/Product.jsp,3,.result,元素,如果省略,元素的,name,属性,其默认值是“,success”,,如果省略了,type,属性,默认结果类型是,Dispatcher,。下面两个,元素的含义是相同的。,/jsp/Confirm.jsp,/jsp/Confirm.jsp,3,.result,元素,元素可以包含一个,元素,其中包含一些通用的结果。如果某个动作在它的动作声明中不能找到一个匹配的结果,它将搜索,元素(如果有这个元素的话)。,下面是,元素的一个例子。,/jsp/GenericErrorPage.jsp,login.jsp,4.global-results,元素,5.constant,元素,元素用来定义常量或覆盖,default.properties,文件里定义的常量。,如下所示的,元素将把,struts.DevMode,项设置为,true,。,6.include,元素,元素的作用是包含其他的,Struts 2,配置文件。这样,通过,元素就可以轻松地把,Struts 2,的配置文件分解为多个文件。,元素是,的直接子元素,下面是一个例子。,12.2 注册/登录系统,本节实现一个注册,/,登录系统。,按照,MVC,设计模式,可以将应用组件分成如下:,模型层,包括存放用户信息的,JavaBean,类。,持久层,包括数据库表、,DAO,类等。,控制层,包括,Action,动作类。,表示层,包括,JSP,页面。,12.2 注册/登录系统,12.2.1,定义持久化类,12.2.2,持久层实现,12.2.3,定义,Action,动作类,12.2.4,创建结果视图,12.2.5,修改,struts.xml,配置文件,12.2.6,运行应用程序,12.2.1,定义持久化类,为了封装表单数据,定义一个简单的,User,类,该类遵循,JavaBeans,规范,包含下面,4,个属性。,private String username;,private String password;,private int age;,private String email;,程序,12.4 User.java,12.2.2,持久层实现,用户数据存放在一个名为,userinfo,的数据表中,该表有,username,、,password,、,age,和,email,字段。,CREATE TABLE userinfo(,username varchar(20)PRIMARY KEY,-,用户名,password varchar(8)NOT NULL,-,口令,age int,-,年龄,email varchar(50)UNIQUE);-Email,地址,这里持久层实现使用,Hibernate,,需将库文件添加到,WEB-INF/lib,目录中,,User,类的映射文件,User.hbm.xml,如下。,程序,12.5 User.hbm.xml,在配置文件,hibernate.cfg.xml,中增加下面一行:,12.2.2,持久层实现,12.2.3,定义,Action,动作类,下面的,RegisterAction.java,程序是一个动作类。在该类中声明了一个,User,类型的属性,user,,并为该属性定义了,setter,方法和,getter,方法。,user,对象与,JSP,页面表单域使用的,user,名匹配。,程序,12.6 RegisterAction.java,12.2.3,定义,Action,动作类,当表单提交时,,Struts,动作类首先使用,User,类的默认构造方法创建,user,属性对象,然后用表单域的值填充该,user,对象的每个属性,这个过程发生在,execute(),执行之前。,该类定义了,register(),和,login(),,分别用来处理注册和登录动作。,在各自的方法体中创建一个,Session,对象,然后使用,save(user(),将,user,对象写入数据库,使用,Query,的,list(),检索数据库中是否存在,user,对象,从而实现注册和登录功能。,12.2.4,创建结果视图,为了将表单数据收集到,User,对象中,定义下面的页面,register.jsp,,其中包含一个表单用来接收用户输入数据。,程序,12.7 register.jsp,12.2.4,创建结果视图,当用户点击“提交”按钮时系统执行,Register,动作,将表单数据提交给动作对象,因此需要在,struts.xml,文件中定义动作名称。,注意,,4,个输入域的,name,属性值对应于,User,类的,4,个属性,这里用对象名,user,来引用,4,个属性。当我们创建,Action,类处理该表单时,必须在,Action,类中指定该对象。,12.2.4,创建结果视图,页面中的,和,标签用来显示动作错误和域校验的错误。该应用程序还包括登录页面,login.jsp,用来显示用户登录信息,代码如下。,程序,12.8,login.jsp,success.jsp,是注册成功显示的页面,代码如下。,程序,12.9,success.jsp,12.2.4,创建结果视图,success.jsp,是注册成功显示的页面,代码如下。,程序,12.9,success.jsp,该页面通过,标签显示,user,对象的信息,它将调用,User,类的,toString,(),输出结果。,welcome.jsp,页面用于显示登录成功欢迎消息,代码如下。,程序,12.10,welcome.jsp,12.2.5,修改,struts.xml,配置文件,/register.jsp,/login.jsp,/welcome.jsp,/error.jsp,/success.jsp,/error.jsp,12.2.6 运行应用程序,在,index.jsp,页面中添加下列代码定义两个动作,用户注册,用户登录,在,index.jsp,页面中单击“用户注册”链接,打开,register.jsp,页面,如图,12-4,所示。在该页面中输入用户信息,单击“注册”按钮,则显示如图,12-5,所示页面。,12.2.6,运行应用程序,12.3 OGNL,OGNL(Object-Graph Navigation Language)称为对象-图导航语言,它是一种简单的、功能强大的表达式语言。,使用OGNL表达式语言可以访问存储在ValueStack和ActionContext中的数据。,12.3.1 ValueStack栈,对应用程序的每一个动作,,Struts,在执行相应的动作方法前会先创建一个,ValueStack,对象,称为,值栈,。,ValueStack,用来保存该动作对象及其属性。,JSP,页面能够访问,ValueStack,12.3.1 ValueStack栈,在ValueStack栈的内部有两个逻辑组成部分,分别是Object Stack和Stack Context,如图12.6所示。,Object Stack,parameters,request,session,application,attr,Object 0,Object 1,Object n,Stack Context,12.3.2,读取,Object Stack,中对象属性,要访问,Object Stack,中对象的属性,可以使用以下几种形式之一:,object.propertyName,objectpropertyName,objectpropertyName,若栈顶动作对象有一个,message,属性,则可以用下面形式引用:,0.message,0message,0message,如果从栈顶对象开始搜索,则可以省略下标部分。例如,,0.message,可直接写成,message,的形式。,还可以使用下面的语法访问动作类的,getMessage,(),方法:,示例,定义,SampleAction,动作类,public class SampleAction,private String message;,private UserBean user=,new UserBean();,user.setUsername(,王小明,);,public String execute(),setMessage(,世界,你好!,);,return success;,示例,在,struts.xml,文件中使用下面,元素定义动作。,/sample.jsp,示例,在,index.jsp,页面中添加下面代码定义一个超链接引发,sample,动作。,Sample JSP,示例,sample.jsp,0.user.username:,user.username:,message:,getMessage():,12.3.3,读取,Stack,Context,对象的属性,在,Stack,Context,中包含下列对象:,application,、,session,、,request,、,parameters,、,attr,。,这些对象都是,Map,类型的对象,可在其中存储“键,/,值”对数据。,12.3.3,读取,Stack,Context,对象的属性,application,中包含当前应用的,Servlet,上下文属性,session,中包含当前会话级属性,request,中包含当前请求级属性,parameters,中包含当前请求的请求参数,attr,用于在,request,、,session,和,application,作用域中查找指定的属性。,12.3.3,读取,Stack,Context,对象的属性,要访问,Stack,Context,中的对象需要给,OGNL,表达式加上一个前缀字符“,#”,,可以使用以下几种形式之一:,#object.propertyName,#objectpropertyName,#objectpropertyName,这里,object,为上述,5,个对象之一,,propertyName,为对象中的属性名。例如:,12.3.5,使用,OGNL,访问数组元素,若动作类,SampleAction,中声明一个,String,数组属性,在,JSP,页面中可以使用,标签访问。,private String cities;,public String execute(),cities=new String,北京,上海,天津,重庆,;,return success;,12.3.5,使用,OGNL,访问数组元素,在,JSP,页面中可以使用,OGNL,按如下方式访问数组元素。,cities:,cities.length:,cities0:,top.cities:,12.3.6,使用,OGNL,访问,List,类型的属性,private List fruitList=new ArrayList();,fruitList.add(,苹果,);,fruitList.add(,橘子,);,fruitList.add(,香蕉,);,public String execute(),return success;,12.3.6,使用,OGNL,访问,List,类型的属性,在,JSP,页面中可以使用,OGNL,按如下方式访问,ArrayList,的元素。,fruitList:,fruitList.size:,fruitList0:,12.3.7,使用,OGNL,访问,Map,类型的属性,private Map countryMap=,new HashMap();,countryMap.put(China,北京,);,countryMap.put(American,纽约,);,countryMap.put(Australia,堪培拉,);,public String execute(),return success;,12.3.7,使用,OGNL,访问,Map,类型的属性,在,JSP,页面中可以使用,OGNL,按如下方式访问,Map,的元素。,countryMap:,countryMap.size:,countryMap1:,12.4 Struts 2常用标签,Struts 2,框架提供了一个标签库使得,Web,应用程序可以很容易地在页面中引用动态数据,创建动态响应。,有些标签模仿标准的,HTML,标签,还有些标签用于创建非标准的控件。,Struts 2,的标签可以分为两大类:,通用标签,用户界面(,UI,)标签,12.4 Struts 2常用标签,12.4.1 通用标签,1.,标签,2.,标签,3.,标签,4.,标签,5.,标签,6.,标签,7.,标签,8 ,标签,9 ,标签,10.,标签,1.,标签,用于在页面中输出一个动作属性值。,例如,下面标签将输出,customerId,动作属性的值。,下面这个,标签将输出会话作用域中名为,userName,的属性值。,1.,标签,如果没有给出,value,属性,将输出,ValueStack,栈顶对象的值。,通常,,EL,语言可以提供更简洁的语法。,例如,下面的,EL,表达式同样可以输出,customerId,动作属性的值。,$customerId,2.,标签,标签用于把一个参数传递给包含它的标签(如,、,等)。,它有两个属性:,name,值为参数名,value,值为参数值。,2.,标签,如果要传递一个,String,类型的字符串作为参数值,必须把它用单引号括起来。例如:,也可以将,value,属性值写在,标签的开始标签和结束标签之间,如下所示:,John Smith,3.,标签,标签,用于创建,JavaBean,实例,并把它压入,Value Stack,栈的,Stack Context,。这个标签的功能与,JSP,的,动作很相似。,下面定义一个,ConverterBean,用来实现摄氏温度和华氏温度的相互转换。,3.,标签,public class ConverterBean,private double celcius;,private double fahrenheit;,public double getCelcius(),return(fahrenheit-32)*5/9;,public void setCelcius(double celcius),this.celcius=celcius;,public double getFahrenheit(),return celcius*9/5+32;,public void setFahrenheit(double fahrenheit),this.fahrenheit=fahrenheit;,3.,标签,下面的,tagDemo.jsp,页面中使用了,和,标签。,BeanTagExample,37,37C=F,4.,标签,标签用来在指定作用域中定义一个属性并为其赋值,然后将其存储到,Stack Context,中。,使用,标签定义,popLanguage,变量并赋值,然后访问该变量。,name,属性指定变量名,,value,属性指定变量值。,Popular Language is:,5.,标签,标签与,标签类似,区别是,标签把一个对象压入,ValueStack,而不是,Context Map,。,标签的另一个特殊的地方是,它的起始标签把一个对象压入栈,结束标签将弹出该对象。,标签只有一个,value,属性,它指定将被压入,ValueStack,栈中的值。,5.,标签,假设有一名为,Employee,的,JavaBean,类,该类有,name,和,age,两个属性。在,JSP,中可使用下列代码创建一个,bean,实例并将其压入,ValueStack,。,姓名,:,年龄,:,姓名,:,年龄,:,6.,标签,标签用来创建一个超链接,指向其他,Web,资源,尤其是本应用程序的资源。例如:,Hello World,该标签通过,action,属性指定引用的资源。当程序运行时,将鼠标指向链接,可以看到链接的目标是,hello.action,,它相对于,Web,应用程序的根目录。,6.,标签,在,标签内可以使用,标签为,URL,提供查询串。例如:,Bruce Phillips,Hello Bruce Phillips,这里,使用,为请求提供一个查询参数,,userName,为参数名,标签内的值为参数值。,7.,标签,标签用于在,JSP,页面中直接调用一个,Action,。,8 ,标签,标签用来对,Java,语言的一个,Date,对象进行格式化。用户可以指定一种输出格式(如,“,dd/MM/yyyy hh:mm,”,),还可以产生易读的格式(如,“,2,小时,,14,分钟,”)。,private Date currentDa
展开阅读全文