嗯,長夜慢慢無心睡眠,繼續寫這個的第二篇。就當做是回顧了。
上篇我們說到,建表和包結構。接下來就是實體類啦。
Javabean
一共需要這些
具體的代碼如下。用eclipse自帶的生成工具去生成對應的get和set方法,還有toString方法都可以自動生成。別自己寫。那是累傻小子呢!!!
一定注意,一定注意!
package com.imooc.domain;
public class User {
private Integer uid;
private String username;
private String password;
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
package com.imooc.domain;
/**
* domain
*
*/
public class Product {
private Integer pid;
private String pname;
private String author;
private Double price;
private String description;
private String filename;
private String path;
private Category category=new Category();
@Override
public String toString() {
return "Product [pid=" + pid + ", pname=" + pname + ", author=" + author + ", price=" + price + ", description="
+ description + ", filename=" + filename + ", path=" + path + ", category=" + category + "]";
}
//表中分類的ID,面向對象的語言
public Integer getPid() {
return pid;
}
public void setPid(Integer pid) {
this.pid = pid;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getFilename() {
return filename;
}
public void setFilename(String filename) {
this.filename = filename;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public Category getCategory() {
return category;
}
public void setCategory(Category category) {
this.category = category;
}
}
package com.imooc.domain;
import java.util.List;
public class PageBean<T> {
private int page;//當前頁數
private int limit;//每頁顯示的記錄數
private int totalCount;//總記錄數
private int totalPage;//總頁數
private List<T> list;//每頁顯示的數據集合
@Override
public String toString() {
return "PageBean [page=" + page + ", limit=" + limit + ", totalCount=" + totalCount + ", totalPage=" + totalPage
+ ", list=" + list + "]";
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public int getLimit() {
return limit;
}
public void setLimit(int limit) {
this.limit = limit;
}
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}
}
package com.imooc.domain;
public class Category {
private Integer cid;
private String cname;
private String cdesc;
@Override
public String toString() {
return "Category [cid=" + cid + ", cname=" + cname + ", cdesc=" + cdesc + "]";
}
public Integer getCid() {
return cid;
}
public void setCid(Integer cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public String getCdesc() {
return cdesc;
}
public void setCdesc(String cdesc) {
this.cdesc = cdesc;
}
}
OK哦這樣我們的類就創建好了呢。
接下來我們就要去實現用戶登錄模塊了
接下來打開login.jsp
然後我們觀察頁面會向我們傳入username password
OK接下來呢我們在web.action這個包裏創建UserServlet.java 文件進行接收信息和處理服務。具體的登錄實現是我們先從頁面接收用戶名和密碼。這個時候呢我們把這兩個數據傳到servlet類中,然後我們從request中解析這兩個數據,將數據進行封裝。
然後我們調用Service層的UserService。然後我們在UserService中調用用戶是否存在,若存在返回一個用戶對象。不然返回空值。
Dao層呢在UserDaoImpl類中進行數據庫查詢。看其是否有匹配的用戶
若有的話,向Service層返回一個非空對象,否則,返回空。
Servlet接收到了Service的返回值。再進行判斷。於是根據是否爲空決定頁面的跳轉。
這就是登錄的邏輯了。
我們後續可以給其加上驗證碼。整個類進行驗證碼生成然後和頁面輸入的進行比對。若成功才訪問數據庫。不成功則提示錯誤。
驗證碼沒有實現。但是加上的邏輯並不是太難。
接下來呢。我們有了登錄就有退出
退出很簡單的邏輯
將session毀掉
然後進行跳轉到登錄頁面。無需其他層的參與。
具體的代碼實現如下
UserServlet類
package com.imooc.web.action;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.imooc.domain.User;
import com.imooc.service.UserService;
import com.imooc.service.impl.UserServiceImpl;
/**
* Servlet implementation class UserServlet
*/
@WebServlet("/UserServlet")
public class UserServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 接收參數
String methodName = request.getParameter("method");
// 判斷
if ("login".equals(methodName)) {
login(request, response);
}else if("logout".equals(methodName)) {
logout(request,response);
}
}
/**
* 用戶退出的方法
* @param request
* @param response
* @throws IOException
*/
private void logout(HttpServletRequest request, HttpServletResponse response) throws IOException {
//1將session銷燬掉
request.getSession().invalidate();
//2頁面進行跳轉,跳轉到登錄頁面
response.sendRedirect(request.getContextPath()+"/login.jsp");
}
/**
* UserServlet中登錄的方法
* @param request
* @param response
* @throws IOException
* @throws ServletException
*/
private void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//接收用戶名和密碼
String username=request.getParameter("username");
String password=request.getParameter("password");
System.out.println(username+" "+password);
//數據的封裝
User user=new User();
user.setUsername(username);
user.setPassword(password);
//處理數據
UserService userService=new UserServiceImpl() ;
User existUser=userService.login(user);
//根據處理結果,完成頁面跳轉
if(existUser!=null) {
//登錄成功,返回登錄頁面
System.out.println("success");
request.getSession().setAttribute("existUser", existUser);
response.sendRedirect(request.getContextPath()+"/CategoryServlet?method=findAll");
}
else {
//登錄失敗返回登錄頁面
request.setAttribute("msg", "用戶名或密碼錯誤");
request.getRequestDispatcher("/login.jsp").forward(request,response);
System.out.println("fuck");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
然後是UserService 接口和其實現類
package com.imooc.service;
import com.imooc.domain.User;
public interface UserService {
User login(User user);
}
package com.imooc.service.impl;
import com.imooc.dao.UserDao;
import com.imooc.dao.impl.UserDaoImpl;
import com.imooc.domain.User;
import com.imooc.service.UserService;
public class UserServiceImpl implements UserService {
@Override
public User login(User user) {
//調用DAO方法查詢用戶是否存在
UserDao userDao=new UserDaoImpl();
return userDao.login(user);
}
}
接下來就是UserDao接口何其實現類。實現類裏面用到的JDBCUtils這個類在後面有實現。我們利用自己封裝的類很輕鬆的實現了數據庫的鏈接。並且dao的實現類裏面的try-catch塊我們以後會經常用到。應牢牢記住
package com.imooc.dao;
import com.imooc.domain.User;
public interface UserDao {
User login(User user);
}
package com.imooc.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import com.imooc.dao.UserDao;
import com.imooc.domain.User;
import com.imooc.utils.JDBCUtils;
public class UserDaoImpl implements UserDao {
@Override
public User login(User user) {
// TODO Auto-generated method stub
Connection conn=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
try {
//獲得連接
conn=JDBCUtils.getConnection();
//編寫sql
String sql="select * from user where username=? and password=?";
//預編譯sql
pstmt=conn.prepareStatement(sql);
//設置參數
pstmt.setString(1, user.getUsername());
pstmt.setString(2, user.getPassword());
//執行
rs=pstmt.executeQuery();
if(rs.next()) {
User existUser=new User();
existUser.setUid(rs.getInt("uid"));
existUser.setUsername(rs.getString("username"));
existUser.setPassword(rs.getString("password"));
return existUser;
}
else {
return null;
}
}catch(Exception e) {
e.printStackTrace();
}finally {
//釋放資源
JDBCUtils.release(rs, pstmt, conn);
}
return null;
}
}
接下來爲了解釋JDBCUtils類,他在我們Utils包內,用於封裝我們內部的數據庫連接。很是方便
我們將代碼羅列如下,後面的操作我們也同樣會用到這些東西的:
package com.imooc.utils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
/**
* JDBC的工具類
*
*/
public class JDBCUtils {
public static final ComboPooledDataSource dataSource = new ComboPooledDataSource();
/**
* 獲得連接
* @throws Exception
*/
public static Connection getConnection() throws Exception{
return dataSource.getConnection();
}
/**
* 獲得連接池
*/
public static DataSource getDataSource(){
return dataSource;
}
/**
* 釋放資源
*/
public static void release(ResultSet rs,Statement stmt,Connection conn){
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
public static void release(Statement stmt,Connection conn){
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
}
都搞定了。肯定要給大家看看效果。來我們把項目發佈到TomCat中吧
然後運行。效果如下圖
要是錯誤登錄的話
我們慢慢的發現都是HTML–》Servlet—》service----》dao這一套。這一套爲何要這樣設計呢?
這就涉及到軟件工程的中軟件體系結構設計的MVC風格—也就是大名鼎鼎的模型model-視圖view-控制control風格
model對應DAO層
view對應HTML和Servlet層
control對應service層
具體的MVC介紹,以後有空我想起了再寫吧。各位想看的,歡迎自行百度。
到此爲止此集結束
下次我們介紹的是
分類管理的實現
有添加和刪除分類,還有修改分類以及分類的顯示。並且會完成文件上傳工具類的解析
最後宣傳下我個人的微信公衆號,微信搜索:可及的小屋,有志向整副業,娛樂的程序員們,歡迎您的到來。謝謝。
100G程序員資料,自取哦!!