我有下面的代碼塊工作得很好:代碼要求在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增加使這個代碼工作?
你首先回答了「爲什麼」,所以當我被允許時我會接受這個答案。我儘可能避免編寫「真正的」Java類,因爲它們必須進行編譯,並且必須重新啓動服務器才能接收它們。 – 2010-12-07 19:14:01
小技巧是記住正常的scriptlet是一個返回頁面內容的巨大方法的一部分。它有一個試試看,你的<%!方法不。設置你的容器離開生成的.java文件,以更好地瞭解發生了什麼。 – 2010-12-07 19:15:10