SpringMVC笔记(3)方法参数及处理ajax

SpringMVC的转发和重定向

在spring-mvc.xml中配置视图解析器



    
    

当返回类型是String时前缀和后缀字符串拼接即jsp文件的路径
如果字符串开头是redirect:/则为重定向,可以访问另一个方法的url或者公开的.jsp文件,WEB-INF下的资源不能访问


    @RequestMapping("/aaa")
    public String f1(){
        System.out.println(this.getClass() + "日志1... f1()..转发 meto");
        
        return "test2"; 
    }
    
    @RequestMapping("/bbb")
    public String f2(){ 
        System.out.println(this.getClass() + "日志2... f2()..重定向 meto");
    
        //return "redirect:test2"; //web-inf/下的资源不让访问,只能转发
        //return "redirect:/fff/aaa.do";
        return "redirect:/test1.jsp";
    }

SpringMVC中方法的返回值

ModelAndView,重定向和转发形式

方法的参数为ModelAndView mv
返回值为 mv
mv.setViewName();为转发和重定向的方法
代码演示:



    @RequestMapping("/ccc")
    public ModelAndView f3( ModelAndView mv ){
        System.out.println(this.getClass() + "日志3... f1()..转发 meto");
        
        mv.setViewName("test2");
        return mv; 
    }
    
    @RequestMapping("/ddd")
    public ModelAndView f4( ModelAndView mv){   
        System.out.println(this.getClass() + "日志4... f2()..重定向 meto");
        
        //mv.setViewName("redirect:test2"); //web-inf/下的资源不让访问,只能转发
        mv.setViewName("redirect:/test1.jsp");
        return mv;
    }

返回值为JSON

@ResponseBody+手动拼接
参数 HttpServletResponse
代码演示:


    @RequestMapping("/eee")
    @ResponseBody
    public void f5(HttpServletResponse resp ) throws IOException{
        System.out.println(this.getClass() + "日志3... f1()..转发 meto");
        String str="{'success':0,'data':['张三','bbb','ccc']}";
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        resp.getWriter().print(str);    
    }

@ResponseBody+jar包自动拼接
导入jar包

021.PNG

new JSONObject对象,put("","")方法存数据
代码演示



    @RequestMapping("/fff")
    @ResponseBody
    public void f6(HttpServletResponse resp) throws IOException{
        System.out.println(this.getClass() + "日志3... f1()..转发 meto");
        
        List ulist = new ArrayList(); 
        ulist.add( new Users("A1","战三1",21));
        ulist.add( new Users("A2","战三2",22));
        ulist.add( new Users("A3","战三3",23));
        ulist.add( new Users("A4","战三4",20));
        ulist.add( new Users("A5","战三5",25));
        ulist.add( new Users("A6","战三6",26));
        
        JSONObject js = new JSONObject();
        
        js.put("success", 0);
        js.put("data", ulist);
        
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        resp.getWriter().print( js.toString() );
    }//f6

@ModelAttribute注解:Controller中预先执行的方法

代码演示:
会先执行pre1方法



    @Controller
    @RequestMapping("/sss")
    public class Second {
        
        @ModelAttribute
        public void pre1(){
            System.out.println("...pre1()....");
        }
        
        
        @RequestMapping("/aaa")
        public String s1(){
            System.out.println(this.getClass()+"日志1...");
            return "test2";
        }
    }

预处理-对象处理

@ModelAttribute
在预处理方法中返回一个对象如Users,它可以是从数据库查到的或者通过参数接收创建的,它被放在了Model/ModelMap中
将方法的返回类型的首字母小写的字符串作为键存放
可以在另一个方法里通过Model,ModelMap来获取
代码演示:


    @ModelAttribute
    public Users pre1(){
        System.out.println("...pre1()....预处理,并放置对象在 Model/ModelMap");
        //可能是从数据查询出的 或者 通过参数接收创建的
        Users u = new Users("A001","瓷洗太后",40);
        return u;
    }
    
    
    @RequestMapping("/aaa")
    public String s1( Model md, ModelMap mdMap , ModelAndView mv){
        System.out.println(this.getClass()+"日志1..." + md.asMap().get("users"));
        System.out.println(this.getClass()+"日志2..." + mdMap.get("users"));
        System.out.println(this.getClass()+"日志3..." + mv.getModelMap().get("users"));
        return "test2";
    }

预处理-对象处理+key:@ModelAttribute("uvv")

这次注解中的字符串为键,不是返回值类型的小写了
数据仍然存放在Model/ModelMap中
代码演示:



    @ModelAttribute("uvv")
    public Users pre4(){
        System.out.println("...pre4()....预处理,并放置对象在 Model/ModelMap");
        //可能是从数据查询出的 或者 通过参数接收创建的
        Users u = new Users("A001","拿破轮",40);
        return u;
    }
    
    @RequestMapping("/aaa")
    public String s1( Model md, ModelMap mdMap , ModelAndView mv){
        System.out.println(this.getClass()+"日志1..." + md.asMap().get("uvv"));
        System.out.println(this.getClass()+"日志2..." + mdMap.get("uvv"));
        System.out.println(this.getClass()+"日志3..." + mv.getModelMap().get("uvv"));
        return "test2";
    }

预处理-对象处理+model

预处理方法的参数为(Model md)时,可以通过md.addAttribute("",u)来存到Model/ModelMap中
代码演示:



    @ModelAttribute
    public void pre5(Model md){
        System.out.println("...pre5()....预处理,并放置对象在 Model/ModelMap");
        //可能是从数据查询出的 或者 通过参数接收创建的
        Users u = new Users("A001","焊武帝",40);
        md.addAttribute("www", u);
    }
    
    @RequestMapping("/aaa")
    public String s1( Model md, ModelMap mdMap , ModelAndView mv){
        System.out.println(this.getClass()+"日志1..." + md.asMap().get("www"));
        System.out.println(this.getClass()+"日志2..." + mdMap.get("www"));
        System.out.println(this.getClass()+"日志3..." + mv.getModelMap().get("www"));
        return "test2";
    }

预处理--对象处理+形参@ModelAttribute

预处理方法中的参数md.addAttribute("xxx",u);
在获取时可以在另一个方法的参数里
(@ModelAttribute("xxx") Users t)
这样t就是预处理方法中所存的对象
代码演示:



    @ModelAttribute
    public void pre6(Model md){
        System.out.println("...pre6()....预处理,并放置对象在 Model/ModelMap");
        //可能是从数据查询出的 或者 通过参数接收创建的
        Users u = new Users("A001","糖太宗",40);
        md.addAttribute("xxx", u);
    }
    
    @RequestMapping("/aaa")
    public String s1(@ModelAttribute("xxx") Users t){
        System.out.println(this.getClass()+"日志1..." + t);
        System.out.println(this.getClass()+"日志2..." + t);
        return "test2";
    }

方法的参数为Model,ModelMap,ModeAndView,返回类型String时

保存一些数据,

    md.addAttribute("kkk", "qxs钱学森");
    mdMap.addAttribute("vvv", "ylp袁隆平");
    mv.addObject("xxx", "djx邓稼先");

转发到页面上时
在页面上{vvv}可以拿到对应的值${xxx}不可以
重定向到页面上时

    1.${kkk}
2.${vvv}
3.${xxx}
a.${param.kkk}
b.${param.vvv}
c.${param.xxx}

123为null,ab有值,c为null,null就是不显示
代码如下:




    @RequestMapping("/aaa")
    public String f1(Model md,ModelMap mdMap,ModelAndView mv){
        System.out.println(this.getClass()+"日志...Model/ModelMap/ModelAndView 转发");
    
        md.addAttribute("kkk", "qxs钱学森");
        mdMap.addAttribute("vvv", "ylp袁隆平");
        mv.addObject("xxx", "djx邓稼先");
        return "test2";
    }
    
    @RequestMapping("/bbb")
    public String f2(Model md,ModelMap mdMap,ModelAndView mv){
        System.out.println(this.getClass()+"日志...Model/ModelMap/ModelAndView 重定向");
    
        md.addAttribute("kkk", "qxs钱学森");
        mdMap.addAttribute("vvv", "ylp袁隆平");
        mv.addObject("xxx", "djx邓稼先");
        return "redirect:/test1.jsp";
    }

方法的参数为Model,ModelMap,ModeAndView,返回类型ModelAndView时

存值,返回mv,
mv.setViewName("test2")转发方式

    md.addAttribute("kkk", "qxs钱学森");
    mdMap.addAttribute("vvv", "ylp袁隆平");
    mv.addObject("xxx", "djx邓稼先");
    
    mv.setViewName("test2");
    return mv;

页面上

    1.${kkk}
2.${vvv}
3.${xxx}

1,2,3都可以取到对应的值

重定向到
mv.setViewName("redirect:/test1.jsp");

    md.addAttribute("kkk", "qxs钱学森");
    mdMap.addAttribute("vvv", "ylp袁隆平");
    mv.addObject("xxx", "djx邓稼先");
    
    mv.setViewName("redirect:/test1.jsp");
    return mv;  

test1.jsp页面

    1.${kkk}
2.${vvv}
3.${xxx}
a.${param.kkk}
b.${param.vvv}
c.${param.xxx}

1,2,3无值,abc有值
由此可见
保存时Model/ModelMap/ModelAndView集合中保存一份同时也会在request中也会自动保存一份
转发到下一个资源依然会从request.getAttibute中接收到
重定向时下一个资源需要从request.getParamter中接收
ModelAndView 需要设这方法的返回值也是ModelAndView 才可以访问 ModelAndView中的资源

你可能感兴趣的:(SpringMVC笔记(3)方法参数及处理ajax)