自己在跟着老师写一个用户信息操作的一个web项目,然后运行的时候出现两个问题(真是服了自己了,跟着敲都能出错,而且还看了好久没看到哪里不一样)下面记录一下自己的解决过程和一些总结。
用户登录验证时输入正确的用户名和密码却还是提示用户名或密码错误。 刚开始出现意识到这个错误明显是表单提交过去的用户名和密码与数据库中的不一致,可是我浏览器中输入的是一样的呀,就这样磨了好长时间久久无果。然后无奈打开断点调试,果然输入用户名和密码提交后username是null,密码正确。这样问题大概就清楚了:没有得到username对象!从login.jsp页面查起,果然用户名的name属性值是user,这和数据库中的username不一致(与其说与数据库中的username不一致倒不如说与Javabean中的成员变量不一致),改成username后解决。
为什么name属性要和Javabean中的username一致?我查了一下inpu框的name属性,如下:
name 属性规定 input 元素的名称。 name 属性用于对提交到服务器后的表单数据进行标识,或者在客户端通过 JavaScript 引用表单数据。 注释:只有设置了 name 属性的表单元素才能在提交表单时传递它们的值。
这样的话name属性中的值是往Servlet中传递的,一探究竟再看web层的LoginServlet中的代码,下段代码是获得表单中的所有属性值:
Map<String, String[]> map = request.getParameterMap();调试一下看看细节,map中的数据如下: 其中username的key是username,password的key是password, 接下来就是把这些数据封装成User对象:
User user = new User(); try { BeanUtils.populate(user,map); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); }这个方法会遍历map<key, value>中的key,如果bean中有这个属性,就把这个key对应的value值赋给bean的属性。 在这个案例中map<key,value>包含{username=“zhangsan”,password=“123”} ,既然这个方法是到User实体类中找key值,那么一切就都说得通了,input表单中的name属性必须是username,这样才能在javabean中找到username属性并且赋值!
浏览器中出现了el表达式不显示的问题:就是我index.jsp页面中想显示用户的名字
<div >${user.name},欢迎您</div>这里user.name一直获取不到用户名字,经常一段时间的找问题,发现原来LoginServlet中是将用户信息存到了request域而没有存到seesion域中,这是因为两个的生命周期不同:request的生命周期只在数据提交,提交以后即释放,session则是浏览器关闭才释放。这样肯定是null,改为session即解决。
// 将用户存入seesion,跳转页面 session.setAttribute("user",loginUser);首先看一下el表达式: EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象、获取数据。 那么${user.name}中的user就是session域中的user对象,user.name就是获取session域中的name值。
这两个小问题都是由于自己的粗心导致的,第一个是没把user改成username,第二个是错把session.setAttribute写成了reque.setAtrribute。想想真的是手废了,看着打都能打错,还久久没有发现!不过好一点就是练习了下找错误的步骤,对一些更细节的问题更了解了。