SSM项目整合实现简单用户注册和查询操作
前言:
此篇文章是我在学习SSM框架入门时写的一个小demo,主要是为了熟悉SSM框架的使用与引入,通过SSM框架的搭建完成对用户需求的注册和查询操作。
同时检验自己对SSM框架的掌握程度,以便进一步完成对SSM框架升级后spring boot框架的学习。
该项目简单的使用Ajax技术对数据请求的实现,包括简单的前端页面设计等
PS: 项目全部源码免费获取方法写在文章最后
一、项目实现前提(开发环境配置)
1.编程工具:Idea 2020.3
2.编程环境:JDK 1.8
3.数据库:MySQL 8.0.18
4.请求环境:Tomcat 9.0.50
5.浏览器:Firefix、Chrome、Edge等
6.项目框架:Spring + SpringMVC + Mybatis + Mysql
7.maven依赖:apache-maven-3.3.9
8.其他:jquery-3.4.1.js、jackson等
二、项目基本思路
需求简介:教师、学生注册账户,编辑个人信息,存储到数据库中,方便各学校的人员统计和管理,使其信息保留在云端。
A.前期功能的实现
1.教师端注册登录的实现
2.对账户其信息的增删改查等操作
B.后期功能的完善
1.教师对学生进行综合评价
2.学生反馈信息等
3.学生端注册登录的实现
4.权限设定
三、具体实现步骤
1.创建数据库(myssm)
1) teacher表
教师号tid
教师姓名tname
教师年龄tage
教授课程tmajor
账户密码tpassword
创建表sql语句
CREATE TABLE `teacher` ( `tid` int(20) NOT NULL AUTO_INCREMENT, `tname` varchar(60) DEFAULT NULL, `tage` int(20) DEFAULT NULL, `tmajor` varchar(60) DEFAULT NULL, `tpassword` varchar(50) DEFAULT NULL, PRIMARY KEY (`tid`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8
2) student表(后期完善)
学生学号id
学生姓名name
学生年龄age
所学专业major
账户密码password
辅导员tid
2. Tomcat的配置
- 1).下载解压Tomcat 9.0.50版本的文件,配置path路径等(不详细叙述)
- 2).电脑管理员身份打开cmd输入startup 然后回车打开Tomcat 使其运行
- 3).在idea界面中配置Tomcat启动器并部署项目访问地址等
3. idea中的SSM框架搭建
SSM 编程,即 SpringMVC + Spring + MyBatis 整合,是当前最为流行的 JavaEE 开发技术架构。其实 SSM 整合的实质,仅仅就是将 MyBatis整合入 Spring。因为 SpringMVC原本就是 Spring的一部分,不用专门整合。
SSM 整合的实现方式可分为两种:
- 基于 XML 配置方式
- 基于注解方式
3.1 SSM简介:
SpringMVC + Spring + MyBatis
- SpringMVC:数据处理,视图层和界面层,负责接收请求,显示处理结果的。
- Spring:Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成
- MyBatis:持久层, 访问数据库的。
3.2 实现逻辑:
用户发起请求--SpringMVC接收--Spring中的Service对象--MyBatis处理数据。
SSM整合也叫做SSI (IBatis也就是mybatis的前身), 整合中有容器。
- 第一个容器SpringMVC容器, 管理Controller控制器对象的。
- 第二个容器Spring容器,管理Service,Dao,工具类对象的
需要做的是把使用的对象交给合适的容器创建,管理。 把Controller还有web开发的相关对象交给springmvc容器, 这些web用的对象写在springmvc配置文件中service,dao对象定义在spring的配置文件中,让spring管理这些对象。
springmvc容器和spring容器是有关系的,关系已经确定好了springmvc容器是spring容器的子容器, 类似java中的继承。 子可以访问父的内容,在子容器中的Controller可以访问父容器中的Service对象, 就可以实现controller使用service对象。
3.3 实现步骤:
1)使用myssm的mysql库
表使用teacher(tid, auto_increment, tname, tage,tmajor,tpassword)
2)新建maven web项目
新建Maven工程,选择maven-archetype-webapp,
3)进行Next,然后对其项目命名(myfirst-ssm)和工件坐标(com.gob)的编写
4)对Maven的路径配置
5)创建成功后的原始结构
3.4加入依赖(pom.xml)
springmvc,spring,mybatis三个框架的依赖,jackson依赖,mysql驱动,druid连接池jsp,servlet依赖。
1) maven 依赖
1 <!--servlet--> 2 <dependency> 3 <groupId>javax.servlet</groupId> 4 <artifactId>javax.servlet-api</artifactId> 5 <version>3.1.0</version> 6 <scope>provided</scope> 7 </dependency> 8 <!-- jsp 依赖 --> 9 <dependency> 10 <groupId>javax.servlet.jsp</groupId> 11 <artifactId>jsp-api</artifactId> 12 <version>2.2.1-b03</version> 13 <scope>provided</scope> 14 </dependency> 15 <!--springmvc--> 16 <dependency> 17 <groupId>org.springframework</groupId> 18 <artifactId>spring-webmvc</artifactId> 19 <version>5.2.5.RELEASE</version> 20 </dependency> 21 <!--事务的--> 22 <dependency> 23 <groupId>org.springframework</groupId> 24 <artifactId>spring-tx</artifactId> 25 <version>5.2.5.RELEASE</version> 26 </dependency> 27 <dependency> 28 <groupId>org.springframework</groupId> 29 <artifactId>spring-jdbc</artifactId> 30 <version>5.2.5.RELEASE</version> 31 </dependency> 32 <!--aspectj 依赖--> 33 <dependency> 34 <groupId>org.springframework</groupId> 35 <artifactId>spring-aspects</artifactId> 36 <version>5.2.5.RELEASE</version> 37 </dependency> 38 <!--jackson--> 39 <dependency> 40 <groupId>com.fasterxml.jackson.core</groupId> 41 <artifactId>jackson-core</artifactId> 42 <version>2.9.0</version> 43 </dependency> 44 <dependency> 45 <groupId>com.fasterxml.jackson.core</groupId> 46 <artifactId>jackson-databind</artifactId> 47 <version>2.9.0</version> 48 </dependency> 49 <!--mybatis 和 spring 整合的--> 50 <dependency> 51 <groupId>org.mybatis</groupId> 52 <artifactId>mybatis-spring</artifactId> 53 <version>1.3.1</version> 54 </dependency> 55 <!--mybatis--> 56 <dependency> 57 <groupId>org.mybatis</groupId> 58 <artifactId>mybatis</artifactId> 59 <version>3.5.1</version> 60 </dependency> 61 <!--mysql 驱动--> 62 <dependency> 63 <groupId>mysql</groupId> 64 <artifactId>mysql-connector-java</artifactId> 65 <version>5.1.9</version> 66 </dependency> 67 <!--druid--> 68 <dependency> 69 <groupId>com.alibaba</groupId> 70 <artifactId>druid</artifactId> 71 <version>1.1.12</version> 72 </dependency> 73 </dependencies>
2)插件
1 <build> 2 <resources> 3 <resource> 4 <directory>src/main/java</directory><!--所在的目录--> 5 <includes><!--包括目录下的.properties,.xml 文件都会扫描到--> 6 <include>**/*.properties</include> 7 <include>**/*.xml</include> 8 </includes> 9 <filtering>false</filtering> 10 </resource> 11 </resources> 12 <plugins> 13 <plugin> 14 <artifactId>maven-compiler-plugin</artifactId> 15 <version>3.1</version> 16 <configuration> 17 <source>1.8</source> 18 <target>1.8</target> 19 </configuration> 20 </plugin> 21 </plugins> 22 </build>
3.5写web.xml
A.web原版本较低,需要更改版本号,改到4.0版本的
B.更改版本的方法
方法一:复制粘贴之前项目的文档
方法二:在模块组件中更改版本4.0(推荐)
更改后的web4.0
1)注册DispatcherServlet ,目的:
a.创建springmvc容器对象,才能创建Controller类对象。
b.创建的是Servlet,才能接受用户的请求。
1 <!--注册中央调度器--> 2 <servlet> 3 <servlet-name>myweb</servlet-name> 4 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 5 <init-param> 6 <param-name>contextConfigLocation</param-name> 7 <param-value>classpath:conf/dispatcherServlet.xml</param-value> 8 </init-param> 9 <load-on-startup>1</load-on-startup> 10 </servlet> 11 <servlet-mapping> 12 <servlet-name>myweb</servlet-name> 13 <url-pattern>*.do</url-pattern> 14 </servlet-mapping>
2)注册spring的监听器:
ContextLoaderListener,目的: 创建spring的容器对象,才能创建service,dao等对象。
1 <!--注册spring的监听器--> 2 <context-param> 3 <param-name>contextConfigLocation</param-name> 4 <param-value>classpath:conf/applicationContext.xml</param-value> 5 </context-param> 6 <listener> 7 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 8 </listener>
3)注册字符集过滤器,解决post请求乱码的问题
1 <filter> 2 <filter-name>characterEncodingFilter</filter-name> 3 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 4 <init-param> 5 <param-name>encoding</param-name> 6 <param-value>utf-8</param-value> 7 </init-param> 8 <init-param> 9 <param-name>forceRequestEncoding</param-name> 10 <param-value>true</param-value> 11 </init-param> 12 <init-param> 13 <param-name>forceResponseEncoding</param-name> 14 <param-value>true</param-value> 15 </init-param> 16 </filter> 17 <filter-mapping> 18 <filter-name>characterEncodingFilter</filter-name> 19 <url-pattern>/*</url-pattern> 20 </filter-mapping>
3.6创建项目整体结构和各种包
创建包
1)Controller请求类包
2)Service业务类包
3)dao接口类包
4)entity实体类包
注:向数据库中添加数据需要用mybatis和实体类,
Dao ,Mapper和处理业务逻辑的service,
最后接收请求的controller。
3.7写springmvc,spring,mybatis的配置文件
1)springmvc配置文件(springssm.xml)
2)spring配置文件(applicationContext.xml)
3)mybatis主配置文件(mybatis.xml)
4)数据库的属性配置文件(jdbc.properties)
注:具体参考文件夹内配置文件。
3.8写代码, dao接口和mapper文件, service和实现类,controller和entity 实体类。
1)entity 实体类
Teacher中的属性名可以与数据库中的属性名不同,但需要起别名或者用resultype进行配置。
1 private Integer tid; 2 private String tname; 3 private Integer tage; 4 private String tmajor; 5 private String tpassword;
2)dao接口
TeacherDao:
1 public interface TeacherDao { 2 int insertTeacher(Teacher teacher); 3 List<Teacher> selectTeachers(); 4 }
注:selectTeachers();相当于查询所有教师,自定义名称。
TeacherDao.xml:
其作用是对数据库中的数据进行增删改查操作,相当于对数据库的映射。
文件命名尽量与接口相同,便于记忆与操作。
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <mapper namespace="com.gob.dao.TeacherDao"> 6 <select id="selectTeachers" resultType="Teacher"> 7 select tid,tname,tage,tmajor,tpassword from teacher order by tid desc 8 </select> 9 <insert id="insertTeacher"> 10 insert into teacher(tid,tname,tage,tmajor,tpassword) values(#{tname},#{tage},#{tmajor},#{tpassword}) 11 </insert> 12 </mapper>
注:a.查询id和返回类型起别名或者用(全限定路径com/gob/entity/Teacher)进行配置
b.要养成习惯在select 和from之间一定要写列名,不要写星*,这样方便运行,防止出错节约网络流量,提升效率等
3)service类
TeacherService:
1 public interface TeacherService { 2 int addTeacher(Teacher teacher); 3 List<Teacher> find Teachers(); 4 }
TeacherServiceImpl:接口的实现
找到TeacherService类然后Ait+Enter进行接口的实现放在package com.gob.service.impl;路径下,需新建impl包;
1 @Service 2 public class TeacherServiceImpl implements TeacherService { 3 @Resource 4 private TeacherDao teacherDao; 5 @Override 6 public int addTeacher(Teacher teacher) { 7 int nums = teacherDao.insertTeacher(teacher); 8 return nums; 9 } 10 @Override 11 public List<Teacher> findTeachers() { 12 return teacherDao.selectTeachers(); 13 } 14 }
注://引用类型自动注入@Autowired, @Resource
4)controller类(重点)
TeacherController:首先加注解@Controller
1 @Controller 2 @RequestMapping("/teacher") 3 public class TeacherController { 4 5 @Resource 6 private TeacherService service; 7 //注册教师 8 @RequestMapping("/addTeacher.do") 9 public ModelAndView addTeacher(Teacher teacher ){ 10 ModelAndView mv = new ModelAndView(); 11 String tips= "注册失败"; 12 //调用service处理teacher 13 int nums = service.addTeacher(teacher); 14 if (nums >0){ 15 tips = "教师【"+teacher.getTname()+"】注册成功"; 16 } 17 //添加数据 18 mv.addObject("tips",tips); 19 //指定结果页面 20 mv.setViewName("result"); 21 return mv; 22 23 } 24 //处理查询,响应ajax 25 @RequestMapping("/queryTeacher.do") 26 @ResponseBody 27 public List<Teacher> queryTeacher(){ 28 //参数检查, 简单的数据处理 29 List<Teacher> teachers = service.findTeachers(); 30 return teachers; 31 } 32 }
注:返回结果页面需要在web页面类中声明
3.9.1写jsp页面
result.jsp:
1 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 <html> 3 <head> 4 <title>Title</title> 5 </head> 6 <body> 7 result.jsp 结果页面,注册结果: ${tips} 8 </body> 9 </html>
至此,后端内容基本上全部写完和配置好了
======================================
3.9.2前端页面
1)首页
Index.jsp:
1 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 <% 3 String basePath = request.getScheme() + "://" + 4 request.getServerName() + ":" + request.getServerPort() + 5 request.getContextPath() + "/"; 6 %> 7 <html> 8 <head> 9 <title>功能入口</title> 10 <base href="<%=basePath%>" /> 11 </head> 12 <body> 13 <div align="center"> 14 <p>我的第一个SSM整合项目的实现</p> 15 <img src="images/ssm.jpg" /> 16 <table> 17 <tr> 18 <td><a href="addTeacher.jsp"> 注册教师</a></td> 19 </tr> 20 <tr> 21 <td><a href="listTeacher.jsp">查询教师</a></td> 22 </tr> 23 </table> 24 </div> 25 </body> 26 </html>
A.项目部署成功:
B.主页面:
2)注册页面
A. addTeacher:
1 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 <% 3 String basePath = request.getScheme() + "://" + 4 request.getServerName() + ":" + request.getServerPort() + 5 request.getContextPath() + "/"; 6 %> 7 <html> 8 <head> 9 <title>教师注册</title> 10 <base href="<%=basePath%>" /> 11 </head> 12 <body> 13 <div align="center"> 14 <form action="teacher/addTeacher.do" method="post"> 15 <table> 16 <tr> 17 <td>姓名:</td> 18 <td><input type="text" name="tname"></td> 19 </tr> 20 <tr> 21 <td>年龄:</td> 22 <td><input type="text" name="tage"></td> 23 </tr> 24 <tr> 25 <td>教授课程:</td> 26 <td><input type="text" name="tmajor"></td> 27 </tr> 28 <tr> 29 <td>登录密码:</td> 30 <td><input type="text" name="tpassword"></td> 31 </tr> 32 <tr> 33 <td> </td> 34 <td><input type="submit" value="注册"></td> 35 </tr> 36 </table> 37 </form> 38 </div> 39 </body> 40 </html>
教师张三注册:
注册成功返回结果页面:
注册信息存储到数据库:
注:1.在写注册页面时,<td>姓名:</td> <td><input type="text" name="tname"></td>的类型和实体类的属性相对应,作为映射。
2.项目请求实现路径 index.jsp--addTeacher.jsp---teacher/addTeacher.do( service的方法,调用dao的方法)--result.jsp
B.查询页面
listTeacher:
1 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 <% 3 String basePath = request.getScheme() + "://" + 4 request.getServerName() + ":" + request.getServerPort() + 5 request.getContextPath() + "/"; 6 %> 7 <html> 8 <head> 9 <title>查询教师ajax</title> 10 <base href="<%=basePath%>" /> 11 <script type="text/javascript" src="js/jquery-3.4.1.js"></script> 12 <script type="text/javascript"> 13 $(function(){ 14 //在当前页面dom对象加载后,执行loadTeacherData() 15 loadTeacherData(); 16 $("#btnLoader").click(function(){ 17 //loadTeacherData(); 18 alert($("#country > option:selected").val()); 19 alert($("#country > option:selected").text()); 20 }) 21 }) 22 function loadTeacherData(){ 23 $.ajax({ 24 url:"teacher/queryTeacher.do", 25 type:"get", 26 dataType:"json", 27 success:function(data){ 28 //清除旧的数据 29 $("#info").html(""); 30 //增加新的数据 31 $.each(data,function(i,n){ 32 $("#info").append("<tr>") 33 .append("<td>"+n.tid+"</td>") 34 .append("<td>"+n.tname+"</td>") 35 .append("<td>"+n.tage+"</td>") 36 .append("<td>"+n.tmajor+"</td>") 37 .append("</tr>") 38 }) 39 } 40 }) 41 } 42 </script> 43 </head> 44 <body> 45 <div align="center"> 46 <table> 47 <thead> 48 <tr> 49 <td>学号</td> 50 <td>姓名</td> 51 <td>年龄</td> 52 <td>教授课程</td> 53 </tr> 54 </thead> 55 <tbody id="info"> 56 </tbody> 57 </table> 58 <input type="button" id="btnLoader" value="查询数据"> 59 <select id="country"> 60 <option value="1">北京</option> 61 <option value="2">上海</option> 62 <option value="3">深圳</option> 63 <option value="4">天津</option> 64 <option value="5">成都</option> 65 </select> 66 </div> 67 </body> 68 </html>
3.9.3使用ajax实现查询教师的功能
Controller中:
1 //处理查询,响应ajax 2 @RequestMapping("/queryTeacher.do") 3 @ResponseBody 4 public List<Teacher> queryTeacher(){ 5 //参数检查, 简单的数据处理 6 List<Teacher> teachers = service.findTeachers(); 7 return teachers; 8 }
查询路径:http://localhost:8088/myfirst_ssm/teacher/queryTeacher.do
四、项目整体架构
五、知识点扩展:
@Resource注解类的使用
1.首先在resources目录下的spring的配置文件applicationContext.xml中写包扫描路径配置文件,扫描该com.gob.service路径下的所有类。
<!--声明service的注解@Service所在的包名位置-->
<context:component-scan base-package="com.gob.service" />
2.然后在service包路径下,编写接口和其实现类,在此类前加@Service注解,用于该类被扫描,可以被实例化。
@Service
public class TeacherServiceImpl implements TeacherService {};
3.最后在使用此方法时,@Resource标注在声明的变量上,根据类型将实例化的对象注入到声明的变量中,就可以使用了。
@Resource
private TeacherService service;
写在最后:
写文章不易,对你有帮助的话,希望给个三连(点赞、关注、评论)
文章转载请注明出处链接,有其他想法可在评论区留言,谢谢!
项目源码(百度网盘):
链接:https://pan.baidu.com/s/1O1Ak00_h9o9Z0WPvunO_Rw
提取码:1234
其他随笔推荐(作者力推):
1. 十大排序算法(Java实现):https://www.cnblogs.com/zbcxy506/p/zbcxy506_3arithmetic-01.html
本文来自博客园,作者:智博程序园,转载请注明原文链接,谢谢配合:https://www.cnblogs.com/zbcxy506/articles/zbcxy506_2ssm-01.html