【问题标题】:Code requires try/catch in JSP declaration section but not in the scriptlet section?代码在 JSP 声明部分需要 try/catch,但在 scriptlet 部分不需要?
【发布时间】:2011-05-21 19:11:46
【问题描述】:

我有以下代码块可以正常工作:

<%@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 jsp


    【解决方案1】:

    不同之处在于,当您将代码封装在方法中时,必须传播或处理在该方法中抛出的已检查异常。 JSP 中的代码抛出的异常会被 servlet 容器捕获和记录。

    从长远来看,最好从 JSP 中删除 Java 代码。在短期内,您可以更改第二个 sn-p 中 md5hash 方法的声明以抛出 NoSuchAlgorithmException,这样您就可以不用 try-catch 并且不吃异常。

    顺便说一句,try-catch 不仅无用,而且还可能有害,因为您可能会遇到问题而不会因为异常被吃掉而收到通知。

    【讨论】:

    • 我已经让我的方法抛出异常,而不是使用 try/catch。谢谢你的建议。
    【解决方案2】:

    普通的 JSP 源代码本身已经放置在一个巨大的 try-catch 块中。每个普通的 scriptlet &lt;% %&gt; 都将成为它的一部分,因此您无需显式捕获异常。但是,方法定义 &lt;%! %&gt; 将被放置在标准 try-catch 之外,因此您必须自己处理异常。

    不用说,这不是最佳做法。而是将 Java 代码放在一个真正的 Java 类中。对于这个特定的目的,我认为 EL 函数非常有用。另见How to avoid Java code in JSP files?

    【讨论】:

    • 你先回答了“为什么”,所以当我被允许时,我会接受这个答案。我尽可能避免编写“真正的”Java 类,因为它们必须被编译,并且必须重新启动服务器才能获取它们。
    • 提示是要记住,普通 scriptlet 是返回页面内容的一个巨大方法的一部分。它有一个 try-catch,你的
    • @jsumners:不错的 IDE 和服务器支持自动/热重载。例如,Eclipse+Glassfish 在亚秒内完成。 Tomcat 需要更长的时间,但它也支持它。
    • 我确定是这样。不过,我的环境从上到下都很糟糕。这么说吧,我有一个由 5 台服务器组成的集群来运行这个站点。环境非常脆弱且难以复制,我必须从公共访问中删除其中一台服务器并在其上进行所有开发。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多