目录
- 注解@Controller ,@RequestMapping,@ModelAttribute,@ResponseBody
- 注解形控制器 介绍
- 自动扫描Controller的HelloWorld
- URL路径映射(REST风格的URL)
- @ResponseBody使用
注解有哪些?
- @Controller:用于标识是处理器类;
- @RequestMapping:请求到处理器功能方法的映射规则;
- @RequestParam:请求参数到处理器功能处理方法的方法参数上的绑定;
- @ModelAttribute:请求参数到命令对象的绑定;
- @SessionAttributes:用于声明 session 级别存储的属性,放置在处理器类上,通常列出模型属性(如 @ModelAttribute)对应的名称,则这些属性会透明的保存到 session 中;
- @CookieValue:cookie 数据到处理器功能处理方法的方法参数上的绑定;
- @ResponseBody:处理器功能处理方法的返回值作为响应体(通过 HttpMessageConverter 进行类型转换);
- @PathVariable:请求 URI 中的模板变量部分到处理器功能处理方法的方法参数上的绑定,从而支持 RESTful 架构风 格的 URI;
注解形控制器
package com.ht.web;
...
@Controller // 1.将UserController变成一个Handler
@RequestMapping(“/user”) //2.指定控制器映射的URL,限定了只有 /user/** 能进来
public class UserController {
@RequestMapping(value = “/register”) //3.处理方法对应的URL,相对于 //2处的URL。只有/user/register能进来
public String register() {
return “user/register”; //4返回逻辑视图名
}
}
开发步骤
1.配置Spring-web.xml配置文件

<!--1,开启springmvc注解模式
a. 自动注册DefaultAnnotationHandlerMapping,AnnotationMethodHandlerAdapter
b. 默认提供一系列的功能:数据绑定,数字和日期的format@NumberFormat,@DateTimeFormat
c. xml,json的默认读写支持-->
<mvc:annotation-driven/>
<!--2.静态资源默认servlet配置-->
<!--
1).加入对静态资源处理:js,gif,png
2).允许使用 "/" 做整体映射
-->
<mvc:default-servlet-handler/>
<!--3:配置JSP 显示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>
<!--4:扫描web相关的controller控制器-->
<context:component-scan base-package="com.ht.web"/>
2.WEB-INF/JSP/hello.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hello World</title>
</head>
<body>
${message}
</body>
</html>
3.编写控制器 com.ht.web.HelloWorldController
package icom.ht.web.HelloWordController;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
/**
* Created by shkstart on 2019/9/24
*/
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping(value = "/hello") //请求URL到处理器功能处理方法的映射
public String helloWorld(ModelMap map) {
map.put("message","hello word!"); //把参数放置到 request中
return "hello"; //返回显示的视图
}
}
4.web.xml 配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 初始化配置参数 -->
<init-param>
<description>SpringMVC</description>
<param-name>contextConfigLocation</param-name>
<!--指定springmvc配置文件路径 -->
<param-value>classpath:spring/spring-web.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<!-- 拦截所有请求 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
5.运行项目
- 浏览器访问:http://localhost:8080/user/hello
- 查看页面输出 hello world
@Controller 注解介绍
- 被@Controller标记的类实际上就是个SpringMVC Controller对象,它是一个控制器类,而@Contoller注解在org.springframework.stereotype包下。其中被@RequestMapping标记的方法会被分发处理器扫描识别,将不同的请求分发到对应的接口上。
- <context:component-scan base-package="com.ht.web"/> 配置表示:自动扫描con.ht.web下带有@Controller注解的控制器类,免去了一个个注入的繁琐
@RequestMapping 注解介绍
- Spring MVC 使用@RequestMapping 注解控制器指定哪些URL请求
- 在控制器的类定义及方法定义处都可标注
-- 类定义处:提供初步的请求映射信息。相对于WEB 应用的根目录
-- 方法处:提供进一步的细分映射信息。相对于类定义处URL。若类定义处未标注
- @RequestMapping ,则方法处标记的URL相对于WEB 应用根目录
- DispatcherServlet 截获请求后,就通过控制器上@RequestMapping提供映射信息确定请求对应的处理方法
- value、method、params、heads 分别表示:请求URL、请求方法、请求参数、请求头(联合使用多个条件可以让请求映射更加精确化)
@RequestMapping 注解参数

Map、Model、ModelMap、ModelAndView
package icom.ht.web.HelloWordController;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
/**
* Created by shkstart on 2019/9/24
*/
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping(value = "/hello") //请求URL到处理器功能处理方法的映射
public String helloWorld(ModelMap map) {
map.put("message","hello word!"); //把参数放置到 request中
return "hello"; //返回显示的视图
}
/**
* 使用map,Model,ModelMap 向页面传值
* @param model org.springframework.ui.Model
* @param model2 java.util.Map
* @param model3 org.springframework.ui.ModelMap
* @return
*/
@RequestMapping(value = "/modelMap")
public ModelAndView modelMap(Model model, Map model2, ModelMap model3){
model.addAttribute("model","1");
model2.put("map","2");
model3.put("modelmap","3");
ModelAndView mv = new ModelAndView();
mv.addObject("ModelAndView","4");
mv.setViewName("modelMapTest");
return mv;
}
}
测试页
modelMapTest.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>测试map,Model,ModelMap</title>
</head>
<body>
model:${model}<br>
map:${map}<br>
modelmap:${modelmap}<br>
ModelAndView:${ModelAndView}<br>
</body>
</html>
Map、Model、ModelMap、ModelAndView 四者的区别
四者作用大同小异,主要都是用来将数据传输到视图层上,最大的区别是
- Model只是用来传输数据的,并不会进行业务的寻址。ModelAndView则可以进行业务寻址,即可以设置对应的要请求的静态文件(jsp等)。
- Model是每次请求可以自动创建的,而ModelAndView是需要自行new的。
SpringMVC参数绑定
- 从HttpServletRequest中获取参数
-
@RequestParam
- @PathVariable 绑定URI模板变量值
1.HttpServletRequest中获取参数
/**
* 从request中获取参数
* @param request
* @return
*/
@RequestMapping(value = "/basicData1")
public String basicData1(HttpServletRequest request,ModelMap map){
//获取request中的参数
String str = (String) request.getParameter("str");
System.out.println("---从request中获取参数--->>"+str);
map.put("message",str);
return "hello";
}
- 访问:localhost:8080/demo2/basicData1?str=ht
-
可以看到获取到了ht
2.@RequestParam 参数绑定
/**
* 使用RequestParam 注解绑定参数
* value:绑定参数名称,浏览器端 name 的名称
* required:客户端是否必须填写,如果为false,且有默认时,不传参不会报错
* 如果为true,且没有默认时,不传参会报400 Required String parameter 'username' is not present 的错
* defaultValue:默认值,如果未填写,则自动赋默认值
* @param name
* @return
*/
@RequestMapping(value = "/basicData2")
public String basicData2(@RequestParam(value = "username",required = false,defaultValue = "张三") String name,ModelMap map){
map.put("message",name);
System.out.println("------>>"+name);
return "hello";
}
- 访问: http://localhost:8080/demo2/basicData2 控制台输出:张三
- 访问: http://localhost:8080/demo2/basicData2?username=1 控制台输出:1
3.默认传参
/**
* 默认绑定方法:数据类型包括:Integer、Long、Byte、Double、Float、Short、String
*/
@RequestMapping(value = "/basicData3")
public String basicData3(String name,int age,Double height){
System.out.println("----姓名-->>"+name);
System.out.println("----年龄-->>"+age);
System.out.println("----身高-->>"+height);
return "hello";
}
- 访问: http://localhost:8080/basicData3?name=ht&age=20&height=172.5
-
可以看到后台输出
4.PathVariable
/**
* {×××}占位符, 请求的 URL 可以是 “/ basicData4 /123456” 或 “/ basicData4 /abcd”
* @param userId
* @param map
* @return
*/
@RequestMapping(value="/basicData4/{userId}")
public String basicData4(@PathVariable("userId")String userId, ModelMap map){
System.out.println("---绑定参数-->>"+userId);
map.put("message",userId);
return "hello";
}
- 带占位符的URL是Spring3.0 新增的功能,该功能在SpringMVC向REST目标挺近发展过程中具有里程碑的意义
-
通过@PathVariable 可以将URL中占位符参数绑定到控制器处理方法中:URL中{xxx} 占位符可以通过@PathVariable(“xxx”)绑定到操作方法入参中
5.普通的POJO对象绑定请求参数
/**
* POJO 对象数据的绑定
* @param role
* @return
*/
@RequestMapping(value="/basicData5")
public String basicData5(Role role){
System.out.println("-----角色名:"+role.getName());
System.out.println("-----用户名:"+role.getUser().getName());
return "hello";
}
public class Role{
private String id;
private String name; //角色名
private Integer userId; //所属用户
private User user;
//set,get方法
}
//用户实体类
public class User{
private Intrger age;
private String name;
//set,get方法
}
- Spring MVC 会按请求参数名和POJO属性名进行自动匹配,自动为该对象填充属性值。支持级联属性。
- 访问链接后看到

-
http://localhost:8080/demo2/basicData5?name=roleName&user.name=lwb
结束!
