java web 一

需求:可以使用在网页调用脚本打包,也可以添加修改打包配置

技术选型:spring mvc +vue

数据存储:项目功能十分简单,先期通过读写json文件来实现。后续看情况是否引入数据库

后台问题记录

1controller返回json数据

在controller上添加@ResponseBody的注解,并在servlet的配置中添加如下配置

    <mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
            <!-- 避免IE执行AJAX时,返回JSON出现下载文件 -->
            <bean id="fastJsonHttpMessageConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>application/json;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

2读写json文件

使用 com.alibaba.fastjson.JSON的jar包

/**
* 将文件序列化成对象,注意文件的编码也需要时UTF-8的编码格式
*/

String input = FileUtils.readFileToString(new File(Config.INSTANCE.getValue("dataSourcePath")), "UTF-8");
packages = JSON.parseObject(input, new TypeReference<ArrayList<PackageBean>>() {});
/**
* 将对象反序列化
*/
String str = JSON.toJSONString(dataSource);
/**
* 将json格式的数据写入文件,
*/
public static void WriteConfigJson(String filePath,String args) {

File file = new File(filePath);

if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
try {
file.delete();
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}

try {
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(file),"UTF-8");//注意文件的格式要和此处的编码格式一致
out.write(args);
out.flush();
out.close();
System.out.println("success...");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
}


3文件下载

    @RequestMapping(value="/download.do")
    public ResponseEntity<byte[]> download(HttpServletRequest request,
                                           HttpServletResponse response,
                                           ModelMap model)throws Exception {
        String filename=request.getParameter("addinName");
        String folderName=request.getParameter("folderName");
        //下载文件路径
        String path = Config.INSTANCE.getValue("addinExePath")+folderName;

        File file = new File(path + File.separator + filename);
        HttpHeaders headers = new HttpHeaders();
        //下载显示的文件名,解决中文名称乱码问题
        String downloadFielName = new String(filename.getBytes("UTF-8"),"iso-8859-1");
        //通知浏览器以attachment(下载方式)打开图片
        headers.setContentDispositionFormData("attachment", downloadFielName);
        //application/octet-stream : 二进制流数据(最常见的文件下载)。
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),
                headers, HttpStatus.CREATED);
    }

4执行bat脚本

    public void PackeAddin(String pinyinName, String displayName){
        String s;
        Process process;
        String cmd="cmd  /c start /b "+Config.INSTANCE.getValue("packageBatPath")+" "+displayName+" "+pinyinName;
        try {
            process = Runtime.getRuntime().exec(cmd);
            InputStream in=process.getInputStream();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in,"GBK"));//解决输出的时候中文乱码的情况
            while((s=bufferedReader.readLine()) != null){
                System.out.println(s);
            }
            in.close();
            bufferedReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

5 读取properties文件

使用读文件的方式来获取文件中的信息,并在获取数据之后进行重新编码就可以解决中文乱码的问题

    public String getValue(String key) {
//        InputStream input = getClass().getResourceAsStream("/application.properties");
        InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream("config.properties");//获取在resources目录下的properties文件

        try {
            if(input != null){
                prop.load(input);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            if (input != null) {
                try {
                    input.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        try {
            return prop == null ? null : new String(prop.getProperty(key).getBytes("ISO-8859-1"),"GBK");//重新编码,防止中文乱码
        }catch (Exception ex)
        {
            ex.printStackTrace();
        }
        return null;
    }

小结:对于刚入门的新手来说,java最大的难点在于各种中文乱码,所幸大部分问题都可以搜索出来,有了比较成熟的方案

 

posted @ 2018-01-23 16:25  jiataoqin  阅读(105)  评论(0编辑  收藏  举报