1、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>
对应的controller类
package com.gt.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//只要实现了Controller接口的类,说明这就是一个控制器了
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;
}
}
1.1、ServletAPI
通过设置ServletAPI , 不需要视图解析器
- 通过HttpServletResponse进行输出
- 通过HttpServletResponse实现重定向
- 通过HttpServletResponse实现转发
(1)创建一个ModelTest1
(2)对ModelTest1进行配置
package com.gt.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@Controller
public class ModelTest1 {
@RequestMapping("/m1/t1")
public String test1(HttpServletRequest request, HttpServletResponse response) {
HttpSession session = request.getSession();
System.out.println(session.getId());
return "test";
}
}
(3)运行,拿到了sessionid
1.2、通过SpringMVC来实现转发和重定向 - 无需视图解析器
- 如果有视图解析器的话,转发就直接在return写上核心位置,如果没有就需要完整的路径。
- 重定向的话就直接redirect:/index.jsp,他会自动拼接调整,但是如果变成redirect1:/index.jsp则就会报错
(1)先要在springmvc-servlet中注解掉视图解析器
(2)返回/test.jsp
转发
package com.gt.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@Controller
public class ModelTest1 {
@RequestMapping("/m1/t1")
public String test1(Model model) {
model.addAttribute("msg", "ModelTest1");
//转发
return "forward:/WEB-INF/jsp/test.jsp";
}
}
输出结果:
重定向:
package com.gt.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@Controller
public class ModelTest1 {
@RequestMapping("/m1/t2")
public String test2(Model model) {
model.addAttribute("msg", "ModelTest1");
//重定向
return "redirect:/index.jsp";
}
}
输出结果:
1.3、通过SpringMVC来实现转发和重定向 - 有视图解析器
- 重定向 , 不需要视图解析器 , 本质就是重新请求一个新地方嘛 , 所以注意路径问题.
- 可以重定向到另外一个请求实现
(1)打开视图解析器
(2)运行代码在ModelTest1中
@RequestMapping("/m1/t1")
public String test1(Model model) {
model.addAttribute("msg", "ModelTest1");
//转发
return "forward:/WEB-INF/jsp/test.jsp";
}
@RequestMapping("/m1/t2")
public String test2(Model model) {
model.addAttribute("msg", "ModelTest1");
//重定向
return "redirect:/index.jsp";
}
2、数据处理
2.1、处理提交数据
1、提交的域名称和处理方法的参数名一致
提交数据 : http://localhost:8080/hello?name=shanmu
处理方法 :
@Controller
@RequestMapping("/u1")
public class UserController {
// http://localhost:8080/u1/t1?name=zyy
@GetMapping("/t1")
public String add(String name, Model model) {
//1. 获取前端传的入参
System.out.println("前端传的入参:" + name);
//2. 将返回结果传输给前端 Model
model.addAttribute("msg", name);
//3. 视图跳转
return "test";
}
}
后台输出 : shanmu
2、提交的域名称和处理方法的参数名不一致(这种办法比较好@RequestParam("username"))
提交数据 : http://localhost:8080/hello?username=shanmu
处理方法 :
//@RequestParam("username") : username提交的域的名称 .
@GetMapping("/t2")