嗯,长夜慢慢无心睡眠,继续写这个的第二篇。就当做是回顾了。
上篇我们说到,建表和包结构。接下来就是实体类啦。
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程序员资料,自取哦!!