Java 代码在JSP声明部分需要try/catch,但在scriptlet部分不需要?
我有以下代码块可以正常工作:Java 代码在JSP声明部分需要try/catch,但在scriptlet部分不需要?,java,jsp,Java,Jsp,我有以下代码块可以正常工作: <%@page import="java.util.*" %> <%@page import="java.security.*" %> <% String str = "A string to hash."; MessageDigest md = MessageDigest.getInstance("MD5"); md.update( str.getByt
<%@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块中。每个普通的scriptlet
都将成为它的一部分,因此您不需要显式捕获异常。但是,方法定义
将置于标准try catch之外,因此您必须自己处理异常
不用说,这不是最佳做法。而是将Java代码放在真正的Java类中。对于这个特殊的目的,我认为EL函数非常有用。另请参见普通JSP源代码本身已经放在一个巨大的try-catch块中。每个普通的scriptlet
都将成为它的一部分,因此您不需要显式捕获异常。但是,方法定义
将置于标准try catch之外,因此您必须自己处理异常
不用说,这不是最佳做法。而是将Java代码放在真正的Java类中。对于这个特殊的目的,我认为EL函数非常有用。另请参见区别在于,当您将代码封装在方法中时,必须传播或处理该方法中抛出的已检查异常。JSP中的代码引发的异常被servlet容器捕获并记录 从长远来看,最好从JSP中删除Java代码。在短期内,您可以更改第二个代码段中md5hash方法的声明,以抛出NoSuchAlgorithmException,这样您就不用try-catch,也不用吃掉异常
顺便说一句,try-catch不仅仅是无用的,它还有潜在的危害,因为您可能会遇到问题,并且由于异常被吃掉而无法得到通知。区别在于,当您将代码封装到方法中时,必须传播或处理该方法中抛出的已检查异常。JSP中的代码引发的异常被servlet容器捕获并记录 从长远来看,最好从JSP中删除Java代码。在短期内,您可以更改第二个代码段中md5hash方法的声明,以抛出NoSuchAlgorithmException,这样您就不用try-catch,也不用吃掉异常
顺便说一句,try-catch不仅仅是无用的,它还有潜在的危害,因为您可能会遇到问题,并且由于异常被吃掉而无法得到通知。您首先回答了“为什么”,因此在允许的情况下,我将接受此答案。我尽量避免编写“真正的”Java类,因为它们必须被编译,服务器必须重新启动才能获取它们。一个技巧是要记住,普通的scriptlet是返回页面内容的一个巨大方法的一部分。它有一个试一试的功能,您的@jsumners:idential IDE和服务器支持自动/热重新加载。例如,Eclipse+Glassfish在亚秒内完成这项工作。Tomcat需要更长的时间,但它也支持它。我相信情况就是这样。不过,我的环境自上而下都很糟糕。这样说吧,我有一个由5台服务器组成的集群来运行这个站点。环境非常脆弱,很难复制,因此我必须将其中一台服务器从公共访问中删除,并对其进行所有开发。您首先回答了“为什么”,因此我将在允许的情况下接受此答案。我尽量避免编写“真正的”Java类,因为它们必须被编译,服务器必须重新启动才能获取它们。一个技巧是要记住,普通的scriptlet是返回页面内容的一个巨大方法的一部分。它有一个试一试的功能,您的@jsumners:idential IDE和服务器支持自动/热重新加载。例如,Eclipse+Glassfish在亚秒内完成这项工作。Tomcat需要更长的时间,但它也支持它。我相信情况就是这样。不过,我的环境自上而下都很糟糕。这样说吧,我有一个由5台服务器组成的集群来运行这个站点。环境非常脆弱,很难复制,因此我必须从公共访问中删除其中一台服务器,并在其上进行所有开发。我让我的方法抛出异常,而不是使用try/catch。谢谢你的建议。我已经让我的方法抛出异常,而不是使用try/catch。谢谢你的建议。