Math.sqrt(-5) - >强制自定义异常&在自定义错误页面上重新路由并显示错误

时间:2009-11-28 20:03:37

标签: java jsp exception-handling

由于this没有真正回答我的问题,我会澄清。

3 .jsp pages,index.jsp,calculator.jsp和error.jsp。

index.jsp包含(带有html和body标签):

<p><b>Enter the Number you want to know the square root of:</b></p>
<form action="calculator.jsp" method="post">
<div><input type="text" name="number_textfield" size="40" /> <input type="submit" value="Send" /></div>
</form>

error.jsp包含(没有html body标签):

<%@page isErrorPage="true" import="java.io.*" %>
<%
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
exception.printStackTrace(pw);
String exceptionstack = sw.toString();
%>
<p>Path to File causing this error:
<span class="errortext"><%= request.getAttribute("javax.servlet.error.request_uri") %></span><br />
Error Message: <span class="errortext"><%= exception %></span><br />
The Error is: <span class="errortext"><%= exception.getMessage() %></span><br /></p>
<hr />
<p>Exception stack:</p>
<pre class="errortext"><%= exceptionstack %></pre>
<p><a href="../index.jsp">Index Page</a></p>

现在在calculator.jsp ....

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

2)如果我输入的数字小于0,则没有任何反应。现在我尝试了there的各种方法。它们都不起作用。

calculator.jsp(没有body和html标签):

<%@ page errorPage="../WEB-INF/sqrterror.jsp" %>

 <%
    String number_string = request.getParameter("number_textfield");
    double number = Double.parseDouble(number_string);
    if (number < 0){
        //THAT'S WHAT I'M MISSING HERE :(
 %>

 <%
    }

    else{
                 double sqrt = Math.sqrt(number);            
  %>
        <p>Square Root of <%= number %> is <%= sqrt %> .</p>
        <p><a href="../A03/sqrtcalculator.jsp">Back to Index Page</a></p>
  <%
    }
 %>

2 个答案:

答案 0 :(得分:4)

这里有一个很大的问题:如果你在一个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>

${error}应显示错误消息(如果有)。 servlet可以将其设置为请求属性。

按如下方式更改result.jsp

<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,如下所示(哦,确保您使用Servlet 2.4或更新版本来获取EL(Expression Language${}项)在模板中工作文本):

<servlet>
    <servlet-name>calculator</servlet-name>
    <servlet-class>com.example.CalculatorServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>calculator</servlet-name>
    <url-pattern>/calculator</url-pattern>
</servlet-mapping>

url-pattern应涵盖您在<form action>中使用的操作网址。

那应该是它。更好地分离业务逻辑和表示逻辑。这是MVC方式的良好开端。

答案 1 :(得分:0)

添加

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