SpringMVC注解

时间:2019-10-09
本文章向大家介绍SpringMVC注解,主要包括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


  结束!

原文地址:https://www.cnblogs.com/268lwc/p/11644220.html