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

浪尽此生 提交于 2020-02-27 16:26:43

SpringMVC的转发和重定向

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

<!-- 试图解析器  springMVC管理的jsp文件位置应该在 /WEB-INF/meto/  -->
<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/meto/"/>
    <property name="suffix" value=".jsp"/>
</bean>

当返回类型是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<Users> ulist = new ArrayList<Users>(); 
		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邓稼先");

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

	1.${kkk}<br/>
	2.${vvv}<br/>
	3.${xxx}<br/>
	a.${param.kkk}<br/>
	b.${param.vvv}<br/>
	c.${param.xxx}<br/>

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}<br/>
    2.${vvv}<br/>
    3.${xxx}<br/>

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}<br/>
	2.${vvv}<br/>
	3.${xxx}<br/>
	a.${param.kkk}<br/>
	b.${param.vvv}<br/>
	c.${param.xxx}<br/>

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!