对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. 【视频开发】【计算机视觉】doppia编译之一:前言及安装CUDA

    最近做一个"高清视频人流量检测"的项目,由于对实时性要求较高,我们需要较快的检测速度.在搜索茫茫"论"海后,我在"The Fastest Deform ...

  2. Java环境配置-jdk和jre的安装

    java 是直接在 jdk 下就可以运行 jdk会自带jre 所以只需要下载jdk配置一下环境就可以了 一般编辑java是需要 myeclipse 也可以用 记事本TXT文档 或者用 notepad+ ...

  3. 可扩展标记语言XML之一:XML的概念、作用与示例

    哈喽大家好啊,乐字节小乐又来给大家分享Java技术文章了.上次已经讲完了Java多线程相关知识(可以看我博客文章), 这次文章将讲述可扩展标记语言XML 一. 标记语言 标记语言,是一种将文本(Tex ...

  4. 【剑指offer】面试题 14. 剪绳子

    面试题 14. 剪绳子 LeetCode 题目描述 给你一根长度为 n 的绳子,请把绳子剪成 m 段(m.n 都是整数,n>1 并且 m>1),每段绳子的长度记为 k[0],k[1],·· ...

  5. 一分钟 - 创建python虚拟环境

    python创建虚拟环境 python安装第三方库大都是通过pip命令安装,这个命令确实是很简便的,而对于每个独立的项目来说,需要用到的库或许会不同,如果删除或更新原来已有的版本库,或许会导致其他的项 ...

  6. C++ 制作一个“测运”小游戏-rand()函数的应用

    游戏说明: 游戏名:Lucky Guy 玩法说明:有2种模式可以选择,一种是一直选择数字,直到抽到炸弹为止.另一种是在0~9个数字中进行选择,有5个炸弹,最高分为5,抽到炸弹即游戏结束.游戏结束后,可 ...

  7. centos7编译安装memcached

    1.libevent 源码地址:https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent ...

  8. Dubbo快速入门 三

    3.dubbo环境搭建 3.1).[windows]-安装zookeeper 1.下载zookeeper 网址 https://archive.apache.org/dist/zookeeper/zo ...

  9. microk8s 搭建

    一.简述 microk8s不通过虚拟机但与主机隔离方式,快速轻巧安装Kubernetes.通过在单个快照包中打包Kubernetes,Docker.io,iptables和CNI的所有上游二进制文件来 ...

  10. CF936C Lock Puzzle 构造

    传送门 好久不做构造题脑子都僵化了qwq 无解的条件是\(s\)包含的字符可重集和\(t\)包含的字符可重集不相等,相等的时候下文会给出一种一定可行的构造方案. 考虑增量构造.定义某个字符串\(x\) ...