前言:
有任何疑问可以私信我哦!
Eclipse中建立用户实体类
//用户实体类,字段与数据库中对应,生成getter/setter方法
public class User {
private int id;
private String name;
private String password;
private int age;
private int usertype;
public User(){}
public User(int id, String name, String password, int age, int usertype) {
super();
this.id = id;
this.name = name;
this.password = password;
this.age = age;
this.usertype = usertype;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getUsertype() {
return usertype;
}
public void setUsertype(int usertype) {
this.usertype = usertype;
}
}
编写Dao层,实现由数据库中获取username 和password
//Dao接口 通过用户名获取用户相关信息
public interface UserDao {
/**
* 根据用户名获取用户
* @param name
* @return 对应的User对象;如果用户不存在,返回null
*/
User getByName(String name);
}
//Dao接口实现类
public class UserDaoImpl implements UserDao {
public UserDaoImpl() {
}
String url="jdbc:mysql://localhost:3306/bookmanager?useUnicode=true&characterEncoding=UTF-8";
String user="root";
String password="";
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
@Override
public User getByName(String name) {
User u=null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn= DriverManager.getConnection(url,user,password);
String sql="SELECT id,name,password,age,usertype FROM bm_user WHERE name=?";
ps= conn.prepareStatement(sql);
ps.setString(1, name);
rs=ps.executeQuery();
while(rs.next()){
u=new User();
u.setId(rs.getInt("id"));
u.setName(rs.getString("name"));
u.setPassword(rs.getString("password"));
u.setAge(rs.getInt("age"));
u.setUsertype(rs.getInt("usertype"));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
if(rs!=null){
rs.close();
}
if(ps!=null){
ps.close();
}
if(conn!=null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
return u;
}
}
编写Service层,引入Dao 进行业务处理
//service层接口 接收页面输入的信息,进行业务处理
public interface UserService {
/**
* @param name
* @param password
* @return 传入的值与数据库是否一致的判断
*/
boolean isLogain(String name,String password);
}
//service层实现类
public class UserServiceImpl implements UserService {
UserDao uDao=new UserDaoImpl();
@Override
public boolean isLogain(String name, String password) {
User u =uDao.getByName(name);
if(u!=null&&password.equals(u.getPassword())){
return true;
}
return false;
}
}
页面书写form表单 并将用户输入的信息提交到servlet中
<form action="<%=request.getContextPath()%>/Login" method="post">
${mess }<br>
<input type="text" name="name" placeholder="请输入用户名"><br/>
<input type="password" name="password" placeholder="请输入密码"><br>
<button type="submit">登录</button>
</form>
编写servlet,接收用户输入信息,并将其与数据库中比较!进行页面跳转
<!-- 因为form表单中,method是post方式!所以在servlet中的doPost方法 -->
@WebServlet("/Login")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public LoginServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//接收输入的用户名和密码
String name = request.getParameter("name");
String password = request.getParameter("password");
//调用业务方法判断用户是否登录成功
UserService us = new UserServiceImpl();
boolean flag = us.isLogain(name, password);
//如果登陆成功跳转到首页
if(flag){ request.getRequestDispatcher("/index.jsp").forward(request, response);
}
else{
String mess = "用户名或者密码错误";
request.setAttribute("mess", mess); request.getRequestDispatcher("/login.jsp").forward(request, response);
}
}
}
总结
- 为什么dao层的方法和service层中的方法不一致
- 侧重点不同!dao层进入数据库中查询必须要通过用户名或者密码查询,而service层 则是将页面进行业务处理的,需要接收页面输入的参数!
- 为什么登录页面中有一个EL表达式
- 当用户输入信息错误时,如果仅仅返回到登录页面,用户会不知道发生了什么,所以需要在页面中返回一句话,告知用户“用户名或者密码错误”,而使用EL表达式,只有登录失败,进行跳转之后session中才会有数据,页面才会显示,而正常访问是不显示的!