簡介 ActionMapping
在Struts 1.1之後,很多的请求分配职责都落入了RequestProcessor的手上,ActionServlet则专责於组态配置及应用程式模组的设定。
RequestProcessor采取 Command 模式,根据客户端的请求呼叫Action物件,其分配的依据是客户端请求的URI及Action物件的对应,这些都设定在struts- config.xml的<action-mappings>标签中。
<action-mappings>用来描述一组ActionMapping物件,当中的每一个<action> 标签都对应一个ActionMapping物件,当客户端发出请求至RequestProcessor时,请求的URI对应於< action>标签中设定的path属性,而要呼叫的Action物件则是type属性所设定的物件,RequestProcessor会将请求的 执行工作交给该Action物件来执行。
举个例子来说,如果<action-mappings>设定如下的话:
则当请求的URL是http://localhost:8080/strutsapp/hello.do时, RequestProcessor会使用/hello.do来确认对应的ActionMapping物件(实际上即找出path设定为/hello的 <action>標籤),该ActionMapping物件告知RequestProcessor要使用 onlyfun.caterpillar.HelloAction,而後RequestProcessor会将呼叫HelloAction的 execute()方法,并将ActionMapping物件当作参数传递给它。
RequestProcessor实际上将工作交给Action物件,Action物件在第一次被呼叫时产生,之後一直使用它。 Action物件的运作必须提供一些参数来描述工作的细节,诸如使用哪一个ActionForm、forward对象的查找、错误发生时的页面对象等等, Struts将这些资讯包装在ActionMapping中,并作为参数传送给Action物件,以使得Action在需要相关的资讯时可以从 ActionMapping中取得。
如果客户端请求了struts-config.xml中没有定义的资源,Struts会丢出 404 Invalid path 的讯息,您可以撰写匿名的ActionMapping来提供自己的错误讯息:
如果RequestProcessor遇到没有定义的Action请求,则会交由匿名的ActionMapping来处理。
在<action>标签中会使用<forward>标签,用於查找与指定Action物件完成之後,要转发请求回应的去向,您使 用ActionMapping的findForward()方法来查找对应的forward对象,另外,您也可以提供一个< global-forward>设定,如果ActionMapping的findForward()方法找不到指定的forward对象,则会查找 <global-forward>所设定的对象,一个设定例子如下:
<global-forward>提供一个全局可查找的forward对象,在Struts的组态中,可以为每一个 <action>标签指定forward对象,如果在<action>中查找不到,就会至<global- forward>中查找。对於一些共同使用的forward对象,您可以集中於<global-forward>中管理。
在Struts中,ActionMapping继承自ActionConfig,大部份的属性定义实际上都已经在ActionConfig 中完成,在将来ActionMapping有可能会被AutoConfig所取代,不过在目前ActionMapping仍旧存在,根据线上API的说 明,存在的事实基於它仍是现存应用程式所使用到的类别。
RequestProcessor采取 Command 模式,根据客户端的请求呼叫Action物件,其分配的依据是客户端请求的URI及Action物件的对应,这些都设定在struts- config.xml的<action-mappings>标签中。
<action-mappings>用来描述一组ActionMapping物件,当中的每一个<action> 标签都对应一个ActionMapping物件,当客户端发出请求至RequestProcessor时,请求的URI对应於< action>标签中设定的path属性,而要呼叫的Action物件则是type属性所设定的物件,RequestProcessor会将请求的 执行工作交给该Action物件来执行。
举个例子来说,如果<action-mappings>设定如下的话:
...
<action-mappings>
<action
path="/hello"
type="onlyfun.caterpillar.HelloAction">
....
</action>
<action
path="/login"
type="onlyfun.caterpillar.LoginAction">
....
</action>
</action-mappings>
...
<action-mappings>
<action
path="/hello"
type="onlyfun.caterpillar.HelloAction">
....
</action>
<action
path="/login"
type="onlyfun.caterpillar.LoginAction">
....
</action>
</action-mappings>
...
则当请求的URL是http://localhost:8080/strutsapp/hello.do时, RequestProcessor会使用/hello.do来确认对应的ActionMapping物件(实际上即找出path设定为/hello的 <action>標籤),该ActionMapping物件告知RequestProcessor要使用 onlyfun.caterpillar.HelloAction,而後RequestProcessor会将呼叫HelloAction的 execute()方法,并将ActionMapping物件当作参数传递给它。
RequestProcessor实际上将工作交给Action物件,Action物件在第一次被呼叫时产生,之後一直使用它。 Action物件的运作必须提供一些参数来描述工作的细节,诸如使用哪一个ActionForm、forward对象的查找、错误发生时的页面对象等等, Struts将这些资讯包装在ActionMapping中,并作为参数传送给Action物件,以使得Action在需要相关的资讯时可以从 ActionMapping中取得。
如果客户端请求了struts-config.xml中没有定义的资源,Struts会丢出 404 Invalid path 的讯息,您可以撰写匿名的ActionMapping来提供自己的错误讯息:
...
<action>
name="error"
unknown="true"
forward="/WEB-INF/pages/error.jsp"/>
...
<action>
name="error"
unknown="true"
forward="/WEB-INF/pages/error.jsp"/>
...
如果RequestProcessor遇到没有定义的Action请求,则会交由匿名的ActionMapping来处理。
在<action>标签中会使用<forward>标签,用於查找与指定Action物件完成之後,要转发请求回应的去向,您使 用ActionMapping的findForward()方法来查找对应的forward对象,另外,您也可以提供一个< global-forward>设定,如果ActionMapping的findForward()方法找不到指定的forward对象,则会查找 <global-forward>所设定的对象,一个设定例子如下:
- struts-config.xml
...
<struts-config>
<global-forwards>
<forward
name="welcome"
path="/welcome.do"/>
</global-forwards>
<action-mappings>
<action
path="/welcome
type="onlyfun.caterpillar.WelcomeAction">
<forward
name="welcomeUser"
path="/WEB-INF/pages/welcome.jsp"/>
</action>
<action
path="/hello"
type="onlyfun.caterpillar.HelloAction">
<forward
name="helloUser"
path="/WEB-INF/pages/hello.jsp"/>
</action>
<action-mappings>
</struts-config>
...
<global-forward>提供一个全局可查找的forward对象,在Struts的组态中,可以为每一个 <action>标签指定forward对象,如果在<action>中查找不到,就会至<global- forward>中查找。对於一些共同使用的forward对象,您可以集中於<global-forward>中管理。
在Struts中,ActionMapping继承自ActionConfig,大部份的属性定义实际上都已经在ActionConfig 中完成,在将来ActionMapping有可能会被AutoConfig所取代,不过在目前ActionMapping仍旧存在,根据线上API的说 明,存在的事实基於它仍是现存应用程式所使用到的类别。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)