【问题标题】:JSP Default object validationJSP 默认对象验证
【发布时间】:2016-03-17 13:37:54
【问题描述】:

我正在使用 MVC 设计将 JSP 作为视图层的项目。 我正在测试 JSP 可用的会话、应用程序和请求对象的结果。 我写了以下代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Calculator</title>
</head>
<body>
    <%! int result = 0;
        int add_request(String num1, String num2){
            if((num1 != null && num2 !=null) && (!num1.isEmpty() && !num2.isEmpty()))
                result = Integer.parseInt(num1)+Integer.parseInt(num2);
        return result;
    }

    int div_session(String number, String number1){
        if((number != null && number1 != null) && (!number.isEmpty() && !number1.isEmpty()))
                return (Integer.parseInt(number)/Integer.parseInt(number1));
        return 0;
    }

    int mult_context(String number, String number1){
        if((number != null && number1 != null) && (!number.isEmpty() && !number1.isEmpty()))
                return (Integer.parseInt(number)*Integer.parseInt(number1));
        return 0;
    }

    %>

    <div align="center">
        <form>
            Number: <input type="text" name="num1" /> <br>
            Number: <input type="text" name="num2" />
            <div align="center">
             <input type="submit" >
            </div>
        </form> 
    </div>

    <%
        ServletContext context = request.getServletContext();
        String firstnum = request.getParameter("num1");
        String secondnum = request.getParameter("num2");
        if((firstnum != null && secondnum != null) && (!firstnum.isEmpty() && !secondnum.isEmpty()))
        {
            session.setAttribute("test1", firstnum);
            session.setAttribute("test2", secondnum);
            context.setAttribute("test1", firstnum);
            context.setAttribute("test2", secondnum);
            application.setAttribute("test1", firstnum);
            application.setAttribute("test2", secondnum);
        }
    %>
    Result:<br>

    <br>Add request: <%= add_request(request.getParameter("num1"), request.getParameter("num2")) %>
    <br>Division session: <%= div_session((String)session.getAttribute("test1"), (String)session.getAttribute("test2")) %>
    <br>Multiplication context: <%= mult_context((String)context.getAttribute("test1"), (String)context.getAttribute("test2")) %>
    <br>Application Result: <%= mult_context((String)application.getAttribute("test1"), (String)application.getAttribute("test2")) %>

</body>
</html>

期望的输出是:
数量:120
数量 : 20


添加结果:140
分区会议:6
乘法上下文:2400
乘法应用:2400

当我重新提交时,传递给请求对象的参数为空,因此添加结果应为零。如果我打开一个新选项卡 a 访问不带参数的 url,则添加结果应该为零。当我打开另一个浏览器时,分区会话应该为零。但一切都一样。


因为根据理论,只有会话和应用程序/上下文对象在多个请求之间是持久的,并且只有上下文在多个会话中是持久的。


伙计们,我哪里出错了。 谢谢。

【问题讨论】:

  • 一切似乎都很好。
  • 如果我刷新,那么参数 num1 和 num2 将为空,因此 add 方法将显示 0,但它显示最后一个结果,它不会在下一个请求中更新结果。会话和应用程序也是如此。

标签: java jsp session


【解决方案1】:

您已经创建了一个 Servlet 实例的实例变量,该实例是从您翻译的 JSP 中创建的。

<%! int result = 0   

您需要重新加载您的 JSP 或 Web 应用程序才能恢复为零。 在 Tomcat(参见工作文件夹)中,如下所示

public final class test_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
             org.apache.jasper.runtime.JspSourceImports {

   int result = 0;  
   ...
}

因此在你的add_request方法中,当参数为空时,返回result的持久化值。

【讨论】:

    【解决方案2】:

    试试下面的 add_request 代码。它对我有用!

    int add_request(String num1, String num2) {
            if ((num1 != null && num2 != null)
                    && (!num1.isEmpty() && !num2.isEmpty()))
                return (Integer.parseInt(num1) + Integer.parseInt(num2));
            return 0;
        }
    

    在您的代码中,仅添加选项无法正常工作。实际上 Division 选项按预期工作正常(在不同的浏览器中,不进行会话)。如果您在代码中进行上述更改,所有范围都将按预期工作。

    【讨论】:

    • 没错。甚至不需要“结果”实例成员。
    【解决方案3】:

    看, 这是因为Scope 概念而发生的。

    JSP有没有比从窄到宽更喜欢说的范围:

    1. request
    2. page
    3. session
    4. application
    

    现在,正如我当时所知道的,

    当一些parameter 去获取假设时,

    从请求中获取“num1”和“num2”(已在 第一次请求时的会话+应用程序范围)然后,

    如果没有找到(页面刷新时确实没有找到),那么它会尝试 如果它在那里,则从更广泛的范围内找出它。

    所以,最后在你的情况下,

    如果在请求中未找到num1num2(页面刷新时),则为 如果存在,则开始从更广泛范围的下一级搜索,或者 not(比请求范围更广)。

    看,它的搜索方向是下一个更广泛的范围,直到没有 find 最终在任何地方都找不到然后返回 null,

    所以它是从会话中获取的,然后它不会去搜索 适用范围。

    谢谢。

    更新

    请对您的代码进行以下更改...

    int add_request(String num1, String num2){
    
                if((num1 != null && num2 !=null) && (!num1.isEmpty() && !num2.isEmpty()))
                    result = Integer.parseInt(num1)+Integer.parseInt(num2);
                else
                    result = 0;
    
            return result;
    

    并从 Query-String 清除附加参数并按 Enter 键 键盘你会得到你所期望的正确结果。

    【讨论】:

    • 很好,request.getParameter("num1") 搜索参数的范围更广,但我保存了具有不同名称的对象,即在表单参数名称为 num1、num2 但在会话和应用程序中参数的名称是 test1 , test2 那么映射是如何发生的。
    • @AbhijatyaSingh 请参阅我的更新部分...您是对的,不同范围的名称不同。对不起..!!谢谢:-)
    猜你喜欢
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 2014-09-26
    • 1970-01-01
    • 2012-10-30
    • 2016-07-26
    相关资源
    最近更新 更多