SpringMVC中常用注解整理

SpringMVC

SpringMVC是springframework的后续产品,已经融合在Spring Web Flow里面。Spring框架提供了构建web应用的全功能MVC模块,使用spring可插入的MVC架构,从而使spring进行web开发。

通过策略接口,Spring 框架是高度可配置的,而且包含多种视图技术,例如 JavaServer Pages(JSP)技术、Velocity、Tiles、iText和POI。Spring MVC 框架并不知道使用的视图,所以不会强迫开发者只使用 JSP 技术。Spring MVC 分离了控制器、模型对象、过滤器以及处理程序对象的角色,这种分离让它们更容易进行定制

SpringMVC组件处理请求的流程图。
在这里插入图片描述
SpringMVC的三大组件:处理器映射器,处理器适配器,视图解析器。

DispatcherServlet:前端控制器。用户请求达到前端控制器,就相当于MVC模式中的C,它是整个流程控制的中心,由它调用其他组件处理用户的请求,DispatcherServlet的存在降低了组件之间的耦合度。

HandlerMapping: 处理器映射器 他负责而根据用户请求找到hanlder处理器,SpringMVC提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式。

常用注解

@RequsetMapping

@Target({
    
    ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mappingpublic 
@interface RequestMapping {
    
    
    String name() default ""; 
    @AliasFor("path")    
    String[] value() default {
    
    };
    @AliasFor("value")    
    String[] path() default {
    
    };
    RequestMethod[] method() default {
    
    };
    String[] params() default {
    
    };
    String[] headers() default {
    
    };
    String[] consumes() default {
    
    };
    String[] produces() default {
    
    };}

作用:用于建立请求URL和处理请求方法之间的对应关系.

@RequestMapping的属性:

  • value和path的作用一样,都是建立请求的URL,默认情况下就是value,也就是扫描属性不指定,直接写字符串就是value的值。
  • method:他指的是请求提交的方式,返回类型是一个RequestMethod[ ] 数组,这个其实就是一个枚举,里面是7中请求方式。默认情况下指定的是GET请求。
  • params:用于指定限制请求参数的条件,他支持简单的表达式,要求请求参数的key和value编写和配置的一模一样。
    例如:params = {“username”},那么就代表请求参数中必须有username这个属性。
    params={“username=zhangsan”},那么就代表请求参数必须是username,并且username的值必须是zhangsan .
    headers: 发送的请求中必须包含请求头。

@RequestParam

requestParam: 指定请求参数名,name 属性 和 value属性的含义一样.
如果,指定请求参数与方法中的参数不一样那么就会封装失败
例如:
在这里插入图片描述
不加@RequestParam

@RequestMapping("/testRequestParam")
public String testRequestParam(String username){
    
    
    System.out.println("执行了"+"username = "+username);
    return "success";
}

输出结果就是null
加上@RequestParam之后,就能输出传过来的参数

@RequestMapping("/testRequestParam")
public String testRequestParam(@RequestParam(name = "uname") String username){
    
    
    System.out.println("执行了"+"username = "+username);
    return "success";
}

输出结果: 执行了username = hello;

@RequestBody

RequestBody:用于获取请求体内容,使用得到的是key = value&key=value…的数据。get请求方式不适用。

属性:required:是否必须有请求体。默认值是true。当取值为true,get请求方式会报错,如果取值为false,get请求的是null;

<form action="/anno/testRequestBody" method="post">
    username: <input type="text" name="username">
    password: <input name="password" type="password">
    <input type="submit" value="登录">
</form>

加上@RequestBody注解

@RequestMapping("/testRequestBody")
public String testRequestBody(@RequestBody String body){
    
    
    System.out.println("执行了");
    System.out.println(body);
    return "success";
}

这时候的body就是一个键值对形式的字符串。
打印出来就是:
执行了
username=admin&password=admin

@PathVariable

PathVariable 作用:用于绑定URL中的占位符,
例如:请求URL中/delete/{id}; 这个id就是一个占位符,URL支持占位符是spring3.0之后加入的。是springMVC支持restFul风格的URL。

属性:value:用于指定URL中占位符名称。
required: 是否必须提供占位符。
使用:

<a href="/anno/testPathVariable/10">testPathVariable</a>
@RequestMapping("/testPathVariable/{sid}")
public String testPathVariable(@PathVariable(name = "sid") String id){
    
    
    System.out.println("执行了");
    System.out.println(id);
    return "success";
}

输出:执行了 10

@RequestHeader

RequestHeader:
作用; 用于获取请求头信息;
属性:value:提供消息头的名称,required:是否有这个消息头。 在实际开发中并不怎么常用。

例如:获取请求头中的Accept信息。

<a href="/anno/testRequestHeader">testRequestHeader</a>
@RequestMapping("/testRequestHeader")
public String testRequestHeader(@RequestHeader(value = "Accept") String header){
    
    
    System.out.println("执行了");
    System.out.println(header);
    return "success";
}

在这里插入图片描述
输出结果
执行了
text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8

@CookieValue

CookieValue注解:获取cookie的属性值。

例如:获取cookie中的JSESSIONID

<a href="/anno/testCookieValue">testCookieValue</a>
@RequestMapping("/testCookieValue")
public String testCookieValue(@CookieValue(value = "JSESSIONID") String cookieValue){
    
    
    System.out.println("JSESSIONID:  "+cookieValue);
    return "success";
}

输出JSESSIONID:
JSESSIONID: B44B3879FC61179FDDAFE3D09FEEB6AE

@ModelAttribute

  • 作用:该注解是SpringMVC4.3版本以后新加入的,它可以用于修饰方法和参数。
    如果放在方法上,表示当前方法会在控制器的方法执行之前先执行,它可以修饰没有返回值的方法,也可以修饰具有返回值的方法。
    如果出现在参数上,获取指定的数据给参数赋值。

  • 属性:value:用于获取数据的key 。key可以是pojo的属性名称,也可以是map结构的key.

  • 应用场景:当提交表单时,如果一个POJO的属性包含表单中的属性,但还有多余的没有在表单中,这个时候为了得到完整的对象,可以在方法前配置@ModelAttribute注解,代表提交表单后(或者发起请求后)会首先执行该方法,然后我们可以在该方法中将这个对象中的属性完整的封装到新的对象中去,然后返回这个对象

@RequestMapping("/testModelAttribute")
public String testModelAttribute(User user){
    
    
    System.out.println("testModelAttribute execute ....");
    System.out.println("user = "+user);
    return "success";
}

@ModelAttribute
public User showUser(){
    
    
    User user = new User();
    user.setDate(new Date());
    System.out.println("user ....");
    return user;
}

输出:
user …
testModelAttribute execute …
user = User{username=‘jerry’, password=‘abc’, date=Tue Dec 10 16:44:34 CST 2019}

@SessionAttributes

@SessionAttributes 只能作用在类上,作用是将指定的Model中的键值对 添加至session中,方便在下一次请求中使用。

@SessionAttributes(value = {
    
    "username"})//等于说将username="张三" //这个在request域中的属性添加到session域中。
@Controller
@RequestMapping("/anno")
public class AnnoController {
    
    

    @ModelAttribute
    public void showUser( Map<String,User> map){
    
    
        User user = new User();
        user.setDate(new Date());
        map.put("abc",user);
        System.out.println("show user ....");
    }
    /**
     * 在request域中设置数据,如果使用HttpServletRequest设置属性,
     * 代码耦合度会更高
     * @param modelMap
     * @return
     */
    @RequestMapping("/testSessionAttributes")
    public String testSessionAttributes(ModelMap modelMap){
    
    
        //底层会存储到request域中
        modelMap.addAttribute("username","张三");
        System.out.println("set requestAttribute...");
        return "success";
    }

    /**
     * 从session域中取数据
     * @param modelMap
     * @return
     */
    @RequestMapping("/getSessionAttributes")
    public String getSessionAttributes(ModelMap modelMap){
    
    
        //从session中获取对象的属性
        String username = (String) modelMap.get("username");
        System.out.println("get requestAttribute...");
        System.out.println("username = "+username);
        return "success";
    }

    /**
     * 从session域中删除数据
     */
    @RequestMapping(value = "/delSessionAttribute")
    public String delSessionAttribute(SessionStatus status){
    
    
        System.out.println("清除session域中所有数据....");
        status.setComplete();
        return "success";
    }
}
<h2><a href="/anno/testSessionAttributes">testSessionAttributes</a></h2><br>
<h2><a href="/anno/getSessionAttributes">getSessionAttributes</a></h2>
<h2><a href="/anno/delSessionAttribute">清除session</a></h2>

需要注意的是,此时清除的只是该Controller通过@SessionAttribute添加至session的数据(当然,如果不同controller的@SessionAttribute拥有相同的值,则也会清除)

Guess you like

Origin blog.csdn.net/qq_43672652/article/details/113808422