所以,假设我有一个现有的工作页面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参数更改,但控制器的名称没有更改,尽管我明确地将其返回
我收到错误
我做错了什么?我错过了什么吗?
答案 0 :(得分:1)
假设您的MVC配置中有UrlBasedViewResolver
,则您返回的String
值为View 名称。 ViewResolver
将使用该名称并尝试为其解析View
。
您似乎想要做的是通过重定向获得301响应。使用视图名称,可以通过在视图名称中指定redirect:
前缀来实现。它在文档中描述,here。
这是一个问题/答案,解释了您可以执行重定向的所有(默认)方式: