V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
supuwoerc
V2EX  ›  问与答

请教下后端 Java 大佬

  •  
  •   supuwoerc · 2021-02-10 22:03:30 +08:00 · 1085 次点击
    这是一个创建于 1163 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近小弟在家自学 java,刚刚自己搭建了一个 Maven 的 javaweb 项目,刚刚写了几个接口,遇到了一些问题,希望大家能指导下我,提前感谢~~

    问题 list:

    1.文件上传一般是放在什么地方呢?我现在是写了个 properties,里面配置了绝对路径,但是网上有的说存到 WEB-INF 下的 upload 文件夹,我也试了一下,发现路径怎么写都不对,不知道应该怎么写?(我想这文件应该不必存储到项目下,但是还是想弄清楚怎么将文件写入 WEB-INF/upload 下)

    2.在封装 json 的时候,上传 markdown 我将 markdown 实例写到了 json 的 data 里面,但是上传其他文件的时候我想起来一个问题,难道还要再封装一个 Bean 来描述文件信息吗? (之所以要存 markdown 信息是因为我想回显上传内容),不知道实际开发中大佬们怎么做的?

    3.现在还是不太清楚 Servlet 和 service 中代码怎么写,总是写着写着发现 Servlet 全干完了,Dao 中代码倒比较清晰,但是 Servlet 和 service 区分模糊的很,希望大佬能解释下。

    上传文件的代码如下:

    @WebServlet("/uploadFile/*")
    public class UploadFile extends BaseServlet {
        private UploadFileService uploadFileService = new UploadFileServiceImpl();
        public void upload(HttpServletRequest request, HttpServletResponse response) {
            response.setContentType("application/json;charset=utf-8;");
            boolean isMultipart = ServletFileUpload.isMultipartContent(request);  //判断 enctype 属性是否是 multipart/form-data
            try {
                if (isMultipart) {
                    FileItemFactory factory = new DiskFileItemFactory();  //工厂实例
                    ServletFileUpload upload = new ServletFileUpload(factory);  //ServletFileUpload 实例依赖于 FileItemFactory 工厂
                    List<FileItem> itemList = upload.parseRequest(request);  //解析表单字段,封装成一个 FileItem 实例的集合
                    Iterator<FileItem> iterator = itemList.iterator();  //迭代器
                    while (iterator.hasNext()) {
                        FileItem fileItem = iterator.next();  //依次解析每一个 FileItem 实例,即表单字段
                        if (!fileItem.isFormField()) {
                            //文件表单字段
                            String fileUpName = fileItem.getName();  //用户上传的文件名
                            Properties properties = new Properties();
                            properties.load(UploadFile.class.getClassLoader().getResourceAsStream("client.properties"));
                            String fileDir = properties.getProperty("fileDir");
                            //默认存到 WEB-INF 下的 upload 文件夹  (构建项目后存到 target 目录下)
                            String pathName = UploadFile.class.getClassLoader().getResource("").getPath().replace("classes", "upload");
                            if (fileDir != null && !("".equals(fileDir))) {
                                pathName = fileDir;
                            }
                            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
                            String dirName = pathName+ File.separator + simpleDateFormat.format(new Date());
                            File rebornDir = new File(dirName);
                            if (!rebornDir.isDirectory()) {
                                rebornDir.getAbsolutePath();
                                rebornDir.mkdirs();        //不存在目录时创建目录
                            }
                            File file = new File(rebornDir + File.separator + fileUpName);  //保存的文件
                            System.out.println(file);
                            if (!file.exists()) {
                                file.getAbsolutePath();
                                file.createNewFile();    //创建文件
                            }
                            fileItem.write(file);  //写入,保存到目标文件
                            String prefix = fileUpName.substring(fileUpName.lastIndexOf(".") + 1);
                            //如果是 markdown 文件的话需要存到数据库里面,其他格式的文件存到文件夹里面就行
                            Markdown addResult = null;
                            if("md".equals(prefix)){
                                addResult = uploadFileService.uploadMarkdownFile(file, "ceshi", 2, file.getPath());
                            }else{
                                addResult = null;
                            }
                            ResultInfo resultInfo = new ResultInfo();
                            resultInfo.setSuccess(true);
                            resultInfo.setMessage("上传成功!");
                            resultInfo.setData(addResult);
                            writeValue(response, resultInfo);
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("文件上传出现异常");
                ResultInfo resultInfo = new ResultInfo();
                resultInfo.setSuccess(false);
                resultInfo.setMessage("上传失败!");
                resultInfo.setData(null);
                writeValue(response, resultInfo);
            }
        }
    }
    
    
    4 条回复    2021-02-11 22:36:10 +08:00
    serverABCD
        1
    serverABCD  
       2021-02-11 00:02:02 +08:00 via iPhone
    直接用 Spring 吧,你写的这些以后工作基本用不到,直接背一背知识点面试用就行了。
    CCIP
        2
    CCIP  
       2021-02-11 00:45:01 +08:00
    业务逻辑写到 service 参数校验放到 Servlet
    cslive
        3
    cslive  
       2021-02-11 14:03:09 +08:00
    Servlet 了解会用就行,后面直接 springboot 吧,另外这个上传路径放在哪都行,你看的教程太老了,找点 springbootj 教程看
    night98
        4
    night98  
       2021-02-11 22:36:10 +08:00
    Servlet 知道个大概就行了,把 httprequest 和 response 对象了解清楚就行,然后看 springmvc 就行
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2820 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 11:39 · PVG 19:39 · LAX 04:39 · JFK 07:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.