2010-12-07 73 views
1

我有下面的代碼塊工作得很好:代碼要求在JSP聲明部分嘗試/ catch但不在scriptlet部分?

<%@page import="java.util.*" %> 
<%@page import="java.security.*" %> 

<% 
String str = "A string to hash."; 
MessageDigest md = MessageDigest.getInstance("MD5"); 
md.update(str.getBytes()); 
byte[] digest = md.digest(); 
StringBuffer hexString = new StringBuffer(); 
for (int i = 0, j = digest.length; i < j; i++) { 
    String tmp = Integer.toHexString(0xFF & digest[i]); 
    if (tmp.length() < 2) { 
     tmp = "0" + tmp; 
    } 

    hexString.append(tmp); 
} 

out.println(hexString.toString()); 
%>

當我嘗試了打破哈希碼進入定義MessageDigest對象時,我得到了一個「拋出:NoSuchAlgorithmException」錯誤的方法:

<%@page import="java.util.*" %> 
<%@page import="java.security.*" %> 

<% 
String str = "A string to hash"; 
String md5string = md5hash(str); 

out.println(md5string); 
%> 

<%! 
public String md5hash(String str) { 
    MessageDigest md = MessageDigest.getInstance("MD5"); 

    md.update(str.getBytes()); 
    byte[] digest = md.digest(); 
    StringBuffer hexString = new StringBuffer(); 
    for (int i = 0, j = digest.length; i < j; i++) { 
     String tmp = Integer.toHexString(0xFF & digest[i]); 
     if (tmp.length() < 2) { 
      tmp = "0" + tmp; 
     } 

     hexString.append(tmp); 
    } 

    return hexString.toString(); 
} 
%>

爲了讓JSP編譯,我不得不修改它,像這樣:

<%@page import="java.util.*" %> 
<%@page import="java.security.*" %> 

<% 
String str = "A string to hash"; 
String md5string = md5hash(str); 

out.println(md5string); 
%> 

<%! 
public String md5hash(String str) { 
    MessageDigest md = null; 

    try { 
     md = MessageDigest.getInstance("MD5"); 
    } catch (NoSuchAlgorithmException e) {} 

    md.update(str.getBytes()); 
    byte[] digest = md.digest(); 
    StringBuffer hexString = new StringBuffer(); 
    for (int i = 0, j = digest.length; i < j; i++) { 
     String tmp = Integer.toHexString(0xFF & digest[i]); 
     if (tmp.length() < 2) { 
      tmp = "0" + tmp; 
     } 

     hexString.append(tmp); 
    } 

    return hexString.toString(); 
} 
%>

爲什麼我有一個無用的try/catch增加使這個代碼工作?

回答

7

正常的JSP源代碼本身已經放置在一個巨大的try-catch塊中。每個普通的scriptlet將成爲它的一部分,所以你不需要明確地捕獲異常。但是,方法定義<%! %>將被放置在之外標準try-catch,因此您必須自己處理異常。

不用說,這不是最佳實踐。而是將Java代碼放入真正的Java類中。爲了這個特殊的目的,我認爲EL功能非常有用。另請參見How to avoid Java code in JSP files?

+0

你首先回答了「爲什麼」,所以當我被允許時我會接受這個答案。我儘可能避免編寫「真正的」Java類,因爲它們必須進行編譯,並且必須重新啓動服務器才能接收它們。 – 2010-12-07 19:14:01

+1

小技巧是記住正常的scriptlet是一個返回頁面內容的巨大方法的一部分。它有一個試試看,你的<%!方法不。設置你的容器離開生成的.java文件,以更好地瞭解發生了什麼。 – 2010-12-07 19:15:10

1

不同之處在於,當您將代碼封裝在方法中時,檢查在該方法中拋出的異常必須傳播或處理。由JSP中的代碼引發的異常被servlet容器捕獲並記錄。

從長遠來看,最好從JSP中刪除Java代碼。在短期內,您可以在第二個代碼片段中更改md5hash方法的聲明,以引發NoSuchAlgorithmException,這樣您就可以在沒有try-catch的情況下執行此操作並且不會發生異常。

順便說一下,try-catch不僅毫無用處,而且可能是有害的,因爲您可能有問題,並且因爲發生異常而未得到通知。