jsp中setProperty指令的运行逻辑是什么?

改变了setProperty指令的位置后,重新运行页面,第一次提交数据返回结果为空,第二次提交返回的是第一次提交的值。

img

<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<style>
   #textStyle{
      font-family:宋体;font-size:36;color:blue 
   }
</style>
<% request.setCharacterEncoding("utf-8");
%>
<jsp:useBean id="computer" class="red.star.ComputerBean" scope="session"/>
<HTML><body id = textStyle bgcolor=#ffccff>

<form action="" method=post >
   <input type=text name="numberOne" id = textStyle size=6/>
   <select name="operator" id = textStyle >
       <option value="+" id = textStyle>+
       <option value="-" id = textStyle>-
       <option value="*" id = textStyle>*
       <option value="/" id = textStyle>/
   </select> 
   <input type=text name="numberTwo" id = textStyle size=6/>
    <br> <input type="submit" value="提交" id = textStyle "/>
</form> 
<b>
<jsp:getProperty name="computer" property="numberOne"/> 
<jsp:getProperty name="computer" property="operator"/>  
<jsp:getProperty name="computer" property="numberTwo"/> =
<jsp:getProperty name="computer" property="result"/></b>
</body></HTML>
<jsp:setProperty name="computer" property="*"/>


代码:

img

附加其中Javabean的代码

package red.star;
public class ComputerBean {
   double numberOne,numberTwo,result;
   String operator="+";
   public void setNumberOne(double n) {
      numberOne=n;
   }
   public double getNumberOne() {
      return numberOne; 
   }
   public void setNumberTwo(double n) {
      numberTwo=n;
   }
   public double getNumberTwo() {
      return numberTwo; 
   }
   public void setOperator(String s) {
      operator=s.trim();
   }
   public String getOperator() {
      return operator;
   }
   public double getResult() {
      if(operator.equals("+"))
          result=numberOne+numberTwo;
      else if(operator.equals("-"))
          result=numberOne-numberTwo;
      else if(operator.equals("*"))
          result=numberOne*numberTwo;
      else if(operator.equals("/"))
          result=numberOne/numberTwo;
      return result; 
   }
}


就是想问一下会出现这种情况的原因。还有为什么setProperty指令可以出现在form前面?setProperty在前面时为什么输出的数据仍是本次输入的数据的处理结果?难道不应该跟把setProperty放到最后面的情况一样都是得到上一次的结果吗?这其中的原理是什么?我大概知道是因为setProperty指令不是按照顺序执行的,那它是按什么逻辑执行的?

该回答引用GPTᴼᴾᴱᴺᴬᴵ
setProperty指令用于将请求参数映射到JavaBean属性中。在JSP页面中,setProperty指令可以放在form标签前面或后面。如果放在form标签前面,setProperty指令会在JSP页面的请求处理过程中最先执行。如果放在form标签后面,它会在JSP页面的请求处理过程中最后执行。
·
在这个例子中,由于setProperty指令放在了最后,因此它会在form提交后执行。第一次提交时,由于该指令尚未执行,因此JavaBean中的属性值仍然是上一次提交的结果。在第二次提交时,由于该指令已经执行,JavaBean中的属性值得到了正确更新,因此返回的结果是第一次提交的值。
·
如果将setProperty指令放在form标签前面,它将在所有其他操作之前执行,并将请求参数映射到JavaBean属性中,这样就可以避免出现上述问题。
·
具体而言,当请求到达JSP页面时,JSP引擎会首先执行页面的指令和声明,包括设置编码方式和导入Java类。然后,它会执行setProperty指令,将请求参数映射到JavaBean属性中。接下来,当用户提交表单时,请求参数将被传递到JavaBean中,并执行相应的操作。最后,页面输出结果。