改变了setProperty指令的位置后,重新运行页面,第一次提交数据返回结果为空,第二次提交返回的是第一次提交的值。
<%@ 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="*"/>
代码:
附加其中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中,并执行相应的操作。最后,页面输出结果。