springmvc第4天(rest风格,文件上传)
rest风格
1,介绍
rest风格是一种架构风格,相比传统的在地址栏后面?参数名=参数值不一样,参数全部是/参数值1/参数值2/...来实现的
好处:可读性更好,使得项目架构清晰,并且更有利于使用缓存,同时相比之前的问号带参,不需要再写参数名(不会暴露参数名),这样也相对安全
说明
页面跳转需要使用反斜杠
Controller需要参数的话,要在方法入参前加一个@PathVariable注解(),并且在RequertMapping(value=/路径/{参数名1})
@PathVariable:开启rest风格接收参数
@RequestMapping(value="/view/{id}",method = RequestMethod.GET)
//@PathVariable:开启rest风格接收参数
public String userView(@PathVariable String id,Model model) {
文件上传控制器
springmvc-servlet配置
<!--文件上传控制器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- maxUploadSize:最大的上传字节数:单位:字节 -->
<property name="maxUploadSize" value="500000"></property>
<!-- 请求的编码格式,默认是iso8859-1,此处的设置必须和jsp页面上的pageEncoding一致 -->
<property name="defaultEncoding" value="UTF-8"/>
</bean>
前端页面添加标签
<!-- 上传证件照 -->
<div>
<label for="id_picpath">证件照:</label>
<input name="picpath" id="id_picpath" type="file" value="">
</div>
controller中有文件上传的新增功能
//有文件上传的用户新增功能(上传到服务器当中>tomcat)
@RequestMapping("/usersave")
public String userSave(User user,HttpSession session,HttpServletRequest request,
@RequestParam(value = "picpath",required = false) MultipartFile[] attach) {
//1.在数据库表中添加id_picpath字段 2.在实体类中添加id_picpath属性
String idPicpath=null;//图片的路径->往user对象中设置(用来保存数据的)
String workPicpath=null;
String errorInfo=null;
boolean flag=true;//用来作为一个上传的开关
//1.创建一个串串的文件夹->用来保存上传的图片/文件(如果是第一次上传,文件夹是不存在的)
String path=session.getServletContext().getRealPath("statics"+File.separator+"uploadFile"); //获取当前项目的路径,并且新增一个文件夹
//遍历图片数组
for(int i=0;i<attach.length;i++) {
if (!attach[i].isEmpty()) {//如果上传内容不为空,则进行相关的上传处理
log.info("上传的路径是"+path);
if(i==0) {
errorInfo="uploadFileError";
}
if(i==1) {
errorInfo="uploadWorkFileError";
}
//先获取上传原图片的名字和后缀
String oldName=attach[i].getOriginalFilename();//获取原名字
log.info("图片的原名是:"+oldName);
String suffix=FilenameUtils.getExtension(oldName);//获取后缀
log.info("图片的后缀是:"+suffix);
//1.判断上传的图片大小是否符合要求
int maxSize=300000; //限制为300kb
if (attach[i].getSize()>maxSize) {
request.setAttribute("errorInfo", "图片大小不得超过300kb!!");
flag=false;
return "useradd";
//equalsIgnoreCase:会自动忽略大小写
}else if ("jpg".equalsIgnoreCase(suffix)||"png".equalsIgnoreCase(suffix)||"webp".equalsIgnoreCase(suffix)) {
//创建新的图片名
String fileName=System.currentTimeMillis()+"."+suffix;
//
File file=new File(path,fileName);
if (!file.exists()) {
file.mkdirs();
}
try {
//正式上传:将attach上传到指定的file中
attach[i].transferTo(file);
} catch (Exception e) {
e.printStackTrace();
request.setAttribute("errorInfo", "上传失败");
flag=false;
return "useradd";
}
//将路径+新的图片名赋值给idPicpath变量
if(i==0) {
idPicpath=path+File.separator+fileName;
}
if(i==1) {
workPicpath=path+File.separator+fileName;
}
}else {
request.setAttribute("errorInfo", "图片格式不正确");
flag=false;
return "useradd";
}
}
}
if(flag==true) {
//log.info("进入到用户保存..."+user);
int creatBy=((User)session.getAttribute("user")).getId();
user.setCreatedBy(creatBy);
//设置创建时间
user.setCreationDate(new Date());
//将idPicpath设置到user对象中
user.setIdPicpath(idPicpath);
//将workPicpath
user.setWorkPicpath(workPicpath);
int num=userService.addUser(user);
if (num>0) {
System.out.println("111");
return "redirect:/user/userList";
}
}
return "useradd";
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?