面向对象编程学习(第三天)
哈哈,自己有点太心急了。这个项目要说实际情况的话挺适合我的,作为java的入门学习,但我老觉得这个里边东西有点些许达不到我心里想要的,但我不能一口一个胖子吧,慢慢来,一定要把这个项目重写完,就算写完啥也不会也没关系有个大致了解也很不错,,加油加油加油!原项目作者用的是比较老套的方法因为导入的包是Java.io我问过了ai,说是比较老套的方法,目前有NIO等方法可优化解决。果然写的代码不会白费,今天
果然写的代码不会白费,今天感觉写业务的时候能稍微自己挤一点东西出来,虽然后来依旧拉跨,但还是有一点思路在的;
今天主要编写文件的上传下载功能,轮播图的目标图片显示功能,轮播图的修改更新功能,
1:文件的下载功能(可满足轮播图的加载):
@RequestMapping("/download")
@IgnoreAuth
public ResponseEntity<byte[]> download(@RequestParam String fileName){
try{
File path=new File(ResourceUtils.getURL("classpath:static").getPath());
if(!path.exists()){
path=new File("");
/*这里将path设置为空那这里path=“/static”;
这里叫做兜底机制,放置后续路径拼接出错;
*/
}
File upload=new File(path.getAbsolutePath(),"/file/");
if(!upload.exists()){
upload.mkdirs();
}
/* 这两个判断的目的都是为了保证后续文件操作有可用的路径,是一种健壮性处理方式*/
File file=new File(upload.getAbsolutePath()+"/"+fileName);
if(file.exists()){
/*if(!fileService.canRead(file,SessionManger.getSessionUser())){
getResponse().sendError(403);
}*/
HttpHeaders headers =new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setContentDispositionFormData("attachment",fileName);
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED);
}
//FileUtils是apache的一个工具包而不是自己编写的工具类
} catch (IOException e) {
e.printStackTrace();
}
return new ResponseEntity<byte[]>(HttpStatus.INTERNAL_SERVER_ERROR);
}
原项目作者用的是比较老套的方法因为导入的包是Java.io我问过了ai,说是比较老套的方法,目前有NIO等方法可优化解决
(1):首先定义download方法这个方法返回值为ResponseEntity这个类是spring已经包装好的,里面用一个String字符串来接收参数
(2):通过一个try-catch方法,指定静态路径搜索服务器自有的静态资源,如果没有就返回路径为/static和/file/并且定义响应头的格式
重点:
headers.setContentDispositionFormData("attachment",fileName);
这一行定义了浏览器该如何处理这个响应,是确保它作为一个附件进行下载,而不是进行在线展示
最后返回响应格式,是一个二进制数据;
2:轮播图的目标图片显示功能
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id){
Config config=configService.selectView(new EntityWrapper<Config>().eq("id",id));
return R.ok().put("data",config);
}
这个就很简单用一个id去接收参数,然后通过ConfiService里定义的selectVIew方法进行查找返回
方法参数内还是用一个实体构造器来编写SQL语句
sql语句:WHERE config.id="id"(这个id就是浏览器传过来的url参数)
package com.palop.dao;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.palop.entity.Config;
import com.palop.entity.view.ConfigView;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface ConfigDao extends BaseMapper<Config> {
ConfigView selectView(@Param("ew") Wrapper<Config> wrapper);
}
对应的dao层代码,@Param注解可以删去,因为我上边代码并没有将实体构造器实例化为ew
然后xml文件中还是老一套:\
<select id="selectView" resultType="com.palop.entity.view.ConfigView"> SELECT config.* FROM config config <where>1=1 ${ew.sqlSegment}</where> </select>
就是构建一个完整的sql语句去查询具体的底层实现目前不了解,还是很模糊,但可以了解的是Dao层和Resource中的mapper就是JavaBean和DataBase沟通的桥梁;;;
3:轮播图的修改更新功能
@RequestMapping("/update")
@Transactional
@SysLog("修改轮播图")
public R update(@RequestBody Config config,HttpServletRequest request){
configService.updateById(config);
return R.ok();
}
其中@Transactional注释的作用是:
声明该方法需要在事务环境下执行。
特性:
如果方法执行过程中发生异常,事务会回滚。
如果没有异常,事务正常提交。
适用场景:适用于数据库写操作(如更新、删除),确保数据一致性。、
然后用一个Config实体类去接收请求中的负载是一个json文件,{
- addtime: 1743691696000
- id: 3
- name: "swiper3"
- value: "file/1750264200050.jpg"
}
然后运用的这个updateById方法是IService里已经封装好的方法
,哈哈,自己有点太心急了。这个项目要说实际情况的话挺适合我的,作为java的入门学习,但我老觉得这个里边东西有点些许达不到我心里想要的,但我不能一口一个胖子吧,慢慢来,一定要把这个项目重写完,就算写完啥也不会也没关系有个大致了解也很不错,,加油加油加油!!!!
更多推荐
所有评论(0)