1.1 响应方式介绍
页面跳转
- 返回字符串逻辑视图。
- void原始ServletAPI。
- ModelAndView。
返回数据
- 直接返回字符串数据。
- 将对象或集合转为json返回。
1.2 返回字符串视图
直接返回字符串:此种方式会将返回的字符串与视图解析器的前后缀拼接后跳转到指定页面
@RequestMapping("/m1")
public String test() {
return "success";
}
1.3 原始ServletAPI
通过request、response对象实现响应。通过设置ServletAPI , 不需要视图解析器 。
@RequestMapping("/m1")
public void test1(HttpServletRequest request, HttpServletResponse response)
throws Exception {
// 1.通过response直接响应数据
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("慕课网");
----------------------------------------
request.setAttribute("username", "imooc");
// 2.通过request实现转发
request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
// 3.通过response实现重定向
response.sendRedirect(request.getContextPath() + "/index.jsp");
}
1.4 转发和重定向
请求转发forward
使用返回字符串逻辑视图实现页面的跳转,这种方式其实就是请求转发。如果用了forward:则路径必须写成实际视图url,不能写逻辑视图。
request.getRequestDispatcher("url").forward(request,response)
使用请求转发,既可以转发到jsp,也可以转发到其他的控制器方法。
@RequestMapping("/m1")
public String test1(Model model) {
model.addAttribute("username", "guardwhy");
return "forward:/WEB-INF/pages/success.jsp";
}
Redirect重定向
SpringMVC框架会自动拼接,并且将Model中的数据拼接到url地址上。
@RequestMapping("/redirect")
public String test2(Model model) {
model.addAttribute("username", "guardwhy");
return "redirect:/index1.jsp";
}
1.5 ModelAndView
方式一
在Controller中方法创建并返回model对象,并且设置视图名称。
@RequestMapping("/m1")
public String test1() {
/*
Model:模型 作用封装数据
View:视图 作用展示数据
*/
ModelAndView model = new ModelAndView();
//设置模型数据
model.addObject("username", "guardwhy");
//设置视图名称
model.setViewName("success");
return model;
}
方式二
在Controller中方法形参上直接声明model对象,无需在方法中自己创建,在方法中直接使用该对象设置视图,同样可以跳转页面。
@RequestMapping("/m2")
public String test2(Model model) {
/*
Model:模型 作用封装数据
View:视图 作用展示数据
*/
//设置模型数据
model.addObject("username", "guardwhy");
//设置视图名称
model.setViewName("success");
return model;
}
1.6 跳转结果方式
实现Controller接口
设置ModelAndView对象 , 根据view的名称 , 和视图解析器跳到指定的页面 。
页面 : {视图解析器前缀} + viewName +{视图解析器后缀}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--1.自动扫描包,让指定包下的注解生效,由IOC容器统一管理-->
<context:component-scan base-package="cn.guardwhy.controller"/>
<!--2.让Spring MVC处理静态资源-->
<mvc:default-servlet-handler/>
<!--4.支持mvc注解驱动-->
<mvc:annotation-driven/>
<!--4.视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
控制器controller
package cn.guardwhy.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 TestController1 implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) throws Exception {
// 1.返回一个模型视图对象
ModelAndView mv = new ModelAndView();
// 2.封装对象,放在ModelAndView中。
mv.addObject("msg", "TestController1");
// 3. 封装跳转的视图
mv.setViewName("test");
return mv;
}
}
SpringMVC
通过SpringMVC来实现转发和重定向 - 有视图解析器,重定向 , 不需要视图解析器 。
本质就是重新请求一个新地方嘛 , 所以注意路径问题,可以重定向到另外一个请求实现 。
package cn.guardwhy.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* 转发和重定向
*/
@Controller
public class ResultController02 {
@RequestMapping(value = "m1/t1")
public String test1(Model model){
// 转发方式
model.addAttribute("{msg}", "ModelTest1");
return "success";
}
@RequestMapping(value = "m1/t2")
public String test2(Model model){
// 转发方式
model.addAttribute("{msg}", "ModelTest1");
return "redirect:/index2.jsp";
}
}