一,需求分析
整體分析框架如下圖,需要的包也如下圖,它們放在src下
所有的需求如下圖所示,
1,我們創建一個名為day12的數據庫,其中創建了一個users表
2,在myeclipse中我們新建一個名為day12_user的web項目,
3,在src下我們創建了如下幾個java包:
com.itheima.damain 實體類包, 其中包括 User類
com.itheima.dao 接口包 , 其中包括 UserDao接口
com.itheima.dao.impl 接口實現類包, 其中包括 UserDaoImpl實現類
com.itheima.service 接口包 其中包括service接口
com.itheima.service.impl 接口實現類包 其中包括service接口實現類
com.itheima.utils 工具包 其中包括一般的關閉,連接數據庫的函數
com.itheima.exception 異常包
com.itheima.web.servlet servlet包 包括loginServlet和registerServlet
首先是主頁main.jsp
<body> <h1>歡迎來到主頁</h1> <form action="/day12_user/login.jsp" method = "post"> <input type = "submit" value = "登陸" > </form> <form action="/day12_user/register.jsp" method = "post"> <input type = "submit" value= "注冊"> </form> </body>
對於登陸板塊,選擇登陸按鈕,進入login.jsp
<body> <form action="/day12_user/demo1" method= "post"> 用戶名:<input type = "text" name = "username" ><br> 密碼:<input type = "password" name = "password" ><br> <input type = "submit" value = "登陸"><br> </form> </body>
web.xml如下圖所示
<servlet> <servlet-name>loginServlet</servlet-name> <servlet-class>com.itheima.web.servlet.loginServlet</servlet-class> </servlet> <servlet> <servlet-name>registerServlet</servlet-name> <servlet-class>com.itheima.web.servlet.registerServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>loginServlet</servlet-name> <url-pattern>/demo1</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>registerServlet</servlet-name> <url-pattern>/demo2</url-pattern> </servlet-mapping>
關於user用戶的板塊,com.itheima.damain 實體類包, 其中包括 User類,源碼如下文所示
//實體bean,用於封裝數據 public class User { private int id; private String username; private String password; private String email; private Date birthday; public User(String username, String password, String email, Date birthday) { super(); this.username = username; this.password = password; this.email = email; this.birthday = birthday; } public User() { // TODO Auto-generated constructor stub } public int getId() { return id; } public String getUsername() { return username; } public String getPassword() { return password; } public String getEmail() { return email; } public Date getBirthday() { return birthday; } }
com.itheima.web.servlet servlet包 包括loginServlet和registerServlet
loginservlet的源碼如下圖所示,只寫一個完整源碼,其他的servlet類似
package com.itheima.web.servlet; import java.io.IOException; import java.io.PrintWriter; import java.util.Random; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.itheima.damain.User; import com.itheima.service.impl.UserService; import com.itheima.service.impl.UserServiceImpl; @SuppressWarnings("serial") public class loginServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { //設置編碼模式
request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); //獲取表單數據, 並將表單數據存入到login函數中 String name = request.getParameter("username"); String pwd = request.getParameter("password"); //處理業務邏輯,實現login 方法,里面涉及到finduser方法 UserService us = new UserServiceImpl();// User u = us.login(name,pwd); //分發轉向 if(u!=null){ out.write("<br/>歡迎你,登陸成功,3秒跳轉首頁"); request.setAttribute("u", u.getUsername()); request.getRequestDispatcher("/success.jsp").forward(request, response); }else{ //實現刷新功能 out.write("用戶名或密碼錯誤,請重新登陸"); response.setHeader("refresh", "1;url=/day12_user/login.jsp"); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
上面是登陸成功后的主頁,其源碼為success.jsp
<body> <h1>這是主頁</h1> 歡迎 ${u} ,來到主頁 </body>
對於loginservlet中,有一句代碼進行解析
//處理業務邏輯,實現login 方法,里面涉及到finduser方法
UserService us = new UserServiceImpl(); 這句是創建父接口指向子類對象 User u = us.login(name,pwd);
com.itheima.service 接口包 其中包括Userservice接口,
com.itheima.service.impl 接口實現類包 其中包括UserserviceImpl接口實現類
userService源代碼如下
public interface UserService { //根據用戶和密碼實現登陸 public User login(String name,String pwd); //注冊 public int register(User user); }
UserServiceImpl實現類源碼如下:
package com.itheima.service.impl; import com.itheima.damain.User; import com.itheima.dao.UserDao; import com.itheima.dao.impl.UserDaoImpl; public class UserServiceImpl implements UserService{ // 實現用戶登錄的方法 public User login(String name,String pwd) { // TODO Auto-generated method stub //用實現類來指向父類的接口 UserDao dao = new UserDaoImpl(); return dao.finduser(name,pwd); } public int register(User user) { // TODO Auto-generated method stub UserDao dao = new UserDaoImpl(); return dao.adduser(user); } }
UserDao接口源碼如下
public interface UserDao { // 查找用戶 public User finduser(String name,String password); // 添加用戶 public int adduser(User user); }
UserDaoImpl源碼如下:
package com.itheima.dao.impl; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.text.SimpleDateFormat; import com.itheima.damain.User; import com.itheima.dao.UserDao; import com.itheima.utils.DBUtils; /** * 數據訪問層對於方法的實現 * @author zjf-pc * */ public class UserDaoImpl implements UserDao{ /** * 查找用戶的實現方法 */ public User finduser(String name,String password) { // TODO Auto-generated method stub Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; User u = null; try { conn = DBUtils.getConnection(); //找到與瀏覽器中getConnection輸入用戶名和密碼一致的sql語句,並保存在rs中 String sql = "select * from users where username= ? and password = ?"; ps = conn.prepareStatement(sql); ps.setString(1,name); ps.setString(2, password); //得到sql中的結果 rs = ps.executeQuery(); while(rs.next()) { //新創建一個user對象,將rs中的屬性均賦值給user對象 //如果之前的rs內容為空的話,那么此時返回的u也為null u = new User(); u.setId(rs.getInt(1)); u.setUsername(rs.getString(2)); u.setPassword(rs.getString(3)); u.setEmail(rs.getString(4)); u.setBirthday(rs.getDate(5)); } } catch (Exception e) { e.printStackTrace(); }finally{ DBUtils.closeAll(rs, ps, conn); } return u; } /** * 添加用戶的實現方法 */ public int adduser(User user) { // TODO Auto-generated method stub Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; int i =0; try{ conn = DBUtils.getConnection(); //向數據庫庫表中插入一行語句如下 String sql = "insert into users(username,password,email,birthday)values(?,?,?,?);"; ps = conn.prepareStatement(sql); ps.setString(1, user.getUsername()); ps.setString(2, user.getPassword()); ps.setString(3, user.getEmail()); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-DD"); ps.setString(4, sdf.format(user.getBirthday())); //將數據更新到表中 i = ps.executeUpdate(); } catch (Exception e) { e.printStackTrace(); }finally{ DBUtils.closeAll(rs, ps, conn); } return i; } public UserDaoImpl() { super(); // TODO Auto-generated constructor stub } }
對於用戶注冊板塊,register.jsp如下圖所示
<body> <h1>用戶注冊頁面</h1> <form action="/day12_user/demo2" method = "post"> 用戶名:<input type = "text" name = "username"/><br> 密碼: <input type = "password" name = "password"/><br> 郵箱:<input type = "text" name = "email"/><br> 出生日期:<input type = "text" name = "birthday"/><br> <input type = "submit" value = "注冊"><br> </form> </body>
//web.xml中對應的是這個,那么相應的registerServlet會在下文看到
<servlet-mapping> <servlet-name>registerServlet</servlet-name> <url-pattern>/demo2</url-pattern> </servlet-mapping>
registerServlet源碼如下文所示
public class registerServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //設置編碼模式 request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); int i =0; //獲取表單數據 String name = request.getParameter("username"); String pwd = request.getParameter("password"); String email = request.getParameter("email"); String birthday = request.getParameter("birthday"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-DD"); try { //將獲取到的表單數據封裝到u中 User u = new User(name,pwd,email, sdf.parse(birthday)); UserService us = new UserServiceImpl();//這在上文有解析 //對封裝在u中的數據進行注冊,使其記錄在數據庫表中 i = us.register(u);//這也在上文有解析 if(i!=0) { out.write("注冊成功,信息如下:<br>"); out.write("<br>姓名:"+u.getUsername()); out.write("<br>郵箱:"+u.getEmail()); out.write("<br>出生日期:"+sdf.format(u.getBirthday())); }else { out.write("注冊信息不成功"); } } catch (Exception e) { e.printStackTrace(); } //處理業務邏輯 //分發轉向 } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }