SSM框架-登陆
在目前的企业级Java应用中,Spring框架是必须的。Struts2框架与Spring的整合问题日益凸显,而Spring MVC作为新一代的MVC框架,因其可以与Spring框架无缝整合的特性收到了越来越多的欢迎。Hibernate框架在面对需要存储过程或者复杂SQL时显得力不从心,不能提供高效的数据库控制。而Mybatis框架作为持久层的框架,虽然需要自己编写SQL语句,但是其对高并发高响应的支持,以及对动态SQL和动态绑定的支持使其脱颖而出。
因此SSM框架(Spring + Spring MVC +Mybatis)逐渐取代了之前广泛使用的SSH框架(Spring + Struts2 + Hibernate),成为了目前使用最多的框架。
创建项目
流程与之前类似,这里当作复习了
代码
controller层
package com.zhongruan.controller;
import com.zhongruan.bean.Userinfo;
import com.zhongruan.serivce.Impl.UserinfoServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import java.util.List;
@Controller
@RequestMapping("user")
public class UserinfoController {
@Autowired
UserinfoServiceImpl userinfoService;
@RequestMapping("/findAll.do")
public ModelAndView findAll() {
List<Userinfo> userinfos = userinfoService.findAll();
ModelAndView mv = new ModelAndView();
mv.addObject("Userinfos", userinfos);
mv.setViewName("user-list");
return mv;
}
@RequestMapping("login.do")
public ModelAndView login(Userinfo userinfo) {
boolean flag = userinfoService.login(userinfo);
ModelAndView mv = new ModelAndView();
if (flag) {
mv.setViewName("main");
} else {
mv.setViewName("../failer");
}
return mv;
}
}
dao层
package com.zhongruan.dao;
import com.zhongruan.bean.Userinfo;
import java.util.List;
public interface IUserinfoDao {
public List<Userinfo>findAll();
public Userinfo login(Userinfo userinfo);
}
service层
//抽象类
package com.zhongruan.serivce;
import com.zhongruan.bean.Userinfo;
import javax.validation.constraints.Max;
import java.util.List;
public interface IUserinfoService {
public List<Userinfo>findAll();
public boolean login(Userinfo userinfo);
}
//实体类
package com.zhongruan.serivce.Impl;
import com.zhongruan.bean.Userinfo;
import com.zhongruan.dao.IUserinfoDao;
import com.zhongruan.serivce.IUserinfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserinfoServiceImpl implements IUserinfoService {
@Autowired
private IUserinfoDao userinfoDao;
@Override
public List<Userinfo> findAll() {
return userinfoDao.findAll();
}
@Override
public boolean login(Userinfo userinfo) {
Userinfo user=userinfoDao.login(userinfo);
if (user!=null){
return true;
}else
{
return false;
}
}
}
mapper
<?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.zhongruan.dao.IUserinfoDao" >
<select id="findAll" resultType="com.zhongruan.bean.Userinfo">
select * from userinfo
</select>
<select id="login" resultType="com.zhongruan.bean.Userinfo" parameterType="com.zhongruan.bean.Userinfo">
select * from userinfo where name=#{name} and password=#{password}
</select>
</mapper>
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>中软ETC用户管理系统</title>
<meta
content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"
name="viewport">
<link rel="stylesheet"
href="${pageContext.request.contextPath}/plugins/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet"
href="${pageContext.request.contextPath}/plugins/font-awesome/css/font-awesome.min.css">
<link rel="stylesheet"
href="${pageContext.request.contextPath}/plugins/ionicons/css/ionicons.min.css">
<link rel="stylesheet"
href="${pageContext.request.contextPath}/plugins/adminLTE/css/AdminLTE.css">
<link rel="stylesheet"
href="${pageContext.request.contextPath}/plugins/iCheck/square/blue.css">
</head>
<body class="hold-transition login-page">
<div class="login-box">
<div class="login-logo">
<a href="all-admin-index.html">中软<b>ETC</b>用户管理系统</a>
</div>
<!-- /.login-logo -->
<div class="login-box-body">
<p class="login-box-msg">登录系统</p>
<form action="${pageContext.request.contextPath}/user/login.do" method="post">
<div class="form-group has-feedback">
<input type="text" name="name" class="form-control"
placeholder="用户名"> <span
class="glyphicon glyphicon-envelope form-control-feedback"></span>
</div>
<div class="form-group has-feedback">
<input type="password" name="password" class="form-control"
placeholder="密码"> <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>
<a href="#">忘记密码</a><br>
</div>
<!-- /.login-box-body -->
</div>
<!-- /.login-box -->
<!-- jQuery 2.2.3 -->
<!-- Bootstrap 3.3.6 -->
<!-- iCheck -->
<script
src="${pageContext.request.contextPath}/plugins/jQuery/jquery-2.2.3.min.js"></script>
<script
src="${pageContext.request.contextPath}/plugins/bootstrap/js/bootstrap.min.js"></script>
<script
src="${pageContext.request.contextPath}/plugins/iCheck/icheck.min.js"></script>
<script>
$(function() {
$('input').iCheck({
checkboxClass : 'icheckbox_square-blue',
radioClass : 'iradio_square-blue',
increaseArea : '20%' // optional
});
});
</script>
</body>
</html>
结果展示
登陆界面
登陆成功
登陆失败
总结
Spring MVC 拥有控制器,作用跟Struts类似,接收外部请求,解析参数传给服务层
Spring 容器属于协调上下文,管理对象间的依赖,提供事务机制
mybatis 属于orm持久层框架,将业务实体 与数据表联合 起来
Spring MVC 控制层,想当与 Struts的作用
Spring 控制反转和依赖注入 创建对象交由容器管理,达到了解耦的作用
这里突然想到第一天讲到的IOC和AOP。
IOC:控制反转。是一种降低对象之间耦合关系的设计思想,通过一个中间媒介来响应其他的请求。这个中介就是spring容器。
AOP:面向切面编程,是面向对象开发的一种补充,它允许开发人员在不改变原来模型的基础上动态的修改模型以满足新的需求,如:动态的增加日志、安全或异常处理等。AOP使业务逻辑各部分间的耦合度降低,提高程序可重用性,提高开发效率。
持久层:DAO层(mapper)
- DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,
- DAO层的设计首先是设计DAO的接口, 然后在Spring的配置文件中定义此接口的实现类,
然后就可在模块中调用此接口来进行数据业务的处理,而不用关心此接口的具体实现类是哪个类,显得结构非常清晰, - DAO层的数据源配置,以及有关数据库连接的参数都在Spring的配置文件中进行配置。
- DAO层的设计首先是设计DAO的接口, 然后在Spring的配置文件中定义此接口的实现类,
业务层:Service层
- Service层:Service层主要负责业务模块的逻辑应用设计。
- 首先设计接口,再设计其实现的类
- 接着再在Spring的配置文件中配置其实现的关联。这样我们就可以在应用中调用Service接口来进行业务处理。
- Service层的业务实现,具体要调用到已定义的DAO层的接口,
封装Service层的业务逻辑有利于通用的业务逻辑的独立性和重复利用性,程序显得非常简洁。
表现层:Controller层(Handler层)
- Controller层:Controller层负责具体的业务模块流程的控制。
- 在此层里面要调用Service层的接口来控制业务流程。
- 控制的配置也同样是在Spring的配置文件里面进行,针对具体的业务流程,会有不同的控制器,我们具体的设计过程中可以将流程进行抽象归纳,设计出可以重复利用的子单元流程模块,这样不仅使程序结构变得清晰,也大大减少了代码量。
Service逻辑层设计
- Service层是建立在DAO层之上的,建立了DAO层后才可以建立Service层,而Service层又是在Controller层之下的,因而Service层应该既调用DAO层的接口,又要提供接口给Controller层的类来进行调用,它刚好处于一个中间层的位置。每个模型都有一个Service接口,每个接口分别封装各自的业务处理方法。
SSM框架是spring MVC ,spring和mybatis框架的整合,是标准的MVC模式,将整个系统划分为表现层,controller层,service层,DAO层四层。
使用spring MVC负责请求的转发和视图管理。
spring实现业务对象管理,mybatis作为数据对象的持久化引擎。
在执行上,用户的指令通过mapping映射到controller层,Controller调用业务逻辑处理后,跳转到ModelAndView,然后DispacherSerclet查询视图解析器,找到ModelAndView指定的视图,最后讲该视图显示到客户端web上。