`
sunzhyng
  • 浏览: 57328 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Struts URLs for perfectionists

    博客分类:
  • Java
阅读更多


http://www.lunatech-research.com/archives/2005/07/29/struts-urls

 

Many web applications inelegantly expose themselves in their URLs. While ASP.NET applications tend to have an .aspx in the URL, Struts’ default configuration gives you a .do in your URL. It is possible to reconfigure a Struts web application that uses URLs like /customer.do?method=edit&id=42 to use something like /customer/edit/42 instead. This article covers several separate techniques that you can use for different parts of the URL.

Remove the .do

The first step is to remove the redundant .do from the URL. After all, MIME Content-type headers mean that web resources do not need ‘file extensions’ to indicate their type.

The .do is there to map certain URLs to the Struts ActionServlet, which is achieved by the following web.xml entries:

   

                action

                org.apache.struts.action.ActionServlet

        

        

                action

                *.do

        

The most obvious option is to replace the Servlet mapping’s extension mapping to a prefix mapping like /do*" type="com.example.web.{1}Action" parameter="{2}" />

The asterisks match paths like /customer/ or /customer/edit . The first downside is that if you want to have lower-case URLs then the action class needs to be called customerAction instead of CustomerAction - legal but unconventional. Still, I personally think it would be worse to include upper-case letters in the URL, although that is probably
unavoidable with form parameter names later on.

The second asterisk is something like ‘view’ or ‘edit’ - the DispatchAction method name. The standard approach is to say
parameter="method" in the action mapping and then specify the method in the URL with method=edit .

With the wildcards in the mapping, you can just get the method name from the URL and specify it in as the parameter directly by using parameter="{2}" in the mapping configuration. Then all you need to do is override the DispatchAction.getMethodName method with:

   protected String getMethodName(ActionMapping m, ActionForm f,

                HttpServletRequest req, HttpServletResponse res, String p) throws Exception

        {

                return parameter;

        }

This means that that Struts calls the method in your action class whose name is the parameter value in the action mapping, which in turn is the second part of the path.

Now you can use /customer/edit&id=42 instead of /customer?method=edit&id=42 .

An advantage of this scheme is that you can use the same wildcard parameters to specify the form name and the JSP path for forwards. For example, if you use the mapping:

   

                

        

Perfect.

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics