日记本系统(更新中)
写在前面
系统采用传统的Jsp+Servlet+Model的MVC开发模式,前端采用主流的BootStrap技术,数据库采用Mysql,实现了个人日记本系统,亮点是Bootstrap的综合运用,ckeditor的运用以及FileUpload组件上传图片,以及MD5加密的应用(该项目是非本人开发,只是学习其中的知识);
一、需求:
- 登陆注册
- 日记的增删该查
- 日记分类(增删改查)
- 个人中心(头像,名字,签名等信息)
二、数据库设计:
-
三张表:
t_user(userId,userName,password,nickName,imageName,mood)//password因为采用MD5加密,所以设置长一点(50)
t_diary (diaryId,title,content,typeId,releaseDate )//content 内容长,datatype用text,releaseDate的格式用datetime
t_diaryType(diaryTypeId,typeName) -
主外键设置(外键:其他表中的主键称为外键):
t_diary 中的 typeId外键 关联 t_diaryTaye中的 diaryTypeId主键 (对应关系为多对1)
navicat设置外键:
外键名(name):可以不填, 系统自动生成;
栏位名(Field Name): 就是设置‘typeId’为外键;
参考数据库(Reference DadaBase): 外键关联的数据库;
引用表(Reference Table): 关联的表;
外栏位名(Outside field name): 关联的字段(这里是“diaryTypeId”, 可以与栏位名相同);
删除时:删除时候选择的动作
刷新时:更新时候选择的动作
(在设置外键的时候,删除时和更新时两列有四个值可以选择:CASCADE、NO ACTION、RESTRICT、SET NULL,自己全亲自试了一遍,它们的区别如下:
CASCADE:父表delete、update的时候,子表会delete、update掉关联记录;
SET NULL:父表delete、update的时候,子表会将关联记录的外键字段所在列设为null,所以注意在设计子表时外键不能设为not null;
RESTRICT:如果想要删除父表的记录时,而在子表中有关联该父表的记录,则不允许删除父表中的记录;
NO ACTION:同 RESTRICT,也是首先先检查外键;) -
设计表注意事项:
1.对于id这种主键:int 型,主键,不允许为空,自动递增
2.对于日期,需要特殊格式:如datetime
3.像比较长的文本如日记内容可设置格式为text
4.对于其他的属性,只要是包含汉字型的,如名称,密码都将类型设置为varchar,长度根据需求设置即可。
三.后台代码
四个包:
Dao:数据访问对象层
Model:模型层
Util:工具层
Web:web访问层
- Util:
连接数据库:
注意事项:添加mysql得jar包:mysql-connector-java
public class DbUtil2 {
private String dbUrl="jdbc:mysql://localhost:3306/db_diary";
private String dbUserName="root";
private String dbPassword="l1542735938";
private String jdbcName="com.mysql.jdbc.Driver";
//获取连接:先加载驱动,再连接
public Connection getCon() throws Exception{
Class.forName(jdbcName);
Connection con =DriverManager.getConnection(dbUrl,dbUserName,dbPassword);
return con;
}
//关闭连接
public void closeCon(Connection con) throws Exception{
if (con!=null){
con.close();
}
}
- model
根据数据库中的表建相关的类; - dao
用于登陆账号密码的验证等
如验证登陆信息:
public User login(Connection con ,User user) throws Exception{
User resultUser=null;//若不存在则返回Null
//查找数据库中是否存在user
String sql="select *from t_user where userName=?and password=?";
PreparedStatement pstmt=con.prepareStatement(sql);
pstmt.setString(1, user.getUserName());
pstmt.setString(2, user.getPassword());
ResultSet rs=pstmt.executeQuery();
if(rs.next()){//如果存在,就初始化resultUser
resultUser=new User();
resultUser.setUserId(rs.getInt("userId"));
resultUser.setUserName(rs.getString("userName"));
resultUser.setPassword(rs.getString("password"));
}
return resultUser;
}
- web
注意事项:- 先将tomcat的包添加(buildPath)
- 继承HttpServlet
- 覆盖父类的doPost,doGet方法
代码
package web;
import java.io.IOException;
import java.sql.Connection;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import dao.UserDao;
import model.User;
import util.DbUtil;
public class LoginServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取session对象,用于保存当前登陆对象
HttpSession session=req.getSession();
//获取前台用户信息,用于验证是否合法
String userName=req.getParameter("userName");
String password=req.getParameter("password");
Connection con= null;
DbUtil dbUtil=new DbUtil();
UserDao userDao=new UserDao();
try {
con=dbUtil.getCon();
User currentUser=userDao.login(con, new User(userName,password));
if(currentUser==null){
}else{
session.setAttribute("currentUser", currentUser);
resp.sendRedirect("main.jsp");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
try {
dbUtil.closeCon(con);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}