struts2 教程,struts2的工作流程
很多朋友对于struts2 教程和struts2的工作流程不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!
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/27860struts2的工作流程
在Struts2框架中的处理大概分为以下几个步骤:
1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求
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。
扩展资料:
应用流程注解
当Web容器收到请求(HttpServletRequest)它将请求传递给一个标准的的过滤链包括(ActionContextCleanUp)过滤器。
经过Other filters(SiteMesh,etc),需要调用FilterDispatcher核心控制器,然后它调用ActionMapper确定请求哪个Action,ActionMapper返回一个收集Action详细信息的ActionMaping对象。
FilterDispatcher将控制权委派给ActionProxy,ActionProxy调用配置管理器(ConfigurationManager)从配置文件中读取配置信息(struts.xml),然后创建ActionInvocation对象。
ActionInvocation在调用Action之前会依次的调用所用配置拦截器(Interceptor N)一旦执行结果返回结果字符串ActionInvocation负责查找结果字符串对应的(Result)然后执行这个Result Result会调用一些模版(JSP)来呈现页面。
拦截器(Interceptor N)会再被执行(顺序和Action执行之前相反)最后响应(HttpServletResponse)被返回在web.xml中配置的那些过滤器和核心控制器(FilterDispatcher)。
参考资料:百度百科-Struts 2
struts2的主要的具体工作流程
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转向下一个页面,其中虚线框中为右图的一个简写
如果你还想了解更多这方面的信息,记得收藏关注本站。