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包
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邓稼先");
转发到页面上时
在页面上{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中的资源
来源:CSDN
作者:土豆泥@
链接:https://blog.csdn.net/qq_43674416/article/details/104533816