SpringMVC注解
目录
- 注解@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
结束!