Struts2技术解析——企业级JAVA项目实训一、Struts2框架原理课程目标: 介绍 下载 基本开发配置 开发简单应用Struts2由来Struts作为MVC的Web框架,自推出以来不断受到开发者的追捧,得到用广泛的应用。作为最成功的Web框架,Struts自然拥有众多的优点: MVC模型的使用 功能齐全的标志库(TagLibrary) 开放源代码缺点: 需要编写的代码过多,严重的继承依靠,容易引起“类爆炸” 单元测试困难Struts2=Struts+WebWork 较新的WebMVC框架 Struts1.X与Struts2Struts2与XWorkStruts2=StrutsCore+XWork 以XWork为基础。通过使用XWork的命令模式框架和拦截器框架,提供了一个支持Web功能、能快速构建Web应用的命令模式框架。Struts2将Web功能提托付给XWorkCommand模式解析典型的Command模式需要有一个接口.接口中有一个统一的方法,这就是将命令/请求封装为对象:publicinterfaceCommand{publicabstractvoidexecute();}具体不同命令/请求代码是实现接口Command,下面有三个具体命令publicclassEngineerimplementsCommand{//command1publicvoidexecute(){//doEngineer'scommand}}publicclassProgrammerimplementsCommand{//command2publicvoidexecute(){//doprogrammer'scommand}}publicclassPoliticianimplementsCommand{//command3publicvoidexecute(){//doPolitician'scommand}}Command模式解析按照通常做法,可以直接调用这三个Command,但是使用Command模式,要将他们封装起来,扔到黑盒子List里去:publicclassproducer{publicstaticListproduceRequests(){Listqueue=newArrayList();queue.add(newEngineer());queue.add(newPolitician());queue.add(newProgrammer());returnqueue;}}Command模式解析这三个命令进入List中后,已经失去了其外表特征,以后再取出,也可能无法分辨出谁是Engineer谁是Programmer了,看下面客户端如何调用Command模式:publicclassTestCommand{publicstaticvoidmain(String[]args){Listqueue=Producer.produceRequests();for(Iteratorit=queue.iterator();it.hasNext();)//客户端直接调用execute方法//无需知道被调用者的其它更多类的方法名。((Command)it.next()).execute();}}Command模式解析由此可见,调用者基本只和接口打交道,不合具体实现交互,这也体现了一个原则,面向接口编程,这样,以后增加第四个具体命令时,就不必修改调用者TestCommand中的代码了理解了上面的代码的核心原理,在使用中,就应该各人有自己方法了,特别是在如何分离调用者和具体命令上,有很多实现方法,上面的代码是使用从List过一遍的做法.这种做法只是为了演示XWork提供了什么?XWork是一个标准的Command模式实现,并且完全从web层脱离出来。Xwork提供了很多核心功能:前端拦截机(interceptor),运行时表单属性验证,类型转换,强大的表达式语言(OGNL–theObjectGraphNavigationLanguage),IoC(InversionofControl倒置控制)容器等。基于一个简单的接口就可以进行灵活且可自定义的配置;定制和扩展拦截器来适应任何请求/响应环境;包括多个Action之间的链接,表示层的转向OGNL的应用与自动类型转换;IOC与验证框架。StrutsCore提供了什么?封装HTTP请求与响应对象处理Session与Application容器ServletDispatcher转换与Action执行提供了Web层拦截器Result的转换Struts2系统架构接受请求FilterDispatcher定位Action拦截器调用Action核心方法调用Result输出Struts1.XvsStruts2.XAction——Action&POJOActionForward——Resultstruts-config.xml——struts.xmlActionServlet——FilterDispatcherAction设计原则Action是命令对象Action应当尽量简单Action和任何Web对象无关Action接口只有一个方法: publicinterfaceAction{publicStringexecute()throwsException;}下载Struts2Struts2基本开发配置启动MyEclipse创建WebProject添加必需的Struts2的相应jar文件向web.xml加入Struts2过滤器创建Action类创建JSP表示层页面配置struts.xml文件执行测试用例添加必需的Struts2的相应jar文件向web.xml加入Struts2过滤器创建Action类创建JSP表示层页面配置struts.xml文件运行测试程序流程分析执行流程:Request-FilterDispatcher-XXXAction-Result-JSPPage封装的过程: 设置表单参数 设置请求属性疑问?Request与Response在哪里?表单参数从哪里来?Action属性是如何传递到前台的?单元小结都是MVC架构提供了控制器与流程跳转功能监听特定的URL地址,调用Action提供了表示层标签库提供了国际化支持问答与回顾:POJO是什么?PlainandoldJavaObject,普通JAVA类,不继承自特定模板,包含但不限于JavaBeanSUCCESS和”success”在哪里定义的?Action是如何找到的?(struts.xml)补充:Struts2.0-Struts2.1调整问题:web.xml的变化struts2.1中的写法为:filterfilter-namestruts2/filter-namefilter-classorg.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter/filter-class/filterfilter-mappingfilter-namestruts2/filter-nameurl-pattern/*/url-pattern/filter-mapping补充:Struts2.0-Struts2.1调整问题:tabbedPanel标签一直在使用struts2.0中的s:tabbedPanel标签,这个标签使用的是dojo脚本框架,在struts2.0中是自带的,struts2开发小组在struts2.1中把dojo做为插件的形式存在,对应的写法也发生了变化,下面是struts2.1中的写法:%@taglibprefix=sxuri=/struts-dojo-tags%……sx:head/sx:tabbedpanelid=tabbedpanel1cssStyle=width:100%;height:100%doLayout=truesx:divid=column1label=栏目一loadingText=加载中……href=url1.actioncssStyle=display:none/sx:divsx:divid=column2label=栏目二loadingText=加载中……href=url2.actioncssStyle=display:none/sx:div/sx:tabbedpanel补充:Struts2.0-Struts2.1调整问题:乱码问题原来在struts2.0里面正常的内容,在struts2.1.6中会乱码,解决办法:修改strut2.1.6源文件org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter,把doFilter方法中由:prepare.createActionContext(request,response);prepare.assignDispatcherToThread();prepare.setEncodingAndLocale(request,response);改为:prepare.setEncodingAndLocale(request,response);prepare.createActionContext(request,response);prepare.assignDispatcherToThread();不想修改源文件的话,把StrutsPrepareAndExecuteFilter类的代码copy一份,然后web.xml配置成你copy的这份也可以