对SpringMVC中的以下几个常用注解进行简单的实验测试:

1、@RequestParam

2、@PathVariable

3、@RequestBody

4、@RequestHeader

5、@CookieValue

6、@ModelAttribute

7、@SessionAttributes

具体内容详见代码:

1、annotationTest.jsp页面代码如下:  

<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2019/12/6
Time: 11:02
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--@RequestParam注解的测试--%>
<a href="testRequestParam?uname=lisi">testRequestParam</a><br> <%--@PathVariable注解的测试,注意不是?键=值的形式传参了--%>
<a href="testPathVariable/wangwu">testPathVariable</a> <%--@RequestBody注解的测试,不能用在get请求中--%>
<form action="testRequestBody" method="post">
姓名:<input type="text" name="username"/><br>
年龄:<input type="text" name="age"/><br>
<input type="submit" value="提交"/>
</form> <%--@RequestHeader测试--%>
<a href="testRequestHeader">testRequestHeader</a><br> <%--@CookieValue测试--%>
<a href="testCookieValue">testCookieValue</a><br> <%--@ModelAttribute测试--%>
<form action="testModelAttribute" method="post">
姓名:<input type="text" name="name"/><br>
年龄:<input type="text" name="age"/><br>
<input type="submit" value="提交"/>
</form> <%--@SessionAttributes测试--%>
<a href="testSessionAttributes">testSessionAttributes</a><br>
<%--controller的方法中从session作用域取值--%>
<a href="getSessionAttributes">getSessionAttributes</a><br>
<%--测试controller的方法中清除session作用域中的内容--%>
<a href="deleteSessionAttributes">deleteSessionAttributes</a><br> </body>
</html>

2、AnnotationController代码如下:

package com.example.controller;

import com.example.bean.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.support.SessionStatus; import java.util.Date;
import java.util.Map; @Controller
/*该注解只能写在类上,@SessionAttributes(value={"msg"})只的是从request作用域中取msg的值存入session作用域中*/
@SessionAttributes(value={"msg"})
public class AnnotationController {
public static final String SUCCESS = "success";
@RequestMapping("/testRequestParam")
public String testRequestParam(@RequestParam("uname") String name){
System.out.println("执行了 testRequestParam...");
System.out.println(name);
return SUCCESS;
} //相当于路径中的值封装到username中,再用@PathVariable("username")取出值传给参数
@RequestMapping("/testPathVariable/{username}")
public String testPathVariable(@PathVariable("username") String name){
System.out.println("执行了 testPathVariable...");
System.out.println(name);
return SUCCESS;
} /*@RequestBody可以以字符串的形式接收页面中的表单的数据*/
@RequestMapping("/testRequestBody")
public String testRequestBody(@RequestBody String body){
System.out.println("执行了 testRequestBody...");
System.out.println(body);
return SUCCESS;
} /*@RequestHeader可用于获取请求头中的信息赋值给方法参数*/
@RequestMapping("/testRequestHeader")
public String testRequestHeader(@RequestHeader("accept") String accept){
System.out.println("执行了 testRequestHeader...");
System.out.println(accept);
return SUCCESS;
} /*@RequestHeader可用于获取cookie中的信息赋值给方法参数*/
@RequestMapping("/testCookieValue")
public String testCookieValue(@CookieValue("JSESSIONID") String jsessionid){
System.out.println("执行了 testCookieValue...");
System.out.println(jsessionid);
return SUCCESS;
} /*@ModelAttribute加在方法上,该方法会被先执行, 该注解注释的方法在所在controller的每个方法被调用之前都会被调用一次,所以要慎用*/
    /*@RequestMapping("/testModelAttribute")
public String testModelAttribute(User user){
System.out.println("执行了 testModelAttribute...");
System.out.println(user);
return SUCCESS;
}*/ /*该方法返回的User对象会被contrller中的参数接收,但是只接收页面没有传递的参数,
* 比如date,即使在该方法中改了name属性的值,但是也是以页面传递的name的值为准,
* 即由于页面给user对象传递了name属性,但是没有传递date属性,
* 所以该方法修改的name属性不会生效,只有date属性会生效*/
/*@ModelAttribute
public User getUser(User user){
user.setDate(new Date());
user.setName("haha");
System.out.println("执行了返回对象的getUser...");
return user;
}*/ /*多个@ModelAttribute方法都会执行,且该方法返回的date不会被封装进Controller的参数中*/
/*@ModelAttribute
public Date printAnother(User user){
System.out.println("执行了printAnother...");
Date date =new Date();
return date;
}*/ @RequestMapping("/testModelAttribute")
public String testModelAttribute(@ModelAttribute("abc") User user){
System.out.println("执行了 testModelAttribute...");
System.out.println(user);
return SUCCESS;
} /*没有返回值的@ModelAttribute修饰的方法
将对象封装到map中,在controller中通过 @ModelAttribute("abc")形式从map中取key是abc对应的user对象
该注解注释的方法在所在controller的每个方法被调用之前都会被调用一次,所以要慎用*/
@ModelAttribute
public void queryUser(Map<String,User> map){
System.out.println("执行了返回空值的测试");
User user = new User();
user.setName("哈哈");
user.setDate(new Date());
map.put("abc",user);
} /*存入Model对象中的值默认是会存入request作用域中的,可从request作用域中直接取值
* 配合类上注解的@SessionAttributes(value={"msg"})可将msg信息存入session作用域中*/
@RequestMapping("testSessionAttributes")
public String testSessionAttributes( Model model){
System.out.println("执行了testSessionAttributes");
model.addAttribute("msg","sessionAttributes测试");
return SUCCESS;
} /*通过方法从Session作用域中取值,Model中没有取值的get方法,可通过ModelMap取值*/
@RequestMapping("getSessionAttributes")
public String getSessionAttributes( ModelMap modelMap){
System.out.println("执行了getSessionAttributes");
String msg = (String)modelMap.get("msg");
System.out.println("session中取的值为:" + msg);
return SUCCESS;
} /*从session作用域中删除数据,删除后再从session作用域中取值就取不到了*/
@RequestMapping("deleteSessionAttributes")
public String deleteSessionAttributes(SessionStatus sessionStatus){
System.out.println("执行了deleteSessionAttributes");
sessionStatus.setComplete();
return SUCCESS;
}
}

3、success.jsp代码如下:

<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2019/12/4
Time: 14:07
To change this template use File | Settings | File Templates.
--%>
<%--为了使el表达式生效,需要在此写上isELIgnored="false"--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>入门成功</h3>
<%--如下两行仅用于测试@SessionAttributes注解时使用--%>
${ requestScope.get("msg") }<br>
${ sessionScope.get("msg") }
</body>
</html>

如有理解不到之处,望指正!

0024SpringMVC中几个常见注解的实验的更多相关文章

  1. English - 英文写作中的最常见“十大句式”

    英文写作中的最常见“十大句式” from 小木虫论坛 一.否定句 许多否定句不含not的否定结构.如果论文作者能正确使用他们,就会增加写作的闪光点,使文章显得生动活泼. 1.Instead of in ...

  2. Spring RestTemplate中几种常见的请求方式

    https://github.com/lenve/SimpleSpringCloud/tree/master/RestTemplate在Spring Cloud中服务的发现与消费一文中,当我们从服务消 ...

  3. SpringMVC Controller介绍及常见注解

    一.简介 在SpringMVC中,控制器Controller负责处理由DispatcherServlet分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model,然后再把该Model返 ...

  4. Spring RestTemplate中几种常见的请求方式GET请求 POST请求 PUT请求 DELETE请求

    Spring RestTemplate中几种常见的请求方式 原文地址: https://blog.csdn.net/u012702547/article/details/77917939   版权声明 ...

  5. 小记----------lombok插件idea的安装&常见注解解释及小案例

    Lombok安装插件 软件:idea 2018.3.6版本 1.打开settings

  6. JAVA中如何定义自定义注解

    了解注解 注解是Java1.5,JDK5.0引用的技术,与类,接口,枚举处于同一层次 .它可以声明在包.类.字段.方法.局部变量.方法参数等的前面,用来对这些元素进行说明,注释 . 在Java中,自带 ...

  7. Guava中Predicate的常见用法

    Guava中Predicate的常见用法 1.  Predicate基本用法 guava提供了许多利用Functions和Predicates来操作Collections的工具,一般在 Iterabl ...

  8. 今天在Mac机器上使用了Flex Builder编辑了一个源代码文件,保存后使用vim命令去打开时发现系统自动在每一行的结尾添加了^M符号,其实^M在Linux/Unix中是非常常见的,也就是我们在Win中见过的/r回车符号。由于编辑软件的编码问题,某些IDE的编辑器在编辑完文件之后会自动加上这个^M符号。看起来对我们的源代码没有任何影响,其实并不然,当我们把源代码文件Check In到svn之类

    今天在Mac机器上使用了Flex Builder编辑了一个源代码文件,保存后使用vim命令去打开时发现系统自动在每一行的结尾添加了^M符号,其实^M在Linux/Unix中是非常常见的,也就是我们在W ...

  9. 【转】Eclipse中设置ButterKnife进行注解式开发步骤 -- 不错

    原文网址:http://www.bubuko.com/infodetail-974262.html 最近在进行Android注解式开发的学习,正在尝试用ButterKnife.ButterKnife的 ...

随机推荐

  1. socket-01

     对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端

  2. SpringBoot系列教程web篇之Get请求参数解析姿势汇总

    一般在开发web应用的时候,如果提供http接口,最常见的http请求方式为GET/POST,我们知道这两种请求方式的一个显著区别是GET请求的参数在url中,而post请求可以不在url中:那么一个 ...

  3. Qt5 QtQuick系列----QtQuick的Secne Graph剖析(3)-- qml与OpenGl结合

    我读的书愈多,就愈亲近世界,愈明了生活的意义,愈觉得生活的重要. -- 高尔基 需要先看:https://blog.csdn.net/qq_35865125/article/details/86485 ...

  4. TCP协议的11种状态及其变化过程?传输的内容又是什么?

    在TCP的11种状态变迁中,我们需要用到TCP头部的三个标志位: 1.SYN,SYN=1表示这是一个连接请求报文或者连接接受报文 2.ACK,ACK=1,表示确认号生效 3.FIN,FIN=1表示发送 ...

  5. nginx acces.log日志分析

    1,统计各访问IP的总数 awk '{if($9>0 && $9==200 && substr($6,2)== "GET") a[$1]++} ...

  6. python-tkinter使用方法——转载(二)

    转载URL:https://www.cnblogs.com/yudanqu/p/9467803.html Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包 ...

  7. java笔记4—继承

    继承: 作用: 提高了代码的复用性. 让类与类之间产生了关系,为多态提供了前提 继承中成员变量的特点: 继承中成员函数的特点: 方法重写: 注意:重写方法必须和被重写的方法具有相同的方法名,参数列表和 ...

  8. Python-22-并发编程

    一.进程 1. 什么是进程 狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed).广义定义:进程是一 ...

  9. redis网文

    1.为什么说Redis是单线程的以及Redis为什么这么快!https://blog.csdn.net/chenyao1994/article/details/794913372.Redis上踩过的一 ...

  10. T-SQL行列相互转换命令:PIVOT和UNPIVOT使用详解

    最近在维护一个ERP 做二次开发 ,在查找数据源的时候看到前辈写的SQL ,自己能力有限 ,就在网上找找有关这几个关键字的使用方法.做出随笔以做学习之用 T-SQL语句中,PIVOT命令可以实现数据表 ...