转自:http://www.blogjava.net/Unmi/archive/2008/05/26/203014.html
Struts2 的 struts.xml 中是分 package 配置的,可以为 package 设置 namespace 属性,如
<package namespace="/secure" ....>
......
</package>
如果没有指定 namespace 属性,默认 namespace 是 ""。使用 namespace 可以方便于按不同目的规划对应用的访问规则。比如不同 namespace 下配置了不同的拦截器就可以实现权限的控制,如 "/secure" 下已登陆用户才能访问,"/public" 下可公开访问的。
配置了 namespace 直接就是反应在访问 URL 上,例如 namespace="/secure" name="test" 的 action
<package namespace="/secure" ....>
<action name="test" ....
</package>
访问它的 URL 就是 http://ip:port/context/secure/test.action,那如果在 namespace "/secure" 下没有 test action 会出现什么情况呢?Struts 还会尝试在默认 namespace,即 "" 下找 test。
再举个例子,URL 是 http://ip:port/context/some/path/test.action 时,如果在 "/some/path" namespace 下找不到 test action,也是到 "" (default namespace) 下找 test action,但不会去 "/some" 下找的。
用标签 <s:url value="/secure/test.action"/> 对应页面源文件是 /context/secure/test.action
稍有麻的就是 <s:form action="/secure/test.action" .... 对应的源文件是 <form action="/context/secure/test.action" ...
但是后台会有警告:
警告: No configuration found for the specified action: '/secure/test.action' in namespace: ''. Form action defaulting to 'action' attribute's literal value.
Struts2 把 action 属性值当整一个 Action Name 了,但这也不影响使用,这个 URL 正好能与 (package namespace) + (action name) 合上拍。
但是对于使用了动态方法调用(struts.enable.DynamicMethodInvocation = true)就没这么幸运了。很容易想当然的
<s:form action="/secure/test!update.action" .... 生成的 HTML 源文件却是 action="/TestStruts2/om/test"
同时后台的警告信息是:
警告: No configuration found for the specified action: '/secure/test' in namespace: ''. Form action defaulting to 'action' attribute's literal value.
很显然对于这个 action="/TestStruts2/om/test",提交时是会得到 HTTP Status 404 - /context/secure/test 错误。
正确的用法是 <s:action...> 也有一个 namespace 属性,对了,就是
<s:form namespace="/secure" action="test!login"> 生成的 HTML 源文件是:<form action="/TestStruts2/om/test!login.action" ....>
我们要的就是这个。
如果不配置 namespace 属性,我们能不能在访问 action 时也用上目录层次呢?可以,那是在 struts1 习惯的做法,配置 <action name="secure/test" ....> name 中使用斜杠,但在 Struts2 中 Action Name 中使用斜杠需要设置
struts.enable.SlashesInActionNames=true 默认为 false
可是 Struts2 大概不赞同这种做法,力挺 namespace 的作用。
对于上面使用了斜框的 Action Name,<s:form 中的写法要用
<s:form action="secure/test"> 生成 HTML 源文件:<form action="/context/secure/test.action" .....
<s:form action="secure/test!update"> 生成 HTML 源文件:<form action="/context/secure/test!login.action" .....
--------------------------------------------------------------------------------
上面的 action 后加不加 .action 无所谓,只是要保证 <s:form> 的 action 属性一定要与 struts.xml 中的 <action> 的 name 匹配上,如果你自作多情的在前面加个斜杠,如写成了
<s:form action="/secure/test!update"> 、 <s:form action="/secure/test"> 或者 <s:form action="/secure/test!update.action"> 生成的 HTML 源文件就都成了:<form action="/context/secure/test" .....
这也是从 Struts1 带来的弊病,因为 Struts1 中 <html:form> action 属性对应的是 <action> 的 path,而 Struts2 中 <s:form> 的 action 属性对应的是 <action> 的 name;name 要完全匹配,path 可以加些层次。
我为何以费这么些功夫来搞清楚这个呢,也就是因为使用 <s:form action=""> 是时而行,时而不行,很似迷惑,一度怀疑是应用服务器在从中作梗。坦白的说,就是写本篇日志完成红线以上的内容时仍未能知晓就理,这也正好映证了写下来的意义。因为在这过程中你在试图让别人更好的理解,倘若自己都说不清,他人只能是云里雾里了。
分享到:
相关推荐
在Struts2中,`struts.xml`是核心配置文件,它定义了应用的各个组件,如动作(Actions)、结果(Results)、拦截器(Interceptors)等。本篇文章将深入探讨如何使用Dom4j这个XML处理库来解析`struts.xml`,以便...
<filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name>...
"Struts2 中 Struts.xml 配置文件详解" Struts2 中的 Struts.xml 配置文件是 Struts2 框架的核心配置文件,用于定义应用程序的行为和结构。在 Struts.xml 文件中,我们可以定义 package、action、interceptor、...
2. **配置Struts2**:在Struts2的配置文件(通常为`struts.xml`)中,我们需要配置Action类,指定其对应的Spring Bean。这可以通过`<package>`标签中的`spring-plugin`配置完成。 ```xml <package name="default" ...
<filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-...
在Struts2中结合使用Freemarker,可以方便地生成XML文本,这对于数据交换或XML配置文件的生成非常有用。以下将详细介绍如何在Struts2中利用Freemarker生成XML文本的步骤。 1. **环境配置** 首先,确保你已经安装并...
在Struts2框架中,配置文件`struts.xml`和`web.xml`是核心部分,它们定义了应用程序的行为和路由规则。随着版本的更新,配置方式也会有所改变。以下是Struts2.5版本中`struts.xml`和`web.xml`配置的更改方法: **1....
全局结果可以在任何Action中使用,而无需在Action配置中显式指定。例如: ```xml <global-results> <result name="input">/error.jsp</result> </global-results> ``` #### Action配置 Action是Struts2中最核心...
在Struts2中,开发者可以通过struts.properties文件定义各种配置属性,而这些属性也可以通过struts.xml文件中的<constant>标签进行设置。比如可以配置是否处于开发模式(struts.devMode)、设置国际化编码(struts....
<filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> ...
<filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> ...
在Struts2中,注解的引入使得开发者可以摆脱繁琐的`struts.xml`配置文件,实现“零配置”运行。 首先,让我们了解什么是注解(Annotation)。注解是Java提供的一种元数据机制,允许在源代码中嵌入信息,这些信息...
这篇博文详细介绍了如何理解和配置Struts2框架中的struts.xml文件,以实现MVC(Model-View-Controller)设计模式的高效应用。 在Struts2框架中,struts.xml文件主要包含以下几个部分: 1. **包(package)定义**:...
ssh 整合所有配置文件的配置... <package name="mystruts" extends="struts-default" namespace="/"> <action name="" class=""> <result></result> </action> </package> </struts> struts2在web.xml里的配置
这个示例项目不仅展示了如何在Struts2中使用JSON,还演示了如何通过Maven进行项目的构建和管理。通过学习这个例子,开发者可以更好地理解Struts2与JSON的集成,以及如何利用Maven来简化Java项目的构建流程。
<display-name>Struts 2</display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- 配置核心拦截器 --> <filter> <filter-name>struts2</filter-name>...
在这个"Struts2 HelloWorld"程序中,我们将深入理解Struts2的基本结构和配置,以及如何创建第一个简单的应用。 首先,让我们从环境搭建开始。为了运行Struts2的HelloWorld程序,你需要安装Java Development Kit ...
<filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> ...
在Struts2中,`struts.xml`文件是核心配置文件,用于定义应用的行为、动作映射、结果类型、拦截器等。这篇博文主要探讨了`struts.xml`文件的元素结构,下面我们将详细解析这些关键元素。 首先,`struts.xml`文件...
Struts.xml文件是Apache Struts 2框架的核心配置文件,用于定义应用的MVC(Model-View-Controller)架构和动作映射。它为应用程序提供了一种声明式的方式来配置Struts2的行为,使得开发者能够控制请求如何被处理,...