这个内容主要讲的是使用SpringMVC下@Controller注解的处理器方法,其中讲解的是其返回的方法。
接下来正片开始!
文章目录
- 1、准备工作
- 2、返回ModelAndView
- 3、返回String类型
- 4、返回对象类型
- 4.1 返回基本对象类型
- 4.2 返回自定义对象
- 5、无返回值void
- 总结
@Controller注解是springmvc的模式结构之一,springmvc处理controller层下的java文件有其中以下的返回值:
- ModelAndView
- String
- 返回自定义对象
- 无返回值void
当然,我们要根据控制器中业务逻辑编写的需要来确定选择何种返回值。
接下来通过实际例子来操作处理器的返回。
1、准备工作
1、创建好controller包下的控制器
package com.jpg.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("result")
public class ResultController {
}
2、在jsp文件下面添加result.jsp文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>result</title>
</head>
<body>
<h1>result------${teamName}</h1>
<h3>test02---request作用域获取:---${requestScope.team.teamName}--
-${requestScope.team.teamId}---${requestScope.team.location}</h3>
<h3>test02---session作用域获取:---${sessionScope.team.teamName}--
-${sessionScope.team.teamId}---${sessionScope.team.location}</h3>
</body>
</html>
以上就是进行返回值处理的前期准备内容。
2、返回ModelAndView
返回前如果是前后端不分的开发,大部分情况下我们返回的是 ModelAndView,即数据模型+视图的格式。
1、首先添加方法
@RequestMapping("test01")
public ModelAndView test01(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("teamname","湖人队");
modelAndView.setViewName("result");
return modelAndView;
}
在这里,我们放上来数据,然后在ModelAndView指定视图的名称。
当处理器方法处理完毕后便跳转到其他资源的同时,就需要传递数据,这种情况下选择返回 ModelAndView 比较好。但是如果只是需要传递数据或者跳转之一,这个时候ModelAndView 就不是最优选择。
2、此时进行编译,打开Java Web
3、返回String类型
上一种方式中的 ModelAndView 可以拆分为两部分,即——Model 和 View。在 SpringMVC 中,Model 我们可以直接在参数中指定,然后返回值是逻辑视图名,视图解析器解析可以将逻辑视图名称转换为物理视图地址。按如下所示:
1、配置自己的视图解析器
<!--视图解析器-->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
视图解析器通过内部资源视图解析器InternalResourceViewResolver
将字符串与解析器中的prefix和 suffix结合形成要跳转的额URI。
2、添加方法
//2、返回字符串
@RequestMapping("test02")
public String test02(HttpServletRequest request){
Team team=new Team();
team.setLocation("迈阿密");
team.setTeamId(1002);
team.setTeamName("热火");
//携带数据
request.setAttribute("team",team);
request.getSession().setAttribute("team",team);
//资源的跳转
return "result";// 经过视图解析器InternalResourceViewResolver的处理,将逻辑视图名称加上前后缀变为物理资源路径 /jsp/result.jsp
}
3、编译运行
4、返回对象类型
4.1 返回基本对象类型
当处理器方法返回Object对象类型的时候,可以是Integer、String、Map、List,也可以是自定义的对象类型。但是无论是什么类型,都不是作为逻辑视图出现,而是直接作为数据返回然后展示的。一般前端发起Ajax请求的时候都会使用直接返回对象的形式。
这个时候需要做以下的动作:
pom.xml文件中添加两个依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
1、编写测试代码
@ResponseBody
@RequestMapping("test03-1")
public Integer test031(){
return 666;
}
@ResponseBody
@RequestMapping("test03-2")
public String test032(){
return "test";
}
4.2 返回自定义对象
1、编写新的方法
@ResponseBody
@RequestMapping("test03-3")
public Team test033(){
Team team=new Team();
team.setLocation("迈阿密");
team.setTeamId(1002);
team.setTeamName("热火");
return team;
}
5、无返回值void
方法的返回值为 void,并不一定真的没有返回值,我们可以通过其他方式给前端返回。实际上,这种方式也可以理解为 Servlet 中的的处理方案。
//通过 HttpServletRequest 做服务端跳转
@RequestMapping("test04-1")
public void test041(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
System.out.println("直接使用HttpServletRequest进行服务器端的转发");
request.getRequestDispatcher("/jsp/ok.jsp").forward(request,response);
}
//通过 HttpServletResponse 做重定向
@RequestMapping("test04-2")
public void test042(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
System.out.println("直接使用HttpServletResponse重定向跳转");
response.sendRedirect("/jsp/ok.jsp");
}
//通过 HttpServletResponse 给出响应
@RequestMapping("test04-3")
public void test043(HttpServletResponse response) throws ServletException,
IOException {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter writer = response.getWriter();
writer.write("返回void类型测试---直接返回字符串");
writer.flush();
writer.close();
}
//也可以自己手动指定响应头去实现重定向:
@RequestMapping("test04-4")
public void test044(HttpServletResponse response) throws ServletException,
IOException {
response.setStatus(302);//设置响应码,302表示重定向
response.setHeader("Location","/jsp/ok.jsp");
}
总结
以上就是我对页面返回的理解,部分可能没有涉及完全希望大家多多批评指正。