springMVC获取异步请求的参数
JQuery发送异步请求回顾
<a href="javascript:void(0);" id="testAjax">访问controller</a>
<script type="text/javascript" src="/js/jquery-3.3.1.min.js"></script>
<script type="text/javascript">
$(function(){
$("#testAjax").click(function(){ //为id="testAjax"的组件绑定点击事件
$.ajax({ //发送异步调用
type:"POST", //请求方式:POST请求
url:"ajaxController", //请求参数(也就是请求内容)
data:'ajax message', //请求参数(也就是请求内容)
dataType:"text", //响应正文类型
contentType:"application/text", //请求正文的MIME类型
});
});
});
</script>
springMVC中controller中获取异步请求的参数注解@RequestBody
当前端异步请求我们的/ajaxController这个地址的时候,由于有@RequestBody这个注解,就会去请求体中找到message参数,然后将其封装到方法的参数中
@ResponseBody 异步请求响应
controller代码详解
package com.fs.springmvc.controller;
import com.fs.springmvc.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
@Controller
public class AjaxController {
/*
@RequestMapping("/ajaxController")
public String testAjax(){
System.out.println("测试ajax异步请求访问后台方法");
return "page";
}
*/
@RequestMapping("/ajaxController")
//@RequestBody注解,可以将请求体内容封装到指定参数中
//因为异步POST请求的参数在请求体中,若不添加@RequestBody,就找不到请求的参数,添加@RequestBody后就会去请求体中把参数内容封装到指定的参数中
//同步请求在地址栏中有参数,所以不用加@RequestBody这个主键
public String testAjax(@RequestBody String message){
System.out.println("测试ajax异步请求访问后台方法"+message);
//异步请求页面跳转是交给前端操作的,这里实际是不会跳转页面的
return "page";
}
/*
//如果处理参数是POJO,且页面发送的请求数据格式与POJO中的属性对应,@RequestBody注解可以自动映射对应请求数据到POJO中
//注意:POJO中的属性如果请求数据中没有,属性值为null,POJO中没有的属性如果请求数据中有,不进行映射
*/
@RequestMapping("/ajaxPojoToController")
//@RequestBody注解,可以将请求体内容封装到指定参数中
public String testAjaxPojo(@RequestBody User user){
System.out.println("测试ajax异步请求访问后台方法"+user);
return "page";
}
@RequestMapping("/ajaxListToController")
//如果处理参数是List集合且封装了POJO,且页面发送的数据是JSON格式的对象数组,数据将自动映射到集合参数中
public String testAjaxList(@RequestBody List<User> users){
System.out.println("测试ajax异步请求访问后台方法"+ users);
return "page";
}
@RequestMapping("/ajaxReturnString")
//使用注解@ResponseBody可以将返回的页面不进行解析,直接返回字符串,该注解可以添加到方法上方或返回值前面
@ResponseBody
public String ajaxReturnString(){
System.out.println("测试ajax异步请求访问后台方法");
//返回的就是forward:page
return "forward:page";
}
@RequestMapping("/ajaxReturnJson")
//基于jackon技术,使用@ResponseBody注解可以将返回的POJO对象转成json格式字符串数据,
@ResponseBody
public User ajaxReturnJson(){
System.out.println("测试ajax异步请求访问后台方法");
User user = new User();
user.setName("小付");
user.setAge(18);
return user;
}
@RequestMapping("/ajaxReturnJsonList")
//基于jackon技术,使用@ResponseBody注解可以将返回的保存POJO对象的集合转成json数组格式数据
@ResponseBody
public List ajaxReturnJsonList(){
System.out.println("测试ajax异步请求访问后台方法");
User user1 = new User();
user1.setName("小付");
user1.setAge(18);
User user2 = new User();
user2.setName("小花");
user2.setAge(18);
List al = new ArrayList<User>();
al.add(user1);
al.add(user2);
return al;
}
@RequestMapping("/cross")
@ResponseBody
//使用@CrossOrigin开启跨域访问
//标注在处理器方法上方表示该方法支持跨域访问
//标注在处理器类上方表示该处理器类中的所有处理器方法均支持跨域访问
@CrossOrigin//多项目之间相互调用会存在跨域的问题,若需要跨域调用,者添加注解就支持跨域调用
public User cross(HttpServletRequest request){
System.out.println("测试ajax异步请求访问后台方法:"+request.getRequestURL());
User user = new User();
user.setName("小花");
user.setAge(18);
return user;
}
@RequestMapping("/testAjaxBtn")
@ResponseBody
public String testAjaxBtn(@RequestBody String name){
System.out.println("测试ajax异步请求访问后台方法:"+name);
return "ok";
}
}
SpringMVC的跨域访问@CrossOrigin
@RequestMapping("/cross")
@ResponseBody
//使用@CrossOrigin开启跨域访问
//标注在处理器方法上方表示该方法支持跨域访问
//标注在处理器类上方表示该处理器类中的所有处理器方法均支持跨域访问
@CrossOrigin//多项目之间相互调用会存在跨域的问题,若需要跨域调用,者添加注解就支持跨域调用
public User cross(HttpServletRequest request){
System.out.println("测试ajax异步请求访问后台方法:"+request.getRequestURL());
User user = new User();
user.setName("小花");
user.setAge(18);
return user;
}
SpringMVC的文件上传
xml文件需要添加一个bean
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 设置扫描spring注解的包-->
<context:component-scan base-package="com.fs.springmvc"/>
<!-- 静态资源加载,核心控制器拦截的是所有请求,需要对静态资源请求进行放行,通过配置放行资源实现
下面这个配置是可以放行所有的普通资源调用
让springMVC不处理静态资源,如 .css .js .html .MP3 等-->
<mvc:default-servlet-handler/>
<!-- 配置mvc注解驱动-->
<mvc:annotation-driven/>
<!--配置文件上传处理器(固定写法)
public static final String MULTIPART_RESOLVER_BEAN_NAME = "multipartResolver";
id="multipartResolver"这个id不能随意的更改,因为在DispatcherServlet中规定了的
-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 配置上传文件的大小-->
<property name="maxUploadSize" value="1024000000"/>
</bean>
</beans>
表单提交注意事项
/*
前端form表单,注意事项,要以POST提交,enctype="multipart/form-data必须要添加
<form action="/fileupload" method="post" enctype="multipart/form-data">
<%--文件上传表单的name属性值一定要与controller处理器中方法的参数对应,否则无法实现文件上传--%>
上传LOGO:<input type="file" name="file"/><br/>
上传照片:<input type="file" name="file1"/><br/>
上传任意文件:<input type="file" name="file2"/><br/>
<input type="submit" value="上传"/>
</form>
*/
controller中的代码
package com.fs.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
/*
SpringMVC文件上传
*/
@Controller
public class FileUploadController {
@RequestMapping(value = "/fileupload")
//参数中定义MultipartFile参数,用于接收页面提交的type=file类型的表单,要求表单名称与参数名相同
public String fileupload(MultipartFile file,MultipartFile file1,MultipartFile file2, HttpServletRequest request) throws IOException {
// MultipartFile参数中封装了上传的文件的相关信息
// System.out.println(file.getSize());//文件的大小字节单位
// System.out.println(file.getBytes().length);//保存的字节数组,也是文件大小
// System.out.println(file.getContentType());//获取上传文件的类型
// System.out.println(file.getName());//是表单提交的name与参数的file,file1,file2
// System.out.println(file.getOriginalFilename());//上传文件名,获取原始上传的文件名,可以作为当前文件的真实名称保存到数据库中备用
// System.out.println(file.isEmpty());//判断文件大小是否是空文件
//首先判断是否是空文件,也就是存储空间占用为0的文件
if(!file.isEmpty()){
//如果大小在范围要求内正常处理,否则抛出自定义异常告知用户(未实现)
//设置保存的路径
String realPath = request.getServletContext().getRealPath("/images");
//保存文件的方法,指定保存的位置和文件名即可,通常文件名使用随机生成策略产生(我使用UUID),避免文件名冲突问题
file.transferTo(new File(realPath,UUID.randomUUID().toString()+file.getOriginalFilename() ));
}
//测试一次性上传多个文件
if(!file1.isEmpty()){
//可以根据需要,对不同种类的文件做不同的存储路径的区分,修改对应的保存位置即可
String realPath = request.getServletContext().getRealPath("/images");
file1.transferTo(new File(realPath,UUID.randomUUID().toString()+file1.getOriginalFilename()));
}
if(!file2.isEmpty()){
String realPath = request.getServletContext().getRealPath("/images");
file2.transferTo(new File(realPath,UUID.randomUUID().toString()+file2.getOriginalFilename()));
}
return "page.jsp";
}
}
Restful风格
package com.fs.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
//@Controller
//@ResponseBody
//设置rest风格的控制器
@RestController//这个注解相当于@Controller,@ResponseBody
//设置公共访问路径,配合下方访问路径使用
@RequestMapping("/user/")
public class UserController {
//rest风格访问路径完整书写方式
@RequestMapping("/user/{id}")
//使用@PathVariable注解获取路径上配置的具名变量,该配置可以使用多次
public String restLocation(@PathVariable Integer id){
System.out.println("restful is running ....");
return "success.jsp";
}
//rest风格访问路径简化书写方式,配合类注解@RequestMapping使用
@RequestMapping("{id}")
public String restLocation2(@PathVariable Integer id){
System.out.println("restful is running ....get:"+id);
return "success.jsp";
}
//接收GET请求配置方式
@RequestMapping(value = "{id}",method = RequestMethod.GET)
//接收GET请求简化配置方式
@GetMapping("{id}")
public String get(@PathVariable Integer id){
System.out.println("restful is running ....get:"+id);
return "success.jsp";
}
//接收POST请求配置方式
@RequestMapping(value = "{id}",method = RequestMethod.POST)
//接收POST请求简化配置方式
@PostMapping("{id}")
public String post(@PathVariable Integer id){
System.out.println("restful is running ....post:"+id);
return "success.jsp";
}
//接收PUT请求简化配置方式
@RequestMapping(value = "{id}",method = RequestMethod.PUT)
//接收PUT请求简化配置方式
@PutMapping("{id}")
public String put(@PathVariable Integer id){
System.out.println("restful is running ....put:"+id);
return "success.jsp";
}
//接收DELETE请求简化配置方式
@RequestMapping(value = "{id}",method = RequestMethod.DELETE)
//接收DELETE请求简化配置方式
@DeleteMapping("{id}")
public String delete(@PathVariable Integer id){
System.out.println("restful is running ....delete:"+id);
return "success.jsp";
}
/*
@RequestMapping(value = {"{id}/{sid}","{id}"})
表示这个方法可以被2个地址调用,一个id/sid 一个/id
@PathVariable(value = "sid",required = false)
required = false 表示sid可以不用传递 在地址映射上就添加2个地址请求
*/
@RequestMapping(value = {"/{id}/{sid}","/{id}"})
//接收DELETE请求简化配置方式
public String rest(@PathVariable("id") Integer id, @PathVariable(value = "sid",required = false) Integer sid){
System.out.println("restful is running ....delete:"+id);
return "success.jsp";
}
}
注解
⚫ Restful
◆ @RestController
◆ @PathVariable
◆ @GetMapping
◆ @PostMapping
◆ @PutMapping
◆ @DeleteMapping