5 实用技术
5.1 文件上传下载
前端页面
必表单中的三个注意事项
- input的type必须是file类型
- 表单的提交方式必须是post
- 表单的enctype属性的值必须是”multipart/form-data”
页面表单代码
1.类型必须是multipart/form-data,上传的标签name名字必须与后台接收的变量名一致否则传不上去
单文件上传
1.导入fileupload和common-io依赖
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.3</version> </dependency>
2.配置文件上传解析器
B表示Byte
1M=1024*1024
注意事项:bean的id值必须和我的保持一致,不然后台获取不到表单数据
3.编写控制器
多文件上传
页面代码
页面效果
控制器
总结
1.页面中的多个上传选项name要一致
2.后端接受文件上传数据时多文件使用数组接收
3.bean中标签id必须为multipartResolver
5.2 文件上传注意事项
- 文件命名问题, 获取上传文件名,并解析文件名与扩展名
- 文件名过长问题
- 文件保存路径
- 重名问题
@RequestMapping(value = "/fileupload") //参数中定义MultipartFile参数,用于接收页面提交的type=file类型的表单,要求表单名称与参数名相同 public String fileupload(MultipartFile file,MultipartFile file1,MultipartFile file2, HttpServletRequest request) throws IOException { System.out.println("file upload is running ..."+file); // MultipartFile参数中封装了上传的文件的相关信息 // System.out.println(file.getSize()); // System.out.println(file.getBytes().length); // System.out.println(file.getContentType()); // System.out.println(file.getName()); // System.out.println(file.getOriginalFilename()); // System.out.println(file.isEmpty()); //首先判断是否是空文件,也就是存储空间占用为0的文件 if(!file.isEmpty()){ //如果大小在范围要求内正常处理,否则抛出自定义异常告知用户(未实现) //获取原始上传的文件名,可以作为当前文件的真实名称保存到数据库中备用 String fileName = file.getOriginalFilename(); //设置保存的路径 String realPath = request.getServletContext().getRealPath("/images"); //保存文件的方法,指定保存的位置和文件名即可,通常文件名使用随机生成策略产生,避免文件名冲突问题 file.transferTo(new File(realPath,file.getOriginalFilename())); } //测试一次性上传多个文件 if(!file1.isEmpty()){ String fileName = file1.getOriginalFilename(); //可以根据需要,对不同种类的文件做不同的存储路径的区分,修改对应的保存位置即可 String realPath = request.getServletContext().getRealPath("/images"); file1.transferTo(new File(realPath,file1.getOriginalFilename())); } if(!file2.isEmpty()){ String fileName = file2.getOriginalFilename(); String realPath = request.getServletContext().getRealPath("/images"); file2.transferTo(new File(realPath,file2.getOriginalFilename())); } return "page.jsp"; }
5.4 Restful风格配置
5.4.1 Rest
- Rest( REpresentational State Transfer) 一种网络资源的访问风格,定义了网络资源的访问方式
- 传统风格访问路径
http://localhost/user/get?id=1
http://localhost/deleteUser?id=1 - Rest风格访问路径
http://localhost/user/1 - Restful是按照Rest风格访问网络资源
- 优点
隐藏资源的访问行为,通过地址无法得知做的是何种操作
书写简化
5.4.2 Rest行为约定方式
GET(查询) http://localhost/user/1 GET
POST(保存) http://localhost/user POST
PUT(更新) http://localhost/user PUT
DELETE(删除) http://localhost/user DELETE
注意:上述行为是约定方式,约定不是规范,可以打破,所以称Rest风格,而不是Rest规范
5.4.3 Restful开发入门
//设置rest风格的控制器 @RestController //设置公共访问路径,配合下方访问路径使用 @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"; } }
<!--配置拦截器,解析请求中的参数_method,否则无法发起PUT请求与DELETE请求,配合页面表单使用--> <filter> <filter-name>HiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>HiddenHttpMethodFilter</filter-name> <servlet-name>DispatcherServlet</servlet-name> </filter-mapping>
开启SpringMVC对Restful风格的访问支持过滤器,即可通过页面表单提交PUT与DELETE请求
页面表单使用隐藏域提交请求类型,参数名称固定为_method,必须配合提交类型method=post使用
<form action="/user/1" method="post"> <input type="hidden" name="_method" value="PUT"/> <input type="submit"/> </form>
Restful请求路径简化配置方式
@RestController public class UserController { @RequestMapping(value = "/user/{id}",method = RequestMethod.DELETE) public String restDelete(@PathVariable String id){ System.out.println("restful is running ....delete:"+id); return "success.jsp"; } }
5.5 postman工具安装与使用
postman 是 一款可以发送Restful风格请求的工具,方便开发调试。首次运行需要联网注册
面试题
spring里面用到了哪些设计模式?
- 代理模式
- 工厂模式
- 单例模式
- 责任链模式
- 模板模式: 模版方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤
https://www.cnblogs.com/Adam-Ye/p/13638784.html
拦截器和过滤器的区别
过滤器是web核心三大组件之一,可以增强所有的请求和响应。
拦截器是springmvc的一个特有功能,理论上只能增强处理器(处理器:controller中的方法),底层是AOP技术。