zoukankan      html  css  js  c++  java
  • 【CSDN】Spring+Spring MVC+Mybatis实战项目之云笔记项目

    【CSDN】Spring+Spring MVC+Mybatis实战项目之云笔记项目----mind_programmonkey

    这是一篇在mind_programmonkey云笔记项目基础上的自学笔记

    项目说明与源码出自原作者

    项目说明

    【实战】Spring+Spring MVC+Mybatis实战项目之云笔记项目

    一、项目简介

    img

    1. 项目概述

    云笔记,是tmocc上的一个子项目,用于客户进行在线学习记录,分享,收藏笔记,以及参与社区活动。

    2. 模块划分

    用户模块:登录、注册、修改密码、退出

    笔记本模块:创建、删除、更新、查看

    笔记模块:创建、删除、更新、查看、转义

    分享/收藏模块:分享、收藏、查看、搜索

    回收模块:查看、彻底删除、恢复

    活动模块:查看活动、参加活动

    3. 设计思想

    MVC设计思想

    表现层:html+css+Jquery+ajax

    控制层:springmvc

    业务层;service组件

    持久层:Dao组件

    4. 技术架构

    (1)开发环境:windows10+tomcat+mysql

    (2)采用技术:java+jquery+ajax+springmvc

    IOC+AOP+mybatis

    java:开发核心技术

    jquery:简化前端JavaScript($对象和API)

    ajax:局处理页面,提升用户体验度

    springmvc:负责接收请求,调用业务组件处理,生成json响应

    spring(IOC/AOP):管理相关组件

    IOC:负责管理Controller/service/dao,维护它们之间的关系

    AOP:面向切面编程,不修改原有的代码,给系统增加新的功能

    5. 整体规范

    -所有的请求ajax方法访问

    -前端页面采用HTML

    -请求结果进行JSON相应

    {status:,“msg”:,“data”:}

     

    二、数据库构建

    1. 常用命令

    show databases;//查看有哪些数据库

    create database cloud_note;//创建数据库

    drop database cloud_note;删除数据库

    use 数据库名 ;连接数据库

    show tables;查看有哪些表

    source ;导入sql文件

    2. 数据表联系

    数据库表联系

    三、项目流程

    SSM框架:springMVC+spring+Mybatis

     

     

    (一)创建云笔记项目环境

    1.**导包**

    img

    2.**添加配置文件**

    img

    +

    web.xml

    3. 划分包结构

    -com.lcz.cloud_note.dao:接口层

    -com.lcz.cloud_note.service:服务层

    -com.lcz.cloud_note.controller:控制层

    -com.lcz.cloud_note.entity:实体层

    -com.lcz.cloud_note.util:工具层

    -com.lcz.cloud_note.aspect:切面层

    4. 将html目录下的内容拷贝到webapp下

     

     

     

    四、功能实现

    (一)、登录功能

    img

     

    1. 发送ajax请求

    事件绑定

    获取参数

    $.ajax发送请求

    2. 服务器处理

    请求

    -->DispatcherServlet->HandlerMapping->Controller.execute()->Service->Dao->cn_user->返回数据

    3.ajax 回调处理

    成功:edit.html

    失败:提示信息,重新登录

     

    (二)、注册功能

    img

    1. 发送ajax请求

    -发送事件:注册按钮的点击

    -获取的参数:用户名 昵称 密码

    -请求地址: /user/register.do

    2. 服务器处理

    请求

    -->DispatcherServlet->

    HandlerMapping->

    Controller.execute()->

    Service(addUser)->

    //检查用户

    user=findByNam(name)

    user!=null

    result

    //添加用户

    处理password

    user.set()

    save(user)

    //设置result

    Dao->cn_user(insert)->json响应

    3.ajax 回调处理

    success:

    注册成功

    注册失败

    error(异常):

     

    知识点:

    UUID:是一个生成字符串算法,用于生成数据库主键

    生成主键有两种方式:在应用服务器端生成主键;在数据库端生成主键

     

     

    (三)、笔记本列表显示功能

    img

    1. 发送ajax请求

    发送事件:进入到edit.html发送请求

    请求参数:userId

    请求地址:/book/loadBooks.do

    2. 服务器处理

    /book/loadBooks.do

    -->LoadBooksController.execute

    -->BookService.LoadUserBooks

    1.BookService接口 loadUserBooks

    2.实现类里面调用dao.findByUserId

    3.实现类中构建Result结果

    -->BookDao.findByUserId

    1.dao接口定义findByUserId

    2.配置BookMapper.xml

    -->cn_notebook

    -->JSON响应

    3.ajax 回调处理

    解析JSON数据。循环生成笔记本列表项(li)

    知识点:

    事件绑定:

    静态绑定---> 元素.click(function(){})

    动态绑定---> 父元素.on("click","li",fn)

     

    (四)、笔记列表显示

    img

    1. 发送ajax请求

    -发送事件:笔记本li的点击

    -请求的参数:笔记本的ID

    -请求地址:/note/loadnote.do

    2. 服务器的处理

    /note/loadnote.do

    ->LoadNoteController.execute

     

    ->NoteService.loadBookNotes

    //定义接口文件NoteService->loadBookNotes(bookId)

    //实现类中重写抽象方法

    noteDao.findByBookId();

    //构建Result-->set方法

    setData=List<Map>

    ->NoteDao.findByBookId(bookId)

    //接口文件定义方法

    //配置mapper文件

    //TestNoteDao

    ->cn_note(select-bookId&cn_note_status_id="1")

     

    3.ajax 回调的处理

    success:解析json数据。生成笔记Li,添加到笔记列表中

    error:提示alert("笔记加载失败")

     

    知识点:

    Dao接口的传值特点:mybatis中Dao方法要么没有参数,要么一个参数。

    //获取笔记信息

    var notes=result.data;//(List集合中存储)

    //清除原来的列表信息

    $("#note_ul").empty();

     

    (五)、显示笔记数据

    img

    1 、发送ajax请求

    #发送事件:笔记列表li元素的单击事件(动态绑定)

    #请求参数:笔记ID(noteId)

    #请求地址:/note/load.do

    2. 服务器处理

    -Controller:LoadNoteController.execute(String noteId)

    -Service:NoteService.loadNote(String noteId)

    -Dao:NoteDao.findByNoteId(Strign noteId)

    -cn_note(查询):

    -json响应

     

    3.ajax 回调处理

    -succes:

    -设置笔记标题(title)

    -设置笔记内容(body)

    um.setContent(“str”);

    um.getContent(“str”);

    -error:alert(“笔记信息加载失败”)

    知识点:UEdit

    用js开发的开源组件

    为什么?

    通过js代码实现表单功能的增强

    如何用?

    1. 引用脚本

    <!-- Ueditor编辑器JS -->

    <script type="text/javascript" charset="utf-8" src="scripts/common/ue/umeditor.config.js"></script>
    <script type="text/javascript" charset="utf-8" src="scripts/common/ue/umeditor.min.js"></script>
    <script type="text/javascript"

    src="scripts/common/ue/lang/zh-cn.js"></script>

    2. 实例化

    //实例化Ueditor编辑器

    var um = UM.getEditor('myEditor');

    3. 通过script

    <!--- 输入框 --->

    <script type="text/plain" id="myEditor" style="100%;height:400px;">

    </script>

    <!--- 输入框 --->

    4. 设置

    um.setContent(“str”);

    um.getContent(“str”);

     

     

     

    六、更新笔记信息即保存笔记信息

    img

    1. 发送ajax请求

    #发送事件:“保存笔记”按钮点击事件(静态)

    #请求参数:笔记ID(id)、标题(title)、内容(body)

    请求地址:/note/update.do

    2. 服务器处理

    -UpdateNoteController(id,title,body)-->

    -NoteService.updateNote(Note)

    -NoteDao.uodateNote(Note)

    -cn_note(更新处理)

    3.ajax 回调处理

    success:对被更新的笔记名称进行更新

    <li><a class="checked"></a></li>

    var $li=$(“#note_ul a.checked”).parent

     

    知识点:alert的使用

    如何显示?

    -通过load(),加载html

    -显示show()背景

     

    七、创建一个新的笔记本

    img

    1.ajax 请求

    -发送事件:对话框中的“创建”按钮的单击(动态)

    -请求参数: 用户ID 笔记本名称

    -请求地址:/book/add.do

    2. 服务器处理

    -AddBookController.execute

    -BookService.addBook(book)

    -BookDao.save(Book book)

    -cn_notebook(insert)

    --json响应

    3.ajax 回调处理

    success:

    -关闭对话框

    -添加一个笔记本li

    -提示创建笔记本的成功

    error:

    提示创建笔记本失败

     

    八、创建一个新的笔记

    img

    1.ajax 请求

    -发送事件:对话框中的“创建”按钮的单击(动态)

    -请求参数:笔记名称 笔记本ID 用户ID

    -请求地址:/note/add.do

    2. 服务器处理

    -AddNoteController.execute

    -NoteService.addBook(book)

    -NoteDao.save(Book book)

    -cn_notebook(insert)

    --json响应

    3.ajax 回调处理

    success:

    -关闭对话框(可以省略)

    -解析JSON数据。生成一个li元素添加到笔记列表中

    1.获取title

    2.获取noteId

    -提示创建笔记的成功

    error:

    提示创建笔记失败

     

    九、显示笔记下拉菜单

    img

    1.通过点击“箭头”按钮显示三个菜单项

    -获取div对象 slideDown();

    2.、下拉菜单的分享功能

    img

    #发送请求

    -发送事件:点击“分享”按钮

    -请求参数:noteId

    -请求地址:/share/add.do

    #服务器处理

    -创建Share类

    -Controller

    -Service

    -Dao-insert

    -cn_share

    #回调处理

    success:提示分享成功 增加图标处理<i class=”fa fa-sitemao”>

    error:提示分享失败

    3.、下拉菜单的删除功能

    img

    //约定1-normal 2-delete

     

    note.setCn_note_status_id("1");

    //约定1-normal 2-favor 3-share

    note.setCn_note_type_id("1");

    4.、下拉菜单的移动功能

    img

    十:模糊查询分享笔记

    img

    功能描述:用户输入搜索关键词,然后点回车,触发查询

    可以多行显示,可以点击,然后显示具体信息

    1. 发送ajax事件

    发送事件:输入关键词后,点回车

    $(“Input_id”).keydown(function(event){

    var code=event.keyCode;

    if(code==13){

    发送ajax请求

    }

    })

    2. 服务器处理

    -Controller

    -Service

    -Dao(select)

    -cn_share

    select * from cn_share like %关键词%

    3.ajax 回调处理

    success:显示搜索笔记结果列表

    error:搜索笔记失败

     

    十一、修改密码及退出登录操作

    img

     

    十二、Spring AOP的应用

     

    AuditBean:性能审计用来查看执行各个业务需要的时间

    ExceptionBean:保存异常信息到日志中

    LoggerBean:封装打桩操作逻辑

    结构

    控制层:controller @Controller

    业务层:service @Service

    持久层:Repository @Repository

    表现层:html+css+Jquery+ajax

    -com.lcz.cloud_note.dao:接口层 --------持久层

    -com.lcz.cloud_note.service:服务层--------业务层

    -com.lcz.cloud_note.controller:控制层--------控制层

    -com.lcz.cloud_note.entity:实体层

    -com.lcz.cloud_note.util:工具层

    -com.lcz.cloud_note.aspect:切面层

    代码梳理

    导入源码之后,就要一点点的看源码了

    注册登录

    从界面出发:

    image-20200329213919596

     

    function register() {
    // 取值
    var userName = $("#regist_username").val();
    var password = $("#regist_password").val();
    var password2 = $("#final_password").val();
    var nickname = $("#nickname").val();
    // 校验用户名格式
    var reg = /^w{3,20}$/;
    if(!reg.test(userName)) {
    $("#warning_1").text("3-20位的英文、数字、下划线.").show();
    return;
    } else {
    $("#warning_1").hide();
    }
    //校验密码
    if(password.length<6 || password != password2) {
    return;
    }
    //进行注册
    var user = {
    "cn_user_name":userName,
    "cn_user_password":password,
    "cn_user_desc":nickname
    };
    $.ajax({
    type:"post",
    url:basePath+"user/register.do",
    dataType:"json",
    data:user,
    success:function(result) {
    if(result.status==0) {
    if(result.data) {
    alert("注册成功.");
    $("#zc").attr("class","sig sig_out");
    $("#dl").attr("class","log log_in");
    } else {
    $("#warning_1").text("用户名已存在.").show();
    }
    } else {
    alert(result.message);
    }
    },
    error:function(xhr,status,error) {
    alert("请求失败.");
    }
    });
    }

    url:basePath+"user/register.do"与之前的的html+script+json+servlet相似,

    web.xml文件中设置功能选择器,接收来自表现层的请求:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
     <display-name>SpringMvcMybatis</display-name>
     <welcome-file-list>
       <welcome-file>index.html</welcome-file>
       <welcome-file>index.htm</welcome-file>
       <welcome-file>index.jsp</welcome-file>
       <welcome-file>default.html</welcome-file>
       <welcome-file>default.htm</welcome-file>
       <welcome-file>default.jsp</welcome-file>
     </welcome-file-list>
     <listener>
       <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
     </listener>
     <context-param>
       <param-name>contextConfigLocation</param-name>
       <param-value>classpath:applicationContext.xml</param-value>
     </context-param>
     
     <servlet>
       <servlet-name>SpringMVC</servlet-name>
       <servlet-class>
    org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
       <init-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>
    classpath:applicationContext.xml
     </param-value>
       </init-param>
     </servlet>
     <servlet-mapping>
       <servlet-name>SpringMVC</servlet-name>
       <url-pattern>*.do</url-pattern>
     </servlet-mapping>
     
     <filter>
       <filter-name>encodingFilter</filter-name>
       <filter-class>
      org.springframework.web.filter.CharacterEncodingFilter
       </filter-class>
       <init-param>
         <param-name>encoding</param-name>
         <param-value>UTF-8</param-value>
       </init-param>
     </filter>
     <filter-mapping>
       <filter-name>encodingFilter</filter-name>
       <url-pattern>*.do</url-pattern>
     </filter-mapping>
    </web-app>

    告诉表示层要用什么方式请求去哪里请求

    image-20200329215652667

    凡是以xxx.do方式请求都发送到了controller

    image-20200329220940989

     

    controller接收这个请求:

    @Controller
    @RequestMapping("/user")//匹配请求
    public class UserRegisterController {
    @Resource
    private UserService userService;

    @RequestMapping("/add.do")
    @ResponseBody//以json数据格式返回数据
    public NoteResult<Object> execute(String name,String password,String nick) {
    //调用userService处理注册请求
    NoteResult<Object> result = userService.addUser(name, password, nick);
    System.out.println(result);
    return result;
    }
    }

    UserService用户操作类,在service包里定义了该接口

    public interface UserService {
    //查找登录的账户名 返回查找到的用户名对象(登录方法)
    public NoteResult<User> checkLogin(String name,String password);
    //保存一个用户名,输入类型为User(注册方法)
    public NoteResult<Object> addUser(String name,String password,String nick);
    //修改用户名密码
    public NoteResult<Object> changeUser(String userName,String last_password,String final_password);
    }
    1. 查找

    2. 保存(这里被用到)

    3. 修改

    实现上面的接口:

    public NoteResult<Object> addUser(String name, String password, String nick) {
    //接受结果数据
    NoteResult<Object> result = new NoteResult<Object>();
    //用户检测
    User hasUser = userDao.findByName(name);
    if(hasUser!=null) {//用户名存在
    result.setStatus(1);//用户名已经被占用
    result.setMsg("用户已经被占用");
    return result;
    }
    //用户名可用,添加用户的操作
    //添加用户
    User user = new User();
    //设置用户名
    user.setCn_user_name(name);
    //设置密码,密码存储需加密
    String md5Password = NoteUtil.md5(password);
    user.setCn_user_password(md5Password);
    //设置昵称
    user.setCn_user_nick(nick);
    //设置主键id
    String id = NoteUtil.createId();
    user.setCn_user_id(id);
    //执行保存操作
    userDao.save(user);
    //构建返回结果
    result.setStatus(0);
    result.setMsg("注册成功");
    return result;
    }

    注册阶段主要是执行上面的userDao.save(user);把用户信息保存数据库去。

    userDao是接口,它能创建引用。用mapper的配置实现类的方法

    mapper数据库与java对象的映射关系

    配置数据库参数的时候SqlSessionFactory找到mapper的位置(mapper里有多个描述对象与数据库列对应关系的xml文件)。

    配置mapper扫描,就是把上面所提到的所有mapper的xml配置文件都集中映射到dao

    如下:

    <!-- 配置数据库连接参数及连接池 -->
    <bean id="dbcp" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="username" value="root"/>
    <property name="password" value="root"/>
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/mysql"/>
    </bean>
    <!-- 配置SqlSessionFactory -->
    <bean id="ssf" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dbcp"/>
    <property name="mapperLocations" value="classpath:mapper/*.xml"/>
    </bean>

    <!-- 配置mapper扫描 -->
    <bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.lcz.cloud_note.dao"/>
    </bean>

    image-20200330193930628

    Dao包中每个类对应这mapper中的每个xml,类中的每个方法对应着xml中的每个id

    这样save(user)就与下面的sql对应了:

    <insert id="save" parameterType="com.lcz.cloud_note.entity.User">
    insert into
    cn_user(cn_user_id,cn_user_name,cn_user_password,cn_user_nick,cn_user_token)
    values(#{cn_user_id},#{cn_user_name},#{cn_user_password},#{cn_user_nick},#{cn_user_token})
    </insert>

    这样就完成了新用户的添加

    整理出来的项目结构是:

    image-20200330201703550

     (未完)

  • 相关阅读:
    struts2: 通过流输出实现exce导出
    Spring Security笔记:Remember Me(下次自动登录)
    Spring Security笔记:登录尝试次数限制
    Spring Security笔记:使用BCrypt算法加密存储登录密码
    Spring Security笔记:使用数据库进行用户认证(form login using database)
    Spring Security笔记:HTTP Basic 认证
    Spring Security笔记:自定义登录页
    Spring Security笔记:Hello World
    Spring官网下载dist.zip的几种方法
    UML:类图复习-鸡生蛋,蛋生鸡
  • 原文地址:https://www.cnblogs.com/1605-3QYL/p/12601252.html
Copyright © 2011-2022 走看看