第3章Struts2基础本章要点yStruts1框架的基本知识y使用Struts1框架开发Web应用yWebWork框架的基本知识y使用WebWork框架开发Web应用y在Eclipse中整合Tomcaty使用Eclipse开发Web应用y为Web应用增加Struts2支持yStruts2框架的MVC组件yStruts2框架的流程y通过web.xml文件加载Struts2框架y通过struts.properties文件配置Struts2属性ystruts.xml文件的结构y前面一章已经大致介绍了Struts2应用的基本情况,通过前一章的学习,读者应该对Struts2框架有了一个大致的掌握。但对于各知识点的细节,还需要进一步学习,本章将详细介绍Struts2框架的基础部分。因为Struts2是在WebWork和Struts1的基础上发展起来的,因此掌握一定的WebWork和Struts1框架的知识,将对于掌握Struts2框架大有裨益。特别是WebWork方面的开发经验,绝大部分都可以适用于Struts2应用的开发。本章将会简要介绍Struts1和WebWork框架的使用。本章还将介绍在EclipseIDE工具中开发Struts2应用,并且详细介绍Struts2配置文件的各个细节。3.1Struts1的MVC实现Struts1是世界上最“古老”的MVC框架,它出现于2001年。Struts1以ActionServlet作为核心控制器,由ActionServlet负责拦截用户的所有请求。Struts1框架有3个重要组成部分:Action、ActionForm和ActionForward对象。第3章Struts2基础3.1.1下载和安装Struts1框架本节的示例程序基于Struts1的1.2.9版,请读者也下载该版本的Struts1框架,下载和安装Struts1框架请按如下步骤进行。登录struts.apache.org站点,下载Struts的合适版本。解压缩下载到的压缩包,解压缩后,发现有如下文件结构:ycontrib:该路径下存放了Struts1表达式语言支持的类库和标签库文件。ylib:该路径下存放了Struts1框架的核心类库。ywebapps:该路径下存放了Struts1框架的示例应用及文档应用。y另外还一些关于Struts的说明和LICENSE等文档将lib下的JAR文件全部复制到WEB-INF/lib下,并将TLD文件全部复制到WEB-INF下,再将validator-rules.xml文件也复制到WEB-INF下。如果需要用到Struts-EL(表达式)语言,还应将contrib下的JAR文件复制到WEB-INF/lib下。为了在编译程序时可以导入Struts1类库,还应将struts.jar文件增加到环境变量中。3.1.2实现ActionFormStruts1使用单独的ActionForm封装请求参数,当用户提交一个请求时,Struts1将使用单独的ActionForm来封装所有的请求参数。从结构上看,ActionForm就是一个POJO:它需要为用户的每个请求参数都提供一个对应的属性,并为该属性设置相应的setter和getter方法——但ActionForm的设计不是POJO,它必须继承Struts1的ActionForm基类。下面是一个简单的登录页面,包含两个表单域,分别代表用户名和密码。该登录页面的代码如下:%@pagelanguage=javacontentType=text/html;charset=gb2312errorPage=%!--导入Struts的三个标签库--%@includefile=taglibs.jsp%htmlheadmetahttp-equiv=Content-Typecontent=text/html;charset=gb2312!--使用国际化资源文件的key输出标题--titlebean:messagekey=login//title/headbody!--输出登录页面标题--h3bean:messagekey=loginTitle//h3!--输出Action处理完后的错误信息。--fontcolor=red${requestScope.err}/font!--通过messagePresent判断输入校验后的出错提示是否存在--logic:messagesPresent!--输出出错提示--bean:messagekey=errors.header/ulhtml:messagesid=errorlibean:writename=error//li/html:messages/ulhr/51Struts2权威指南——基于WebWork核心的MVC开发/logic:messagesPresent!--下面是登录表单--html:formaction=login.do!--使用国际化信息来输出标签--bean:messagekey=username/html:textproperty=username/brbean:messagekey=pass/html:passwordproperty=pass/brhtml:submitbean:messagekey=login//html:submitbr/html:form/body/html在浏览器中浏览该页面时,看到该页面包含了一个简单的登录表单。该页面的界面如图3.1所示。该页面中有两个表单域,这两个表单域封装了需要向服务器发送的请求参数,对于Strurts应用而言,请求参数是通过ActionForm来封装的,ActionForm非常类似一个POJO(定义几个属性,为每个属性提供setter和getter方法),但该ActionFrom需要继承ActionForm,或者是它的子类。因为本应用使用了Struts的校验框架,因此本应用中的ActionForm继承了ValidatorForm类。下面是本应用中ActionForm类的代码:录图3.1系统登录的页面publicclassLoginFormextendsValidatorForm{//下面两个属性用于封装两个表单域的请求参数privateStringusername;privateStringpass;//以下是属性字段的系列get、set方法publicStringgetUsername(){returnusername;}publicvoidsetUsername(Stringusername){this.username=username;}publicStringgetPass(){returnpass;}publicvoidsetPass(Stringpass){this.pass=pass;}}上面ActionForm类的代码非常简单,除了该类需要继承ValidatorForm之外。也正是因为该ActionForm继承了ValidatorForm,从而导致了该类的污染,降低了该类的代码复用。对于Struts1而言,ActionForm类是一个既烦琐又没有技术含量的类,写起来难免让52第3章Struts2基础程序员觉得意兴索然。虽然有很多IDE(集成开发环境)可以自动生成该ActionForm类,但Struts1框架也感觉到大量重复书写该类是一个负担,后来提供了动态ActionForm,让人可以避免书写ActionForm类。注意Struts1中的ActionForm类是一个非常简单的类,它实质上是一个普通的JavaBean,但必须继承ActionForm类。除此之外,ActionForm还可以使用动态FormBean,从而允许通过配置文件来定义ActionForm。3.1.3实现ActionAction就是用于处理用户请求的业务控制器,当用户请求发送到ActionServlet后,ActionServlet拦截到用户请求,将请求转发到系统的业务控制器处理。ActionServlet在转发用户请求时,会将请求参数封装成ActionForm实例,并将该ActionForm实例转发给Action实例。Action实例从ActionForm中取出用户请求参数,然后调用业务逻辑组件处理用户请求,并根据处理结果,调用不同的视图页面来呈现处理结果。下面是系统的Action处理类代码。publicclassLoginActionextendsAction{//必须重写该execute方法,该方法用于处理用户请求publicActionForwardexecute(ActionMappingmapping,ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse)throwsException{//获取封装用户请求参数的ActionForm实例LoginFormloginForm=(LoginForm)form;//从ActionForm中取出用户请求参数Stringusername=loginForm.getUsername();Stringpass=loginForm.getPass();//处理用户请求if(username!=null&&username.equals(scott)){returnmapping.findForward(welcome);}else{returnmapping.findForward(error);}}}上面的Action代码非常简单,甚至没有调用任何业务逻辑组件,只是直接判断用户请求参数的用户名和密码是否为scott和tiger,如果用户名和密码正确,则返回welcome的ActionForward,否则返回error的ActionForward。53Struts2权威指南——基于WebWork核心的MVC开发注意ActionForward就是一个逻辑视图,通过在配置文件中定义ActionFoward的映射,完成逻辑视图名和实际视图资源之间的映射。Struts1的Action类与Struts2的Action类有一定的类似性,都通过调用execute方法来处理用户请求。但最大的区别在于Struts1Action的execute方法与ServletAPI耦合,但Struts2Action类的execute方法无需与ServletAPI耦合。3.1.4配置Struts1的Action实现了Struts1的Action后,还需要在struts-config.xml文件中配置Action,配置Action需要指定Action的实现类,以及Action处理请求的URL。配置Action时,还应该配置该Action对应的ActionForm,每个ActionForm使用一个form-bean.../元素定义。定义Action和ActonForm之间的关联关系时,在定义Action的action../元素中通过name属性指定与此Action关联的ActionForm。因为本应用还使用了Struts1的数据校验框架,因此配置action.../元素时,还应该增加validate属性,并将该属性值设置成true;还需要增加input属性,该属性指向输入校验失败后转入的视图资源。下面是本应用的struts-config.xml文件代码。?xmlversion=1.0encoding=GBK?!--指定Struts1配置文件的DTD信息--!DOCTYPEstruts-configPUBLIC-//ApacheSoftwareFoundation//DTDStrutsConfiguration1.2//EN