代码审核标准
可以计算有效代码行数:
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)换成@