Spring MVC:从基本控制器重定向 - 如何获取重定向到的路径?

时间:2013-03-19 17:09:11

标签: spring spring-mvc

我进行了搜索和搜索,但没有找到任何可能无法解释的内容,也没有找到解释如何操作的内容。

如果你有一个扩展的基本控制器,我知道请求映射的方法也是继承的。

所以.... [/ p>

public abstract class BaseController
{

    @RequestMapping(value="hello", method=RequestMethod.GET)
    public String hello(Model model) {
        return "hello-view;
}

...像这样的控制器......

@Controller
@RequestMapping("/admin/")
public abstract class AdminController
{
 ....
}

...将继承一个侦听/ admin / hello的方法,该方法返回hello-view。

这一切都很好。

但是如果我有一个重定向的BaseController方法怎么办?

public abstract class BaseController
{

    @RequestMapping(value="hello", method=RequestMethod.POST)
    public String hello(Model model) {
        return "redirect:/success/;
}

据我了解,重定向需要相对或绝对URL而不是视图名吗?

那么我的AdminController如何确保重定向发生在/ admin / success /?

BaseController方法如何获取AdminController上类级别@requestMapping的句柄?

这可能吗?

4 个答案:

答案 0 :(得分:7)

一个选项:

public abstract class BaseController
{
    /** get the context for the implementation controller **/
    protected abstract String getControllerContext();

    @RequestMapping(value="hello", method=RequestMethod.GET)
    public String hello(Model model) {
        return "redirect:"+getControllerContext()+"success/";
    }
}

这是管理员控制器。

@Controller
@RequestMapping(AdminController.context)
public abstract class AdminController
{
    static final String context = "/admin/";
    @Override
    protected String getControllerContext() {
        return context;
    }
 ....
}

涉及可能有效的反射的另一个选项......:

public abstract class BaseController
{
    String context = null;

    @RequestMapping(value="hello", method=RequestMethod.GET)
    public String hello(Model model) {
        return "redirect:"+getControllerContext()+"success/";
    }

    // untested code, but should get you started.
    private String getControllerContext() {
        if ( context == null ) {
            Class klass = this.getClass();
            Annotation annotation = klass.getAnnotation(RequestMapping.class);
            if ( annotation != null ) {
                context = annotation.value();
            }
        }
        return context;
    }
}

答案 1 :(得分:2)

根据http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-redirecting-redirect-prefix $http.get(this.url) 将相对于当前的Servlet上下文重定向。

我的检查:应用程序上下文是 this.url = 'data.json'; var that = this; this.fetch = function() { return $http.get(that.url) .then(function(response) { return response.data; }) .catch(function(response) { console.log('Error retrieving sales data', response.status, response.data); }); }; ,Servlet上下文是redirect:/myapp/some/resource, 请求topjava

meals重定向到http://localhost:8080/topjava/meals/meals

http://localhost:8080/topjava/meals/update?...重定向到http://localhost:8080/topjava/meals

答案 2 :(得分:1)

在Spring中无需像

那样提供相对网址
"redirect:/admin/success/";

而不是上面的代码,你可以直接给出这样的

"redirect:/success/";

默认情况下,它将采用上下文路径。

答案 3 :(得分:-1)

只要您不需要任何动态,我就会重定向到字符串中的请求映射。尚未使用重定向,但管理成功的映射将是:

return "redirect:/admin/success/"

这应该使用相应的请求映射创建浏览器重定向到您的控制器。

另一种可能性是使用反射并获取父级的请求映射注释。