java问题,高手请进,其他人就不要凑热闹了。谢谢

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import util.DBUtil;
import entity.User;
public class UserDAO {
public void save(User user) throws Exception{
Connection conn = DBUtil.getConnection();
PreparedStatement prep =
conn.prepareStatement(
"insert into t_user(username,pwd,age) " +
"values(?,?,?)");
prep.setString(1, user.getUsername());
prep.setString(2, user.getPwd());
prep.setInt(3, user.getAge());
prep.executeUpdate();
DBUtil.close(conn);
}
public User findByUsername(String username) throws Exception{
User user = null;
Connection conn = DBUtil.getConnection();
PreparedStatement prep =
conn.prepareStatement("select * from t_user " +
"where username=?");
prep.setString(1, username);
ResultSet rst = prep.executeQuery();
if(rst.next()){
user = new User();
user.setId(rst.getLong("id"));
user.setUsername(username);
user.setPwd(rst.getString("pwd"));
user.setAge(rst.getInt("age"));
}
DBUtil.close(conn);
return user;
}
}

import entity.User;
public class ActionServlet extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String uri = request.getRequestURI();
String action = uri.substring(uri.lastIndexOf("/"),
uri.lastIndexOf("."));
if(action.equals("/regist")){
String username = request.getParameter("username");
String pwd = request.getParameter("pwd");
int age = Integer.parseInt(request.getParameter("age"));
//查看用户名是否存在,如果存在,提示
//用户换一个用户名,否则,将用户提交的信息
//插入到数据库。
UserDAO dao = new UserDAO();
try {
User user = dao.findByUsername(username);
if(user != null){
request.setAttribute("regist_error",
"用户名被占用");
request.getRequestDispatcher("regist.jsp")
.forward(request, response);
}else{
user = new User();
user.setUsername(username);
user.setPwd(pwd);
user.setAge(age);
dao.save(user);
response.sendRedirect("login.jsp");
}
} catch (Exception e) {
e.printStackTrace();
throw new ServletException(e);
}
}else if(action.equals("/login")){
String username = request.getParameter("username");
String pwd = request.getParameter("pwd");
UserDAO dao =
new UserDAO();
try {
User user = dao.findByUsername(username);
//只有当用户名与密码与数据库中存放的
//信息匹配时,才允许登录系统
if(user != null && user.getPwd().equals(pwd)){
//登录成功
response.sendRedirect("main.jsp");
}else{
//登录失败
request.setAttribute("login_error",
"用户名或密码错误");
request.getRequestDispatcher("login.jsp")
.forward(request, response);
}
} catch (Exception e) {
e.printStackTrace();
throw new ServletException(e);
}
}
}
}

问题是:

从数据库中验证是否有该有户名和密码有则登录无则不登陆,为什么是这样写的呢?
if(user != null && user.getPwd().equals(pwd)){
//登录成功

user的获取是根据用户名获取的。如果数据库中有这个用户名,则能够查询出user,则user不可能为null,所以user != null 表示的是用户名存在。
&& 表示且的意思

user.getPwd().equals(pwd) 表示的是 以这个用户名查询出来的这个用户的密码和输入的密码是否一致。如果一致,则equals返回为真,否则返回假。

整个的意思就是 有用户名且密码一致 则登录成功。追问

有用户名?是不是就是数据库中的用户名

为什么不这样写:
if(user.getUsername().equals(uaernanme) && user.getPwd().equals(pwd)){

追答

可以这样写啊 意思是一样的。

追问

假设数据库中有这些数据:
用户名 密码
张三 123
李四 456
当我在输入框中输入:张三 456后,会允许通过吗?谢谢

追答

不允许通过 输入 张三 123才通过

追问

不是说只要用户名和密码与数据库中数据相同就能通过呀,张三和456都有呀。我知道这是错的,但是不也不知到用户名和密码是怎么相互关联起来的,是怎么回事?

追答

一个表中不是一条记录 一条记录的吗??
一条记录包括很多列,很多列构成了一个记录的属性。

张三 123 这是一条记录。

李四 456 也是一条记录。

但 张三 456 这条记录在数据库中不存在。

追问

还有最后一个问题哈,
if(user != null && user.getPwd().equals(pwd)){
User user = dao.findByUsername(username);
假设我输入张三 123,在验证密码的时候,user.getPwd().equals(pwd)这句代码执行步骤是:
1.User user = dao.findByUsername(username);
2.。。。。
在步骤1中是怎么把张三传进去的,是不不是前面user != null传进去的,可是它是通过什么方式记住的(前面有传入一个张三),初学者,谢谢

追答

public User findByUsername(String username) throws Exception{
User user = null;
Connection conn = DBUtil.getConnection();
PreparedStatement prep =
conn.prepareStatement("select * from t_user " +
"where username=?");
prep.setString(1, username);
ResultSet rst = prep.executeQuery();
if(rst.next()){
user = new User();
user.setId(rst.getLong("id"));
user.setUsername(username);
user.setPwd(rst.getString("pwd"));
user.setAge(rst.getInt("age"));
}
DBUtil.close(conn);
return user;
}
不是有这个函数,
conn.prepareStatement("select * from t_user " +
"where username=?");
从数据库中读取一条符合username的记录,如果有
则将数据库中的各列赋值给该user对象
user = new User();
user.setId(rst.getLong("id"));
user.setUsername(username);
user.setPwd(rst.getString("pwd"));
user.setAge(rst.getInt("age"));

然后将这个user 赋值给User user = dao.findByUsername(username);

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-03-24
User user = dao.findByUsername(username);

这一句不是已经检测了用户名是否存在吗,不存在的话是null,存在的话就不是null,此时if语句就只需判断user是否为空即可,再检测一下密码是否正确就行了。
如果if(user.getUsername().equals(uaernanme) && user.getPwd().equals(pwd)){的话,user若是null,则会报java.lang.NullPointerException这个异常。追问

if(user != null && user.getPwd().equals(pwd)){

user.getPwd().equals(pwd)中的user好像在该类中没有new吧

追答

User user = dao.findByUsername(username);

这句不是已经将对象查询了吗,有值的话就不需要new了。

追问

User user = dao.findByUsername(username);
能调用user.getPwd()吗?为什么能?

追答

你是不是入门都还没入完,怎么这么个东西都不知道,不是有User.java这个vo类吗,里面肯定有相对应的set和get方法的。这些个方法的变量名是对应数据库相应的字段的。你这个要是不知道的话还是先把入门的东西搞懂再说吧。

第2个回答  2013-03-24
,,,,, user是一个javaBean的对象,从前台获得响应,到servlet中封装属性到javaBean的对象中去.然后进行校验,,user!=null 是验证这个userBean的对象是否存在(因为不存在说明对象为null,), &&user.getPwd().equals(pwd)是从user对象里取出passWord 和数据库中的pwd 进行比较。 这是一个简单的验证。追问

1.user怎么是这个?
User user = dao.findByUsername(username);

2.user != null 与 user.getPwd().equals(pwd)中的user一样,是怎么回事?为什么不写成一样的
if(user != null && user.getPwd().equals(pwd)){

为什么不这样写:
if(user.getUsername().equals(uaernanme) && user.getPwd().equals(pwd)){

追答

如果你不怕报,空指针异常也, 可以这样写.

追问

假设数据库中有这些数据:
用户名 密码
张三 123
李四 456
当我在输入框中输入:张三 456后,会允许通过吗?谢谢

追答

注意编码问题,问题就不大。

第3个回答  2013-03-24
user !=null 是验证你输入的用户名是否在数据库中存在
user.getPwd().equals(pwd) 是验证你所输入的用户名密码是否与数据库中的相匹配
两者都符合就可以成功登录了追问

为什么不这样写:
if(user.getUsername().equals(uaernanme) && user.getPwd().equals(pwd)){

追答

如果user不存在就报空指针了

第4个回答  2013-03-24
user 是通过方法到数据库查询出来的
如果没有这个用户名那么user对象就是null
如果有这个用户
那么就比对输入的密码和查询出来的密码是否一致
一致就可以登录了

所以是写的&&同时满足追问

假设数据库中有这些数据:
用户名 密码
张三 123
李四 456
当我在输入框中输入:张三 456后,会允许通过吗?谢谢

追答

不会
你输入“张三”
通过“张三”查询返回得到的user对象
其中pwd的值就是123
所以密码不匹配是不会登录成功的

追问

那段代码是:通过“张三”查询返回得到的user对象

追答

对的
代码里就是通过用户名来查询用户信息

如果数据库中有这个用户的信息
那么信息就包含了用户名、密码等信息
如果数据库中没有这个用户
那么user就是null了

追问

还有最后一个问题哈,
if(user != null && user.getPwd().equals(pwd)){

User user = dao.findByUsername(username);

假设我输入张三 123,在验证密码的时候,user.getPwd().equals(pwd)这句代码执行步骤是:
1.User user = dao.findByUsername(username);
2.。。。。
在步骤1中是怎么把张三传进去的,是不不是前面user != null传进去的,可是它是通过什么方式记住的(前面有传入一个张三),初学者,谢谢

相似回答