1、Click to edit Master title style,Click to edit Master text stylesgood1,Second levelgood2,Third levelgood3,Fourth levelgood4,Fifth levelgood5,手把手教程,版权所有:尚学堂科技,Struts+Hibernate+Spring,尚学堂,Struts+Hibernate+Spring,Web,开发流行架构,课程总体目标,我们的目标是:能够熟练运用当前流行的,java,开源框架:,Struts,、,Hibernate,以及,Spring,来构建灵活、易于扩展的多
2、层,Web,应用程序。,多层架构概述,C/S,:以数据库为中心,B/S,:多层架构才是真正的目的,B/S,多层架构将显示、业务运算、数据库等功能完全分离,杜绝彼此的耦合与影响,从而实现松耦合和良好的可维护性。,呈现层,(UI Layer/Presentation Layer),struts,业务逻辑层(,Business Layer,),spring,持久化层(,Persistence Layer,),hibernate,Struts,开源,MVC,框架,Struts,课程目标,深入理解,MVC,模式,掌握,Struts,体系架构,掌握,Struts,开发流程,熟练掌握,Struts,的配置方
3、法,从,Servlet,说开去,什么是,Servlet,?,如何编写,Servlet,?,如何映射,Servlet,?,相对路径与绝对路径的基本概念,如何基于,Servlet,编程?,JavaBeans,JavaBean,是一种,java,类,JavaBean,必须是具体的和公共的,并且具备无参构造器,JavaBean,通过提供符合一致性设计模式的公共方法将内部域暴露称为属性,JavaBean,提供两种方法来访问,Bean,的内部状态:,访问器,(getters),用来读,JavaBean,状态,以小写,get,前缀开始,后跟属性名,属性名的第一个字母必须大写,,返回值必须匹配相应修改器的方法
4、的参数,;如果访问器返回,boolean,值,则使用,is,前缀开始,后跟属性名,属性名第一个字母必须大写。,修改器,(setters),用来改变,JavaBean,状态,以小写,set,前缀开始,后跟属性名,属性名的第一个字母必须大写,,修改器的返回值通常为,void,Struts,是什么?,Struts,的目标是提供一个开发,Web,应用的开源框架。,Struts,鼓励基于,M2,模式(即,MVC,设计模式)来开发程序。,Model,View,Controller,Model1,与,Model2,设计模式简介,以,JSP,为中心的开发模型,称为,Model1,(,JSP+JAVABEAN,
5、业务逻辑与表示逻辑混和,不利维护与重用,HTML,中嵌入了大量的,JAVA,代码,验证、流程控制、更新程序的状态全部在,JSP,中完成,基于,MVC,模式的框架,MVC,将问题进行分解,模型包含应用程序的核心功能。模型封装了应用程序的状态。它对视图或控制器一无所知。,视图提供模型的表示。它是应用程序的 外观。视图可以访问模型的读方法,但不能访问写方法。此外,它对控制器一无所知。,控制器对用户的输入作出反应。它创建并设置模型。,Model2,Struts,框架概览,Struts,框架概览,浏览器,web,容器将对来自,HTTP,的每个请求创建一个,request,对象,并用一个,respon
6、se,对象作出响应,控制器,控制器接收来自浏览器的请求,在,struts,中,是由一个,servlet,来充当控制器的角色,struts-,config.xml,文件配置控制器,模型,在,struts,中,由,Action,类充当业务逻辑的包装器,,ActionForm,是程序的状态,视图,JSP,文件,Struts,框架组件,ActionServlet,类控制导航流,ActionServlet,根据,URI,来决定哪个,Action,类被用于处理请求,Action,可以校验输入,并访问业务层以便从数据库检索信息,Action,需要知道页面提交了哪些内容,所以由,ActionServlet,根
7、据请求,URI,来决定将请求参数绑定到哪个,ActionForm,中,并传入,Action,Action,在完成业务逻辑后,返回一个,ActionForward,对象,ActionServlet,根据,ActionForward,对象中的路径来调用页面完成响应,Struts,将这些信息绑定在一个,ActionMapping,对象中,一个,ActionMapping,对应一个请求,URI,当请求路径到达的时候,ActionServlet,就会查询,ActionMapping,对象,,ActionMapping,对象将告诉,ActionServlet,哪个,Action,类会被调用、哪个,Acti
8、onForm,类被用于传递页面数据以及哪些,ActionForward,将被用于转向,有关,Action,、,ActionForm,、,ActionForward,等信息,,Struts,通过一个配置文件:,struts-,config.xml,文件来定义。,Struts1.X,和,Struts2.X,Struts1.X,与,Struts2.X,的差异较大,Struts1.X,应用更加广泛,Struts2.X,实际上是另外一个框架,Webwork,发展而来的,后续课程将会有对,webwork/Struts2.X,的介绍以及实例操作,快速开始一个,Struts,项目,第一个项目,实现用户登录操作
9、用户将看到一个登录页面,要求用户输入用户名以及密码,如果用户名以及密码都是,admin,,提示登录成功,否则提示登录失败,1,、用,Eclipse,创建一个,J2EE Web,应用项目,如右图所示,2,、下载并解压,Struts,项目,*从,Apache,网站下载,struts,最新版,*将压缩包解压到一个目录,此目录为,STRUTS_HOME,目录,3,、将,STRUTS_HOME/lib,目录下的所有,.jar,文件拷贝到刚创建的,web,项目的,WebContent,/WEB-INF/lib,目录下,4,、配置,ActionServlet,:,修改,web,项目的,web.xml,文件
10、添加如下,Servlet,映射配置,(转下一页),web.xml,的配置,action,org.apache.struts.action.ActionServlet,config,/WEB-INF/struts-,config.xml,2,action,*.do,我们将需要创建如下文件,一个,ActionForm,LoginActionForm.java,一个,Action,LoginAction.java,struts-,config.xml,文件,三个页面,登录页面,login.jsp,登录成功提示页面,login_success.jsp,登录失败提示页面,login_error.jsp
11、就这些!没别的了!,创建,LoginActionForm.java,ActionForm,是一个,JavaBean,,需继承,org.apache.struts.action.ActionForm,类,它捕获通过,HTTP,请求传送的参数,ActionForm,针对每个,HTML,表单中的字段具有一个对应的属性,ActionServlet,匹配请求中的参数和,ActionForm,中的属性,并调用,ActionForm,中的,setter,方法,将参数传入,ActionForm,我们的,login.jsp,有,username,和,password,两个表单字段(下面将会看到),所以,我们需
12、要定义,ActionForm,中相应的,setter,方法:,setUsername,和,setPassword,方法,ActionForm,中的,getter/setter,方法,可以通过,Eclipse,集成环境,自动生成,ActionForm,中的内部属性全部定义为私有的(,private,),并通过公共,(public),的,getter/setter,方法来访问,package,com.bjsxt.strutstest,;,import,org.apache.struts.action.ActionForm,;,public class,LoginActionForm,extends
13、ActionForm,private String username;,private String password;,/*,*return Returns the password.,*/,public String,getPassword,(),return password;,/*,*,param,password The password to set.,*/,public void,setPassword(String,password),this.password,=password;,/*,*return Returns the username.,*/,public Str
14、ing,getUsername,(),return username;,/*,*,param,username The username to set.,*/,public void,setUsername(String,username),this.username,=username;,创建,LoginAction.java,Action,是一个,Java,类,需继承,org.apache.struts.action.Action,类,ActionServlet,将会组装,ActionForm,,并将它传递给,Action,Action,通常负责:,输入校验,调用业务逻辑类执行业务逻辑操作
15、决定返回哪个,ActionForward,我们的,LoginAction,做了如下事情,这些是一个,Action,通常都会做的最典型的事情:,将输入的,ActionForm,强制转换为,LoginActionForm,从,LoginActionForm,对象中获取用户名以及密码的数据信息,执行用户名及密码的逻辑判断操作(在通常的情况下,要将这些业务逻辑交给专门的类去处理,这里这样做是为了演示的需要),根据业务逻辑执行的结果,决定返回哪个,ActionForward,,我们在这里使用,success,这个标识来表示登录成功页面,用,error,标识来表示登录失败页面,public class,
16、LoginAction,extends Action,public,ActionForward,execute(ActionMapping,mapping,ActionForm,form,HttpServletRequest,request,HttpServletResponse,response)throws Exception,/,将,ActionForm,强制转换为,LoginActionForm,LoginActionForm,loginForm,=(,LoginActionForm)form,;,/,从,LoginActionForm,中提取从页面表单传递过来的参数,String u
17、sername=,loginForm.getUsername,();,String password=,loginForm.getPassword,();,/,根据这些参数,执行业务逻辑操作,if(admin.equals(username,)&,admin.equals(password,),/,如果用户名和密码均为,admin,,则转向登录成功页面,return,mapping.findForward(success,);,else,/,否则转向登录失败页面,return,mapping.findForward(error,);,创建,Struts,配置文件,struts-,config.
18、xml,在,WebContent,/WEB-INF,目录下创建,struts-,config.xml,文件,并添加如下内容(空白的,struts-,config.xml,),紧接着,我们将往这个空白的配置文件中添加其它配置信息,struts-,config.xml,文件,是由,ActionServlet,读取的配置文件,它定义了所有关于,Action,、,ActionForm,、,ActionForward,等的详细信息,添加,ActionForm,配置,配置,LoginActionForm,我们在,struts-,config.xml,文件中,在,标签的内部,添加如下配置:,标签内部可以包含
19、多个,标签,标签必须指定,name,和,type,属性,name,属性是给此,ActionForm,一个标识名称,type,属性指定了此,ActionForm,是哪个类,必须是全路径的类名,添加,Action,配置,配置,LoginAction,我们在,struts-,config.xml,文件中,紧接着,标签的下面,添加对,LoginAction,的配置,标签可以配置的重要属性包括:,path-,从页面上通过一个什么样的,URL,路径来访问,Action,(不包含,.do,),type,访问这个URL的时候,调用哪个Action类,,这是,Action,的全路径类名,name,这个属性用来标
20、识哪个,ActionForm,将被创建,并将提交的表单组件给它,scope,FormBean,的作用域范围,可以取值为,session,和,request,,一般取值都是,request,创建,login.jsp,在,WebContent,目录下创建,login.jsp,文件,如右边所示,添加一个表单,,action,为,login.do,,这个,login.do,的意思,将会告诉,struts,的,ActionServlet,,它将需要调用哪个,Action,来处理这个表单的请求,添加输入域,username,,这个,username,的表单字段,必须跟,LoginActionForm,中的
21、属性一致,添加密码输入域,password,请登录,请输入用户名:,请输入密码:,创建,login_success.jsp,和,login_error.jsp,login_success.jsp,登录成功,欢迎您,您已经成功登录!您创建的第一个,Struts,应用程序已成功运行!,login_error.jsp,登录失败,您的登录失败了,可能原因是用户名或密码不正确,请返回重新输入,返回登录页面,启动,Tomcat,并运行,login.jsp,运行,login.jsp,之后,能看到如下所示的登录表单,输入用户名,admin,和密码,admin,,将能看到登录成功的界面,输入其它用户名或密码,将
22、能看到登录失败的界面,在这个简单的应用程序背后发生了什么?,当你从浏览器输入地址:,localhost:8088/Struts-Test/login.jsp,,,Tomcat,将按通常情况来处理这个,JSP,并返回浏览器,当你提交表单,实际上是提交到了这样一个,URL,地址:,localhost:8088/Struts-Test/login.do,,,Tomcat,将会根据,web.xml,的配置,将这个请求发送给相应的,Servlet,,在我们的应用中,,Tomcat,将会把这个请求发送给,org.apache.struts.action.ActionServlet,这个类(请参看,web.
23、xml,的配置),然后,ActionServlet,根据,struts-,config.xml,的配置信息,调用,LoginAction,对象去处理这个请求,在此之前,它会将页面表单的请求数据封装到,LoginActionForm,对象中,并传递给,LoginAction,LoginAction,返回一个,ActionForward,对象,包含了将要转向的路径信息,ActionServlet,根据这个,ActionForward,对象所包含的路径信息,调用相应的页面去执行响应,流程图请参考下一页,LoginAction,应用程序的流程图,Struts,项目架构图,Struts,工作流程图,St
24、ruts,与,MVC,视图(,View,),在使用,Struts,框架的,web,应用程序中,,JSP,以及相关的技术(如,Taglib,)等共同组成视图层,这一层的主要职责是显示用户界面。,Struts,提供了很多机制让我们能更加轻松地创建视图,控制器(,Controller,),Struts,中,,ActionServlet,是控制器层组件,模型(,Model,),模型包括:系统的内部状态以及改变系统状态的动作,Struts,中的,Action,和,ActionForm,是模型的一部分,Struts,建议把,”,做什么,”(Action),和,”,如何做,”(,业务逻辑,),相分离,创建业
25、务逻辑处理类(,Model,),使用单例模式,(Singleton),来创建业务逻辑处理类,创建,UserManager,业务逻辑处理类,创建,validate,方法,创建,UserNotFoundException,创建,PasswordErrorException,package,com.bjsxt.strutstest,;,public class,UserManager,private static,UserManager,userManager,;,private,UserManager,(),public static synchronized,UserManager,getIns
26、tance,(),if(userManager,=null),userManager,=new,UserManager,();,return,userManager,;,public void,validate(String,username,String,password),throws,UserNotFoundException,PasswordErrorException,if(!admin.equals(username,),throw new,UserNotFoundException,();,if(!admin.equals(password,),throw new,Passwor
27、dErrorException,();,Action,中如何调用业务逻辑处理类?,我们看下面的代码:,try,UserManager.getInstance().validate(username,password,);,return,mapping.findForward(success,);,catch(,UserNotFoundException,e),e.printStackTrace,();,catch(,PasswordErrorException,e),e.printStackTrace,();,return,mapping.findForward(error,);,通过添加业务
28、逻辑处理类,我们将验证逻辑转移到了业务逻辑处理层,页面之间数据的传递,如何将数据从,Action,中传递到下一个,JSP,页面?,一般使用,request.setAttribute,方法:,在,Action,中,使用,request.setAttribute(String,name,Object,data),方法往,request,中设置参数,在,JSP,中,使用,request.getAttribute(String,name),来获取相应的参数,在原来,LoginAction,的基础上编写相应的代码,测试页面数据传递,传递登录成功者的帐号信息到成功页面,并显示,进一步理解,Struts,控
29、制流,细节:所有的页面请求由容器接收,Struts,的核心组件是,ActionServlet,,像其它所有,Servlet,一样,它是生存在容器中的,比如,Tomcat,、,WebLogic,等,当容器启动的时候,它会读取,web.xml,文件(部署描述符),告诉容器它会装入哪些,Servlet,一个标准的,Servlet,是通过,servlet,-mapping,来设定,哪些请求,将会被提交到哪些,servlet,中,Struts,的,servlet,-mapping,配置一般是:,action,*.do,这样配置的意思是:任何以,.do,结尾的,URL,请求,都会被发送到,ActionSe
30、rvlet,进行处理,小结,MVC,基本结构,Struts,的主要组成部分,如何编写,ActionForm,如何编写,Action,如何在配置文件中定义映射,URL,、,Action,以及,ActionForm,如何获取从页面传递到,Action,的数据,如何将数据从,Action,传递到下一个页面,如何将业务逻辑与表示层分离,需牢记原则:不要在,Action,中进行业务逻辑的处理,业务逻辑应交给专门的,Model,层去做,在业务逻辑层抛出异常,并在,Action,中捕捉和处理,Struts,Taglib,易于使用,能代替直接在页面上写,JAVA,脚本,便于重用,用,Struts,Taglib
31、实现成功页面,在以后的开发中,将逐步介绍一些常用的,Taglib,尝试简单的,tag lib,使用,在,JSP,文件的头部添加如下声明:,关于,struts tag lib,的说明,可以查看相关的参考文档,常用的,struts tag lib,和,和,JSTL,简介:,SUN,的标准,Taglib,库,JSP,标准标签库(,JSP Standard Tag Library,,,JSTL,),迭代和条件判断,数据管理格式化,XML,操作,数据库访问,函数标签库,表达式语言(,EL,),EL,隐式对象,存取器,运算符,在项目中使用,JSTL,拷贝,jstl.jar,和,standard.jar,
32、到,WEB-INF/lib,目录下,在,JSP,中添加伪指令,常用,JSTL,标记,、,和,进一步理解,ActionForm,ActionForm,的要求,必须扩展自,org.apache.struts.action.ActionForm,如果要获取表单的值,必须定义一个,public,属性,如果要求在将,ActionForm,传递到,Action,之前进行校验,必须实现,validate,方法,如果想要在组装前初始化属性,必须实现,reset,方法,DynaActionForm,举例说明,DynaActionForm,的配置,DynaActionForm,的使用,ActionForm,作为表
33、单字段收集器,通过,HTTP,提交表单数据,通过,HTTP,上传文件,通过例子演示文件上传的简易方法,通过,HTTP,提交空字段,修改原来的,JSP,文件,提交空字段,ActionForm,作为类型转换器,所有从表单提交到后台的数据均为字符串类型,如何利用,ActionForm,自动转换,int,数据类型,举例说明,如何利用,ActionForm,自动转换,boolean,数据类型,举例说明,如何利用,ActionForm,自动转换,Date,类型,定义,Converter,注册,Converter,举例说明,如何利用,ActionForm,自动转换,Double,类型,举例说明,Action
34、Form,作为传输对象,ActionForm,可以被其它,bean,或者过程作为数据载体。,Transfer,对象,(,也称为值对象(,value object,),),用来通过发送粗糙,规整的数据视图来交换精细规整的数据。,ActionForm,的各个属性都必须是可变的。,提示:,使用粗糙,规整,ActionForm,来减小类维护。,应用中的表单一般共享属性,创建一个基本的,ActionForm,,具有表单需要的所有属性,ActionForward,ActionForward,能做什么?,在,Action,中,经常问的问题是:“,OK,操作成功了,然后呢?”,ActionForward,会回
35、传给,ActionServlet,ActionForward,中的路径,可以是一个带参数的,URI,ActionForward,的属性,name,path,redirect,className,转发,(forward),与重定向,(redirect),全局,ActionForward,与局部,ActionForward,动态创建,ActionForward,将,ActionForward,定义在一个,Struts,配置文件中是个好的选择,但也可以在,Action,中动态创建,ActionForward,,而不需要在配置文件中指定,如下所示:,ActionForward,forward=new,
36、ActionForward(/do/itemEdit?action,=edit);,举例说明,ActionMapping,理解,ActionMapping,path,forward,type,name,scope,validate,input,parameter,unknow,ActionMapping,Scope,属性,在,Action,映射配置中,,Scope,属性可以取值为:,request,或,session,Scope,属性表示:,Struts,框架在将,ActionForm,对象(与目标,Action,匹配的,ActionForm,)传送到,Action,之前,会将,ActionF
37、orm,对象保存的位置,如:,scope=“request”,配置,将指示,struts,调用,request.setAttribute(“,ActionForm,名称,”,ActionForm,对象,),方法,将,ActionForm,对象保存到,request,。,其中,,ActionForm,名称,与,struts-,config.xml,配置中的,ActionForm,名称一致,如:,,其中,uploadForm,就是其名称。,我们明白,scope,属性的意义之后,就可以利用,struts,的这些特性,来解决开发过程中的某些常见问题,常见问题:如何在程序出现异常的时候返回录入界面重新录
38、入,假设现在要在一个页面上输入用户的信息(可能会有十几个属性值需要输入),用户不小心输入了一个重复的帐号,而帐号是不允许重复的,这个时候,系统应该提示用户有关帐号重复的信息,同时让用户重新选择一个帐号。,这种情况下,我们需要返回用户录入界面,让用户修改帐号字段。,现在的问题是:如何在返回这个录入界面的时候,将用户输入的其它信息保持住?,搞定,Action,对象,如果应用需要保存一个记录到数据库中,典型的过程可能是,ActionForward,提供一个链接到输入页面,ActionForm,捕获输入,ActionMapping,配置,Action,Action,将输入送到数据库中(通常会将这一步操
39、作委托给业务逻辑类去实现),J2EE,是一个多线程的环境,服务器针对每个请求启动一个线程来处理。所以有可能会有多个线程同时访问一个,Servlet,实例的情况,在,Struts,里面也是一样的,有可能会有多个线程同时访问一个,Action,实例的情况,所以必须保证,Action,类中的方法具有“可重入性”,即不能在,Action,的方法里改变实例变量的值,Action,的主要职责,校验输入数据,调用业务逻辑方法,检测处理异常,根据逻辑进行转向操作,I18N,问题,什么是,I18N,问题?,在英文中,国际化(,Internationalization,)被缩写为,I18N,,即只取首尾两个字母,
40、中间字母为,18,个,问题在哪里?,页面字符串硬编码,异常消息的硬编码,提示信息的硬编码,Java,如何支持,I18N,?,一个简单的例子,不支持,I18N,的例子,NoI18NSample.java,支持,I18N,的例子,我们需要将硬编码文本转移到外部的资源文件,编写,MessagesBundle.properties,编写,MessagesBundle_zh_CN.properties,编写,MessagesBundle_en_US.properties,编写,I18NSample.java,运行,I18NSample.java,乱码?,因为资源文件必须是,Latin-1,或,Unico
41、de,编码(如,udddd,)的字符,使用,native2ascii,工具,将中文资源文件进行转换,Java,支持,I18N,的编码过程总结,1,、创建属性文件(可能要用,native2ascii,工具转换),2,、定义,Locale,对象,3,、创建一个,ResourceBundle,对象,ResourceBundle,对象用于分离跟本地相关的数据,如果找不到相应语言或国家代码的属性文件,将使用默认的属性文件(即没有标识语言和国家代码的属性文件:,MessagesBundle.properties,),其创建方式如下:,message=,ResourceBundle.getBundle(Me
42、ssagesBundle,currentLocale,);,第一个参数,表示要从哪些资源属性文件中(,MessagesBundle_XX.properties,)获取数据,第二个参数,是一个,Locale,对象,表示要选择哪个资源属性文件,4,、从,ResourceBundle,对象中获取数据,Locale,对象,我们通过指定一个语言代码和国家代码来创建一个,Locale,对象,国家代码是可选的,语言代码是小写字母;国家代码是大写字母,Locale.getDefault,(),可以获得系统当前的,Locale,Java,都支持哪些语言代码和国家代码?,DateFormat.getAvailab
43、leLocales,(),语言代码标准:,ftp.ics.uci.edu/pub/ietf/http/related/iso639.txt,国家代码标准:,userpage.chemie.fu-berlin.de/diverse/doc/ISO_3166.html,与,Locale,相关的数据:,消息文本(带参数?),日期(时间),货币(数字),等等。,Struts,如何支持,I18N,1,、需要在,struts,配置文件中指定资源属性文件的位置和名称,如,2,、在相应的位置放置相应的文件,3,、在,JSP,页面中使用,来输出文本,以避免硬编码,以登录页面的国际化作为例子讲解,创建相应的资源属
44、性文件,用,标签替换登录页面的硬编码文本,测试(更改网页显示语言,以便测试不同的版本),关于,message-resources,配置中,parameter,的值,parameter,的值,可以指定资源文件的位置和名称,举例:,表示在类路径根目录(,WEB-INF/classes,目录)下有,MessageResources_XX_XX.properties,文件(注意:国家代码可以省略,跟,java,中对资源属性文件的处理一样),表示在类路径根目录下,有一个,resources,目录,在这个,resources,目录中存放着所有的,application_XX_XX.properties,资
45、源属性文件,如何用程序切换网页显示的语言,struts,利用在,session,中存放一个,Locale,对象来达到设置当前语言的目的,默认的情况下,,struts,根据网页向后台提交时所包含的语言编码信息来提供缺省的,Locale,对象,这就是我们为什么可以通过更改网页显示语言设置,就能显示不同的语言文字的原因。,struts,在,session,中存放的这个,Locale,对象,取名为:,Globals.LOCALE_KEY,的值,Globals,是,struts,框架提供的一个对象,利用这个原理,我们可以用编程的方式来手工切换整个应用系统的语言。,举例说明,ChangeLanguageA
46、ction,Struts,消息处理,为什么需要消息处理?,比如登录成功的提示,比如创建失败的提示,等等,总之,程序总是要通过界面来跟用户交互,所以,,在交互的过程中,,就产生了众多的消息文本,struts,提供了专门的处理机制,来将这些消息文本国际化,避免消息文本的硬编码,消息处理,就是在,Action,和,JSP,之间传递的消息文本的处理(区别于,JSP,页面硬编码文本的消息,,JSP,页面消息可以使用,标签来处理),Struts,交互消息,是通过,ActionMessages,等对象,以及相应的,标签来处理的,如何创建消息对象?,ActionMessages,与,ActionMessage
47、对象,ActionMessages,对象是,ActionMessage,对象的集合,一个,ActionMessage,对象,代表一个国际化消息文本(字符串),如何创建,ActionMessages,对象?,ActionMessages,messages=,new,ActionMessages,();,如何创建,ActionMessage,对象?,ActionMessage,msg,=new,ActionMessage(“key,”);,其构造方法带的参数,就是一个在资源属性文件中的,key,,所以,它能表示一个国际化消息文本,如何将,ActionMessage,对象添加到,ActionMes
48、sages,对象中?,messages.add(“message_id”,msg,);,第一个参数,(,message_id,),表示本,ActionMessage,对象在,ActionMessages,对象中区别于其它,ActionMessage,对象的标识符,如何将消息对象从,Action,中传递到下一个页面,(JSP),?,首先我们要决定的是,我们要传递的消息是,普通消息,还是,错误消息,?,普通消息:即普通的消息文本,错误消息:即提示错误的消息文本,本质上,这两种消息没有什么区别,都是消息文本,但是如果一个页面同时需要显示普通的消息文本和错误消息文本的时候,就需要进行区分了,比如不同类
49、型的消息文本可能要用不同的样式来显示,通过一句简单的代码,将,ActionMessages,对象保存到,HttpServletRequest,对象中,保存普通消息:,this,.saveMessages(request,messages,);,保存错误消息:,this.saveErrors(request,messages,);,这就是调用父类(,Action,)所提供的方法,saveMessages()/saveErrors,(),来保存消息对象,实际上,父类的,saveMessages,(),方法,将消息对象保存在了,request,中,并命名为,Globals.MESSAGE_KEY,s
50、aveErrors,(),方法,将消息对象保存在了,request,中,并命名为,Globals.ERROR_KEY,如何在,JSP,中使用消息对象?,使用,标签来显示消息,标签既可以显示普通消息,也可以显示错误消息,标签的重要属性:,name,消息对象的名称,如果我们调用,saveMessages/saveErrors,方法来传递消息,那么这个名字不需要标识(,struts,使用缺省的名称,即,Globals.MESSAGE_KEY,或,Globals.ERROR_KEY,),id,(,这是必需的属性,)因为我们传递的是,ActionMessages,对象,而不是,ActionMessage






