响应返回值
在处理请求时,控制器的处理函数返回值类型可以决定其怎么响应该请求。
返回值为String类型
当返回值为string类型,会根据返回值,到视图解析器指定的路径寻找指定类型的文件显示出来。
控制器处理方法
@RequestMapping("/hello")
public String testJson() {
System.out.println("执行了");
return "success";
}
视图解析器配置
<!-- 配置视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
处理/hello
请求时就会向视图解析器指定的路径,classpath/WEB-INT/pages/
去找到success.jsp文件然后显示到浏览器。
返回值为void
如果返回值void,并且控制器处理请求方法不做任何转发和重定向,则默认会向视图解析器指定的路径寻找请求名称.类型名
文件。
@RequestMapping("/hello")
public void testJson() {
System.out.println("执行了");
}
如上,就会去找hello.jsp
文件,找不到会直接报404。
一般返回值为void类型时,都会在控制器处理方法中做转发和重定向。
下述代码包含三种方法
@RequestMapping("/testVoid")
public void testVoid(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
System.out.println("执行了");
// 第一种:编写请求转发程序
// httpServletRequest.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(httpServletRequest,httpServletResponse);
// 第二种:重定向
// httpServletResponse.sendRedirect(httpServletRequest.getContextPath()+"/index.jsp");
//设置中文乱码问题
httpServletResponse.setCharacterEncoding("UTF-8");
httpServletResponse.setContentType("text/html;charset=UTF-8");
// 第三种:直接会响应。直接打印出以下字符
httpServletResponse.getWriter().println("你好");
}
对HttpServletRequest和HttpServletResponse不了解的,可以看下这篇博客:HttpServletRequest与HttpServletResponse的实现类
返回值为ModelAndView
通过创建ModelAndView对象对数据进行封装,让后跳转到视图解析系指定路径的指定类型文件,以String为返回值类型的底层就是以ModelAndView来实现的。
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView() {
System.out.println("执行了");
User user = new User();
user.setName("美美");
user.setPassword("123");
user.setAge(18);
ModelAndView mv = new ModelAndView();
mv.addObject("user",user);
mv.setViewName("success");
return mv;
}
响应JSON数据
在jsp主页面发送json数据给服务器,控制器处理方法通过@RequestBody来将json数据封装成JavaBean类型,最后通过@ResponseBody将JavaBean类型再转换成json数据。
Springmvc 默认用 MappingJacksonHttpMessageConverter 对 json 数据进行转换,需要加入 jackson 的包。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.11.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.11.2</version>
</dependency>
首先导入jquery.js文件放在类路径下js文件夹中
注意:我们在创建前端控制器的时候是拦截所有请求,包括这些静态文件。
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
所以我们需要在springmvc的配置文件中设置过滤掉这些静态文件。
<!-- 设置静态资源不过滤 -->
<mvc:resources location="/js/" mapping="/js/**"/>
<mvc:resources location="/img/" mapping="/img/**"/>
<mvc:resources location="/css/" mapping="/css/**"/>
发送json数据
<button id="btn">按钮</button>
<script>
$(function () {
$("#btn").click(function () {
$.ajax({
url:"request/testJson",
contentType:"application/json;charset=UTF-8",
data:'{"name":"aa","password":100}',
dataType:"json",
type:"post",
success:function(data){
alert(data);
alert(data.name);
}
});
})
})
</script>
控制器处理方法
// ResponseBody 将JavaBean对象转换成JSON数据
@RequestMapping("/testJson")
public @ResponseBody User testJson(@RequestBody User user) {
System.out.println("执行了");
System.out.println("user:" + user);
return user;
}
成功封装成JavaBean类型
成功转换为json数据