有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java数学。sqrt(5)>强制自定义异常和重新路由,并在自定义错误页面上显示错误

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

三,。jsp页面,索引。jsp,计算器。jsp和错误。jsp

索引。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>

错误。jsp包含(不含html正文标记):

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

现在是计算器。jsp

1)如果我在索引中将文本字段留空。jsp,我正在根据错误显示错误。jsp

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

计算器。jsp(无正文和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>
  <%
    }
 %>

共 (1) 个答案

  1. # 1 楼答案

    这里有一个大问题:如果在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>中使用的操作url

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