使用@Controller注解的处理器,其返回值常用四种类型:
ModelAndViewString返回自定义类型对象无返回值void 1.1、返回ModelAndView
前后端未分离开发时,返回ModelAndView,即模型+视图。
@RequestMapping("test01")
public ModelAndView test01(){
ModelAndView mv=new ModelAndView();
//相当于request.addAttribute("name","工作1");
mv.addObject("name","工作1");
//经过视图解析器InternalResourceViewResolver处理,将逻辑视图名称变为物理资源路径
mv.setViewName("/jsp/result");
return mv;
}
1.2、返回String
ModelAndView可以拆分两部分,Model和View,在SpringMVC中Model可以直接在参数中指定,然后返回值是逻辑视图名,视图解析器可以将逻辑视图名转换为物理视图地址。
通过内部视图资源解析器InternalResourceViewResolver将字符串与解析器中的prefix和suffix结合形成跳转的URI。
@RequestMapping("test02")
public String test02(HttpServletRequest request){
Job job=new Job();
job.setId(1);
job.setName("任务A");
job.setDescription("紧急且重要任务");
request.setAttribute("job",job);
request.getSession().setAttribute("job",job);
//经过视图解析器InternalResourceViewResolver处理,将逻辑视图名称变为物理资源路径
return "/jsp/result";
}
1.3、返回对象类型test02-------request作用域:----------${requestScope.job.id}----------${requestScope.job.name} ----------${requestScope.job.description}
test02-------session作用域:----------${sessionScope.job.id}----------${sessionScope.job.name} ----------${sessionScope.job.description}
当处理器返回Object对象类型,可以是Integer、String、Map、List,也可以是自定义对象类型。但是不论是什么类型都不是作为逻辑视图出现,而是直接作为数据返回展示的。一般前端发起Ajax时候都会直接使用返回对象的形式。
返回对象的时候,需要使用@RequestBody注解,将转换后的json数据放入到响应体中。
pom文件中添加两个依赖:
1.3.1、返回基础类型com.fasterxml.jackson.core jackson-core 2.11.2 com.fasterxml.jackson.core jackson-databind 2.11.2
@ResponseBody
@RequestMapping("test03-1")
public Integer test031(){
return 100;
}
@ResponseBody
@RequestMapping("test03-2")
public String test032(){
return "abc";
}
1.3.2、返回自定义对象类型
@ResponseBody
@RequestMapping("test03-3")
public Job test033(){
return new Job(1,"任务1","任务描述",new Date());
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
ajax请求自定义对象结果:
1.3.3、返回集合list
@ResponseBody
@RequestMapping("test03-4")
public List test034(){
List jobList=new ArrayList<>();
int i=10;
while (i>0){
jobList.add(new Job(i,"任务"+i,"任务描述"+i,new Date()));
i--;
}
return jobList;
}
1.3.4、返回Map集合ajax请求list对象结果:
@ResponseBody
@RequestMapping("test03-5")
public Map test035(){
Map map=new HashMap<>();
for(int i=0;i<10;i++){
map.put(String.valueOf(i),new Job(i,"任务"+i,"任务描述"+i,new Date()));
}
return map;
}
1.4、无返回值voidajax请求map对象结果:
方法的返回值为void并不一定没有返回值,可以通过其他方式返回给前端。这种方式也为servlet中的处理方案。
@RequestMapping("test04-1")
public void test041(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("直接使用HttpServletRequest进行服务端转发");
request.getRequestDispatcher("/ok.jsp").forward(request,response);
}
@RequestMapping("test04-2")
public void test042(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("直接使用HttpServletResponse进行重定向");
response.sendRedirect("/ok.jsp");
}
@RequestMapping("test04-3")
public void test043(HttpServletResponse response) throws IOException {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter pw= response.getWriter();
pw.write("112233");
pw.flush();
pw.close();
}
@RequestMapping("test04-4")
public void test044(HttpServletResponse response) throws IOException {
response.setStatus(302);
response.setHeader("Location","/ok.jsp");
}
二、页面导航方式
页面导航分为两种:1、转发 2、重定向
SpringMVC有两种方式实现页面转发或重定向:
返回字符串使用ModelAndView
在SpingMVC进行页面导航时使用不同前缀指定转发还是重定向
转发: forward:url 默认重定向: redirect:url 2.1、转发
@Controller
@RequestMapping("nav")
public class NavigationController {
@RequestMapping("test01-1")
public String test011(HttpServletRequest request){
request.setAttribute("name","come on");
// return "ok"; //默认:由视图解析器处理后将逻辑视图转换为物理资源路径
return "forward:/ok.jsp"; //添加了forward之后,视图解析器前后缀就失效了,必须自己编写绝对路径
}
@RequestMapping("test01-2")
public ModelAndView test012(){
ModelAndView mv=new ModelAndView();
mv.addObject("name","go go go");
// mv.setViewName("ok"); //默认:由视图解析器处理后将逻辑视图转换为物理资源路径
mv.setViewName("forward:/ok.jsp"); //添加了forward之后,视图解析器前后缀就失效了,必须自己编写绝对路径
return mv;
}
}
2.2、重定向
@RequestMapping("test02-1")
public String test021(HttpServletRequest request){
request.setAttribute("name","come on"); //页面上无法获取到request作用域上的值,请求中断了
return "redirect:/ok.jsp"; //添加了redirect之后,视图解析器前后缀就失效了,必须自己编写绝对路径
}
@RequestMapping("test02-2")
public ModelAndView test022(){
ModelAndView mv=new ModelAndView();
mv.addObject("name","go go go"); //存储在request作用域中的值以参数形式添加在url上
mv.setViewName("redirect:/ok.jsp"); //添加了redirect之后,视图解析器前后缀就失效了,必须自己编写绝对路径
return mv;
}
2.3、重定向或转发到控制器
@RequestMapping("test03-1")
public ModelAndView test031(){
System.out.println("test03-1转发到控制器");
ModelAndView mv=new ModelAndView();
mv.addObject("name","哈哈哈");
mv.setViewName("forward:/nav/test01-1");
return mv;
}
@RequestMapping("test03-2")
public ModelAndView test032(){
System.out.println("test03-2重定向到控制器");
ModelAndView mv=new ModelAndView();
mv.addObject("name","哈哈哈");
mv.setViewName("redirect:/nav/test01-1");
return mv;
}



