前言:对于工作多年的同学来说,相信都接触过了SpringMVC:,但在使用的过程中,多少会心里打鼓,或者还有很多疑问没搞明白,本篇文章就我自己的使用心得做出一个总结,希望能够帮助很多那些还在前行路上摸索的同学。

Q1:当映射路径为,关于对Controller中具体方法访问时需要注意的地方

比如我们在Controller中定义了这么个方法

@RequestMapping(value="/test", method = {RequestMethod.GET})
public String test(){return "index";
}

访问方式应该很简单吧,直接 http://localhost:8080/SpringMVC/test 如下图

那给其加上后缀,还能访问到吗,比如
http://localhost:8080/SpringMVC/test.action
http://localhost:8080/SpringMVC/test.abc
答案是可以的,如下图

可以发现,任意后缀都可以,但在项目开发中,到底加不加这个后缀,我给的答案是,如果项目组有要求,URI统一格式都是以某某为后缀,你还是加上吧,虽然你不加最终访问的时候并不会影响,但怎么说呢,保持一致吧。

Q2:Ajax和SpringMVC之间的交互

比如现有如下界面:

<form id="login">账 号:<input type="text" name="username" id="username" ><br/>密 码:<input type="password" name="password" id="password"><br/><input type="button" id="submit" value="Submit" />
</form>

ajax请求如下:

$(function() {$("#submit").click(function() {var json = {'username':$('#username').val(),'password':$('#password').val()};//json字符串 {"username":"admin","password":"123456"}var postdata = JSON.stringify(json);alert(postdata);$.ajax({  type : 'POST',  contentType : 'application/json',processData : false,url : '<%=path%>/databind/json',dataType : 'json',  data : postdata,  success : function(data) {  alert('username : '+data.username+'\npassword : '+data.password);  }}); });
});

tip:我们可以看到在用contentType : ‘application/json’发起请求,data我们传的是一个json字符串,而不是json对象,一开始我也认为是可以的,结果不行,直接传对象报错,不妨亲自试试。

SpringMVC需要提供的方法如下:

@RequestMapping(value="/json", method = {RequestMethod.POST})
@ResponseBody
public Account json(@RequestBody Account account){System.out.println(account);return account;
}

那还是contentType : ‘application/json’发起的请求,我们能不能用如下的方式接收值呢

@RequestMapping(value="json", method = {RequestMethod.POST})
@ResponseBody
public Account json(String username, String password){Account account = new Account();account.setUsername(username);account.setPassword(password);return account;
}

答案是不可以的,会抛异常,400 Bad Request

究其原因是:contentType : ‘application/json’数据发送后台接收必须是Modle,不能是单个属性,且必须加上@RequestBody注解。

如果我们把contentType换成默认的contentType : ‘application/x-www-form-urlencoded’呢,前后台又该怎么写

ajax写法如下:

$(function(){$("#submit").click(function(){$.ajax({type: "POST",/* contentType : 'application/x-www-form-urlencoded',*/url:  '<%=path%>/databind/json',dataType: "json",data: {username:$('#username').val(),password:$('#password').val()},success: function(data){alert('username : '+data.username+'\npassword : '+data.password);}}); });
});

这里不得不提下,虽然data这里看起来传的是一个json对象,但由于使用了application/x-www-form-urlencoded,最终可以通过firebug可以看到,其实最终传过去的还是username=admin&password=123456,当然你也可以直接传这么个字符串过去,但是有一点要注意,真实项目中字段还是特别多的,这样拼接会相当繁琐,然而我们知道还有个方法供我们使用,jQuery给我们提供的$(“#login”).serialize()序列化表单。

$(function(){$("#submit").click(function(){var params = $("#login").serialize();alert(params);$.ajax({type: "POST",url:  '<%=path%>/databind/json',dataType: "json",data: params,success: function(data){alert('username : '+data.username+'\npassword : '+data.password);}}); });
});

我提供的这两种方式归根结底其实是一样的,切记,切记。。。

后台接收方式如下:

@RequestMapping(value="json", method = {RequestMethod.POST})
@ResponseBody
public Account json(String username,String password){Account account = new Account();account.setUsername(username);account.setPassword(password);return account;
}

那这里要提出一个疑问,如果我需要接受的字段特别多呢,难道我在方法中也需要一个一个参数的去写嘛,比如有20个,还不得累死。

答案是当然啦

@RequestMapping(value="/json", method = {RequestMethod.POST})
@ResponseBody
public Account json(Account account){System.out.println(account);return account;
}

此外,这里不得不提一件事情,很多人一看到要拿model接收传参,就想着应该是不是应该加上@RequestBody注解,springmvc才会帮你把相关值封装到model里面去,我在这里告诉你,千万不要这样想,这个注解不是随便就用的,它的用途是帮你转换json->model、 xml->model,你好好的表单提交,用的contentType:application/x-www-form-urlencoded,何必画蛇添足加上这个注解呢。

Q3:什么时候该用@RequestParam注解,什么时候不该用

前面我们已经看到了,接受单个基本类型值的参数,只要在方法中分别写下,并且并不需要使用什么注解就能拿到传过来的值,那为什么还有@RequestParam这个注解呢,并且看到很多地方都在用。

其实呢这个注解,有它的用处,并不是一无是处,首先作为基本类型的参数,如果不使用注解,是可传可不传的,如果为null并不会报错,但当你使用了@RequestParam注解,那么此时该参数就是必传的了,如果不传就不会报错,然而还是可以通过配置来让其可不必传,如@RequestParam(value=”username”, required=false),此外,该注解还可以设置如果前台没有传值过来,会给一个默认值,如@RequestParam(value=”username”, defaultValue=”ruo”)。

我对该注解做的总结是:如果你某个参数不是必传的,就别用它了,如果是必传的,请一定用上它,如果必传参数可以有默认值的话,还请加上defaultValue默认值。

Q4:SpringMVC都有哪些方式可以用来给前端界面传递对象,用来绑定显示

方式有三种,现提供测试例子如下

    <form action="<%=path%>/databind/modelautobind" method="post">用户名:<input type="text" name="username"><br/>密 码:<input type="password" name="password"><br/><input type="submit" value="Submit" /></form><hr><form action="<%=path%>/databind/modelautobind2" method="post">用户名:<input type="text" name="username"><br/>密 码:<input type="password" name="password"><br/><input type="submit" value="Submit" /></form><hr><form action="<%=path%>/databind/modelautobind3" method="post">用户名:<input type="text" name="username"><br/>密 码:<input type="password" name="password"><br/><input type="submit" value="Submit" /></form>

跳转结果界面如下:

<%@ 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>Insert title here</title>
</head>
<body>
用户名:${account.username}<br/>
密  码:${account.password}
</body>
</html>

我们使用了三种不同的请求路径URI,现在我们来看看都是如何实现的

@RequestMapping(value="/modelautobind", method = {RequestMethod.POST})
public String modelAutoBind(@ModelAttribute("account") Account account){System.out.println("第一种方式:" + account);return "modelautobindresult";
}@RequestMapping(value="/modelautobind2", method = {RequestMethod.POST})
public String modelAutoBind(Model model, Account account){System.out.println("第二种方式:" + account);model.addAttribute("account", account);return "modelautobindresult";
}@RequestMapping(value="/modelautobind3", method = {RequestMethod.POST})
public String modelAutoBind(HttpServletRequest request,Account account){System.out.println("第三种方式:" + account);request.setAttribute("account", account);return "modelautobindresult";
}

这三种方式都是可以的,看结果界面如下:
方式一:

方式二:

方式三:

最后想说的是,使用哪一种,就看个人习惯吧。

SpringMVC个人零碎总结相关推荐

  1. 【SpringMVC】概述

    概述: SpringMVC:是基于spring的一个框架, 实际上就是spring的一个模块, 专门是做web开发的.                       理解是servlet的一个升级 Sp ...

  2. 【SpringMVC】基本概念

    SpringMVC的基本概念 三层架构 我们的开发一般都是基于c/s或者b/s架构.在JavaEE开发中,几乎全都是基于B/S架构开发.在B/S架构中,系统标准的三层架构包括:表现层,业务层,持久层. ...

  3. SSM框架整合(Spring+SpringMVC+MyBatis)

    输出结果 1.Maven Web项目创建 之前有写过Eclipse+Maven创建web项目的帖子,如果需要,请参考这里写链接内容 创建好项目之后因为入下图: 2.SSM整合 2.1 引入需要的JAR ...

  4. SpringBoot-web开发(四): SpringMVC的拓展、接管(源码分析)

    [SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) SpringBoot-web开发(二): 页面和图标定制(源码分析) SpringBo ...

  5. SpringMVC——通俗易懂讲讲Ajax~

    聊聊Ajax 一.什么是Ajax 二.iframe标签简单伪造Ajax 三.Ajax的实现 1. 基本概念的了解 Ajax的核心是什么? XMLHttpRequest是什么? Ajax数据传输的数据格 ...

  6. Jackson、FastJson快速入门(整合SpringMVC)

    目录 1. 什么是 JSON 2. JSON 语法规则 3. JSON 与 JS 对象的关系 4. JSON 和 JS 对象互转 5. Jackson-数据格式转换 1. 环境搭建 2. 对象转jso ...

  7. RESTful风格及其SpringMVC实现

    目录 1.RESTful概念 2.RESTful功能 3.对比:传统方式操作资源 4.SpringMVC实现传统方式操作资源 5.使用RestFul操作资源 6.SpringMVC实现RESTful操 ...

  8. 使用注解开发SpringMVC详细配置教程

    目录 1.使用注解开发SpringMVC 1.新建一个普通的maven项目,添加web支持 2.在pom.xml中导入相关依赖 3.配置web.xml 4.编写SpringMVC配置文件 1. 自动扫 ...

  9. SpringMVC的form:form表单的使用

    为什么要使用SpringMVC的form:form表单,有两个原因:一是可以更加快捷的完成表单的开发,比如会替你做好数据类型装换等本来需要你自己动手的工作.其次就是能够更加方便的实现表单回显. 首先要 ...

最新文章

  1. VS Code 1.47 发布!官方版 Settings Sync 终于来了!
  2. SSH连接问题:1.Software caused connection abort2.client_loop: send disconnect: Connection reset
  3. jquery判断页面、图片是否加载完成
  4. php计算机基础知识,计算机基础知识①
  5. 使用webpack打包后的vue项目如何运行(express)
  6. 如果再出恶性安全事件,滴滴会有人被追究刑责吗?
  7. pytorch 对抗样本_【炼丹技巧】功守道:NLP中的对抗训练 + PyTorch实现
  8. 递归算法1加到100_五种循环方法计算1加到100
  9. MAX脚本发送贴图的另外一个方式
  10. python编程软件哪个好-Python开发工具哪个好?好用的Python开发工具排行榜推荐下载...
  11. 吉特仓库管理系统- 斑马打印机 ZPL语言的腐朽和神奇
  12. c语言写按键控制蜂鸣器,单片机按键控制蜂鸣器演奏音乐
  13. 真彩色图像RGB,YIQ图像,HSV图像,YCbCr图像的相互转换(Matlab实现)
  14. 日本恐怖片《二重身》核心内容赏析
  15. PHP中的定界符 echo
  16. ElasticSearch7 集群安装和配置
  17. Ubuntu 16.04 tf-faster-rcnn 在CPU下训练数据
  18. bzoj 3620: 似乎在梦中见过的样子
  19. TCP:三次握手:URG、ACK、PSH、RST、SYN、FIN 分别代表什么
  20. AC/DC、DC/DC转换器知识

热门文章

  1. 解读:学习网络安全自学好还是报培训班好
  2. 【闲得无聊】写个web版功德无量附代码+静态资源
  3. 目前市场上主流的BI产品主要有哪些?
  4. 查看jvm的运行参数
  5. 列表中使用bootstrap-switch开关
  6. 周信东c语言实验二实验报告,实验三 循环结构程序设计参考答案
  7. 制作的excel表格如何放到微信公众平台文章中?
  8. Android Camera之Deferred Surface
  9. 【转】Maximal Information Coefficient (MIC)最大互信息系数详解与实现
  10. win10 语言栏跳出来,如何调回去