代码计数器小Demo

代码审核标准

可以计算有效代码行数:

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代码\JSP
			int 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里面可能嵌入JavaScript
	public 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代码\JSP
			int 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)换成@




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值