7

品質問題の認識を高めるために、管理者向けにJava / JSP Webアプリケーション(もちろんレガシー;-)に関する最初の広範な静的コード分析レポートを作成しています。メインのJavaコードは問題ありません。PMD、Checkstyle、Classcycleなどの無料のツールがたくさんあります。

しかし、JSPはどうですか?(残念ながら)JSPにはかなりのJavaコードが埋め込まれており、これを分析する必要があります。JSPを静的に分析するには、どのツールを使用できますか、またはどのプロセスに従う必要がありますか?

  • JSPをカバーするPMD5の新機能について知っていますが、調査する価値はありますか?
  • どういうわけかJSPのソースサーブレットを生成し、基本的なJava分析ツールを使用することができます。そうであれば、JSPのJavaソースを取得する最も簡単な方法は何ですか?
4

4 に答える 4

3

非常に単純なメトリックが目的に合っている場合があります。「このjspにはスクリプトレットが含まれていますか」または「行数スクリプトレットコード」は、grepなどと一緒に作成できるはずです。

あなたが物事を修正するための時間のために経営陣に売り込みをしているなら、これを超えた詳細は何か価値を追加しますか?

- - 編集 - -

簡単なグーグルは、これを使用してjspsについて上記で提案した統計を抽出できる可能性があることを示唆しています

http://www.semanticdesigns.com/Products/SearchEngine/

この質問の答えとして提案されたのはどれですか

JSPプロジェクトのサイズを測定するための良い方法は何でしょうか?

于 2013-03-14T11:44:54.057 に答える
3

ヘンリーが正しく指摘したように、JSPの適切なメトリックは「行数スクリプトレットコード」です。これは、いくつかの正規表現を使用して実行できます。

コードの行数とHTMLの行数(=LoC_Java/LoC_Html)の比率が最も表現力に富んでいることがわかりました。この数値が小さいほど良いです。20%または30%までの比率は問題ないように見えますが、50%を超える値または1を超える値でも問題はありません。私の分析では、比率が最大6のJSPが見つかりました(本当に悪い)。

また、ページディレクティブの数は大まかな洞察を提供します。この数値は主に輸入によるものであるため、数値が大きいほど結合度が高いことを示します。

同様のメトリックは、JSPルールセットを備えたPMDでも利用できます。これはHTMLページ分析に基づいており、スクリプトレットの数、スクリプトレットの長さ、重複したインポートとエンコードの問題、およびプレーンなHTMLアンチパターンを報告できます。

于 2013-03-23T19:17:34.413 に答える
1

苦く聞こえたくないのですが、何がこれから抜け出そうとしているのでしょうか?

基盤は実際には非常に悪い習慣であるため、JSPでコード品質メトリックを取得することは実際には役に立たないと思います(そして私は間違っているかもしれません)。

個人的には、JSPからMVCまたはDCIフレームワークにロジックを移行する方法を理解するために、リソースや時間を投資しようと思います。

于 2013-03-14T10:52:03.727 に答える
0

正直に言うと、この分析では(可能であれば)何も得られません。JSP内の混同されたコードはただひどいです。唯一の解決策は、MVCフレームワークに最初に移行できない場合は、少なくともサービスクラスでそれらを移動することです。後でそれらのサービスクラスを再利用して、より簡単に分析することができます。

最近作業した苦痛なjspコードの例:システムは9年前のものです

oListCode.setDB(driverclass, databaseurl, databasetype.intValue());
java.util.Vector oVecActiveStatusListCodes = oListCode.getListCodes(13, user.getAdminId());


java.text.DecimalFormat dformat = new java.text.DecimalFormat("###0.00");
java.text.DecimalFormat averageformat = new java.text.DecimalFormat("###0.##");

java.util.Vector userDirectoryVector = new java.util.Vector();

String searchoptionvalue = request.getParameter("iscombinesearch");
if (searchoptionvalue != null && searchoptionvalue.equals("on")) {
    java.util.Vector oVectorStudents = (java.util.Vector) session.getAttribute("studentsearchresult");

    if (oVectorStudents != null) {
        oVector.addAll(oVectorStudents);
    }
}


java.util.Vector<StatusSequenceInfo> oStaSeqVector = student.getStatusSequence(user.getAdminId());
java.util.Vector<StatusSequenceInfo> oEnrollStatusvecto = student.getProgramStatus(user.getAdminId());


String parameterList = "?columns=" + java.net.URLEncoder.encode(columns, "UTF-8") +
                    "&activestatus=" + activestatus +
                    "&studenttype=" + studenttype +
                    "&faith=" + faith +
                    "&race=" + race +
                    "&levelid=" + levelid +
                    "&levelidlist=" + levelidlist +
                    "&curriculumid=" + curriculumid +
                    "&programmeid=" + programmeid +
                    "&programmelevelid=" + programmelevelid +
                    "&semesterid=" + semesterid +
                    "&sex=" + sex +
                    "&idnumber=" + java.net.URLEncoder.encode(idnumber, "UTF-8") +
                    "&batchnumber=" + java.net.URLEncoder.encode(batchnumber, "UTF-8") +
                    "&firstname=" + java.net.URLEncoder.encode(firstname, "UTF-8") +
                    "&middlename=" + java.net.URLEncoder.encode(middlename, "UTF-8") +
                    "&lastname=" + java.net.URLEncoder.encode(lastname, "UTF-8") +
                    "&nationality=" + java.net.URLEncoder.encode(nationality, "UTF-8") +
                    "&address=" + java.net.URLEncoder.encode(address, "UTF-8") +
                    "&city=" + java.net.URLEncoder.encode(city, "UTF-8") +
                    "&state=" + java.net.URLEncoder.encode(state, "UTF-8") +
                    "&zip=" + java.net.URLEncoder.encode(zip, "UTF-8") +
                    "&homephone=" + homephone +
                    "&email=" + email +
                    "&advisor=" + java.net.URLEncoder.encode(advisor, "UTF-8") +
                    "&dob=" + dob +
                    "&visaexpiredate=" + java.net.URLEncoder.encode(visaexpiredate, "UTF-8") +
                    "&regstatus=" + regStatus +
                    "&regstartDate=" + java.net.URLEncoder.encode(regstartDate, "UTF-8") +
                    "&regendDate=" + java.net.URLEncoder.encode(regendDate, "UTF-8") +
                    "&shashmap=" + shashmap +
                    "&studentcount=" + studentcount + extendedurl;

String paginationLink = "admin_search_student_result.jsp" + parameterList;
long totalpage = new Double(Math.ceil(new Double(studentcount).doubleValue()/number_of_student)).longValue();//for pagination

String downloadStudentLink = "download_search_student_result.jsp" + parameterList + "&number_of_student=" + studentcount;
String printStudentLink = "admin_print_search_student_result.jsp" + parameterList + "&from_row=" + from_row;

%>


<html <%if (user.getLanguageId()>0 && oDictionary.getLanguageInfo(user.getLanguageId()).getDirection()==1) out.print("dir='rtl'");%>>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-15"/>
<title><%if (user.getRole()==6) out.print(oDictionary.getTranslatedWord(userLanguageId, "Sub-Administrator", adminId)); else out.print(oDictionary.getTranslatedWord(userLanguageId, "Administrator", adminId));%></title>
<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<meta name="Microsoft Theme" content="blocks 000, default">
<meta name="Microsoft Border" content="tlb, default">

</head>


<body bgcolor="#FFFFFF" text="#000000" link="#CC0000" vlink="#CC0000" alink="#CC0000" leftmargin=5 topmargin=5 marginheight="0" marginwidth="0" onResize="if (navigator.family == 'nn4') window.location.reload()">


<p>
<table width=100%>
<td>
<img src="images/search.gif"> <b><font color="#666666" face="Arial, Arial, Helvetica" size="5"><%=oDictionary.getTranslatedWord(userLanguageId, "Search Result", adminId)%> &nbsp;&nbsp;</font></b>
</td>
<td align=right>
<table>
<%if (user.getRole()==4 || (user.getRole()==6 && (user.getOptions().indexOf("[STUDENT_RECORDS=") != -1 ))) {%>
<td>
&nbsp;<img src="images/write.gif"> <font face=arial size=2 color="#666666"><b><a href="new_student.jsp"><%=oDictionary.getTranslatedWord(userLanguageId, "New Student", adminId)%></a></font></b>
</td>
<%} %>
<td>
&nbsp;<img src="images/search.gif"> <font face=arial size=2 color="#666666"><b><a href="admin_search_student.jsp"><%=oDictionary.getTranslatedWord(userLanguageId, "Search Student", adminId)%></a></font></b>
</td>
<td>
&nbsp;<img src="images/read.gif"> <font face=arial size=2 color="#666666"><b><a href="students.jsp"><%=oDictionary.getTranslatedWord(userLanguageId, "Student Directory", adminId)%></a></font></b>
</td>
</table>
</td>
</table>


<%if (user.getRole()==4 || (user.getRole()==6 && (user.getOptions().indexOf("[STUDENT_RECORDS=F]") != -1 || user.getOptions().indexOf("[STUDENT_RECORDS=V]") != -1))) {%>

<table width="100%">
<tr>
<td>
    <%@ include file="paginate.jsp" %>
</td>

<td align="right">
<table>
<tr>
<td>
<img src="images/download.jpg">
<a href="<%=downloadStudentLink%>" target=_><font face=arial size=-1>[<%=oDictionary.getTranslatedWord(userLanguageId, "Download search result", adminId)%>]</font></a>
</td>
<td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<a href="<%=printStudentLink%>" target=_><img border=0 src="images/printer.gif"><font face=arial size=-1>[<%=oDictionary.getTranslatedWord(userLanguageId, "Print search result", adminId)%>]</font></a>
</td>
</tr>
</table>
</tr>
</table>

</font>
<table border="0" cellpadding="1" cellspacing="0" style="border-collapse: collapse" width="100%" id="AutoNumber1" bordercolordark="#666666" bordercolorlight="#999999">

<%if (!columns.equals("")) {%>

<tr>
<td nowrap bgcolor="<%=user.getColor()%>" bordercolor="#CC3300"><font face="Arial, Arial, Helvetica" size=2><b><%=oDictionary.getTranslatedWord(userLanguageId, "Student Name", adminId)%></b></font></td>
<%for (int i=0; i<oVectorColumns.size(); i++) {%>
<td nowrap bgcolor="<%=user.getColor()%>" bordercolor="#CC3300"><font face="Arial, Arial, Helvetica" size=2><b><%=oVectorColumns.get(i)%></b></font></td>
<%}%>
</tr>

<%

    for (StudentInfo studentinfo:oVector) {

        userDirectoryVector.add(new Long(studentinfo.getStudentId()));

        java.util.HashMap oHashMapProfielValues = oExtendedProfile.getProfileFieldValues(studentinfo.getStudentId(), 1, user.getAdminId());
        java.util.Vector oVectorStudentAllPrograms = registration.getStudentAllProgrammes(studentinfo.getStudentId(), user.getAdminId());

        String programname = "";
        String levelname = "";
        String programlevelname = "";
        String RegistrationDate="";

だから、分析するのではなく、これらをクリーンアップする方が良いのではないでしょうか?答えはイエスだと思います

于 2013-03-14T11:12:35.890 に答える