• SpringMVC返回值类型


    ModelAndView

    1 @RequestMapping(method=RequestMethod.GET)
    2     public ModelAndView index(){
    3         ModelAndView modelAndView = new ModelAndView("/user/index");
    4         modelAndView.addObject("xxx""xxx");
    5         return modelAndView;
    6     }

    通过ModelAndView构造方法可以指定返回的页面名称,也可以通过setViewName()方法跳转到指定的页面 ,
    使用addObject()设置需要返回的值,addObject()有几个不同参数的方法,可以默认和指定返回对象的名字。
    调用addObject()方法将值设置到一个名为ModelMap的类属性,ModelMap是LinkedHashMap的子类,
    具体请看类。

    1 @RequestMapping(method=RequestMethod.GET)
    2     public ModelAndView index(){
    3         ModelAndView modelAndView = new ModelAndView();
    4         modelAndView.addObject("xxx""xxx");
    5         modelAndView.setViewName("/user/index");
    6         return modelAndView;
    7     }

    对于ModelAndView类的属性和方法

    Model

    一个模型对象,主要包含spring封装好的model和modelMap,以及Java.util.Map,当没有视图返回的时候视图名称将由requestToViewNameTranslator决定;Model 是一个接口, 其实现类为ExtendedModelMap,继承了ModelMap类。

    ModelMap

    待续

    Map

    1 @RequestMapping(method=RequestMethod.GET)
    2     public Map<String, String> index(){
    3         Map<String, String> map = new HashMap<String, String>();
    4         map.put("1""1");
    5         //map.put相当于request.setAttribute方法
    6         return map;
    7     }

    PS:响应的view应该也是该请求的view。等同于void返回。

    Java代码  
    1. @RequestMapping("/demo2/show")  
    2.     publicMap<String, String> getMap() {  
    3.         Map<String, String> map = newHashMap<String, String>();  
    4.         map.put("key1", "value-1");  
    5.         map.put("key2", "value-2");  
    6.         returnmap;  
    7.     }  


    在jsp页面中可直通过${key1}获得到值, map.put()相当于request.setAttribute方法。
    写例子时发现,key值包括 - . 时会有问题.

    View

    这个时候如果在渲染页面的过程中模型的话,就会给处理器方法定义一个模型参数,然后在方法体里面往模型中添加值。可以返回pdf excel等,暂时没详细了解。

    String

    对于String的返回类型,笔者是配合Model来使用的;

    1 @RequestMapping(method = RequestMethod.GET)
    2     public String index(Model model) {
    3         String retVal = "user/index";
    4         List<User> users = userService.getUsers();
    5         model.addAttribute("users", users);
    6  
    7         return retVal;
    8     }

    或者通过配合@ResponseBody来将内容或者对象作为HTTP响应正文返回(适合做即时校验);

    1 @RequestMapping(value = "/valid", method = RequestMethod.GET)
    2     public @ResponseBody
    3     String valid(@RequestParam(value = "userId", required = false) Integer userId,
    4             @RequestParam(value = "logName") String strLogName) {
    5         return String.valueOf(!userService.isLogNameExist(strLogName, userId));
    6  
    7     }

    ps:返回字符串表示一个视图名称,这个时候如果需要在渲染视图的过程中需要模型的话,就可以给处理器添加一个模型参数,然后在方法体往模型添加值就可以了,

    String 指定返回的视图页面名称,结合设置的返回地址路径加上页面名称后缀即可访问到。
    注意:如果方法声明了注解@ResponseBody ,则会直接将返回值输出到页面。
    例如:

    Java代码  
    1. @RequestMapping(value = "/something", method = RequestMethod.GET)  
    2. @ResponseBody  
    3. publicString helloWorld()  {  
    4. return"Hello World";  
    5. }  


    上面的结果会将文本"Hello World "直接写到http响应流。

    Java代码  
    1. @RequestMapping("/welcome")  
    2. publicString welcomeHandler() {  
    3.   return"center";  
    4. }  

    返回字符串代表的意义:
    1):字符串代表逻辑视图名

    真实的访问路径=“前缀”+逻辑视图名+“后缀”

    注意:如果返回的String代表逻辑视图名的话,那么Model的返回方式如下:

       public String testController(Model model){
    model.addAttribute(attrName,attrValue);//相当于ModelAndView的addObject方法
    return "逻辑视图名";
       }

    2):代表redirect重定向

    redirect的特点和servlet一样,使用redirect进行重定向那么地址栏中的URL会发生变化,同时不会携带上一次的request

    案例:

    public String testController(Model model){
    return "redirect:path";//path代表重定向的地址
    }

    3):代表forward转发

    通过forward进行转发,地址栏中的URL不会发生改变,同时会将上一次的request携带到写一次请求中去

    案例:
    public String testController(Model model){
    return "forward:path";//path代表转发的地址
    }

    详细例子参考:http://blog.csdn.net/u011001084/article/details/52847174

    Void

    当返回类型为Void的时候,则响应的视图页面为对应着的访问地址

    01 @Controller
    02 @RequestMapping(value="/type")
    03 public class TypeController extends AbstractBaseController{
    04  
    05     @RequestMapping(method=RequestMethod.GET)
    06     public void index(){
    07         ModelAndView modelAndView = new ModelAndView();
    08         modelAndView.addObject("xxx""xxx");
    09     }
    10 }

    返回的结果页面还是:/type

    PS:这个时候我们一般是将返回结果写在了HttpServletResponse 中了,如果没写的话,spring就会利用RequestToViewNameTranslator 来返回一个对应的视图名称。如果这个时候需要模型的话,处理方法和返回字符串的情况是相同的。

    小结:
    1.使用 String 作为请求处理方法的返回值类型是比较通用的方法,这样返回的逻辑视图名不会和请求 URL 绑定,具有很大的灵活性,而模型数据又可以通过 ModelMap 控制。
    2.使用void,map,Model 时,返回对应的逻辑视图名称真实url为:prefix前缀+视图名称 +suffix后缀组成。
    3.使用String,ModelAndView返回视图名称可以不受请求的url绑定,ModelAndView可以设置返回的视图名称。

    Model model,HttpServletRequest request, ModelMap map声明变量

    request.getSession().setAttribute("test", "haiwei2Session");
    request.setAttribute("test", "haiwei1request"); 
    map.addAttribute("test", "haiweiModelMap");
    model.addAttribute("test", "haiweiModel");

    我通过${test}这个方式取值,优先取Model和ModelMap的,Model和ModelMap是同一个东西,谁最后赋值的就取谁的,然后是request,最后是从session中获取

  • 相关阅读:
    今天的赢在中国推迟了,给大家推荐个视频,看看什么是真正的中华武术
    赢在中国080312
    盛大(上海)诚聘软件测试人员
    jQuery入门[2]-选择器
    阿里巴巴诚信通成为《赢在中国》的实战项目,要花多少钱?--《赢在中国》(20080408)
    唐僧晒书
    用于生成网页、WAP、JS中文编码的Unicode编码工具
    jQuery入门[5]-AJAX
    中国哲学(一)
    20071212公映的《色即是空2》(sex is zero 2)字幕文件
  • 原文地址:https://www.cnblogs.com/ringqq/p/11828937.html
Copyright © 2020-2023  润新知