Spring MVC 使用介绍(五)—— 注解式控制器(一):基本介绍

时间:2021-08-12 22:35:10

一、hello world

相对于基于Controller接口的方式,基于注解方式的配置步骤如下

  1. HandlerMapping 与HandlerAdapter 分别配置为RequestMappingHandlerMapping、RequestMappingHandlerAdapter(或者添加配置:<mvc:annotation-driven />,详见:<mvc:annotation-driven/>的作用
  2. 定义Controller类,添加注解@Controller
  3. 实例化为bean(xml中显示配置为bean,或添加配置:<context:component-scan />)

控制器

@Controller
//@RequestMapping(value = "/matt")
public class TestController { @RequestMapping(value = "/hello")
public ModelAndView helloWorld() {
ModelAndView mv = new ModelAndView();
mv.addObject("message", "hello world");
mv.setViewName("hello");
return mv;
}
}

web.xml同上篇示例

spring-mvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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-4.2.xsd"> <!-- HandlerMapping -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean> <!-- HandlerAdapter -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/> <!-- ViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean> <bean class="cn.matt.controller.TestController"/>
</beans>

hello.jsp

<%@ page language="java" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
${message}
</body>
</html>

启动后,访问http://localhost:8080/myweb/hello

二、处理器映射:@RequestMapping

@RequestMapping可使用在方法和类上

  • 方法:表示处理器映射,如上例
  • 类:表示窄化请求映射,如上例控制器类上添加@RequestMapping(value = "/matt"),访问路径变为:http://localhost:8080/myweb/matt/hello

三、处理器返回值类型

处理器返回值类型可以为以下几种:

  1. ModelAndView:通过该对象,可分别对Model及View进行设置
  2. String:返回视图名,或对页面进行转发和重定向,可通过处理方法的Model参数添加数据
    • "视图名":即表示视图,真实的访问路径为:“前缀”+"视图名"+“后缀”
    • “redirect:path”:重定向,和response.sendRedirect()类似,但不同的是
      • "/"表示当前上下文,而非全局上下文,与请求转发相同
      • 在url中会添加当前Model的设置的key-value值
    • "forward:path":请求转发,与request.getRequestDispatcher(..).forward(..)相同
  3. void:通过HttpServletRequest、HttpServletResponse进行请求的转发、重定向,或结果的直接输出

测试示例

@Controller
public class TestController3 {
// 1、ModelAndView
@RequestMapping(value = "/return1")
public ModelAndView testReturnValue1() {
ModelAndView mv = new ModelAndView();
mv.addObject("message", "hello world");
mv.setViewName("hello");
return mv;
} // 2、String: 视图名
@RequestMapping(value = "/return2")
public String testReturnValue2(Model model) {
model.addAttribute("message", "yeah!!");
return "hello";
} // 2、String: 重定向
@RequestMapping(value = "/return3")
public String testReturnValue3(Model model) {
model.addAttribute("name", "matt");
model.addAttribute("message", "oh my god");
return "redirect:/return2";
} // 2、String: 请求转发
@RequestMapping(value = "/return4")
public String testReturnValue4(Model model) {
model.addAttribute("name", "matt");
model.addAttribute("message", "oh my god");
return "forward:/return2";
} // 3、void
@RequestMapping(value = "/return5")
public void testReturnValue5(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 页面转发
// request.getRequestDispatcher("/return2").forward(request, response); // 页面重定向
// response.sendRedirect("/myweb/return2"); // response直接输出结果
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json串");
} @RequestMapping("/model1")
public String testModel1(@ModelAttribute("user") UserInfo userInfo) {
return "hello";
}
}

hello.jsp

<%@ page language="java" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
${message} ${name}
</body>
</html>

测试结果

输入:http://localhost:8080/myweb/return1
输出:hello world 输入:http://localhost:8080/myweb/return2
输出:yeah!! 输入:http://localhost:8080/myweb/return3
重定向到:http://localhost:8080/myweb/return2?name=matt&message=oh+my+god
输出:yeah!! 输入:http://localhost:8080/myweb/return4
输出:yeah!! matt 输入:http://localhost:8080/myweb/return5
输出:json串

关于web中相对路径的使用,详细说明可参考javaweb学习总结(八)——HttpServletResponse对象(二) 第三小节

四、JSON输出:@ResponseBody与@RestController

1、@ResponseBody基本使用

@ResponseBody用于将方法返回的对象输出为JSON数据,除在方法上添加该注解外,还需要:

  i)添加转化器配置(对象 -> JSON)

  ii)添加Jackson依赖

使用示例如下:

控制器

@Controller
//@ResponseBody
public class TestController {
@RequestMapping(value = "/hello")
@ResponseBody
public Map<String, Object> helloWorld() { Map<String, Object> map = new HashMap<String, Object>();
map.put("name", "matt");
map.put("age", 29);
return map;
} @RequestMapping(value = "/hello2")
@ResponseBody
public String helloWorld2() { return "选择比努力更重要!";
}
}

web.xml与上例相同

除HandlerAdapter,spring-mvc.xml的其他配置与上例相同

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
</list>
</property>
</bean>

添加依赖

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.4.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.4.3</version>
</dependency>

启动后,访问http://localhost:8080/myweb/hello,输出:{"age":29,"name":"matt"}

补充:当使用配置<mvc:annotation-driven />时,转化器的配置方式如下:

<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>

关于json转化器的详细介绍和中文乱码问题,可参考Spring Mvc @ResponseBody String返回中文字符串乱码

2、@ResponseBody的其他用法

@ResponseBody可作用于方法和类:

  • 方法:单个方法输出JSON数据,如上例
  • 类:类的所有映射方法均输出JSON数据

当@ResponseBody作用于类时,@Controller和@ResponseBody可合写为@RestController

参考:

第六章 注解式控制器详解——跟着开涛学SpringMVC

<mvc:annotation-driven/>的作用

@responseBody注解的使用

@Controller和@RestController的区别

Spring Mvc @ResponseBody String返回中文字符串乱码

javaweb学习总结(八)——HttpServletResponse对象(二)

springMVC中controller的几种返回类型

Spring MVC 使用介绍(五)—— 注解式控制器(一):基本介绍的更多相关文章

  1. Spring MVC (二)注解式开发使用详解

    MVC注解式开发即处理器基于注解的类开发, 对于每一个定义的处理器, 无需在xml中注册. 只需在代码中通过对类与方法的注解, 即可完成注册. 定义处理器 @Controller: 当前类为处理器 @ ...

  2. Spring MVC 使用介绍(六)—— 注解式控制器(二):请求映射与参数绑定

    一.概述 注解式控制器支持: 请求的映射和限定 参数的自动绑定 参数的注解绑定 二.请求的映射和限定 http请求信息包含六部分信息: ①请求方法: ②URL: ③协议及版本: ④请求头信息(包括Co ...

  3. spring&lpar;6&rpar;--注解式控制器

    6.1.注解式控制器简介 一.Spring2.5之前,我们都是通过实现Controller接口或其实现来定义我们的处理器类.已经@Deprecated.   二.Spring2.5引入注解式处理器支持 ...

  4. spring&lpar;7&rpar;--注解式控制器的数据验证、类型转换及格式化

    7.1.简介 在编写可视化界面项目时,我们通常需要对数据进行类型转换.验证及格式化. 一.在Spring3之前,我们使用如下架构进行类型转换.验证及格式化: 流程: ①:类型转换:首先调用Proper ...

  5. SpringMVC强大的数据绑定(2)——第六章 注解式控制器详解

    SpringMVC强大的数据绑定(2)——第六章 注解式控制器详解 博客分类: 跟开涛学SpringMVC   6.6.2.@RequestParam绑定单个请求参数值 @RequestParam用于 ...

  6. 03springMVC注解式控制器开发

    注解式控制器开发简介 注解式控制器开发HelloWorld HelloWorld的运行流程 处理器定义 REST简介 URL路径映射 数据绑定 不同的Model有相同的属性的处理 静态资源的处理 1  ...

  7. J2EE进阶&lpar;十三&rpar;Spring MVC常用的那些注解

    Spring MVC常用的那些注解 前言 Spring从2.5版本开始在编程中引入注解,用户可以使用@RequestMapping, @RequestParam,@ModelAttribute等等这样 ...

  8. 2017&period;3&period;31 spring mvc教程(五)Action的单元测试

    学习的博客:http://elf8848.iteye.com/blog/875830/ 我项目中所用的版本:4.2.0.博客的时间比较早,11年的,学习的是Spring3 MVC.不知道版本上有没有变 ...

  9. Hibernate Validation,Spring mvc 数据验证框架注解

    1.@NotNull:不能为 Null,但是可以为Empty:用在基本数据类型上. @NotNull(message="{state.notnull.valid}", groups ...

随机推荐

  1. padding&sol;border与width的关系

    本文讲述 padding / border 的设置后是否对 width 有影响,width 等于 auto 与 100% 的区别 CSS 框模型 (Box Model) 规定了元素框处理元素内容.内边 ...

  2. linux问题

    make:进入目录'/opt/FriendlyARM/tiny4412/05android/android-4.1.2'target Dex: framework trouble writing ou ...

  3. CSS居中的实现用法实例

    转载的一篇文章,讲解css内容居中的. 网上有关css 居中的文章不胜枚举,不过大多没有做系统的总结.这里分享的这篇有关css居中的文章,个人感觉不错,值得收藏. 一.水平居中1,将元素水平居中(us ...

  4. 关于JQuery 中&dollar;&period;ajax函数利用jsonp实现Ajax跨域请求ASP&period;NET的WebService成功获取数据的案例

    部署环境:Window 7 SP1+IIS7 成功方案: 其成功解决问题的几个重要因素如下: 1.       由于WebService默认不支持Get请求,所以要在Web.config配置文件内的& ...

  5. java&period;net&period;UnknownHostException 异常处理

    修改hosts文件: 1.把机器名和ip写在下面 2.hosts文件生效   soure /etc/hosts

  6. jQeury 批量删除

    /*批量删除*/ function datadel(){ var ids = new Array(); $("input[name='batch']:checked").each( ...

  7. 通俗易懂之Tensorflow summary类 &amp&semi; 初识tensorboard

    前面学习的cifar10项目虽小,但却五脏俱全.全面理解该项目非常有利于进一步的学习和提高,也是走向更大型项目的必由之路.因此,summary依然要从cifar10项目说起,通俗易懂的理解并运用sum ...

  8. &quot&semi;UX&quot&semi;将会是下一个Buzzword&quest;

    “用户体验非常重要”.“没有用户体验就没有产品”.“UX就是一切”.不知道从何时开始,用户体验(UX) 这个名词已经变得如此多见了,但是人们真正的认识.认清了什么是用户体验了吗?设计师们常挂在嘴边的用 ...

  9. mongodb的增删改查

    show dbs 显示所有有数据的数据库 use dbname:如use ela; 如果指定的数据库不存在,就会创建,否则就会切到该数据库上. db 显示当前数据库 db.dropDatabase() ...

  10. C&num; 7 新特性-1

    来源https://www.kenneth-truyers.net/2016/01/20/new-features-in-c-sharp-7/ Tuples What Tuples是数据的临时分组.区 ...