Динамические URL на Struts 2 - PullRequest
       7

Динамические URL на Struts 2

0 голосов
/ 22 октября 2010

Я создаю приложение с помощью Struts2 и хочу иметь дружественные URL-адреса.

Si, я установил следующие параметры в 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>

Но, когда я нажал на URL http://localhost/notes/welcome/1, я получил эту ошибку:

Servlet.service () для сервлета по умолчанию вызвал исключение java.lang.NullPointerException

Есть идеи?Что я делаю не так?Я использую стойки 2.0.14 ... Спасибо.

Вот полная трассировка стека:

ПРЕДУПРЕЖДЕНИЕ: StandardWrapperValve [по умолчанию]: PWC1406: Servlet.service () дляпо умолчанию сервлет выдал исключение java.lang.NullPointerException в com.opensymphony.xwork2.config.impl.ActionConfigMatcher.convertActionConfig (ActionConfigMatcher.java:168) в com.opensymphony.xwork2.config.impl.ActionConfMatMatcher) в com.opensymphony.xwork2.config.impl.DefaultConfiguration $ RuntimeConfigurationImpl.getActionConfig (DefaultConfiguration.java:297) в com.opensymphony.xwork2.DefaultActionProxy.prepare (DefaultActionProxy.java:169) в org.impache.StrutsActionProxyFactory.createActionProxy (StrutsActionProxyFactory.java:41) в org.apache.struts2.dispatcher.Dispatcher.serviceAction (Dispatcher.java:494) в org.apache.struts2.dispatcher.FilterDispatcher.doFilter) или фильтре ().apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:256) в org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:215) в org.apache.catalina.core.StandardWrapperValve.invoke (StandardWrapperValve.jalg.apina.apin: 277).core.StandardContextValve.invoke (StandardContextValve.java:188) в org.apache.catalina.core.StandardPipeline.invoke (StandardPipeline.java:641) в com.sun.enterprise.web.WebPipeline.invoj (WebPipe) в com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke (PESessionLockingStandardPipeline.java:85) в org.apache.catalina.core.StandardHostValve.invoke (StandardHostValve.java:185) .cat.apine.apine.apineapate.apineapatedoService (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 (ПроцессorTask.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.j.s). Comgrizzly.http.HttpProtocolChain.execute (HttpProtocolChain.java:76) по адресу com.sun.grizzly..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)

Спасибо.

Ответы [ 2 ]

2 голосов
/ 25 октября 2010
  • Я не думаю, что вам нужна начальная косая черта в имени действия (например, * / * вместо / * / *)
  • Вы установили какие-либо точки останова в своем действии, чтобы увидеть,NPE происходит до или после вашего действия?
  • Какой картограф действий вы используете?

Кроме того, на случай, если вы просто пытаетесь получить дружественные URL-адреса в стиле Ruby on RailsВы смотрели на Плагин Struts2 Rest ?

Редактировать: Как я и подозревал, это, похоже, связано с ведущей косой чертой в вашем отображении действий.Я смог воспроизвести это исключение под Tomcat.Начальная косая черта приводит к тому, что Struts2 не может правильно проанализировать ActionConfig для этого действия и создает NPE.Изменение имени действия на * / * решило проблему и правильно вызвало ViewNotesAction с заголовком приветствия и идентификатором 1.

0 голосов
/ 30 июня 2011

Если вы не хотите переделывать ваше приложение для непосредственного использования Rest, вы также можете использовать инструменты перезаписи URL, такие как http://ocpsoft.com/prettyfaces/,, которые позволяют вам выполнять сопоставления URL-адресов непосредственно поверх существующего приложения..

Вы просто настраиваете что-то подобное в файле pretty-config.xml:

<url-mapping>
   <pattern value="/my/restful/url" />
   <view-id value="/my/existing/url" />
</url-mapping>

Или, если вы хотите перезаписать параметры, вы можете сделать это:

<url-mapping>
   <pattern value="/my/restful/url/#{param}" />
   <view-id value="/my/existing/url" />
</url-mapping>

А это значит, что любые URL-адреса, похожие на /my/existing/url?param=value, теперь станут:

/my/restful/url/value

Так что их легко добавить в ваши текущие приложения.

...