Struts 2上的动态URL [英] Dynamic URLs on Struts 2
问题描述
我正在使用Struts2创建应用程序,并且希望拥有友好的URL.
I'm creating an application using Struts2 and I want to have friendly URLs.
Si,我在struts.xml中设置了以下参数:
Si, i set the following params in struts.xml:
<constant name="struts.action.extension" value=""/>
<constant name="struts.enable.SlashesInActionNames" value="true"/>
<constant name="struts.mapper.alwaysSelectFullNamespace" value="false"/>
和我的动作
<package name="notes" namespace="/notes" extends="struts-default">
<action name="/*/*" class="action.ViewNoteAction">
<param name="title">{1}</param>
<param name="id">{2}</param>
<result>/Notes/view.jsp</result>
</action>
</package>
但是,当我点击网址 http://localhost/notes/welcome/1 时,我得到了此错误:
But, when i hit the url http://localhost/notes/welcome/1 i got this error:
Servlet默认的Servlet.service()抛出异常 java.lang.NullPointerException
Servlet.service() for servlet default threw exception java.lang.NullPointerException
有什么主意吗?我做错了什么?我正在使用Struts 2.0.14 ...谢谢.
any idea? What I'm doing wrong? I'm using struts 2.0.14... Thanks.
这是完整的堆栈跟踪:
警告: StandardWrapperValve [默认]: PWC1406:Servlet的Servlet.service() 默认抛出异常 java.lang.NullPointerException 在com.opensymphony.xwork2.config.impl.ActionConfigMatcher.convertActionConfig(ActionConfigMatcher.java:168) 在com.opensymphony.xwork2.config.impl.ActionConfigMatcher.match(ActionConfigMatcher.java:144) 在com.opensymphony.xwork2.config.impl.DefaultConfiguration $ RuntimeConfigurationImpl.getActionConfig(DefaultConfiguration.java:297) 在com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:169) 在org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:41) 在org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:494) 在org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:422) 在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) 在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215) 在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:277) 在org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188) 在org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641) 在com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97) 在com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85) 在org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185) 在org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:332) 在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:233) 在com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165) 在com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791) 在com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693) 在com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954) 在com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170) 在com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135) 在com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102) 在com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88) 在com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76) 在com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53) 在com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57) 在com.sun.grizzly.ContextTask.run(ContextTask.java:69) 在com.sun.grizzly.util.AbstractThreadPool $ Worker.doWork(AbstractThreadPool.java:330) 在com.sun.grizzly.util.AbstractThreadPool $ Worker.run(AbstractThreadPool.java:309) 在java.lang.Thread.run(Thread.java:637)
WARNING: StandardWrapperValve[default]: PWC1406: Servlet.service() for servlet default threw exception java.lang.NullPointerException at com.opensymphony.xwork2.config.impl.ActionConfigMatcher.convertActionConfig(ActionConfigMatcher.java:168) at com.opensymphony.xwork2.config.impl.ActionConfigMatcher.match(ActionConfigMatcher.java:144) at com.opensymphony.xwork2.config.impl.DefaultConfiguration$RuntimeConfigurationImpl.getActionConfig(DefaultConfiguration.java:297) at com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:169) at org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:41) at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:494) at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:422) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:277) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641) at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97) at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185) at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:332) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:233) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165) at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791) at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693) at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954) at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170) at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88) at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57) at com.sun.grizzly.ContextTask.run(ContextTask.java:69) at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309) at java.lang.Thread.run(Thread.java:637)
谢谢.
推荐答案
- 我认为您不需要 您的动作名称中的斜线 (例如,*/*代替/*/*)
- 您是否在操作中设置了任何断点以查看NPE是在操作之前还是之后发生的?
- 您使用的是哪个动作映射器?
- I don't think you need the leading slash in your action name (e.g., */* instead of /*/*)
- Have you set any breakpoints in your action to see if the NPE is occurring before or after your action?
- What action mapper are you using?
此外,在偶然的机会下,您只是尝试获取Ruby on Rails样式友好的URL,是否您已经研究了
Also, on the off chance you are just trying to get Ruby on Rails style friendly URLs, have you looked into the Struts2 Rest Plugin?
编辑:我怀疑这似乎与您的操作映射中的前斜杠有关.我能够在Tomcat下重现此异常.前导斜杠导致Struts2无法为该操作正确解析ActionConfig,并且正在生成NPE.将操作名称更改为*/*解决了该问题,并正确调用了ViewNotesAction,其标题为Welcome,ID为1.
As I suspected, this appears to be related to the leading slash in your action mapping. I was able to reproduce this exception under Tomcat. The leading slash is causing Struts2 to not be able to properly parse the ActionConfig for that action and is producing the NPE. Changing the action name to */* resolved the issue and properly invoked ViewNotesAction with a title of welcome and an id of 1.
这篇关于Struts 2上的动态URL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!