zoukankan      html  css  js  c++  java
  • springmvc重定向请求。

    SpringMVC重定向传参数的实现(来自网友)

    验证了我说的,从model层中拿来的数据,不管什么类型,都是通过隐含模型,中转,放入request中的。除非你特意把这些数据放到session域中。

    SpringMVC

    在spring的一个controller中要把参数传到页面,只要配置视图解析器,把参数添加到Model中,在页面用el表达式就可以取到。但是,这样使用的是forward方式,浏览器的地址栏是不变的,如果这时候浏览器F5刷新,就会造成表单重复提交的情况。所以,我们可以使用重定向的方式,改变浏览器的地址栏,防止表单因为刷新重复提交。

    jsp文件:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>login</title>
    </head>
    <body>
    	
    	<form id="form1" action="/demo/user/login" method="post">
    		账号:<input type="text" name="name" /></br>
    		密码:<input type="password" name="password" /></br>
    		<input type="submit" value="submit"/>
    		
    	</form>
    
    </body>
    </html>
    

    controller:

    package com.demo.controller;
    
    import java.util.Map;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    
    /**
     * @author lpj
     * @date 2016年7月10日
     */
    @Controller
    @RequestMapping("/user")
    public class DemoController {
    
    	@RequestMapping("/login")
    	public String login(@RequestParam Map<String, String> user, Model model) {
    		System.out.println("用户提交了一次表单");
    		String username;
    		if (user.get("name").isEmpty()) {
    			username = "Tom";
    		} else {
    			username = user.get("name");
    		}
    		model.addAttribute("msg", username);
    //		  return "home";//此方式跳转,页面刷新会重复提交表单
    		return "redirect:/home.jsp";
    	}
    
    }
    

    由于重定向相当于2次请求,所以无法把参数加在model中传过去。在上面例子中,页面获取不到msg参数。要想获取参数,可以手动拼url,把参数带在后面。 Spring 3.1 提供了一个很好用的类:RedirectAttributes。 使用这个类,我们可以把参数随着重定向传到页面,不需自己拼url了。 把上面方法参数中的Model换成RedirectAttributes,参数就自动跟在url后了。


    但是,这样页面不能用el获取到,还要另外处理,所以,我们还有一种方式,不拼url,用el获取参数,就像普通转发一样。 还是使用RedirectAttributes,但是这次不用addAttribute方法,spring为我们准备了新方法,addFlashAttribute()。 这个方法原理是放到session中,session在跳到页面后马上移除对象。所以你刷新一下后这个值就会丢失。 controller代码改为如下:

    package com.demo.controller;
    
    import java.util.Map;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.ModelAttribute;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.servlet.mvc.support.RedirectAttributes;
    
    /**
     * @author lpj
     * @date 2016年7月10日
     */
    @Controller
    @RequestMapping("/user")
    public class DemoController {
    
    	@RequestMapping("/login")
    //	public String login(@RequestParam Map<String, String> user, Model model) {
    	public String login(@RequestParam Map<String, String> user, RedirectAttributes model) {
    		System.out.println("用户提交了一次表单");
    		String username;
    		if (user.get("name").isEmpty()) {
    			username = "Tom";
    		} else {
    			username = user.get("name");
    		}
    		model.addFlashAttribute("msg", username);
    //		return "home";//此方式跳转,页面刷新会重复提交表单
    		return "redirect:/user/toHome";
    	}
    	
    	@RequestMapping("/toHome")
    	public String home(@ModelAttribute("msg") String msg, Model model) {
    		System.out.println("拿到重定向得到的参数msg:" + msg);
    		model.addAttribute("msg", msg);
    		return "home";
    	}
    }
    

    这边我们使用@ModelAttribute注解,获取之前addFlashAttribute添加的数据,之后就可以正常使用啦。

    学习使我快乐! 一起成长
  • 相关阅读:
    MVC3、如何应用EntityFramework 连接MySql 数据库 Kevin
    DEV EXPRESS Summary Footer 不显示 Kevin
    装饰模式 Kevin
    Dev 控件 GridControl 控件 二次绑定数据源的问题。 Kevin
    System.InvalidOperationException 异常 Kevin
    LINQ to XML Kevin
    代理模式——代码版“吊丝的故事” Kevin
    VS2012 中的设备 面板 Kevin
    maven 学习笔记(三)创建一个较复杂的 eclipse+android+maven 工程
    maven 学习笔记(一)eclipse+android+maven
  • 原文地址:https://www.cnblogs.com/zhizhuoDEZHUZHU/p/9602486.html
Copyright © 2011-2022 走看看