spring redirect不会将浏览器URL更改为适当的URL

时间:2014-05-28 11:49:48

标签: spring jquery-mobile

我的控制器如下

@Controller
@RequestMapping(value="/users")
@SessionAttributes("searchUsersDTO")
public class UserController {

@Autowired
private UserService usersService; 

@RequestMapping
public String users(Model model){
    model.addAttribute("searchUsersDTO", new SearchUsersDTO());
    return "search_for_users_page";
}

@RequestMapping(value="/search",method=RequestMethod.GET)
public String search(@ModelAttribute SearchUsersDTO searchUsersDTO,Model model){

    List<UserDetail> list=usersService.search(searchUsersDTO);

    model.addAttribute("usersList", list);
    return "users_list_page";
}

@RequestMapping(value="/edit",method=RequestMethod.GET)
public String edit(@RequestParam(value="userId") Integer userId,Model model){

    UserDetail detail=usersService.fetchUserDetails(userId);

    model.addAttribute("userDetails", detail);
    return "users_edit_view";
}

@RequestMapping(value="/save",method=RequestMethod.POST)
public String save(UserDetailsDTO userDetailsDTO,Model model){

    usersService.updateUserDetails(userDetailsDTO);
    return "redirect:/users/search";
}   
}

web.xml中的servlet映射

<!-- Processes application requests -->
 <servlet>
    <servlet-name>appServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
    </init-param>
    <init-param>
        <param-name>spring.profiles.active</param-name>
        <param-value>dev</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>appServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

Frist我会搜索用户。它将显示用户列表 然后我将选择要编辑的用户,它将显示编辑视图以及用户的所有详细信息。

然后修改并保存详细信息,这将调用保存方法,保存详细信息后,应导航回搜索视图。

每件事都很好。但保存后,浏览器网址显示为context/users/save,但我需要context/users/search

我找出了问题的原因。需要解决方案
我的users_edit_view已包含jquery.mobile-1.3.2.min.js,我在删除此lib后尝试了。然后它按预期工作。
不知道为什么会引起这个问题。以及如何解决它。

3 个答案:

答案 0 :(得分:2)

问题(我除外)是使用jquery-mobile。 我通过在jquery-mobile之前添加以下脚本来禁用ajax。 现在它按照我的意愿工作。

<script type="text/javascript">
 $(document).bind("mobileinit", function () {
    $.mobile.ajaxEnabled = false;
});
</script>
<script src="../js/jquery.mobile-1.3.2.min.js" th:src="@{/cms/js/jquery.mobile-1.3.2.min.js}"></script>


我们可以在每个表单标记上添加data-ajax=false

答案 1 :(得分:0)

这会有帮助吗? Spring MVC Controller redirect using URL parameters instead of in response

当你返回一个前缀为“redirect:”的视图名称时,无论如何,Spring MVC会将其转换为RedirectView对象,它只是将setExposeModelAttributes设置为true(我认为这是一个奇数值,默认为)。

如果您只使用return "redirect: /search"而该怎么办?

实际上,您使用的return "redirect: users/search"在我的项目中有效。

我想也许你应该在重定向之前将对象绑定到你的模型。

List<UserDetail> list=usersService.search(something);
model.addAttribute("usersList", list);
model.addAttribute("userList",userList);

好像你在开头用“/”返回,比如

return "redirect: /text1/text2"

它会重定向到网址context/text1/text2

如果你使用,

return "redirect: text1"

它会替换网址中的最后一项,例如,从context/Main/oldcontext/Main/text1

我们的测试之间的唯一区别是我的控制器的映射不以"/"开头。但即使我改变了它,重定向仍然有效。 我有我的控制器:

@RequestMapping(value = "/Main") or(value = "Main")

都适用于

redirect:/Main/index.do    or redirect:index.do

答案 2 :(得分:0)

即使是jquery.mobile-1.4.5.min.js也会引发同样的问题,并且在表单标签中添加data-ajax =“false”会在POST之后修复服务器上的重定向。谢谢你的提示。