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最大的难点在于各种中文乱码,所幸大部分问题都可以搜索出来,有了比较成熟的方案