Spring 框架(五)SpringMVC 高级
File file=new File(path);
//判断文件夹是否存在
if (!file.exists()){
//创建文件夹
file.mkdirs();
}
//创建上传对象
ServletFileUpload upload=new ServletFileUpload(new DiskFileItemFactory());
//获得文件列表
List<FileItem> fileItems= upload.parseRequest(request);
for (FileItem item:fileItems){
//判断文件是不是普通表单项
if (item.isFormField()){
//如果是普通表单项,打印表单项名和值
System.out.println(item.getFieldName());
System.out.println(item.getString());
}else{
//如果是文件,截取后缀名
String filename= item.getName();
String suffix = filename.substring(filename.lastIndexOf("."));
//创建唯一的文件名
String uuid= UUID.randomUUID().toString().replace("-","");
filename = uuid + suffix;
//完成文件上传
item.write(new File(path,filename));
System.out.println("上传完毕");
}
}
//跳转到 success 页面
return "success";
}
依赖和表单和上面一样
上传方法中使用 MultipartFile 参数获得上传文件
@RequestMapping("/upload")
public String fileupload(HttpServletRequest request, MultipartFile upload) throws Exception {
//获取项目目录下的 upload 目录路径
String path = request.getSession().getServletContext().getRealPath("/upload/");
System.out.println(path);
File file = new File(path);
if (!file.exists()) {
file.mkdirs();
}
//获取上传文件名字
String filename = upload.getOriginalFilename();
String suffix = filename.substring(filename.lastIndexOf("."));
//创建唯一的文件名
String uuid= UUID.randomUUID().toString().replace("-","");
filename = uuid + suffix;
//完成文件上传
upload.transferTo(new File(path,filename));
return "success";
}
需要在 springmvc 的配置中添加上传处理器
<bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver" id="multipartResolver">
<property name="maxUploadSize" value="10485760"/>
</bean>
给表单添加多个文件项
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="uploads">
<input type="file" name="uploads">
<input type="file" name="uploads">
<input type="submit" value="MVC 多文件上传">
</form>
添加 MultipartFile 数组为参数,参数名和表单 name 一致
@RequestMapping("/upload3")
public String fileupload3(HttpServletRequest request, MultipartFile[] uploads) throws Exception {
//获取 tomcat 项目目录下的 upload 目录路径
String path = request.getSession().getServletContext().getRealPath("/upload/");
System.out.println(path);
File file = new File(path);
if (!file.exists()) {
file.mkdirs();
}
for(MultipartFile upload : uploads) {
//获取上传文件名字
String filename = upload.getOriginalFilename();
String suffix = filename.substring(filename.lastIndexOf("."));
//创建唯一的文件名
String uuid = UUID.randomUUID().toString().replace("-", "");
filename = uuid + "-" + suffix;
//完成文件上传
upload.transferTo(new File(path, filename));
}
return "success";
}
SpringMVC 还提供了其它 API 支持上传:
CommonsMultipartResolver 多部分解析器,用于判断请求是否存在上传文件
MultipartHttpServletRequest 多部分请求,用于获得文件相关信息
具体用法:
@RequestMapping("upload4")
public String fileupload4(HttpServletRequest request) throws IllegalStateException, IOException
{
String path = request.getSession().getServletContext().getRealPath("/upload/");
//创建多部分解析器
CommonsMultipartResolver multipartResolver=new CommonsMultipartResolver(
request.getSession().getServletContext());
//检查表单是否支持文件上传
if(multipartResolver.isMultipart(request)){
//将请求转换为多部分请求,支持上传
MultipartHttpServletRequest multiRequest=(MultipartHttpServletRequest)request;
//获取请求中所有的文件名
Iterator iter=multiRequest.getFileNames();
while(iter.hasNext()) {
//遍历所有文件
MultipartFile file=multiRequest.getFile(iter.next().toString());
if(file!=null) {
//获取上传文件名字
String filename = file.getOriginalFilename();
String suffix = filename.substring(filename.lastIndexOf("."));
//创建唯一的文件名
String uuid = UUID.randomUUID().toString().replace("-", "");
filename = uuid + suffix;
//上传
file.transferTo(new File(path,filename));
}
}
}
return "success";
}
/**
下载控制器
*/
@Controller
public class DownloadController {
@RequestMapping("download")
public void download(String file, HttpServletResponse response) throws IOException {
//下载文件的路径
String path = "D:\install\";
File downFile = new File(path+file);
if(downFile.exists()){
//设置浏览器下载内容类型,响应头
response.setContentType("application/x-msdownload");
response.setHeader("Content-Disposition","attachment;filename="+file);
//通过流发送文件
Files.copy(downFile.toPath(),response.getOutputStream());
}
}
}
==============================================
=========================
3.1.1 前后端分离是什么
前端项目(html5、小程序、移动端),后端项目(java、数据库、tomcat)分开开发和部署
3.1.2 前后端分离优势
1)开发分工明确,前端团队和后端团队同时分工合作开发
2)项目分开部署不同的服务器,如:Tomcat 适合部署动态资源,Nginx 适合部署静态资源
3)便于测试和维护
3.1.3 前后端开发人员的交互方式
1)设计人员根据需求设计接口,提供接口文档
1)后端根据接口文档开发后台接口
2)前端通过接口请求数据,渲染页面
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5TpfgxFJ-1608513277531)(SpringMVC.assets/clipboard-1608100199709.png)]
3.2.1 RESTFul 是什么
RESTFul 是一种网络应用程序的设计风格和开发方式,基于 HTTP,可以使用 XML 格式定义或 JSON 格式定义。适用于移动互联网厂商作为业务使能接口的场景,实现第三方调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源。
RESTful 架构,是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。
每一个 URI 对应服务器上的一个资源(数据库数据、方法等)
通过不同 Http 请求方法来区别增删改查操作
GET --> 查询
POST --> 添加
PUT --> 更新
DELETE --> 删除
通信的格式是 JSON
3.2.3 RESTFul 风格的 API
传统 API 设计,常用动词定义 API,如:find、get、save、update、delete 等
查询所有书籍:
http://域名/book/findAll
查询一本书:
http://域名/book/findById?id=1
添加书籍:
http://域名/book/saveBook
更新书籍:
http://域名/book/updateBook
删除书籍:
http://域名/book/deleteBook?id=1
RESTFul 风格 API 设计,只使用名词,使用不同的请求方法来区别增删改查
查询所有书籍: GET
http://域名/books
查询一本书: GET
http://域名/book/1
添加书籍: POST
http://域名/book
更新书籍: PUT
http://域名/book
删除书籍: DELETE
http://域名/book/1
Restful 风格的控制器的实现
@RestController
public class BookController {
@Autowired
private BookService bookService;
@GetMapping("/books")
public JsonResult findAll(){
try {
List<Book> list = bookService.list();
return new JsonResult(1,list);
}catch (Exception ex){
ex.printStackTrace();
return new JsonResult(0,null);
}
}
@GetMapping("/book/{id}")
public JsonResult findById(@PathVariable("id")Integer id){
try {
Book book = bookService.getById(id);
return new JsonResult(1,book);
}catch (Exception ex){
ex.printStackTrace();
return new JsonResult(0,null);
}
}
@PostMapping("/book")
public JsonResult saveBook(@RequestBody Book book){
try {
bookService.save(book);
return new JsonResult(1,null);
}catch (Exception ex){
ex.printStackTrace();
return new JsonResult(0,null);
}
}
@PutMapping("/book")
public JsonResult updateBook(@RequestBody Book book){
try {
bookService.updateById(book);
return new JsonResult(1,null);
}catch (Exception ex){
ex.printStackTrace();
return new JsonResult(0,null);
}
}
@DeleteMapping("/book/{id}")
public JsonResult delBook(@PathVariable("id")Integer id){
try {
bookService.removeById(id);
return new JsonResult(1,null);
}catch (Exception ex){
ex.printStackTrace();
return new JsonResult(0,null);
}
}
}
3.2.4 浏览器支持 DELETE 和 PUT
浏览器默认只支持 GET 和 POST 请求,如果要表单提交 DELETE 或 PUT 请求,需要通过 SpringMVC 的过滤器来实现
web.xml 添加:
<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>
HiddenHttpMethodFilter 过滤器的作用是:过滤表单中名称为_method 的隐藏域,如果值是 DELETE 就将请求方法转换为 DELETE,是 PUT 就将请求方法转换为 PUT。
表单
<form action="/testDelete" method="post">
<input name="name" placeholder="输入姓名"><br>
<input type="hidden" name="_method" value="DELETE"/>
<input type="submit" value="提交">
</form>
评论