我有下面的代码块可以正常工作:
<%@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才能使此代码正常工作?
普通的JSP源代码本身已经放置在一个巨大的try-catch块中。每个普通脚本<% %>都将成为其中的一部分,因此您无需显式捕获异常。但是,方法定义<%! %>将放置 在 标准try-catch之外,因此您必须自己处理异常。
<% %>
<%! %>
不用说这不是最佳实践。而是将Java代码放在真实的Java类中。为此,我认为EL功能非常有用。