代码计数器小Demo

来源:互联网 发布:聊天软件开发 编辑:程序博客网 时间:2024/06/06 07:37

代码审核标准

可以计算有效代码行数:

JSP中的html<body></body>之间的代码可算,标签只算开头不算结尾,空行不算。 

JavaScrip代码:函数体中的处理代码可以算,函数的调用、函数的声明,变量的声明不算,空行不算。

Servlet:获取表单数据,转发界面不计算。处理业务逻辑的可算,空行不算。

技术组审核代码行数是件头疼的事情,做个demo帮助计算,以供参考。

以下为计算JSP页面以及嵌入其中的JavaScript代码行数的案例

public class CalJSP {private static int JSPsum = 0;private static int JavaScriptsum = 0;public static void main(String[] args) throws IOException {// String path = "C:\\Users\\Nan\\Desktop\\第二组\\Team04_Y-Z1代码\\JSP";String path = "C:\\Users\\Nan\\Desktop\\第二组\\Team06_Y-Z1代码\\JSP";// 这个sublen是用来缩短显示的文件长度的int sublen = path.length();GetSql(path, sublen);System.out.println("JSPsum:" + JSPsum + " JavaScriptsum:"+ JavaScriptsum);}public static String GetSql(String path, int sublen) throws IOException {File rootDir = new File(path);if (!rootDir.isDirectory()) {CalJSP calJSP = new CalJSP();int JSPCount = 0;int scriptCount = 0;String str = rootDir.getAbsolutePath();// 文件名C:\Users\Nan\Desktop\第二组\Team06_Y-Z1代码\JSPint len = str.length();// 查出来的路径是\,要多转义字符,使其表达为\\String path0 = calJSP.convertedPath(str, len);FileInputStream fis = new FileInputStream(path0);InputStreamReader isw = new InputStreamReader(fis, "GBK");BufferedReader br = new BufferedReader(isw);// 把filewriter的写法写成FileOutputStream形式String line = null;while ((line = br.readLine()) != null) {// 从<body>标签开始计数if (line.contains("<body")) {while ((line = br.readLine()) != null) {line = line.trim();// 去除空行 or >if (line.length() == 0 || line.length() == 1) {continue;}// 去除标签的注释else if (line.contains("<!--")) {// System.out.println(line);continue;} else if (line.contains("</body>")) {break;}// 标签只算开头不算结尾 即过滤掉单独行 为</>else if (line.charAt(0) == '<' && line.charAt(1) == '/'|| line.contains("<br>")) {// System.out.println(line);continue;} else if (line.contains("<script")) {scriptCount = calJSP.JavaScriptMethod(line, br,scriptCount);}JSPCount++;System.out.println(line);// 统计html的行数预览}}// <body>外的JavaScript行数else if (line.contains("<script")) {scriptCount = calJSP.JavaScriptMethod(line, br, scriptCount);}}br.close();System.out.println(path.substring(sublen) + "\t\tjsp行数:" + JSPCount+ " javascrip:" + scriptCount);JSPsum += JSPCount;JavaScriptsum += scriptCount;} else {String[] fileList = rootDir.list();for (int i = 0; i < fileList.length; i++) {path = rootDir.getAbsolutePath() + "\\" + fileList[i];GetSql(path, sublen);}}return null;}private String convertedPath(String str, int len) {String path0 = "";for (int i = 0; i < len; i++) {if (str.charAt(i) == '\\') {path0 += "\\\\";} else {path0 += str.charAt(i);}}return path0;}// 计算JavaScript的代码,因为jsp里面可能嵌入JavaScriptpublic int JavaScriptMethod(String line, BufferedReader br, int scriptCount)throws IOException {// 如果script在同一行,则返回if (line.contains("<script") && line.contains("</script>"))return scriptCount;while ((line = br.readLine()) != null) {line = line.trim();if (line.contains("</script>")) {break;}// 去掉注释(第4组)else if (line.contains("<!--")) {continue;}// 去除}、})、}); or {、],、[、);else if (line.contains("}") && line.length() <= 4|| line.length() <= 2) {// System.out.println(line);continue;}// 去除JavaScript的注释代码else if (line.length() >= 2 && line.charAt(0) == '/'&& line.charAt(1) == '/') {// System.out.println(line);continue;}// 去除变量的声明else if (line.contains("var") && !line.contains("=")) {// System.out.println(line);continue;}scriptCount++;// System.out.println(line);// 输出script文本}return scriptCount;}}


以下为计算servlet页面代码行数的案例

public class CalServlet2 {private static int Servletsum = 0;public static void main(String[] args) throws IOException {// String path = "C:\\Users\\Nan\\Desktop\\第二组\\Team04_Y-Z1代码\\JSP";String path = "C:\\Users\\Nan\\Desktop\\第二组\\Team06_Y-Z1代码\\Servlet或Action";// 这个sublen是用来缩短显示的文件长度的int sublen = path.length();GetSql(path, sublen);System.out.println("ServletSum:" + Servletsum);}public static String GetSql(String path, int sublen) throws IOException {File rootDir = new File(path);if (!rootDir.isDirectory()) {CalServlet2 calServlet2 = new CalServlet2();int ServletCount = 0;String str = rootDir.getAbsolutePath();// 文件名C:\Users\Nan\Desktop\第二组\Team06_Y-Z1代码\JSPint len = str.length();// 查出来的路径是\,要多转义字符,使其表达为\\String path0 = calServlet2.convertedPath(str, len);FileInputStream fis = new FileInputStream(path0);InputStreamReader isw = new InputStreamReader(fis, "GBK");BufferedReader br = new BufferedReader(isw);// 把filewriter的写法写成FileOutputStream形式String line = null;while ((line = br.readLine()) != null) {line = line.trim();if (line.contains("import") || line.contains("package")) {continue;}// 去除空行 or {、}else if (line.length() == 0 || line.length() == 1) {continue;}// 正常的注释//else if (line.length() >= 2 && line.charAt(0) == '/'&& line.charAt(1) == '/') {// 去除注释continue;}// eg. /* ...... */else if ((line.contains("/*") && line.contains("*/"))) {// System.out.println(line);// 打印出/*一行*/ 和 /*多行continue;}// eg./* 多行 */else if (line.contains("/*")) {while ((line = br.readLine()) != null) {if (line.contains("*/")) {// System.out.println(line);break;}continue;}continue;// 过滤"*/"} else if (line.contains("request.getParameter")|| line.contains("getRequestDispatcher")|| line.contains("System.out.println")) {continue;}ServletCount++;//System.out.println(line);// 输出servlet的有效行}br.close();System.out.println(path.substring(sublen) + "\t\tservlet行数:"+ ServletCount);Servletsum += ServletCount;} else {String[] fileList = rootDir.list();for (int i = 0; i < fileList.length; i++) {path = rootDir.getAbsolutePath() + "\\" + fileList[i];GetSql(path, sublen);}}return null;}private String convertedPath(String str, int len) {String path0 = "";for (int i = 0; i < len; i++) {if (str.charAt(i) == '\\') {path0 += "\\\\";} else {path0 += str.charAt(i);}}return path0;}}


基本的需求是可以实现,但有个别细节还未充分完善。(更新于160115-02:30)


作者: @nanphonfy
Email:  nanphonfy(Nfzone)gmail.com 请将(Nfzone)换成@




0 0