异步请求定义方式
@RestController
类级别注解,由两个注解组成
@ResponseBody
和
@Controller
组成。在类上加完以后,该类中所有的方法都是异步请求。
@ResponseBody
类级别的注解、方法级别的注解,加到方法上以后,该方法返回的内容以数据形式返回。
数据形式返回包含:字符串、对象、集合以
json
格式进行返回。
返回结果类型
无返回
@GetMapping("/yb")
@ResponseBody
public void yb(HttpServletResponse response) throws IOException {
response.getWriter().write("abcd12123");
}
有返回
- 字符串:如果return中直接写字符串类型的返回值,则会将该值呈现在页面上;
- 返回自定义类型的时候,要求返回json格式的数据。直接进行默认返回会报错:406,不可接受的错误。
- 导jar包解决: ssm中推荐使用的是jackson的jar包;
- jackson-core;
- jackson-databind;
- jackson-annotation;
- 返回集合类型,由此可见集合的返回值和自定义类型返回值都是json格式数据。list是[],map是{},对象是{‘key’,'value'};
json对象和json字符串的转换
var obj ={'id':'1','name':'张三'} //定义js对象;
var jsonObj={'id':'1','name':'张三'}; //json格式的对象;
//json对象转换成json格式字符串:页面转换的:
//var jsonString=JSON.stringify(jsonObj)
var jsonString='{'id':'1','name':'张三'}'; //json格式的字符串;
//json字符串转换成json对象;
var jsonObj=JSON.parse(jsonString);
jquery中的方法
.serialize().serializeArray()
效果
$('#exampleForm').serialize(); // 返回
"username=John&password=secret&hobbies=reading&hobbies=cycling"
$('#exampleForm').serializeArray(); // 返回
[
{ name: "username", value: "John" },
{ name: "password", value: "secret" },
{ name: "hobbies", value: "reading" },
{ name: "hobbies", value: "cycling" }
]
- 在Ajax请求中,可以直接将 serialize 的返回值附加到请求的 data 参数中。指的是url后拼接的 内容,指的是文本字符串;
- serializeArray 获取到的是数组,也和json格式对象数组一致;
RequestBody
@RequestBody和@RequestParam区别:
- 请求方式区别:@RequestParam可以用于任意请求,而@RequestBody用于post、put请求;
- @RequestBody用于异步接收,接收json格式的数据(要求json格式的字符串),可以将json格式数据转换成java对象,如果使用serializeArray的话,需要将其转换成json格式的字符串传入到后端;
- 如果是post请求的时候,并且要求传入的参数格式是json格式,那么必须设置:
// 将数据发送到服务器时 :post 请求需要使用 ;contentType : 'application/json;charset=utf-8' ,
- 在实际应用中,你可能会在一个方法中同时使用 @RequestParam 和 @RequestBody ,这取决于你期望接收的数据类型和来源。例如,你可能需要从请求体中读取一个复杂的JSON对象,同时也从URL中获取一些额外的参数。
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!-- 获取到的是应用上下文 也就是项目名字; -->
<%String path=request.getContextPath()+"/";%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
<base href="<%=path%>">
<!-- 引入外部的jquery: -->
<script type="text/javascript" src="js/jquery-3.3.1.js"></script>
</head>
<body>
<!-- 进行异步请求测验: -->
<form>
用户基本信息:
用户名:<input type="text" name="name" id ="name">
密码:<input type="password" name="pwd" id ="pwd">
<input type="button" value="保存" id="btn">
</form>
<p></p>
</body>
<script type="text/javascript">
//编写jquery代码:
//jquery的入口函数:
$(function(){
//什么时候触发条件?进行异步请求的操作;
//触发以后 发送资源到哪儿?
//发送资源的时候传递什么参数?
//返回怎样的结果:
$('#btn').click(function(){
//jquery的异步请求方法:
var c={
name:$('#name').val(),
pwd:$('#pwd').val()
};
$.ajax({
//url:
url:'user/yb',
//请求方式:
type:'POST',
//将数据发送到服务器时:post请求需要使用;
contentType:'application/json;charset=utf-8',
//传入参数:转换成json格式的字符串;
data:JSON.stringify(c),
//返回结果:
success:function(res){
//返回结果传入到p标签中:
//对p标签进行初始化赋值; {id: null, name: '888', pwd:
'000', rq: null}
var r=JSON.stringify(res);
$('p').html('');
//将获取到的res作为元素或者节点添加入其中:
$('p').append(r);
},
//从服务器返回的数据类型。
dataType:'json'
})
})
})
</script>
</html>
// 异步请求:
@PostMapping("/yb")
@ResponseBody
public User yb(@RequestBody User user){
return user;
}
静态资源处理
指的是需要引入的css、js文件,在springmvc中是没办法直接查看到的,需要进行静态资源处理才可以看到。
<!-- 在applicationContext-mvc.xml中编写; -->
<!-- 静态资源放行:第一种:
location:位置:指的是当前静态资源在webContent下面的位置;
/js/
mapping:映射:哪些请求是静态资源:
/js/* 一级请求:指的是映射的资源只是js当前目录下的资源放行;
/js/jquery.js
/js/** 二级请求:指的是映射的资源只是js目录下所有资源放行;
/js/bootstrap/bootstrap.js;-->
<mvc:resources location="/js/" mapping="/js/**">
</mvc:resources>
<!-- 第二种方式:推荐:-->
<mvc:default-servlet-handler/>
视图解析器
视图解析器为了在请求访问
jsp
资源的时候,省略一些内容,而使用的。
<!-- 视图解析器 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--prefix:可省略的前缀 -->
<property name="prefix" value="/WEB-INF/"></property>
<!-- 可省略的后缀 -->
<property name="suffix" value=".jsp"></property>
</bean>
文件上传
- 文件上传就是将本地的文件传到服务器上的某个文件夹中。
- commons-fileupload;
- commons-io;
Servlet的文件上传
//使用servlet进行文件上传:
@PostMapping("/toFile")
public void servletSc(HttpServletRequest request,HttpServletResponse
response) throws Exception {
//解析请求:
// 检查我们是否有文件上传请求
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
//如果请求不进行文件上传:
if(!isMultipart) {
return ;
}
//为基于磁盘的文件项创建工厂:
DiskFileItemFactory factory = new DiskFileItemFactory();
//创建新的文件上传处理程序
ServletFileUpload upload = new ServletFileUpload(factory);
//解析请求:
List<FileItem> items = upload.parseRequest(request);
//遍历请求:
// 进行文件请求解析:
for (FileItem item : items) {
//判断是否是常规表单域——》除input type="file"以外;
if (item.isFormField()) {
//name的值就是input框中的name属性值;
String name = item.getFieldName();
mvc的文件上传
xml配置多媒体视图解析器
代码中的核心MultipartFile类;
//value的值是input 框中value属性的值;
String value = item.getString("utf-8");
} else {
//fieldName的值 就是input type="file" 中的name属性值;
String fieldName = item.getFieldName();
//fileName:就是input type="file" 中的value属性值
String fileName = item.getName();
//
//创建文件:
//创建文件时需要路径:path:应该是服务器路径= 项目名字/专门用于文件上传的文件
夹/文件名字;
String
scPath=request.getServletContext().getRealPath("/upload/");
//获取到的scPath长得样子是 从盘符到tomcat/webapps/upload/;
//判断upload文件夹是否存在:
File file1 = new File(scPath);
if(!file1.exists()) {
file1.mkdir();
}
//最终的path:
String path =scPath+fileName;
File file=new File(path);
//上传文件:
item.write(file);
//释放资源:
item.delete();
}
}
}
mvc的文件上传
- xml配置多媒体视图解析器
<!-- 配置多媒体视图解析器:
需要注意bean的id必须是multipartResolver;
-->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"></property>
<!-- 默认单位是b ;10240000是10M -->
<property name="maxUploadSize" value="10240000"></property>
</bean>
-
代码中的核心 MultipartFile 类;
//mvc的文件上传:
@PostMapping("/mvcUpload")
public String mvcUpload(MultipartFile file,String
name,HttpServletRequest request,Model model) throws IllegalStateException,
IOException {
//originalFilename表示的是将要上传的文件名字;
String originalFilename = file.getOriginalFilename();
//创建文件时需要路径:path:应该是服务器路径= 项目名字/专门用于文件上传的文件夹/
文件名字;
String scPath=request.getServletContext().getRealPath("/upload/");
//判断upload文件夹是否存在:
File file1 = new File(scPath);
if(!file1.exists()) {
file1.mkdir();
}
//避免上传同一个文件就报错:选择拼接路径的时候去加一个随机数UUID:
String sjs =UUID.randomUUID().toString();
//最终的path指的是存储到数据库中的;
String path =scPath+sjs+originalFilename;
//想传到页面上的路径:
String pagePath="upload/"+sjs+originalFilename;
//文件上传:
File f= new File(path);
file.transferTo(f);
//文件上传完以后进行传值:
//传值是文件路径:
model.addAttribute("path", pagePath);
//传值是上传人:
model.addAttribute("name", name);
return "success.jsp";
}