Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 代码在JSP声明部分需要try/catch,但在scriptlet部分不需要?_Java_Jsp - Fatal编程技术网

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。谢谢你的建议。