struts2处理datelocal,struts2的主要的具体工作流程
struts2处理datelocal,struts2的主要的具体工作流程详细介绍
本文目录一览: Struts2简介
一 什么是Struts ?
虽然Struts 号称是一个全新的框架 但这仅仅是相对Struts 而言 Struts 与Struts 相比 确实有很多革命性的改进 但它并不是新发布的新框架 而是在另一个赫赫有名的框架 WebWork基础上发展起来的 从某种程度上来讲 Struts 没有继承Struts 的血统 而是继承WebWork的血统 或者说 WebWork衍生出了Struts 而不是Struts 衍生了Struts 因为Struts 是WebWork的升级 而不是一个全新的框架 因此稳定性 性能等各方面都有很好的保证 而且吸收了Struts 和WebWork两者的优势 因此 是一个非常值得期待的框架
Apache Struts 是一个优雅的 可扩展的JAVA EE web框架 框架设计的目标贯穿整个开发周期 从开发到发布 包括维护的整个过程
Apache Struts 即是之前大家所熟知的WebWork 在经历了几年的各自发展后 WebWork和Struts社区决定合二为一 也即是Struts
Struts 和Struts 的不同
Action 类
◆Struts 要求Action类继承一个抽象基类 Struts 的一个普遍问题是使用抽象类编程而不是接口
◆Struts Action类可以实现一个Action接口 也可实现其他接口 使可选和定制的服务成为可能 Struts 提供一个ActionSupport基类去实现 常用的接口 Action接口不是必须的 任何有execute标识的POJO对象都可以用作Struts 的Action对象
线程模式
◆Struts Action是单例模式并且必须是线程安全的 因为仅有Action的一个实例来处理所有的请求 单例策略限制了Struts Action能作的事 并且要在开发时特别小心 Action资源必须是线程安全的或同步的
◆Struts Action对象为每一个请求产生一个实例 因此没有线程安全问题 (实际上 servlet容器给每个请求产生许多可丢弃的对象 并且不会导致性能和垃圾回收问题)
Servlet 依赖
◆Struts Action 依赖于Servlet API 因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法
◆Struts Action不依赖于容器 允许Action脱离容器单独被测试 如果需要 Struts Action仍然可以访问初始的request和response 但是 其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性
可测性
◆测试Struts Action的一个主要问题是execute方法暴露了servlet API(这使得测试要依赖于容器) 一个第三方扩展——Struts TestCase——提供了一套Struts 的模拟对象(来进行测试)
◆Struts Action可以通过初始化 设置属性 调用方法来测试 依赖注入 支持也使测试更容易
捕获输入
◆Struts 使用ActionForm对象捕获输入 所有的ActionForm必须继承一个基类 因为其他JavaBean不能用作ActionForm 开发者经常创建多余的类捕获输入 动态Bean(DynaBeans)可以作为创建传统ActionForm的选择 但是 开发者可能是在重新描述(创建)已经存在的JavaBean(仍然会导致有冗余的javabean)
◆ Struts 直接使用Action属性作为输入属性 消除了对第二个输入对象的需求 输入属性可能是有自己(子)属性的rich对象类型 Action属性能够通过web页面上的taglibs访问 Struts 也支持ActionForm模式 rich对象类型 包括业务对象 能够用作输入/输出对象 这种ModelDriven 特性简化了taglib对POJO输入对象的引用
表达式语言
◆Struts 整合了JSTL 因此使用JSTL EL 这种EL有基本对象图遍历 但是对集合和索引属性的支持很弱
◆Struts 可以使用JSTL 但是也支持一个更强大和灵活的表达式语言—— Object Graph Notation Language (OGNL)
绑定值到页面(view)
◆ Struts 使用标准JSP机制把对象绑定到页面中来访问
◆Struts 使用 ValueStack 技术 使taglib能够访问值而不需要把你的页面(view)和对象绑定起来 ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)
类型转换 ◆Struts ActionForm 属性通常都是String类型 Struts 使用Commons Beanutils进行类型转换 每个类一个转换器 对每一个实例来说是不可配置的
◆Struts 使用OGNL进行类型转换 提供基本和常用对象的转换器
校验 ◆Struts 支持在ActionForm的validate方法中手动校验 或者通过Commons Validator的扩展来校验 同一个类可以有不同的校验内容 但不能校验子对象
◆Struts 支持通过validate方法和XWork校验框架来进行校验 XWork校验框架使用为属性类类型定义的校验和内容校验 来支持chain校验子属性Action执行的控制 ◆Struts 支持每一个模块有单独的Request Processors(生命周期) 但是模块中的所有Action必须共享相同的生命周期
◆Struts 支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期 堆栈能够根据需要和不同的Action一起使用
Struts 的工作流程图
工作流程图
工作流程当接收到一个request Interceptor做一些拦截或者初始的工作当外部的ervletrequest到来时初始到了servlet容器 传递给一个标准的过滤器链ActionContextCleanUp这个在集成插件方面非常有用Other filters(SitMesh etc)
调用FilterDispatecher会去查找相应的ActionMapper如果找到了相应的ActionMapper它将会将控制权限交给ActionProxy ActionProxy将会通过ConfigurationManager来查找配置struts xml下一步将会 通过ActionInvocation来负责命令模式的实现(包括调用一些拦截Interceptor框架在调用action之前)
一旦action返回 会查找相应的Result Result类型可以是 jsp或者freeMark 等这些组件和ActionMapper一起返回给请求的url(注意拦截器的执行顺序)
lishixinzhi/Article/program/Java/ky/201311/28090
struts2的主要的具体工作流程
Struts2:
(1)客户端提交一个HttpServletRequest请求(.action或JSP页面)
(2)请求被提交到一系列Filter过滤器,如ActionCleanUp和FilterDispatcher等
(3)FilterDispatcher是Struts2控制器的核心,它通常是过滤器链中的最后一个过滤器
(4)请求发到FilterDispatcher后,FilterDispatcher询问ActionMapper是否需要调用某个Action来处理这个Request(一般根据URL后缀是否为.action来判断)
(5)如果ActionMapper决定需要调用某个Action,FilterDispatcher则把请求交到ActioProxy,由其进行处理.
(6)ActionProxy通过Configuration Manager(它会访问struts.xml)询问框架的配置文件,找到需要调用的Action类.
(7)ActionProxy创建一个ActionInvocation实例,而ActionInvocation通过代理模式调用Action,(在调用之前会根据配置文件加载相关的所有Interceptor拦截器)
(8)Action执行完毕后,返回一个result字符串,此时再按相反的顺序通过Interceptor拦截器.
(9) 最后ActionInvocation负责根据struts.xml中配置的result元素,找到与返回值对应的result,决定进行下一步输出.
struts2的主要工作流程是这样的:
首先有一个http请求,会首先进入ActionContextCleanup(清空值栈等,但会留下自己的,比如session,Attribute等),其作用见括号中的
其次,走一些过滤器,filter,然后进入闻名的struts2的总控FilterDispatcher
穿过上述几层后,会进入ActionMapper,来判断此请求是否需要struts2处理,如果需要,那么由ActionProxy来接管,通过配置管理我们可以找到我们的struts.xml,然后进入真正做事的Action
Invocation,依次穿过我们的拦截器,进入action,从而根据返回的result选择我们要的页面,在拦截器的前半部分去值栈中取值通过标签展示在页面上,最后生成response返回,具体的图如下
此图是我自己总结的,颜色比较多的那个图是struts2的官方图片,只是加了注释
struts2说的应用一些,举例,就像我们图中的,当你点击新增按钮后,会触发一个action给web服务器,服务器接受请求,给对应的web容器,根据上下文可以找到我们的webapp应用,找到总的配置文件web.xml,根据里面的配置来判断action谁去处理,找到filter,反射创建类,回调init,读取struts2的配置文件struts.xml,根据命名空间等找到action,反射创建action类实例,回到execute方法,找到对应的result转向下一个页面,其中虚线框中为右图的一个简写
Struts2教程3:struts.xml常用配置解析
使用<include>标签重用配置文件
在Struts 中提供了一个默认的struts xml文件 但如果package action interceptors等配置比较多时 都放到一个struts xml文件不太容易维护 因此 就需要将struts xml文件分成多个配置文件 然后在struts xml文件中使用<include>标签引用这些配置文件 这样做的优点如下
结构更清晰 更容易维护配置信息
配置文件可以复用 如果在多个Web程序中都使用类似或相同的配置文件 那么可以使用<include>标签来引用这些配置文件 这样可以减少工作量
假设有一个配置文件 文件名为newstruts xml 代码如下
<?xmlversion= encoding= UTF ?><!DOCTYPEstrutsPUBLIC //ApacheSofareFoundation//DTDStrutsConfiguration //EN dtd ><struts><packagename= demo extends= struts default ><actionname= submit class= action MoreSubmitAction ><resultname= save >/result jsp</result><resultname= print >/result jsp</result></action></package></struts>
则struts xml引用newstruts xml文件的代码如下
<?xmlversion= encoding= UTF ?><!DOCTYPEstrutsPUBLIC //ApacheSofareFoundation//DTDStrutsConfiguration //EN dtd ><struts><includefile= newstruts xml /><packagename= test extends= struts default >……</package></struts>
大家要注意一下 用<include>引用的xml文件也必须是完成的struts 的配置 实际上<include>在引用时是单独解析的xml文件 而不是将被引用的文件插入到struts xml文件中
action的别名
在默认情况下 Struts 会调用动作类的execute方法 但有些时候 我们需要在一个动作类中处理不同的动作 也就是用户请求不同的动作时 执行动作类中的不同的方法 为了达到这个目的 可以在<action>标签中通过method方法指定要指行的动作类的方法名 并且需要为不同的动作起不同的名子(也称为别名) 如下面代码所示
<?xmlversion= encoding= UTF ?><!DOCTYPEstrutsPUBLIC //ApacheSofareFoundation//DTDStrutsConfiguration //EN dtd ><struts><packagename= demo extends= struts default ><actionname= test class= action MyAction >……</action><actionname= my class= action MyAction method= my >……</action></package></struts>
上面代码的两个动作的class属性都指向同一个类 name为这个类起了两个动作别名 test和my 在动作my中 使用了method属性指定要要运行的方法名为my
在MyAction类中必须要有my方法 代码如下
packageaction;import opensymphony xwork ActionSupport;publicclassMyActionextendsActionSupport{……publicStringexecute()throwsException{//处理test动作的代码}publicStringmy()throwsException{ //处理my动作的代码}……}
除了在struts xml中配置别名 还可以通过请求参数来描述指定动作(并不需要在struts xml中配置) 请求参数的格式如下
//localhost /contextPath/actionName!method action
关于通过请求指定动作的详细内容 请参阅笔者写的《Struts 教程 处理一个form多个submit》
为action指定参数
在struts 中还可以为action指定一个或多个参数 大家还记着struts x是如何设置的action参数不? 在struts x中可以使用<action>标签的parameter属性为其指定一个action参数 如果要指定多个 就只能通过逗号( )或其他的分隔符将不同的参数隔开 而在struts 中可以通过<param>标签指定任意多个参数 代码如下
<actionname= submit class= action MyAction ><paramname= param >value </param><paramname= param >value </param><resultname= save >/result jsp</result> ……</action>
当然 在action中读这些参数也非常简单 只需要象获取请求参数一样在action类中定义相应的setter方法即可(一般不用定义getter方法) 如下面的代码将读取param 和param 参数的值
packageaction;import opensymphony xwork ActionSupport;publicclassMyActionextendsActionSupport{privateStringparam ;privateStringparam ;publicStringexecute()throwsException{System out println(param +param );}publicvoidsetParam (Stringparam ){this param =param ;}publicvoidsetParam (Stringparam ){this param =param ;}……}
当struts 在调用execute之前 param 和param 的值就已经是相应参数的值了 因此 在execute方法中可以直接使用param 和param
选择result类型
在默认时 标签的type属性值是 dispatcher (实际上就是转发 forward) 开发人员可以根据自己的需要指定不同的类型 如redirect stream等 如下面代码所示
<result name= save type= redirect > /result jsp</result>
这此result type可以在struts core jar包或struts 源代码中的struts default xml文件中找到 在这个文件中找到<result types>标签 所有的result type都在里面定义了 代码如下
<result types> <result typename= chain class= opensymphony xwork ActionChainResult /> <result typename= dispatcher class= apache struts dispatcher ServletDispatcherResult default= true /> <result typename= freemarker class= apache struts views freemarker FreemarkerResult /> <result typename= header class= apache struts dispatcher HttpHeaderResult /> <result typename= redirect class= apache struts dispatcher ServletRedirectResult /> <result typename= redirectAction class= apache struts dispatcher ServletActionRedirectResult /> <result typename= stream class= apache struts dispatcher StreamResult /> <result typename= velocity class= apache struts dispatcher VelocityResult /> <result typename= xslt class= apache struts views xslt XSLTResult /> <result typename= plainText class= apache struts dispatcher PlainTextResult /> <! DeprecatednameformscheduledforremovalinStruts ThecamelCaseversionsarepreferred Seeww > <result typename= redirect action class= apache struts dispatcher ServletActionRedirectResult /> <result typename= plaintext class= apache struts dispatcher PlainTextResult /></result types>
全局result
有很多时候一个<result>初很多<action>使用 这时可以使用<global results>标签来定义全局的<result> 代码如下
<struts><packagename= demo extends= struts default ><global results><resultname= print >/result jsp</result></global results><actionname= submit class= action MoreSubmitAction > ……</action><actionname= my class= action MoreSubmitAction method= my >……</action></package></struts>
lishixinzhi/Article/program/Java/ky/201311/27860
struts2 datetimepicker 如何让日期与时间同时显示
在struts2中,提供了日期控件,以方便地选择日期和时间,这是通过标签来实现的。该日期控件是通过DOJO来实现的,会在客户端生成一段JS代码,所以,要让该日期控件生效,需要加入以下代码:
这样,就可以在页面中使用 标签了。如:代码
配置文件struts.properties中配置global.format.date={0,date,yyyy-MM-dd HH:mm:ss}
这样你试试应该是可以,配置文件应该是
struts2的主要工作流程,处理方式?
请求在Struts2框架中的处理大概分为以下几个步骤:
1 客户端初始化一个指向Servlet容器的请求;
2
这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh
Plugin)
3
接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action
4 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy
5 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类
6 ActionProxy创建一个ActionInvocation的实例。
7 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可
能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2
框架中继承的标签。在这个过程中需要涉及到ActionMapper
给LZ说一下struts2的主要工作流程吧,你可以下载一下他的流程图,首先我们有个请求request进入,会首先走ActionContext Clearup 清空值栈等,但是会留下我们的session和setgetAttribute等,然后会走一下OtherFilter,其他的一些过滤器什么的,然后就会走到我们的filterDispathcer总控,会询问ActionMapping是否此请求需要struts2处理,如果需要,走到ActionProxy代理类,其次,根据ConfigurationManger配置管理找到struts配置文件,然后才是走到真正需要做事的地方,Action Invocation 会依次走我们的拦截器,拦截器走的时候回去值栈中取值,就是通过taglib放到页面上去,走action再走对应result,最后生成相应返回回去。
给LZ两个图吧,第一个图是具体的点击新增按钮后的一系列处理,第二个图是详细的struts2的流程
Struts2中如何配置struts、xml?
Struts2中在配置struts、xml时,解压后找到相应途径,选择配置后一直next即可。
一、办法:
1、在官网下载最新版的Struts2.从图中可以看出,即可以分开下载,又可以一次全部下载。我选择全部下载。
2、下载后将压缩包解压到磁盘根目录。
3、进入struts-2.3.16.1文件,可以看到包含如下文件夹。
4、lib文件包含了上百个库文件,但大多数是可选的,有些库是插件,用于和其他框架的整合。
我们开发时不必全部用到这些库文件,我们可根据apps文件下的模板工程查看需要哪些jar包。进入apps文件看到struts2自带了5个工程模板。
5、此时,右侧的按钮被点亮。点击“Add External JARS?”按钮,添加用户库所需的库文件;选择添加刚才解压的struts2-blank-2.war下WEB-INF/lib中的所有jar包。
二、Struts2简介:
1、Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。
2、其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。
3、虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。
三、应用流程注解:
1、当Web容器收到请求(HttpServletRequest)它将请求传递给一个标准的的过滤链包括(ActionContextCleanUp)过滤器。
2、经过Other filters(SiteMesh ,etc),需要调用FilterDispatcher核心控制器,然后它调用ActionMapper确定请求哪个Action,ActionMapper返回一个收集Action详细信息的ActionMaping对象。
3、FilterDispatcher将控制权委派给ActionProxy,ActionProxy调用配置管理器(ConfigurationManager) 从配置文件中读取配置信息(struts.xml),然后创建ActionInvocation对象。
4、ActionInvocation在调用Action之前会依次的调用所用配置拦截器(Interceptor N)一旦执行结果返回结果字符串ActionInvocation负责查找结果字符串对应的(Result)然后执行这个Result Result会调用一些模版(JSP)来呈现页面。
5、拦截器(Interceptor N)会再被执行(顺序和Action执行之前相反)最后响应(HttpServletResponse)被返回在web.xml中配置的那些过滤器和核心控制器(FilterDispatcher)。
struts2 标签 输出时间格式
使用
标签,有一个format属性,就是用来输出指定时间格式的
例如:
yyyy-MM-dd年月日 HH:mm:ss时分秒
但要注意两个细微的地方,很多人都倒在这上面:
1、"yyyy-MM-dd”中的“MM”一定要大写,不然会不起作用或者时间显示不正常
因为在java中,大M表示“月(Month)",而小m表示"分"(minute)
2、注意的是后面的"HH"表示24小时制,而如果是"hh",则显示时为12小时制
楼主可以自己验证下~~
还有一点:s:date标签使用时,一定要是Date类型。
如果是String型,数值型等其他类型,可以用以下方法:
先在resource文件中定义如下:
format.date_medium={0,date,medium}
format.date_ymd={0,date,yyyy/MM/dd}
format.date_time={0,date,yyyy/MM/dd hh:mm}
然后就可以自由的format了:
struts2 的Action中怎么获取当前时间
当前时间,就可以用java中自带的类Date 就可以了
Date date = new Date();
System.out.println(date);
结果:
Mon May 16 10:15:09 CST 2011
java.util.Date中的
new Date()可以获取系统当前时间,select sysdate from dual可以获取oracle数据库当前时间
不知道你想要获取哪个时间
Date date = new Date();
接着可以用DateFormat类的formate方法格式化一下
正常用java的Date date = new Date();就可以
哥们直接new一个date就行
new Date()
struts2项目性能调优三步曲(一)
前一段时间有反映说是一个使用了struts 的生产系统的页面显示速度太慢 登录后发现确实如此 于是进行了一番性能调优的研究和测试
一 根据struts 官方的性能调优说明进行了一些参数的修改
//struts apache / x/docs/performance tuning //cwiki apache /WW/performance tuning
Turn off logging and devMode (关闭logging和Devmode)
这个当然没问题 但是全部关闭logging不现实 我只是关闭了struts 相关package的logging
Do not use interceptors you do not need 把struts xml中不需要的interceptor统统删除
Use the correct HTTP headers (Cache Control & Expires)
不确定应该如何修改
Copy the static content from the Struts jar when using the Ajax theme (Dojo) or the Calendar tag 关于这点 后面会提到
Create a freemarker properties file in your WEB INF/classes directory 照做
Create the freemarker properties file and add the following setting (or whatever value you deem fitting) template_update_delay= 照做
Enable Freemarker template caching As of Struts setting the property struts freemarker templatesCache to true will enable the Struts internal caching of Freemarker templates This property is set to false by default 照做
进行上述修改后 发现页面打开的速度并没有明显的提高
二 此时我已经基本锁定网页打开速度慢的原因与ajax(或者说是dojo)有关 因为dojo的js库大概有 K左右 先尝试使用gzip压缩javascript 减小传输量 看能否加快页面的加载速度在Tomcat的server xml的connector中添加如下配置 激活gzip功能pression= on pressionMinSize= noCompressionUserAgents= gozilla traviata pressableMimeType= text/ text/xml text/javascript application/x javascript application/javascript 进行上述修改后 发现页面打开的速度还是没有明显的提高
三 经过上述两个实验 觉得应该是struts 所封闭的dojo的性能问题了 于是引入JQuery JQuery的js文件最小是 K gzip后应该更小 页面的响应速度明显改善(一个数量级以上的提高) 主要原因在于与服务器交互的处理上极大地提升了效率 而且页面处理代码更加简洁明了
lishixinzhi/Article/program/Java/ky/201311/29170