2013-02-14 72 views
-1

我期待我的代码重新设置URL,并将其显示如下(有/)如何使用struts2重写URL地址?

http://www.example.com/myProject/Profile/view.action 
http://www.example.com/myProject/Profile/edit.action 

,但它们显示为以下(含_)

http://www.example.com/myProject/Profile_view.action 
http://www.example.com/myProject/Profile_edit.action 

为了实现这个,我改变在“_”,以“/”在我的struts.xml文件,但它不工作

<action name="Profile/*" method="{1}" class="com.controller.Profile"> 
     <result name="view" tiles="viewProfile">viewProfile</result> 
     <result name="edit" tiles="editProfile">editProfile</result> 
    </action> 

我打电话,使用下面的代码

<a href="Profile/view.action" >Profile</a> 

请让我知道是否有其他方法来实现它。

+0

我有同样的问题:( – 2013-02-14 05:44:15

+1

更改后_你/重新启动了网络应用程序吗?无论如何,除非将struts.enable.SlashesInActionNames设置为true,否则不应该在操作名称中使用斜杠。你做到了? – Quaternion 2013-02-14 06:19:19

+0

我不明白它是一个正确的URL,地址的URL格式是不正确的,还是你需要一个格式化URL的规范? – 2013-02-14 11:32:57

回答

1

如果你真的想单独与斜线你的行为,你应该使用NAMESPACE,试试这个:

<package name="profile" extends="struts-default" namespace="/Profile"> 
    <action name="*" method="{1}" class="com.controller.Profile"> 
     <result name="view" tiles="viewProfile">viewProfile</result> 
     <result name="edit" tiles="editProfile">editProfile</result> 
    </action> 
</package> 

如果你想在URL中使用的参数,你应该考虑在你的Struts 2的配置文件中使用

<constant name="struts.enable.SlashesInActionNames" value="true"/> 

问候到Wildcart Mapping文件,你也可以这样做:

<action name="**" method="{1}" class="com.controller.Profile"> 
     <result name="view" tiles="viewProfile">viewProfile</result> 
     <result name="edit" tiles="editProfile">editProfile</result> 
    </action> 

** matches zero or more characters including the slash ('/') character.您还可以找到这对Wildcart Mapping文件。

你应该想想你真的第一的东西,然后的配置和实施。

在你的情况,在Struts 2认为你有斜线上你的行动,认为该Action Configuration

动作名称用斜杠
如果你的操作名称中都有 斜杠(例如, <action name="admin/home" class="tutorial.Admin"/>)you 需要在struts.xml文件中通过指定 <constant> name="struts.enable.SlashesInActionNames" value="true"/>通过 常量在您的动作名称中明确指定斜杠。
请参阅JIRA Issue WW-1383进行讨论,因为将 设置为true会产生副作用。

用点动作名称和破折号
虽然动作的命名是相当 灵活,应该用点时要注意(如:create.user) 和/或破折号(如my-action)。虽然点符号此时不存在已知的 副作用,但短划线符号会导致为某些标记和主题生成的JavaScript生成的问题 。谨慎使用 ,并且始终尝试使用camelcase动作名称(例如 createUser)或下划线(例如my_action)。

因此,Struts 2会将您的斜杠转换为下划线。

+0

感谢它的工作原理,但有一个小问题如下http://stackoverflow.com/questions/14886855/how-to-change-my-code-to-implement-网址reqriting-正确 – 2013-02-15 01:05:28

1

为什么你叫你的行动像

<a href="Profile/view.action" >Profile</a>

但是你可以使用

<a href="view.action" >Profile</a> 

实现这一点,并在你的XML所做的更改

<action name="view.action" method="{1}" class="com.controller.Profile"> 
     <result name="view" tiles="viewProfile">viewProfile</result> 
     <result name="edit" tiles="editProfile">editProfile</result> 
</action> 

你是不是允许你在这里使用通配符apping为方法=“{1}”,因为在你的行动,你还没有指定anything.And如果你真的想使用通配符然后在动作这样

<a href="YOURMETHODNAMEview.action" >Profile</a> 

并在指定的方法名称你的XML

<action name="*view.action" method="{1}" class="com.controller.Profile"> 
      <result name="view" tiles="viewProfile">viewProfile</result> 
      <result name="edit" tiles="editProfile">editProfile</result> 
    </action> 
+0

我想它是用来删除不重新格式化URL的扩展。 – 2013-02-14 06:02:59

+0

ohh对不起,我编辑了我的答案,删除您的downvote – 2013-02-14 06:08:16

0

默认情况下,struts不允许/在操作名称中。你可以通过使用命名空间来实现你想要的,或者修改struts配置来允许破解行动。

1.To使用的命名空间,定义另一个包与命名空间“/档案”:如果你想在同一命名空间下组的许多行动

<package name="profile" extends="struts-default" namespace="/Profile"> 
<action name="*" method="{1}" class="com.controller.Profile"> 
    <result name="view" tiles="viewProfile">viewProfile</result> 
    <result name="edit" tiles="editProfile">editProfile</result> 
</action> 
...... 
</package> 

这是一个好方法。

2.To让破折号在行动上,你有2个选项,定义在struts.xml中的常量象下面这样:

<constant name="struts.enable.SlashesInActionNames" value="true"/> 
<constant name="struts.mapper.alwaysSelectFullNamespace" value="false"/> 

或struts.properties来定义它:

struts.enable.SlashesInActionNames=true 
struts.mapper.alwaysSelectFullNamespace=false 

之后,你可以在struts.xml中使用这个:

<action name="Profile/*" method="{1}" class="com.controller.Profile"> 
    <result name="view" tiles="viewProfile">viewProfile</result> 
    <result name="edit" tiles="editProfile">editProfile</result> 
</action>