Spring控制器,为什么忽略返回的视图?

时间:2014-07-01 13:44:04

标签: spring

所以,假设我有一个现有的工作页面Display Cashier,它显示有关商店收银员的信息。现在,我在此页面上添加一个按钮,如下所示:

<a href="handleGetManager.ctl?cashierId=${id}" class="btn btn-mini">Manager</a>

此URL的请求映射将其(成功)映射到控制器:HandleGetManager

HandleGetManager控制器如下所示:

@Controller
public class HandleGetManager{

    private employeeBO employeeBO; //BO handles all business logic

    //spring hooks
    public HandleGetManager(){} 
    public void setemployeeBo(employeeBO employeeBO){
    this.employeeBO = employeeBO;
    }

    //get controller 
    @RequestMapping(method=RequestMethod.GET)
    public String getManager(@RequestParam String cashierId){

    Long managerId = employeeBO.getManagerByCashierId(cashierId); 

    String redirectUrl = "/displayManager.ctl?managerId=" + managerId.toString();
    return redirectUrl;
    }

}

以下是我尝试时会发生的事情:

我点击Display Cashier页面上的新按钮,我预计会发生以下情况:

  • 浏览器向指定的网址

  • 发送获取请求
  • spring请求映射确保将控制流传递给此类。

  • @RequestMapping(method=RequestMethod.GET)部分确保引发此方法

  • @RequestParam String cashierId指示Spring解析URL并将cashierId值作为参数传递给此方法。

  • EmployeeBo已通过弹簧注入控制器。

  • 发生业务逻辑,调用BO并使用正确的值填充managerId var。

  • 该方法返回不同视图的名称,并附加新的managerId URL arg

现在,到目前为止,一切都按计划进行。我期望接下来发生的是:

  • 将浏览器定向到该网址

  • 于是它会向发送一个获取请求 url,

  • 整个过程将在另一个控制器中重新启动,具有不同的URL和不同的URL arg。

相反会发生什么:

  • 此控制器返回不同视图的名称

  • 浏览器会重定向到半个错误的网址:handleGetManager.ctl?managerId=12345

  • URL参数更改,但控制器的名称没有更改,尽管我明确地将其返回

  • 我收到错误

我做错了什么?我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

假设您的MVC配置中有UrlBasedViewResolver,则您返回的String值为View 名称ViewResolver将使用该名称并尝试为其解析View

您似乎想要做的是通过重定向获得301响应。使用视图名称,可以通过在视图名称中指定redirect:前缀来实现。它在文档中描述,here

这是一个问题/答案,解释了您可以执行重定向的所有(默认)方式: