struts2 action的 struts.xml配置的问题,为什么这样写放在WEB-INF下还是找不到action,只能放到src下

struts2.1两天快速入门(第一天上午) - 猜享代码 - ITeye技术网站
博客分类:
第一天上午学习目录列表:
一、第一个struts2.1应用开发
二、Action配置的各项默认值
三、配置的各种视图转发类型
四、Action属性注入值
五、Struts 2.1处理的请求
开发环境:MyEclipse+Tomcat6.x
一、第一个struts2应用开发
1.1、开发Struts 2程序最少需要的JAR如下:
struts2-core-2.x.x.jar :Struts 2框架的核心类库
xwork-core-2.x.x.jar :XWork类库,Struts 2在其上构建
ognl-2.6.x.jar :对象图导航语言(Object Graph Navigation Language),struts2框架通过其读写对象的属性
freemarker-2.3.x.jar :Struts 2的UI标签的模板使用FreeMarker编写
commons-logging-1.x.x.jar :ASF出品的日志包,Struts 2框架使用这个日志包来支持Log4J和JDK 1.4+的日志记录。
commons-fileupload-1.2.1.jar 文件上传组件,2.1.6版本后必须加入此文件
1.2、Struts2默认的配置文件为struts.xml ,该文件需要存放在WEB-INF/classes下,该文件的配置模板如下:
&?xml version="1.0" encoding="UTF-8"?&
&!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"&
知识提示:此模板可在struts-2.1.6\apps\struts2-blank-2.1.6.war的空白项目里面拷.
1.3、struts2框架是通过Filter启动的。他在web.xml中的配置如下:
&filter-name&struts2&/filter-name&
&filter-class&org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter&/filter-class&
&!-- 自从Struts 2.1.3以后,下面的FilterDispatcher已经标注为过时
&filter-class&org.apache.struts2.dispatcher.FilterDispatcher&/filter-class& --&
&filter-mapping&
&filter-name&struts2&/filter-name&
&url-pattern&/*&/url-pattern&
&/filter-mapping&
知识提示:在StrutsPrepareAndExecuteFilter的init()方法中将会加载类路径下默认的配置文件struts.xml完成初始化操作,些初始化工作只做一次,在服务器启动过程中完成.
1.4、第一个Struts2版HelloWorld.
1.4.1、新建cn.gkit.action.HelloWorldAction类,代码如下:
public class HelloWorldAction {
public String getMessage() {
//返回的是一个字符串
public String execute(){
message = "struts2版的HelloWorld";
return "success";
知识提示:可以看到此Action类并没有继承其它类,是一个简单的POJO类.
1.4.2、action在struts.xml里的配置:
&?xml version="1.0" encoding="UTF-8" ?&
&!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"&
&package name="test" namespace="/test" extends="struts-default"&
&action name="helloworld" class="cn.gkit.action.HelloWorldAction" method="execute" &
&result name="success"&/WEB-INF/jsp/helloworld.jsp&/result&
&/package&
知识提示:&package&表示一个包,类似java包. 此包可以被其它包继承.继承的属性是extends. test包就继承了一个struts的默认包struts-default.struts-default包定义在struts-defautl.xml配置文件里,可以在struts2核心包根路径下面找到.namespace属性表示命名空间,可以把请求路径相同的一部分抽取出来。如访问helloworld请求的路径为:/struts2.1/test/helloworld,其中struts2.1是指向该应用程序的虚拟目录(即内容路径).&result&表示返回的视图,具体配置会在第三章中讲到.
1.4.3、在helloworld.jsp显示message信息:
&%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%&
&!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&
&title&struts2.1版HelloWorld&/title&
${message}
知识提示:用el表达式可以将action里的属性取出来.
二、Action配置(struts.xml--&action&)的各项默认值
1&如果没有为action指定class属性,默认是ActionSupport。
2&如果没有为action指定method属性,默认执行action中的execute() 方法。 3&如果没有指定result的name属性,默认值为success。
如在test包里增加如下一个action请求
&action name="registerUI"&
&result&/WEB-INF/page/register.jsp&/result&
知识提示:当访问路径/struts2.1/test/registerUI时,返回给浏览器的就是register.jsp页面.配置相当于struts1.x,如下:
&action path="/test/regiterUI" forward="/WEB-INF/page/register.jsp"/&
三、配置的各种视图转发类型
&result&配置类似于struts1中的&forward&,但struts2中提供了多种结果类型,常用的类型有: dispatcher(默认值)、
redirect(重定向) 、 redirectAction 、 plainText (文本).
3.1、redirect
但在&result&中还可以使用${属性名}表达式访问action中的属性,表达式里的属性名对应action中的属性。
将1.4.2里的struts.xml配置文件里的&result&改成如下:
&result type="redirect"&/helloworld.jsp?message=${message}&/result&
知识提示: 此时的helloworld.jsp应放在WebRoot目录下才可重定向访问.而在struts1.x的配置文件里的是做不到这一点的.
除非使用urlrewrite重写url,但也不能传一个action里的属性值.
重新访问/struts2.1/test/helloworld请求,浏览器地址将变为/struts2.1/helloworld.jsp?message=struts2H凥elloWorld.这里先忽略中文乱码问题.
3.2、plaintext:显示原始文件内容,例如:当我们需要原样显示jsp文件源代码的时候,我们可以使用此类型。配置如下:
&result name="source" type="plainText "&
&param name="location"&/view.jsp&/param&
&param name="charSet"&UTF-8&/param&&!-- 指定读取文件的编码 --&
知识提示:当访问该请求时,返回的一个jsp页面代码文体视图,即jsp页面代码将不会被执行.
3.3、redirectAction作用与redirect类似,不同的是它重定向的是一个action.
四、Action属性注入值
属性注入类似于spring的属性注入,原理上是一样的, 都是通过反射技术将xml对应的值设值到相对应的java属性里.被注入的属性也要有对应的setter方法.
1、在HelloWorldAction 类里增加一下setter方法:
public void setMessage(String message) {
this.message =
2、为了避免覆盖,将execute方法里给message赋值的那一段代码注释掉.
3、在struts.xml配置文件的&action&增加一个子标签&param name=""&,配置改成如下:
&package name="test" namespace="/test" extends="struts-default"&
&action name="helloworld" class="cn.gkit.action.HelloWorldAction" method="execute" &
&param name="message"&属性注入&/param&
&result name="success"&/WEB-INF/jsp/helloworld.jsp&/result&
&/package&
此时访问该请求,页面显示的mesage属性值为:
五、Struts 2处理的请求
1、指定需要Struts 2处理的请求后缀,配置文件struts.xml配置里增加一下常量标签&constant&
&?xml version="1.0" encoding="UTF-8"?&
&!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"&
&constant name="struts.action.extension" value="do"/&
2、如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号隔开。如:
&constant name="struts.action.extension" value="do,htm"/&
3、常量名struts.action.extension可以在default.properties里找到,里面包含了struts2默认的常量值.default.properties可以在struts2核心包下的org.apache.struts2下找到.
第一天上午内容结束.
下午内容目录如下:
六、Struts2的处理流程与Action的管理方式
七、动态方法调用和使用通配符定义action
八、自定义类型转换器
九、自定义拦截器
十、文件上传
constant 写道
HelloWorldAction 可以不需要继承ActionSupport?
我用的2.0.8,
可以,但在实际项目中一般都继承ActionSupport,在后期课讲会讲到.
不太同意!!!
实际项目中也很多不用ActionSupport的。
HelloWorldAction 可以不需要继承ActionSupport?
我用的2.0.8,
可以,但在实际项目中一般都继承ActionSupport,在后期课讲会讲到.
在2.1.6中StrutsPrepareAndExecuteFilter有bug,当提交的表单中有中文,容易有乱码
这个bug已经在2.1.8版本里修正,如果您使用的是2.1.6版本,可以自定义一个filter来解决,这个filter必须放置在Struts2的Filter之前,在doFilter()方法里手动设置请求编码即可
浏览: 51578 次
来自: 广州
哥们有没有源码啊?能不能发一份!@qq.co ...
哥们有没有源码啊?能不能发一份!@qq.co ...
w 写道nameKey JSONArray
nameKey JSONArray
getResponse( ...myapple123 的BLOG
用户名:myapple123
文章数:28
访问量:62076
注册日期:
阅读量:2212
51CTO推荐博文
Struts2的配置中:Could not find action or result 问题的解决方法
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
border="0" src="/jianzl/pic/item/55d545f09d734.jpg" small="0" class="blogimg" alt="" />
以上是我的工程目录结构,我把struts.xml没有放到src下,而是根据自己的习惯放到新目录:WEB-INF/conf/下了。这时候需要在web.xml中进行必要的配置,配置情况如下:
&filter-name&struts2&/filter-name&
&filter-class&org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter&/filter-class&
&init-param&
&param-name&config&/param-name&
&param-value&struts-default.xml,struts-plugin.xml,/WEB-INF/conf/struts.xml&/param-value&
&/init-param&
Struts.xml内容如下:
&package namespace=&& name=&main& extends=&struts-default&&
&& &action name=&ddd& class=&test.Actiontest&&
&&& &result name=&success&&index.jsp&/result&
&& &/action&
&/package&
这时候在IE地址栏中访问:
时会报错,错误信息如下:
警告: Could not find action or result
There is no Action mapped for namespace / and action name ddd. - [unknown location]
at com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:178)
at org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:61)
at org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:39)
at com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:47)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:478)
at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
at java.lang.Thread.run(Thread.java:619)
10:01:44 com.opensymphony.xwork2.monsLogger warn
警告: Could not find action or result
There is no Action mapped for namespace / and action name ddd. - [unknown location]
at com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:178)
at org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:61)
at org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:39)
at com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:47)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:478)
at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
at java.lang.Thread.run(Thread.java:619)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
解决办法如下:
只要对web.xml稍做一点改动就行,改成如下:
&filter-name&struts2&/filter-name&
&filter-class&org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter&/filter-class&
&init-param&
&param-name&config&/param-name&
&param-value&struts-default.xml,struts-plugin.xml,../conf/struts.xml&/param-value&
&/init-param&
这样就一切OK了。
了这篇文章
类别:┆阅读(0)┆评论(0)1161人阅读
1、Struts2在web.xml中配置为“/*”和“*.action,*.jsp”的差别。&
2、There is no Action mapped for namespace / and action name ...的问题。&
分析(环境是Struts2.1.8.1):&
Struts2过滤器的配置有2种方式:&
&&&&struts2&&
&&&&struts2&&
&&&&*.action&&
&&&&struts2&&
&&&&*.jsp&&
那么这两种方式的配置,究竟有什么差别呢?&
首先,假如配置方式是*.action的话,一般应当同时配置*.jsp,因为如果不通过action而直接访问jsp页面的话,Struts2标签在解析的时候会获取当前线程ThreadLocal中的Dispatcher。而Dispatcher是在Struts过滤器中预设的。代码如下:&
Java代码&&
public&static&ValueStack&getStack(PageContext&pageContext)&{&&
HttpServletRequest&req&=&(HttpServletRequest)&pageContext.getRequest();&&
ValueStack&stack&=&(ValueStack)&req.getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);&&
if&(stack&==&null)&{&&
&&&&HttpServletResponse&res&=&(HttpServletResponse)&pageContext.getResponse();&&
&&&&Dispatcher&du&=&Dispatcher.getInstance();&&
&&&&if&(du&==&null)&{&&
&&&&&&&&throw&new&ConfigurationException(&The&Struts&dispatcher&cannot&be&found.&&This&is&usually&caused&by&&+&&
&&&&&&&&&using&Struts&tags&without&the&associated&filter.&Struts&tags&are&only&usable&when&the&request&&+&&
&&&&&&&&&has&passed&through&its&servlet&filter,&which&initializes&the&Struts&dispatcher&needed&for&this&tag.&);&&
除了为当前线程预设Dispatcher以外,Struts2对“/*”的请求,在完成普通的“*.action”过滤的基础上,另外提供2点功能:&
第1点用于访问classpath中特定的静态资源;&
第2点支持无后缀名的Action请求;&
Struts2的标签有时候需要某些CSS、JS文件的支持,比如&s:head/&标签,可能就转换成:&
&link&rel=&stylesheet&&href=&/demo/struts/xhtml/styles.css&&type=&text/css&/&&&
&script&src=&/demo/struts/utils.js&&type=&text/javascript&&&/script&&&
第1点功能带来的好处是可以把这些Struts2框架用到的CSS、JS文件打包在Struts2-core-***.jar文件中分发,使得Struts2的发布包对开发人员而言更加简洁。&
下面看一下StrutsPrepareAndExecuteFilter是怎样实现的:&
①将Dispatcher预设到线程的ThreadLocal变量上;&
②对于Action请求,直接execute.executeAction(request,response,mapping);&
③如果是/struts、或者/static开始的资源,则在classpath下查找特定的包下面的匹配资源;&
④其他的所有资源(包括直接访问的JSP、以及其他静态资源)转交过滤器链的下一个环节处理:chain.doFilter(request, response);&
上面所说的特定包,是指在&
&&&&struts2&&
&&&&org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter&&
&&&&&&&&packages&&
&&&&&&&&eee&&
中通过packages参数指定的包、以及 &org.apache.struts2.static template org.apache.struts2.interceptor.debugging static&这4个包。&
由于packages可配置,从而,如果有自己的classpath上的资源需要访问,或者需要更改Struts本身的静态资源时,只要把Classpath下相应的package设置在过滤器的初始参数中即可(这一条看上去好像没什么用处)。&
上面是使用/*时对静态资源的访问,那么使用*.action时如果需要的话,如何访问静态资源呢?&
很简单,只要把需要用到的静态资源解压缩到WebContent/struts目录下即可。&
第2点“支持无后缀名的Action请求”经常带来一些混乱,最典型的就是“/*”错误地拦截了其他的映射为无后缀名的Servlet请求。比如DWR、FCKEditor等都存在这种问题。&
比如,当访问“/demo/dwr”时,正常情况应该显示当前系统中对外暴露的JS方法的列表,但在Struts2的默认配置下,却得到“There is no Action mapped for namespace / and action name dwr.”&
又比如在默认配置下,访问http://localhost:8080/demo/hello.action&
和访问http://localhost:8080/demo/hello这两者是等同的。&
当然,也只有无后缀名的URL请求才会被Struts2当做是Action,这也是为什么/dwr无法访问,然而/dwr/interface.js可以访问的原因。&
具体的,看一下下面的代码就明白了:&
Java代码&&
protected&List&String&&extensions&=&new&ArrayList&String&()&{{&add(&action&);&add(&&);}};&&
protected&String&dropExtension(String&name,&ActionMapping&mapping)&{&&
if&(extensions&==&null)&{&&
&&&&return&&&
for&(String&ext&:&extensions)&{&&
&&&&if&(&&.equals(ext))&{&&
&&&&&&&&int&index&=&name.lastIndexOf('.');&&
&&&&&&&&if&(index&==&-1&||&name.indexOf('/',&index)&&=&0)&{&&
&&&&&&&&&&&&return&&&
&&&&&&&&}&&
&&&&}&else&{&&
&&&&&&&&String&extension&=&&.&&+&&&
&&&&&&&&if&(name.endsWith(extension))&{&&
&&&&&&&&&&&&name&=&name.substring(0,&name.length()&-&extension.length());&&
&&&&&&&&&&&&mapping.setExtension(ext);&&
&&&&&&&&&&&&return&&&
&&&&&&&&}&&
return&null;&&
那么,怎么解决此问题呢?&
有2种办法。&
第1种很简单,在Struts.properties中定义:&
struts.action.extension = action即可解决此问题。&
Struts2缺省配置对应于:&
struts.action.extension = action,(注意后面有个逗号)&
第2种是在Struts.properties中设置:&
struts.action.excludePattern = /dwr.*,/webEditor.*(注意,这儿是正则表达式,不是URL匹配模式,所以要写/dwr.*而不是/dwr/*)&
这种写法应配置StrutsPrepareAndExecuteFilter,配置FilterDispatcher是无效的。
原文地址:
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:15901次
排名:千里之外
转载:13篇
(2)(1)(1)(6)(3)(1)(3)(2)Struts2中redirect基本的经验之谈 - lzc0088 - ITeye技术网站
博客分类:
1. redirect:action处理完后重定向到一个视图资源(如:jsp页面),请求参数全部丢失,action处理结果也全部丢失。
2. redirect-action:action处理完后重定向到一个action,请求参数全部丢失,action处理结果也全部丢失。
3. chain:action处理完后转发到一个action,请求参数全部丢失,action处理结果不会丢失。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Redirect Action Result:
这个Result使用ActionMapperFactory提供的ActionMapper来重定位浏览器的URL来调用指定的action和(可选的)namespace.
这个Result比ServletRedirectResult要好.因为你不需要把URL编码成xwork.xml中配置的ActionMapper提供的模式.这就是说你可以在任意点上改变URL模式而不会影响你的应用程序. 因此强烈推荐使用这个Result而不是标准的redirect result来解决重定位到某个action的情况.
ActionName (默认) - 重定位到的action名 namespace - action的名称空间. 如果为null,则为当前名称空间
Redirect Result:
调用 HttpServletResponse#sendRedirect(String) sendRedirect}方法来转到指定的位置. HTTP响应被告知使浏览器直接跳转到指定的位置(产生客户端的一个新请求). 这样做的结果会使刚刚执行的action(包括action实例,action中的错误消息等)丢失, 不再可用. 这是因为action是建立在单线程模型基础上的. 传递数据的唯一方式就是通过Session或者可以为Ognl表达式的web参数(url?name=value)location (默认) - action执行后跳转的地址. parse - 默认为true. 如果设置为false, location参数不会被当作Ognl表达式解析.
&result name="success" type="redirect"&/displayCart.action?userId=${userId}&/result&
name= "delete "
class= "com.zeng.action.UserManageAction "
method= "delete "&
type= "redirect "& list.action?pageBean.pageNumber=${pageBean.pageNumber} &/result&
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
今天在用struts2在做项目时候,从一个action我想跳转到另一个action,并且呢得带上值。说说我的做法吧,首先你得在你的第一个action中这个id必须要有set、get方法。跳转时你的struts.xml:
(方法一):
&result name="topic" type="redirect"&/topicAction!findTopics.do?topicId=${topicId}&/result&
(方法二):
&result name="topic" type="redirect-action"&
&param name="actionName"&findTopics&/param&
&param name="topicId"&${topicId}&/param&
如果是多个参数的话,继续再加几个&param&就行了,对于(方法一)如果是多个参数的怎么办?
&result name="topic" type="redirect"&/topicAction!findTopics.do?topicId=${topicId}&elementId=${elementId}&/result&
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
使用redirect重置链接需要后缀名,使用了redirect——action就不能使用了,就例如使用chain一样,只需要写action的配置名,如果加入后缀名.action,就会报出异常,action未配置正确。
键字: struts2 redirect-action 传递 参数
在做一个系统,使用struts2框架,在提交一个请求后,将获取的数据对象再要生成一个序列号,为了防止刷新生成冗余序列号,就在请求处理完成后,直接重定向到显示该信息的action中:
&action name="enterpreinfo" class="preinfoBusinessAction" method="enterPreinfoSub"&
&result name="success" type="redirect-action"&
showpreinfo?preinfo.order_number=${preinfo.order_number}&pany_name=${pany_name}
&result name="error" type="redirect"&
&param name="location"&/error.jsp&/param&
因为使用了redirect-action,所以要注意不能将 showpreinf?preinfo.order_number=${preinfo.order_number}写成 showpreinf.action?preinfo.order_number=${preinfo.order_number}
在这个配置文件里,多个参数的连接符使用了"&",但XML的语法规范,应该使用"&"代替"&",原理和HTML中的转义相同,开始没有注意,在struts分析配置文件时,总是报出这样的错误:
The reference to entity "preinfo" must end with the ';' delimiter.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
注解方式:
@Results({
@Result(name="input", type="redirectAction", params = {"actionName" , "resend"})
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struts2.1.6无论是xml还是annotation配置redirectAction时,如果要传一些参数,可是这些参数在ServletActionRedirectResult并没有声明,这时ognl会抛异常出来。但实际上传值是成功的。详见struts2的jira:
@Results({
@Result(name="reload",type="redirectAction"
,params={"actionName","hello_world"
,"namespace","/center/part1"
,"id","09"
,"count","90"})
@Results({
@Result(name="reload",type="redirectAction"
,params={"actionName","hello_world"
,"namespace","/center/part1"
,"id","09"
,"count","90"})
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
dispatcher 结果类型为缺省的result类型,用于返回一个视图资源(如:jsp)
&result name="success"&/main.jsp&/result&
&result name="success"&/main.jsp&/result&
以上写法使用了两个默认,其完整的写法为:
&result name="success" type="dispatcher"&
&param name="location"&/maini.jsp&/param&
location只能是页面,不能是另一个action(可用type="chain"解决)。
redirect 结果类型用于重定向到一个页面,另一个action或一个网址。
&result name="success" type="redirect"&aaa.jsp&/result&
&result name="success" type="redirect"&bbb.action&/result&
&result name="success" type="redirect"&&/result&
redirect-action 结果类型使用ActionMapperFactory提供的ActionMapper来重定向请求到另外一个action
&result name="err" type="redirect-action"&
&param name="actionName"&重定向的Action名&/param&
&param name="namespace"&重定向Action所在的名字空间&/param&
redirect和redirect-action两种结果类型在使用上其实并没有什么区别,只是写法不同而已。
chain 用于把相关的几个action连接起来,共同完成一个功能。
&action name="step1" class="test.Step1Action"&
&result name="success" type="chain"&step2.action&/result&
&action name="step2" class="test.Step2Action"&
&result name="success"&finish.jsp&/result&
处于chain中的action属于同一个http请求,共享一个ActionContext
plaintextj 结果类型用于直接在页面上显示源代码
&result name="err" type="plaintext"&
&param name="location"&具体的位置&/param&
&param name="charSet"&字符规范(如GBK)&/param&
浏览 24821
楼主你好,你说到
redirect:action处理完后重定向到一个视图资源(如:jsp页面),请求参数全部丢失,action处理结果也全部丢失。
今天我做了下简单测试,发现参数可以在页面接收,以下是我的代码
&action name="test" class="com.action.UploadAction"&
&result type='redirect' name="test"&/test.jsp?name="tao"&/result&
&/action&
我在test.jsp是这样接收参数
&% String name = request.getParameter("name");
&& System.out.println(&result type='redirect' name="test"&/test.jsp?name="tao"&/result&
);
%&
控制台输出结果:tao,楼主能否解释一下呢?
你重定向以后,把参数都传过去了,肯定能取道啊?重定向后参数全部丢失,指的是之前哪个请求的参数将全部丢失,如果你改成&result type='redirect' name="test"&/test.jsp?name="tao"&/result&,页面肯定获取不到name的值。
浏览: 235271 次
来自: 苏州
支持博主,好文!正好需要了
楼主,您好。有个语法想问一下:引用你原文中“&resul ...
road_16 写道楼主你好,你说到
redirect:act ...
楼主你好,你说到
redirect:action处理完后重定向 ...

我要回帖

更多关于 struts2 action 的文章

 

随机推荐