Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.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 数学sqrt(-5)>;强制自定义异常&;在自定义错误页面上重新路由和显示错误_Java_Jsp_Exception Handling - Fatal编程技术网

Java 数学sqrt(-5)>;强制自定义异常&;在自定义错误页面上重新路由和显示错误

Java 数学sqrt(-5)>;强制自定义异常&;在自定义错误页面上重新路由和显示错误,java,jsp,exception-handling,Java,Jsp,Exception Handling,既然没有真正回答我的问题,我想澄清一下 3.jsp页面、index.jsp、calculator.jsp和error.jsp jsp包含(不带html和正文标记): 输入您想要知道的数字的平方根: error.jsp包含(不带html正文标记): 导致此错误的文件路径: 错误消息: 错误是: 异常堆栈: 现在在calculator.jsp中 1) 如果我将index.jsp中的textfield留空,我将根据error.jsp显示错误 2) 如果输入一个小于0的数字,则什么也不会发生

既然没有真正回答我的问题,我想澄清一下

3.jsp页面、index.jsp、calculator.jsp和error.jsp

jsp包含(不带html和正文标记):

输入您想要知道的数字的平方根:

error.jsp包含(不带html正文标记):


导致此错误的文件路径:

错误消息:
错误是:


异常堆栈:

现在在calculator.jsp中

1) 如果我将index.jsp中的textfield留空,我将根据error.jsp显示错误

2) 如果输入一个小于0的数字,则什么也不会发生。现在我已经尝试了各种各样的方法。它们都不起作用

calculator.jsp(无正文和html标记):


is的平方根

只需添加

  throw new IllegalArgumentException("Number must be non-negative");
加上

  throw new IllegalArgumentException("Number must be non-negative");

这里有一个大问题:如果在JSP文件的中途抛出异常,那么很有可能它永远不会到达
error.JSP
,因为响应已经提交。响应头已经设置,响应编写器已经获得,响应内容已经发送到客户机(即使只是部分),所有这些都是因为JSP本质上是一种纯视图技术。这是一个无法返回的点。最终用户可能会得到一个空白页面,而您可能会在服务器日志中得到一个
IllegalStateException

如果您非常非常幸运,所有内容仍在缓冲区中,尚未刷新,那么webcontainer仍然可以设法将其全部重置,并将请求转发到
error.jsp
。但我不相信这一点。在JSP文件中编写原始Java代码被认为是不好的做法

最好使用Servlet类。我会给你一个开始的例子。更改
index.jsp
,如下所示:

<h4>Enter the Number you want to know the square root of:</h4>
<form action="calculator" method="post">
    <input type="text" name="number" size="40" />
    <input type="submit" value="Send" />
    ${error}
</form>
<p>Square Root of ${param.number} is ${result}.</p>
${param.number}
应显示
“number”
请求参数。
${result}
应该显示结果(如果有)。servlet可以将其设置为请求属性

创建Servlet类CalculatorServlet:

public class CalculatorServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String number = request.getParameter("number");

        // Check if number is set and if it is valid, with little help of regex.
        // Those are valid: "12" and "12.34", but those not: "-1" or "" or null.
        if (number != null && number.matches("^\\d+(\\.\\d+)?$")) {
            request.setAttribute("result", Math.sqrt(Double.parseDouble(number)));
            request.getRequestDispatcher("result.jsp").forward(request, response);
        } else {
            request.setAttribute("error", "Please enter valid number.");
            request.getRequestDispatcher("index.jsp").forward(request, response);
        }

    }
}
请注意,我不会抛出异常,只是验证这些值,并为输入错误的情况设置一条用户友好的错误消息。您应该期望用户输入错误的值。永远不要信任用户输入,始终以正确的方式验证它。您的应用程序看起来不应该因为错误的用户输入而“彻底崩溃”。例外情况只有在后台数据库关闭以及更多此类不可恢复的问题时才可以承受

现在将这个servlet映射到
web.xml
中,如下所示(哦,确保您使用的是Servlet2.4或更新版本,以使EL(
${}
东西)在模板文本中工作):


计算器
com.example.CalculatorServlet
计算器
/计算器
url模式
应该涵盖将在
中使用的操作url


应该是这样。业务逻辑和表示逻辑的更好分离。这是MVC方式的一个良好开端。

这里有一个大问题:如果在JSP文件的中途抛出异常,那么很有可能它永远不会到达
error.JSP
,因为响应已经提交。响应头已经设置,响应编写器已经获得,响应内容已经发送到客户机(即使只是部分),所有这些都是因为JSP本质上是一种纯视图技术。这是一个无法返回的点。最终用户可能会得到一个空白页面,而您可能会在服务器日志中得到一个
IllegalStateException

如果您非常非常幸运,所有内容仍在缓冲区中,尚未刷新,那么webcontainer仍然可以设法将其全部重置,并将请求转发到
error.jsp
。但我不相信这一点。在JSP文件中编写原始Java代码被认为是不好的做法

最好使用Servlet类。我会给你一个开始的例子。更改
index.jsp
,如下所示:

<h4>Enter the Number you want to know the square root of:</h4>
<form action="calculator" method="post">
    <input type="text" name="number" size="40" />
    <input type="submit" value="Send" />
    ${error}
</form>
<p>Square Root of ${param.number} is ${result}.</p>
${param.number}
应显示
“number”
请求参数。
${result}
应该显示结果(如果有)。servlet可以将其设置为请求属性

创建Servlet类CalculatorServlet:

public class CalculatorServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String number = request.getParameter("number");

        // Check if number is set and if it is valid, with little help of regex.
        // Those are valid: "12" and "12.34", but those not: "-1" or "" or null.
        if (number != null && number.matches("^\\d+(\\.\\d+)?$")) {
            request.setAttribute("result", Math.sqrt(Double.parseDouble(number)));
            request.getRequestDispatcher("result.jsp").forward(request, response);
        } else {
            request.setAttribute("error", "Please enter valid number.");
            request.getRequestDispatcher("index.jsp").forward(request, response);
        }

    }
}
请注意,我不会抛出异常,只是验证这些值,并为输入错误的情况设置一条用户友好的错误消息。您应该期望用户输入错误的值。永远不要信任用户输入,始终以正确的方式验证它。您的应用程序看起来不应该因为错误的用户输入而“彻底崩溃”。例外情况只有在后台数据库关闭以及更多此类不可恢复的问题时才可以承受

现在将这个servlet映射到
web.xml
中,如下所示(哦,确保您使用的是Servlet2.4或更新版本,以使EL(
${}
东西)在模板文本中工作):


计算器
com.example.CalculatorServlet
计算器
/计算器
url模式
应该涵盖将在
中使用的操作url


应该是这样。业务逻辑和表示逻辑的更好分离。这是MVC方式的一个良好开端。

我只希望他无论如何都能看到错误页面,因为所有这些scriptlet都已提交了响应。我只希望他无论如何都能看到错误页面。因为所有这些scriptlet都已提交了响应。+1是的,非常有帮助,谢谢,如果我对servlet感兴趣的话。我不是。我想和Scriptlet呆在一起。还是很有帮助的例子,谢谢