springmvc 发送PUT 和 DELETE 请求
一: 发送 DELETE 或者 PUT 请求:
1、在表单中加入一个隐藏的参数: _method , 值是 DELETE (或者PUT)
<form action="springmvc/testRest/a1we2!3#d" method="post">
<input type="hidden" name="_method" value="DELETE"></input>
<input type="submit" value="test Rest delete"></input>
</form>
2、 发送的POST 请求, 配置一个 HiddenHttpMethodFilter 过滤器:
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
该过滤器会把 获取 String paramValue = request.getParameter("_method");
paramValue 值是 DELETE , 然后把该POST 的 HTTP请求的 改成 DELETE 请求。
3、在Controller 中匹配,获取上面的 DETELE 请求
@RequestMapping(value="/testRest/{ss}", method=RequestMethod.DELETE)
public String testRestDelete(@PathVariable("ss") String sid) {
System.out.println("test DELETE: " + sid);
return SUCCESS;
}
输出: test DELETE: a1we2!3
点了 test Rest delete 这个按钮后,请求的url 是 http://localhost:8080/springmvc-1/springmvc/testRest/a1we2!3#d , 在springmvc 中通过 PathVariable 注解获取 REST风格的URL 中的参数,获取的时候 ss 值是 a1we2!3 , 保存到 sid 中。 (把 # 后面的内容去掉了)
二:在 前台页面中写的链接:
<a href="springmvc/tsetParameters?username=zhou&age=11">tsetParameters</a></br>
RequestMapping 注解中可以使用 params 匹配请求中的参数, 用headers 匹配http请求中头域 controller 方法中:
@RequestMapping(value="tsetParameters", params={"username", "age!=10"},headers={"Accept-Language=zh-CN,zh;q=0.9" , "User-Agent=Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36"})
public String testParameters() {
System.out.println("testParameters");
return SUCCESS;
}
当 前台发送的请求 是: http://localhost:8080/springmvc-1/springmvc/tsetParameters?username=zhou&age=11 并且http 请求中带有:
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36
Accept-Language: zh-CN,zh;q=0.9
这两个头域的时候, 才会执行 testParameters 方法。
即执行 testParameters 方法需要同时满足以下的条件:
1、请求url tsetParameters 中必须含有 username 参数,必须含有 age 参数 并且 值不能是 10.
2、请求header 中 必须有 Accept-Language 和 User-Agent 。 并且值是 RequestMapping 中写的。
否则就会报404 错误。
四: @RequestMapping 可以映射参数:
value 值即请求参数的参数名
required 该参数是否是必须,默认是true 。
defaultValue 请求参数的默认值
比如请求url: http://localhost:8080/springmvc-1/springmvc/testRequestParam?username=zhou
controller 方法:
@RequestMapping(value="/testRequestParam")
public String testRequestParam(@RequestParam(value="username") String name, @RequestParam(value="age",required=false, defaultValue="0") int age){
System.out.println("name:" + name + "======" + "age:" + age);
return SUCCESS;
}
输出: name:zhou======age:0
RequestHeader 注解可以获取 http 请求的头域:
@RequestMapping("/testHeader")
public String testRequestHeader(@RequestHeader("User-Agent") String ua) {
System.out.println(ua);
return SUCCESS;
}
CookieValue 可以获取cookie 值
@RequestMapping("/testCookie")
public String testCookieVal(@CookieValue("JSESSIONID") String cook) {
System.out.println(cook);
return SUCCESS;
}
Servlet 原生API 作为目标方法的参数支持以下类型:
HttpServletRequest、HttpServletResponse、HttpSession、java.security.Principal、Local InputStream、 OutputStream、 Reader、Writer 。
@RequestMapping("/testServletAPI")
public void testServletAPI(HttpServletRequest req, HttpServletResponse rep,Writer writer) throws IOException {
System.out.println("HttpServletRequest:" + req + "--------" + rep);
writer.write("this is servlet api");
}
前台页面上显示: this is servlet api
五:
springmvc 可以返回目标方法中的map对象:
Controller 方法:
@RequestMapping("/testMap")
public String testMap(Map<String, Object> map) {
map.put("names", Arrays.asList("tim","jack","mike"));
return SUCCESS;
}
在返回的页面 success.jsp 中 可以接收 names 对象:
<body>
${requestScope.names}
${names}
</body>
页面显示:
[tim, jack, mike] [tim, jack, mike]
Controller 层也可以返回 ModelAndView 对象:
@RequestMapping("/testModelView")
public ModelAndView testModel() {
String viewName = SUCCESS;
ModelAndView modelview = new ModelAndView(viewName);
modelview.addObject("time",new Date());
return modelview;
}
success.jsp 通过 ${names} 或者 ${requestScope.names} 接收,在页面上显示时间。
六:
@sessionAttributes 可以通过属性名指定放到会话中的属性(value属性值), 也可以通过模型属性的对象类型指定哪些模型属性需要放到会话中(types属性值)。
Controller 方法:
@RequestMapping("/testSessionAttr")
public String testSessionAttr(Map<String, Object> map) {
User user = new User("tom","123","tomc@guigu.com", 20);
map.put("userone", user);
map.put("school", "qinghua");
User user2 = new User("mike","365","mm@guigu.com", 30);
map.put("usertwo2", user2.getAge());
return SUCCESS;
}
需要在Controller 类上加上注解: @SessionAttributes(value={"userone"}, types={String.class})
user: ${userone} </br> 在前台界面上取的值是: User [username=tom, password=123, email=tomc@guigu.com, age=20, address=null]
request user: ${requestScope.userone} </br> User [username=tom, password=123, email=tomc@guigu.com, age=20, address=null]
sessionScope user: ${sessionScope.userone}</br> User [username=tom, password=123, email=tomc@guigu.com, age=20, address=null]
school: ${school}</br> qinghua
requestScope school: ${requestScope.school}</br> qinghua
sessoin school: ${sessionScope.school}</br> qinghua
usertwo: ${usertwo2}</br> 30
requestScope usertwo: ${requestScope.usertwo2}</br> 30
sessionScope usertwo: ${sessionScope.usertwo2}</br> 空
只有把 String 类型的值放到 session 中时, sessionScope 中才会取到。
七:
在前台页面向Controller传递bean 的属性时,如果bean 对象没有空的构造函数,并且前台页面传的属性和bean 的构造函数参数不匹配时,就会报错,没有空的构造函数:
严重: Servlet.service() for servlet [springmvc] in context with path [/springmvc-1] threw exception [Request processing failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zhou.entity.User]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.zhou.entity.User.<init>()] with root cause
java.lang.NoSuchMethodException: com.zhou.entity.User.<init>()
at java.lang.Class.getConstructor0(Class.java:2849)
at java.lang.Class.getDeclaredConstructor(Class.java:2053)
需要加上一个空的构造函数。
1、在方法定义上使用 @ModelAttribute 注解:SpringMVC 在调用Controller 目标处理方法前,会先逐个调用在方法级上标注了 @ModelAttribute 的方法。
2、在方法的入参前使用 @ModelAttribute 注解 ,可以从隐含对象中获取隐含的模型数据中获取对象,再将请求参数绑定到对象中,再传入入参,将方法入参对象添加到模型中
前台页面传入 username、email、 age:
<form action="springmvc/testModeAttr">
<input type="hidden" name="id" value="1">
username: <input type="text" name="username" value="Tom"><br/>
email: <input type="text" name="email" value="tomca@126.com"><br/>
age: <input type="text" name="age" value="26"><br/>
<input type="submit" value="提交"><br/>
</form>
Controller 中的方法:
@RequestMapping("/testModeAttr")
public String testModeAttr(User user,Map<String, Object> map) {
System.out.println("modify:" + user);
map.put("user", user);
return SUCCESS;
}
@ModelAttribute
public void getUser(@RequestParam(value="id", required=false) Integer id,Map<String, Object> map) {
if(id!= null){
User user = new User(1,"Tome", "12345","tom@guigu.com", 12);
System.out.println("从数据库中获取的对象:" + user);
map.put("user", user);
}
}
1、先执行 @ModelAttribute 注解的 getUser 方法, 输出: 从数据库中获取的对象:User [id=1, username=Tome, password=12345, email=tom@guigu.com, age=12]
把 user 存入 key是 user 的对象中。
2、 SpringMVC 把 从Map 中取出的 User 对象,并把表单的请求参数 赋给该 User 对象的对应属性。 (这一步是SpringMVC 完成的) (在@ModelAttribute 修饰的方法中,放入到Map 时的键需要和目标方法入参类型的第一个字母小写的字符一致,)
如果在 @ModelAttribute 修饰的方法中,map存入的对象 和 目标方法的参数类名的第一个字母小写的字符不一致,可以在目标方法中用 @ModelAttribute 修改该参数。 比如:
@RequestMapping("/testModeAttr")
public String testModeAttr(@ModelAttribute("usera") User user,Map<String, Object> map) {
System.out.println("modify:" + user);
map.put("user", user);
return SUCCESS;
}
@ModelAttribute
public void getUser(@RequestParam(value="id", required=false) Integer id,Map<String, Object> map) {
if(id!= null){
User user = new User(1,"Tome", "12345","tom@guigu.com", 12);
System.out.println("从数据库中获取的对象:" + user);
map.put("usera", user);
}
}
则在 目标方法 testModeAttr 中的参数 user 也就是 map 中存入的 key 是 usera 的对象。
3、 再执行 目标方法 testModeAttr , 把上面的user 对象传入 该目标方法。
springmvc 发送PUT 和 DELETE 请求的更多相关文章
- 【转】AJAX发送 PUT和DELETE请求注意事项
jax使用restful服务发送put 和 delete 请求时直接传参会出现问题 一,采用POST + _method:delete/put + filter 的方法ajax发送put 和 de ...
- springboot——发送put、delete请求
在springmvc中我们要发送put和delete请求,需要先配置一个过滤器HiddenHttpMethodFilter,而springboot中,已经帮我们自动配置了,所以我们可以不用配置这个过滤 ...
- AJAX发送 PUT和DELETE请求参数传递注意点,了解一下
ajax发送put 和 delete 请求时,需要传递参数,如果参数在url地址栏上,则可以正常使用, 如果在 data:中需要传递参数,(浏览器会使用表单提交的方式进行提交) 则需要注意此时应作如下 ...
- 通过 Ajax 发送 PUT、DELETE 请求的两种实现方式
一.普通请求方法发送 PUT 请求 1. 如果不用 ajax 发送 PUT,我们可以通过设置一个隐藏域设置 _method 的值,如下: <form action="/emps&quo ...
- C#发送POST,GET,DELETE请求API,并接受返回值
发送POST请求 /// <summary> /// API发送POST请求 /// </summary> /// <param name="url" ...
- 如何同步发送put或者delete请求
1.必须把前端发送方式改为post . 2.在web.xml中配置一个filter:HiddenHttpMethodFilter过滤器 3.必须携带一个键值对,key=_method, value= ...
- JQuery发送Put、Delete请求 - 摘自网络
DELETE: $.ajax({ url: '/script.cgi', type: 'DELETE', success: function(result) { // Do something wit ...
- SpringMVC PathVariable和post、get、put、delete请求
1.PathVariable 可以映射URL中的占位符到目标方法的参数中. 2.Rest风格的URL 以CRUD为例: 新增:/order POST 修改:/order/id PUT 获取:/orde ...
- Ajax发送PUT/DELETE请求时出现错误的原因及解决方案
本文讲什么? 大家应该都知道.在HTTP中,规定了很多种请求方式,包括POST,PUT,GET,DELETE等.每一种方式都有这种方式的独特的用处,根据英文名称,我们能够很清楚的知道DELETE方法的 ...
随机推荐
- Linux配置 xampp下的https证书(腾讯云申请)
准备 从腾讯云后台SSL证书管理里下载证书 一.上传文件 解压出来以后有三个文件: 1_root_bundle.crt 2_www.xxxxx.com.crt 3_www.xxxxx.com.key ...
- C# 通过form表单下载文本文件
public void DownLoadConfigFile(string name) { //获取文件字符串内容 var data = _service.ReadFileStr(_configure ...
- Ubuntu下添加新分区并设置挂载点
Ubuntu下添加新分区并设置挂载点 最近在做Android项目,可是解压根文件系统以后,就报警说硬盘不够.当初设置使用的大小为15G.不过扩展分区还是很方便的.当然首先你得设置添加使用的硬盘大小 ...
- js特效,轻松实现内容的无缝平滑滚动
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http ...
- Android设计模式系列(2)--SDK源码之观察者模式
观察者模式,是一种非常常见的设计模式,在很多系统中随处可见,尤其是涉及到数据状态发生变化需要通知的情况下.本文以AbstractCursor为例子,展开分析.观察者模式,Observer Patter ...
- SQL Server 错误(待补充)
1.问题:在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误.未找到或无法访问服务器.请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接. 解决方法: 打开“ ...
- Atitit.软件gui按钮and面板---os区-----linux windows搜索文件 文件夹
Atitit.软件gui按钮and面板---os区-----搜索文件 1. Find 1 2. 寻找目录 1 3. 2. Locate// everything 1 4. 3. Whereis (wi ...
- 安装vim 出现 terminal libary 错误,解决方法
通过源码安装vim时,提示缺少terminal libary 而在安装ncurses以后,此问题照样出现. 经过查找资料发现.运行例如以下命令就能够正常安装vim <pre name=" ...
- linux性能不好怎么办?对着清单撸一遍
性能不好怎么办?对着清单撸一遍 Brendan Gregg是Netflix的资深性能架构师,著名性能调优专家.著有<性能之巅:洞悉系统.企业与云计算>)一书,可以说是性能调优领域的集大成之 ...
- filebeat+kafka失败
filebeat端配置 #----------------------------- Kafka output -------------------------------- output.kafk ...