Spring MVC URI映射配置

时间:2015-07-07 03:51:34

标签: java spring spring-mvc

我使用WebApplicationInitializer来初始化Spring Dispatcher,这就是它的设置方式。

public class MyApplicationInitializer implements WebApplicationInitializer{

@Override
public void onStartup(final ServletContext servletContext) throws ServletException {
    final XmlWebApplicationContext appconfig = new XmlWebApplicationContext();
    appconfig.setConfigLocation("/WEB-INF/app-servlet.xml");

    final ServletRegistration.Dynamic dispatcher =
            servletContext.addServlet("my_app", new DispatcherServlet(appconfig));
    dispatcher.setLoadOnStartup(1);
    dispatcher.addMapping("/app/*.do");
    System.out.println("Here I am ");
}

我打算将控制器类用作命名空间

@Controller
@RequestMapping("app")
public class TestingController{

    @RequestMapping("/{act}.do")
    public ModelAndView getIndex(){ return new ModelAndView("/index.jsp"); }
}

这似乎是合理的,但是当我尝试从tomcat运行此工件时,我收到了此错误消息。

Caused by: java.lang.IllegalArgumentException: Invalid <url-pattern> /app/*.do in servlet mapping

问题是为什么我不能像这样定义调度URI,如果我想为调度程序实现类URI +方法URI,我应该如何设置它?

1 个答案:

答案 0 :(得分:0)

看起来你的端点是为struts制定的。 Spring不支持这一点。可能是因为它是一种非标准的REST技术。

更多RESTful方法是设计这样的URI:

 /app/do/{action}

或者:

/app/do?action={action}

但是,你可以像这样使用正则表达式PathVariables:  

/app/{action:[A-Za-z\\d]+}.do

然后,在方法块内评估请求路径并根据模式匹配有条件地重定向到不同的控制器。 以下是我能够开展工作的例子:

package com.app.controller;

import com.fasterxml.jackson.databind.JsonNode;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;


@Controller
@RequestMapping(value = "/test")
public class TestController
{

    @RequestMapping(value = "/{action:[A-Za-z\\d]+}.do")
    public @ResponseBody
    ModelAndView getDo(@PathVariable String action)
    {
        return new ModelAndView("redirect:/test/action/" + action);
    }

    @RequestMapping(value = "/action/a")
    public @ResponseBody
    ModelAndView getAction()
    {
        return new ModelAndView("/index.jsp");
    }

}

getAction方法可以在另一个控制器中,如果你想要它,但是使用正则表达式重定向我认为你可以完成你正在尝试的要做。