核心:1.前后端代码的交互
2.前端代码
3.后端代码
数据库:写一个文件(里面装有创建的数据库里面的内容)创建数据库(java_blog_system){创建博客blog(blogId,blog_title,content,userId,postTime),创建用户表user(userId,userName,password)}
创建一个Dao包 里面有:
1.创建一个user类:里面有用户的属性(userId,userName,password)
2.创建一个blog类,里面有博客的属性(blogId,blog_title,content,userId,postTime)
3.创建一个UrlDao类,里面有创建数据库源,连接,和关闭一些资源(ResuleSet,Connection,statement)的方法
4.创建一个BlogDao类,里面是博客的添加,查询和删除
5.创建一个UserDao类,里面有查询用户(通过名字和Id)
一.登陆页面
用户在页面上写出用户名和密码后,前端把数据传入到后端,向后端发出请求,后端拿到数据后进行登陆验证
前后端交互:
方法:post Url:login
Content-Type:form表单
后端:接收到用户名和密码
req.setCharacterEncoding("utf8"); String username= req.getParameter("username"); String password= req.getParameter("password");
1.验证用户名和密码是否为空
if(username==null||password==null||"".equals(username)||"".equals(password)){ resp.setContentType("text/html;charset=utf8"); resp.getWriter().write("用户名错误"); return; }
2.验证用户名是否为空(实例化一个UserDao,到实例化后的UserDao里面找接收到的用户名,若用户因为空,这说明用户名错误或密码错误)
UserDao userDao=new UserDao(); User user= null; try { user = userDao.getUserByName(username); } catch (SQLException e) { throw new RuntimeException(e); } if(user==null){ resp.setContentType("text/html;charset=utf8"); resp.getWriter().write("用户名错误或者密码错误"); return; }
3.验证密码是否正确(用接收到的密码和实例化的UserDao的密码做比较)
if(!password.equals(user.getPassword())){ resp.setContentType("text/html;charset=utf8"); resp.getWriter().write("用户名错误或者密码错误"); return; }
4.验证是否有会话(若有会话就查询,若没有就创建会话)
HttpSession session= req.getSession(true); if(session==null){ //未登陆 resp.setStatus(403); resp.sendRedirect("login.html"); } session.setAttribute("username",username);
5.跳转到列表页
resp.sendRedirect("blog_list.html");
二.强制登录
前后端交互:
方法:Get Url:login
后端:
获取会话是否为空,若为空则就返回,否则就查询
若果会话不为空,就查询会话里面的username,看是否和也面输入的是否相同
注意:验证是否已登陆
思路:查看会话是否为空,若会话为空,则就说明未登陆直接返回,若会话不为空,就查询会话,看会话里面的值是否为空,为空就未登陆并直接返回
HttpSession session=req.getSession(false); if(session==null){ resp.setContentType("text/html;charset=utf8"); resp.getWriter().write("用户未登陆"); return; } User user=(User)session.getAttribute("user"); if(user==null){ resp.setContentType("text/html;charset=utf8"); resp.getWriter().write("用户未登陆"); return; }
三.查询博客列表页(blog_list.html)
前端向后端发出请求,后端从数据库拿到数据,到前端响应出来
前后端的交互:
方法:Get Url:blog
Content-Type:application/json
后端:写Get方法
首先实例化一个BlogDao类,拿到他的userId,如果userId为空则为情况一,如果userId不为空则为情况二
BlogDao blogDao = new BlogDao(); String blogId=req.getParameter("userId");
情况一:获取所有的列表
List<Blog> blogs = null; try { blogs = blogDao.getBlogs(); } catch (SQLException e) { throw new RuntimeException(e); } String response = objectMapper.writeValueAsString(blogs); resp.setContentType("application/json;charset=utf8"); resp.getWriter().write(response);
情况二:获取指定Id的博客
Blog blog=new Blog(); try { blog=blogDao.getBlog(Integer.parseInt(blogId)); } catch (SQLException e) { throw new RuntimeException(e); } String response= objectMapper.writeValueAsString(blog); resp.setContentType("application/json;charset=utf8"); resp.getWriter().write(response);
三. 博客列表页(用户的信息)和博客详情页(作者)
如果有blogId=null 则就是博客列表页,若blogId不为空就是博客详情页
String blogId= req.getParameter("blogId");
博客列表页:首先验证用户是否登陆了,如果用户未登陆了,就返回(返回一个实例化的空User)
否则就获取会话中的用户信息,写到服务器中,最后再返回到页面上
博客详情页:实例化一个BlogDao类,到里面查找当前blogId的blog,若没有找到就返回一个实例化空User,否则实例化UserDao类,并查找blog里面的userId,看是否有user,若user为空,就实例化一个空User返回,否则就把接受到的user信息写到服务器上并返回到页面上
博客列表页:
方法:Get Url:user
后端:
HttpSession session= req.getSession(false); if(session==null){ User user=new User(); String response= objectMapper.writeValueAsString(user); resp.setContentType("application/json;charset=utf8"); resp.getWriter().write(response); return; } User user=new User(); user=(User)session.getAttribute("user"); if(user==null){ user=new User() String response= objectMapper.writeValueAsString(user); resp.setContentType("application/json;charset=utf8"); resp.getWriter().write(response); return; } String response= objectMapper.writeValueAsString(user); resp.setContentType("application/json;charset=utf8"); resp.getWriter().write(response);
博客详情页:
方法:Post Url:user blogId=?
BlogDao blogDao = new BlogDao(); Blog blog; try { blog = blogDao.getBlog(Integer.parseInt(blogId)); } catch (SQLException e) { throw new RuntimeException(e); } if (blog == null){ User user=new User(); String response= objectMapper.writeValueAsString(user); resp.setContentType("application/json;charset=utf8"); resp.getWriter().write(response); return; } UserDao userDao=new UserDao(); User user= null; try { user = userDao.getUserById(blog.getUserId()); } catch (SQLException e) { throw new RuntimeException(e); } if(user==null){ user=new User(); String response= objectMapper.writeValueAsString(user); resp.setContentType("application/json;charset=utf8"); resp.getWriter().write(response); return; } String response= objectMapper.writeValueAsString(user); resp.setContentType("application/json;charset=utf8"); resp.getWriter().write(response);
四.编辑页面(发布博客的地方)
思路: 首先先验证是否已登陆,若未登陆就返回,否则就从前端代码中获取标题和正文
如果标题和正文都为空,就返回 否则就实例化一个BlogDao类,调用insert方法来写一篇博客
前后端交互:
方法:post Url: blog
后端:
req.setCharacterEncoding("utf8"); String title=req.getParameter("title"); String content= req.getParameter("content"); if(title==null||content==null||"".equals(title)||"".equals(content)){ resp.setContentType("text/html"); resp.getWriter().write("用户还没有发不此篇博客"); return; } //构造blog,插入标题和正文 Blog blog=new Blog(); blog.setTitle(title); blog.setContent(content); blog.setUserId(user.getUserId()); BlogDao blogDao=new BlogDao(); try { blogDao.insert(blog); } catch (SQLException e) { throw new RuntimeException(e); } resp.sendRedirect("blog_list.html");
五.退出登陆
思路:首先检验是否已登陆,若未登陆则就跳转到登陆页面,若登陆就调用
session.removeAttribute()函数来删除登陆的用户
session.removeAttribute("user"); resp.getWriter().write("该用户已退出登陆");