在reg.jsp里将isAccept改为flag后, 为什么RegServlet.java中if(request.getParameterValues("isAccept")!=null)不用该,改为flag后反而错误,这个isAccept难道不是对应表单中flag?
因为usebean是以javabean中的变量名为基础去使用的,与表单名无关,只是会自动将表单传递过来的同名变量中的值放进对应的javabean变量中而已,另外经过我的测试,将表单中的isAceept设置为flag后,由于name不对应,所以获取不到它的值,会报空指针异常,假如你之前获取成功了,应该是因为你没有刷新reg.jsp,直接返回并测试的。
我也有这个疑问,然后我理了一下思路,你看看能不能帮到你,虽然说得有点啰嗦,但希望你跟着我的思路去对应看一下代码的位置,以及先后顺序,才能更好理解。
1.先搞清楚每个页面及类的含义:
reg.jsp —— 用户填写表单的界面
RegServlet.java —— 暂时想象成 加工厂
users.java —— 用户信息类(即javabean,想象成 模型)
userInfo.jsp —— 是servlert的dopost()重定向到的页面(及展示获取信息后的页面)
这里的跳转顺序:
reg.jsp —— RegServlet.java ——userInfo.jsp 【在使用 加工厂的途中,调用模型,对模型进行写读】
------------------------------------------------------------------------------------------------------------
2.关于flag与isAcccept出现的位置 [以老师最后修改后测试成功来解释]
reg.jsp —— <input name="isAccpet">
RegServlet.java —— String IsAccept; 以及 if(IsAccept.indexOf("true")) {......} else{........}
users.java —— private boolean flag; 以及get/set方法为getFlag()/setFlag()
userInfo.jsp —— <jsp:getproperty name ="regUser" property="flag">
-------------------------------------------------------------------------------------
3.结论
我想你知道<jsp:getproperty >这个用法是获得javabean的属性值的吧
所以<jsp:getproperty name ="regUser" property="flag">
这个flag值只对应users.java 这个javabean里面的变量名
即这里的userInfo.jsp、users.java页面都是用flag
而RegServlet类中的 if(request.getParameterValues("isAccept")!=null) 这里的isAccept是reg.jsp页面中表单提交过来的,所以这里的isAccept对应的是reg.jsp 页面中的 <input name="isAccpet">,而不是用flag
课程里修改了一次Users类的属性的原因是这样,因为对于bool类型的属性,用编译器的简便方法生成对应的set方法时,并不像其他类型,会是set+属性名,而是is+属性名。为了避免理解问题,更换了属性名,并且重命名了set方法。isAccept只是在RegServlet中的doPost方法中声明的局部变量,一个String类型的变量,而if语句的作用是判断表单传递的参数是否为空,注意表单中条款项的 name也改为isAccept。