实训日志2 SSM框架了解和实现简单用户管理系统的增删改查
SSM框架
1、Spring技术
spring是一个容器框架,它可以接管web层,业务层,dao层,持久层的各个组件,并且可以配置各种bean, 并可以维护bean与bean的关系。
- IOC 控制反转:
不再需要程序员去显式地new一个对象,而是让Spring框架帮你来完成这一切。IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。把创建对象和维护对象之间的关系的权利从程序转移到spring的容器。
- AOP 面向切面编程
核心:在不增加代码的基础上,还增加新功能。
什么是切面?你可以这样想:一个公司有多个销售部,都需要行政帮忙搞定日常的订文具、机票、办公室、出差酒店什么的,都需要财务搞定报销、收付款什么的事务吧,要仓库帮忙发货什么的。不可能每个销售部都去招几个行政、财务和仓管什么吧,销售部门只要做好业务就行了,订文具什么的事情交个专门的部门去办就行。在Spring AOP 中,把这些公共的事务,也就是这个例子中的行政啊、财务啊、仓管啊,看成一个个切面,让你的开发的时候,专注于核心业务。
2、Spring MVC
C - Controller:控制器。接受用户请求,调用 Model 处理,然后选择合适的View给客户。
M - Model:模型。业务处理模型,接受Controller的调遣,处理业务,处理数据。
V - View:视图。返回给客户看的结果。注意这里的客户未必是人,可能是浏览器,可能是APP
3、MyBatis
是对jdbc的封装,它让数据库底层操作变的透明。Mybatis的操作都是围绕一个sqlSessionFactory实例展开的。mybatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql语句映射。在每次与数据库交互时,通过sqlSessionFactory拿到一个sqlSession,再执行sql命令。
SSM框架简单用户管理系统的增删改查的实现
用户登陆的实现以及用户的增删改查实现
1、首先仍然先创建User实体类:
public class User {
private int id;
private String username;
private String password;
public User() {
}
public User(int id, String username, String password) {
this.id = id;
this.username = username;
this.password = password;
}
public int getId() {
return id;
}
public String getUsername() {
return username;
}
public void setId(int id) {
this.id = id;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public String getPassword() {
return password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
2、创建IUserDao接口和UserMapper.xml进行关联,
public interface IUserDao {
User findUserByUserName(String username);
List<User> findAll();
void deleteById(int id);
void add(User user);
User selectUserById(int id);
void update(User user);
}
UserMapper.xml中写入相应的数据库操作语句,包括增删改查操作,与IUserDao中方法一致
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.zr.dao.IUserDao">
<!--别名user小写-->
<select id="findUserByUserName" parameterType="String" resultType="user">
select * from tb_user where username=#{username}
</select>
<select id="findAll" resultType="user">
select * from tb_user
</select>
<select id="deleteById" resultType="user">
delete from tb_user where id=#{id}
</select>
<select id="add" resultType="user">
insert into tb_user(username,password) values (#{username},#{password})
</select>
<select id="selectUserById" parameterType="int" resultType="user">
select * from tb_user where id=#{id}
</select>
<update id="update" parameterType="user">
update tb_user set username=#{username},password=#{password}
where id=#{id}
</update>
</mapper>
3、编写Service层,IUserService接口和UserServiceImpl对其的具体实现
IUserService
public interface IUserService {
boolean login(String username,String password);
List<User> findAll();
void deleteById(int id);
void add(User user);
User selectUserById(int id);
void update(User user);
}
UserServiceImpl,这里可以看到我们让容器给我们自动创建了IUserDao类,在其中写了包括登陆,查询所有,删除,添加以及更新修改的逻辑业务。
@Service
public class UserServiceImpl implements IUserService {
//容器创建new
@Autowired
private IUserDao userDao;
@Override
public boolean login(String username, String password) {
User user=userDao.findUserByUserName(username);
if(user!=null&&user.getPassword().equals(password)){
return true;
}
return false;
}
@Override
public List<User> findAll() {
return userDao.findAll();
}
@Override
public void deleteById(int id) {
userDao.deleteById(id);
}
@Override
public void add(User user) {
userDao.add(user);
}
@Override
public User selectUserById(int id) {
User user=userDao.selectUserById(id);
return user;
}
@Override
public void update(User user) {
userDao.update(user);
}
}
4、编写Controller层,下面为UserConntroller具体代码,这里主要调用service层方法,创建modelandview并返回相应视图。同时这里也有使用redirect重定向,redirect是直接跳转到其他页面:
@Controller
@RequestMapping("user")
public class UserController {
@Autowired
private IUserService userService;
@RequestMapping("login.do")
public ModelAndView login(User user){
boolean flag=userService.login(user.getUsername(),user.getPassword());
ModelAndView modelAndView=new ModelAndView();
if(flag){
modelAndView.setViewName("main");
}
else{
modelAndView.setViewName("../failer");
}
return modelAndView;
}
@RequestMapping("findAll.do")
public ModelAndView findAll(){
List<User> users=userService.findAll();
ModelAndView mv=new ModelAndView();
mv.setViewName("user-list");
mv.addObject("users",users);
return mv;
}
@RequestMapping("deleteById.do")
public String delete(int id){
userService.deleteById(id);
return "redirect:findAll.do";
}
@RequestMapping("add.do")
public String add(User user){
userService.add(user);
return "redirect:findAll.do";
}
@RequestMapping("toUpdate.do")
public ModelAndView toUpdate(int id){
User user=userService.selectUserById(id);
ModelAndView modelAndView=new ModelAndView();
modelAndView.addObject("user",user);
modelAndView.setViewName("user-update");
return modelAndView;
}
@RequestMapping("update.do")
public String update(User user){
userService.update(user);
return "redirect:findAll.do";
}
}
5、实现前端的相应,跳转到指定界面以及实现相应的操作
首先为登陆表单,action为/user/login.do,所以他会到conntroller中找到与/user/login.do对应的视图,进行操作处理:
<form method="post" action="/user/login.do">
<div class="form-group has-feedback">
<input type="text" class="form-control"
placeholder="用户名" name="username"> <span
class="glyphicon glyphicon-envelope form-control-feedback"></span>
</div>
<div class="form-group has-feedback">
<input type="password" class="form-control"
placeholder="密码" name="password"> <span
class="glyphicon glyphicon-lock form-control-feedback"></span>
</div>
<div class="row">
<div class="col-xs-8">
<div class="checkbox icheck">
<label><input type="checkbox"> 记住 下次自动登录</label>
</div>
</div>
<!-- /.col -->
<div class="col-xs-4">
<button type="submit" class="btn btn-primary btn-block btn-flat">登录</button>
</div>
<!-- /.col -->
</div>
</form>
用户管理模块将所有用户展现,具体如下,在conntroller层中,对list-users界面视图通过mv.setViewName("user-list") ; mv.addObject("users",users) ; 将users的值传入了user-list的界面上,于是在前端界面进行引用展现;
同时本界面也有对每条记录的删除,修改更新功能,,以删除为例,不仅传入相应的视图位置,同时将id作为参数传入,在后端对其进行处理,完成后再重定向回到所有用户界面
<tbody>
<c:forEach items="${users}" var="user">
<tr>
<td><input id="ids" name="ids" type="checkbox" value="${user.id}"></td>
<td>${user.id}</td>
<td>${user.username}</td>
<td>${user.password}</td>
<td class="text-center">
<a href="/user/toUpdate.do?id=${user.id}" class="btn bg-olive btn-xs">更新</a>
<a href="/user/deleteById.do?id=${user.id}" class="btn bg-olive btn-xs">删除</a>
<a href="" class="btn bg-olive btn-xs">添加角色</a>
</td>
</tr>
</c:forEach>
</tbody>
添加用户的表单如下,转到user/add.do的视图进行处理返回,同时完成后也重定向回到所有用户界面:
<form action="${pageContext.request.contextPath}/user/add.do"
method="post">
<!-- 正文区域 -->
<section class="content"> <!--产品信息-->
<div class="panel panel-default">
<div class="panel-heading">用户信息</div>
<div class="row data-type">
<%--<div class="col-md-2 title">id</div>--%>
<%--<div class="col-md-4 data">
<input type="text" class="form-control" name="id"
placeholder="id" value="">
</div>--%>
<div class="col-md-2 title">用户名称</div>
<div class="col-md-4 data">
<input type="text" class="form-control" name="username"
placeholder="用户名称" value="">
</div>
<div class="col-md-2 title">密码</div>
<div class="col-md-4 data">
<input type="password" class="form-control" name="password"
placeholder="密码" value="">
</div>
</div>
</div>
<!--订单信息/--> <!--工具栏-->
<div class="box-tools text-center">
<button type="submit" class="btn bg-maroon">保存</button>
<button type="button" class="btn bg-default"
onclick="history.back(-1);">返回</button>
</div>
<!--工具栏/--> </section>
<!-- 正文区域 /-->
</form>
更新用户信息,首先在用户管理界面传入用户id,查询数据库将用户信息传入更新用户信息的界面,进行修改操作:
<form action="${pageContext.request.contextPath}/user/update.do"
method="post">
<!-- 正文区域 -->
<section class="content"> <!--产品信息-->
<div class="panel panel-default">
<div class="panel-heading">用户信息</div>
<div class="row data-type">
<div class="col-md-2 title">id</div>
<div class="col-md-4 data">
<input type="text" class="form-control" name="id"
placeholder="id" value="${user.id}">
</div>
<div class="col-md-2 title">用户名称</div>
<div class="col-md-4 data">
<input type="text" class="form-control" name="username"
placeholder="用户名称" value="${user.username}">
</div>
<div class="col-md-2 title">密码</div>
<div class="col-md-4 data">
<input type="password" class="form-control" name="password"
placeholder="密码" value="${user.password}">
</div>
</div>
</div>
<!--订单信息/--> <!--工具栏-->
<div class="box-tools text-center">
<button type="submit" class="btn bg-maroon">保存</button>
<button type="button" class="btn bg-default"
onclick="history.back(-1);">返回</button>
</div>
<!--工具栏/--> </section>
<!-- 正文区域 /-->
</form>
下面为实现截图:
用户管理界面:
修改用户界面:
添加用户界面: