我有以下代码块可以正常工作:
<%@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来使这段代码有效?
答案 0 :(得分:7)
普通的JSP源代码本身已经放在一个巨大的try-catch块中。每个普通的scriptlet <% %>
都将成为其中的一部分,因此您无需显式捕获异常。但是,方法定义<%! %>
将被置于标准try-catch的外,因此您必须自己处理异常。
毋庸置疑,这不是最好的做法。而是将Java代码放在真正的Java类中。出于这个特殊目的,我认为EL功能非常有用。另请参阅How to avoid Java code in JSP files?
答案 1 :(得分:1)
不同之处在于,当您将代码封装在方法中时,必须传播或处理在该方法中抛出的已检查异常。 JSP中的代码引发的异常会被servlet容器捕获并记录。
从长远来看,最好从JSP中删除Java代码。在短期内,您可以在第二个片段中更改md5hash方法的声明以抛出NoSuchAlgorithmException,这样您就可以在没有try-catch的情况下执行此操作并且不会使用异常。
顺便说一句,try-catch不仅没用,它可能有害,因为你可能会遇到问题而不会因为吃掉它而得到通知。