一、在之前的servlet API的跳转
-
1、通过HttpServletResponse进行输出
response.getWriter().println(“Hello,Spring BY servlet API”); -
2、通过HttpServletResponse实现重定向
response.sendRedirect("/index.jsp"); -
3、通过HttpServletResponse实现转发
request.getRequestDispatcher("/WEB-INF/jsp/hello.jsp").forward(request,response);
二、SpringMVC的原理使用ModelAndView
设置ModelAndView对象 , 根据view的名称 , 和视图解析器跳到指定的页面 .
页面 : {视图解析器前缀} + viewName +{视图解析器后缀}
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
id="internalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<!-- 后缀 -->
<property name="suffix" value=".jsp" />
</bean>
12345678
public class ControllerTest1 implements Controller {
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//返回一个模型视图对象
ModelAndView mv = new ModelAndView();
mv.addObject("msg","ControllerTest1");
mv.setViewName("test");
return mv;
}
}
12345678910
三、SpringMVC注解使用跳转
1、没有设置视图解析器的情况下
具体应该 返回forward:/WEB-INF/jsp/hello.jsp
return 默认返回是转发,可以省略 forward:
package com.kai.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class RedirectController {
//1.没有视图解析器:
@RequestMapping("/forward")
public String forward(Model model){
model.addAttribute("msg","无视图解析器-转发");
return "/WEB-INF/jsp/hello.jsp";
}
}
1234567891011121314151617
2、设置了视图解析器的情况下
重定向 , 不需要视图解析器 , 本质就是重新请求一个新地方嘛 , 所以注意路径问题。所以有无视图解析器都用以下方式进行跳转。
//2.有视图解析器:
@RequestMapping("/forward2")
public String forward2(Model model){
model.addAttribute("msg","视图解析器-转发");
return "hello";
}
//3.重定向不会触发视图解析器
@RequestMapping("/redirect")
public String redirect(Model model){
//重定向会直接跳转到web/index.jsp
return "redirect:/index.jsp";
}
1234567891011121314
四、处理提交数据
1、第一种方式
访问地址为:http://localhost:8080/Mvc\_annotation/data1?username=kaikai
@RequestParam(“username”)注解就是解决:接收前端传来参数名和自己定义的参数名不一致的问题,username 就是前端传来的参数名。
一般开发过程中看到这个注解就能清楚的知道这个参数是前端传来的
package com.kai.controller;
import com.kai.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
//数据回显到前端
@Controller
public class DataController {
@GetMapping("/data1")
public String data1(@RequestParam("username")String name, Model model){
System.out.println(name);
model.addAttribute("msg",name);
return "hello";
}
}
12345678910111213141516171819
2、第二种方式
访问地址:http://localhost:8080/Mvc\_annotation/data2?id=1&name=kai&psw=kai
前端传来多个参数时候如 id,name,psw
如果这个请求方法中的参数是一个类(User),它会根据前端传来的参数名(id,name,psw)进行封装成这个类
User类中的属性就是 int id ,String name ,String psw;
@GetMapping("/data2")
public String data2(User user, Model model){
System.out.println(user);
model.addAttribute("msg",user);
return "hello";
}
123456
3、其他方式
还有两种方式ModelMap 和 ModelAndView :
-
Model 只有寥寥几个方法只适合用于储存数据,简化了新手对于Model对象的操作和理解;
-
ModelMap 继承了 LinkedMap ,除了实现了自身的一些方法,同样的继承 LinkedMap 的方法和特性;
-
ModelAndView 可以在储存数据的同时,可以进行设置返回的逻辑视图,进行控制展示层的跳转。
总结:
感谢大家阅读完本文章,也为大家准备了Java进阶的架构资料,需要的朋友可以关注微信公众号【Java程序员聚集地】获取架构资料。