对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. Apache软件基金会核心项目Tomcat的那些事

    Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选.今天就来为大家介绍一下关于T ...

  2. was8.5和aop的问题:JVMVRFY013 违反类装入约束

    一.错误日志:Error 500: javax.servlet.ServletException: java.lang.VerifyError: JVMVRFY013 违反类装入约束 类=org/sp ...

  3. Cannot find bounds of current function

    MinGW编译平台的应用程序使用libcef.dll,当调用cef的capi接口时程序崩溃.调试单步到cef capi函数时,调试器报错“Cannot find bounds of current f ...

  4. Mahalanobia Distance(马氏距离)的解释

    马氏距离有多重定义: 1)可以表示 某一个样本与DataSet的距离. 2)可以表示两个DataSet之间的距离. 1) The Mahalanobis distance of an observat ...

  5. 如何使用websocket实现前后端通信

    websocket通信是很好玩的,也很有用的的通信方式,使用方式如下: 第一步由于springboot很好地集成了websocket,所以先在在pom.xml文件中引入依赖 <dependenc ...

  6. 10 IO流(七)——copy方法封装、关闭流方法封装的两种方式以及try...with...resource

    前言 本文将上一节做的代码,对copy方法与关闭流方法进行封装,并使用try...with...resource关闭流. copy方法封装 我们将copy方法封装,使得只需传入两个流,就能将输入流的源 ...

  7. Linux进程状态详解及状态转换

        学而不思则罔,思而不学则殆.    Linux下,进程状态有五种 : 运行态,可中断睡眠态,不可中断睡眠态,停止态和追踪态 运行态表示进程可执行或者正在执行, 可中断睡眠态表示进程被阻塞,等条 ...

  8. quartz2.3.0(十二)通过RMI协议向Scheduler调度器远程添加job任务

    此代码示例通过RMI协议向Scheduler调度器远程添加job任务. 代码文件包括:job任务类(SimpleJob.java).RMI服务端server类(RemoteServerExample. ...

  9. Oracle数据库常用语法

    基本 --新建表:create table table1( id varchar(300) primary key, name varchar(200) not null); --插入数据 inser ...

  10. [高清] SpringBoot揭秘快速构建微服务体系

    ------ 郑重声明 --------- 资源来自网络,纯粹共享交流, 如果喜欢,请您务必支持正版!! --------------------------------------------- 下 ...