HelloWorld_SSMLogin

引:想着怎么教一个人快速入门SSM,讲原理是真的太费时间,还是以搭建具体流程加上源码比较好吧,先模仿,后创新嘛!

项目架构

项目仓库地址

ssm

我们先把文件夹创建好,当然也可以先直接从我仓库地址把它克隆下来,删除其中部分的代码文件。

配置文件解析

配置文件里面都有注释,大家可以对照着看:

pom.xml文件

pom文件作为Maven工程的核心,主要是用来引入jar包的,在我的pom文件中也详细列出了我们需要哪些包,以及哪些包是用来干什么的。

web.xml文件

web.xml作为Web功能的核心,主要是设置了如何接受请求,这里会结合SpringMVC的前端控制器类DispatcherServlet作为请求分发的核心Servlet,以及在第一次加载过程中,后台服务需要加载哪些配置文件。

ssm配置文件(依靠Spring整合)

我们看到spring文件夹下有三个文件,分别对应了dao,service,web三层的Bean配置。

spring-dao-config.xml文件

这里主要是配置数据库连接池(数据源),以及注入SqlSessionFactory和所有在com.todorex.dao下得所有Dao接口。

spring-service-config.xml文件

这里主要配置扫描并注入com.todorex.service包下所有Service注解类,以及配置事务管理器。

spring-web-config.xml文件

这里主要配置扫描并注入com.todorex.controller包下所有Controller注解类,以及配置视图解析器。这里还有一个超级重要的就是配置处理静态资源的方式。

mybatis-config.xml文件

这里主要是设置mybatis的全局属性。

jdbc.properties文件

这里主要配置数据库连接的相关信息。

log4j.properties文件

这里主要配置日志记录的相关信息。

配置文件都配置完了,我们终于可以开始写代码了!

SSM代码

需求

实现用户的登录与注销。

上帝视角开发(我需要什么就造什么)

我需要一个能处理我的请求(URL)的Controller

知道要controller,我们就造一个,我们在com.todorex.controller包下新建一个LoginController类。

Controller的作用主要是根据你请求的URL来做不同的事(对应的方法),结果是返回一个ModelAndView(当然View和Model也可以分开),如果方法的逻辑只是页面间的跳转和简单数据处理,我们就用不到Service了,如过我们需要进行业务处理以及操作数据库,那么我们就需要用到Service了。

PS:这里需要注意请求转发和请求重定向的区别(注释中有)

我需要一个能处理业务的Service

在service层设计一个好的接口是至关重要的(我们还是HelloWorld,以后有经验了自然能设计得好一些),如果实现类有多个的话 ,可以用@Service(“userService1”)来注入,@Resource(name=”userService1”) 来对应获取。在处理业务逻辑的时候,一般都会涉及到数据库操作,这个时候我们就需要用到Dao了。

我需要一个能处理数据的Dao

这里我们要明确一点:一个Dao接口对应一个Mapper文件,Dao定义接口方法,Mapper文件实现该方法的sql语句。

日志

这里我们举一个例子,就是记录登录用户的名字和时间,看下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class LoginController {
// 获得日志对象
Logger logger = Logger.getLogger(LoginController.class);

@RequestMapping(value = "/checkLogin",method = RequestMethod.POST)
public String checkLogin(User user, Model model) {
user = userService.checkLogin(user.getUsername(),user.getPassword());
if (user != null) {
// 日志记录用户登录
logger.info(user.getUsername()+"在"+new Date() + "登录过!");
model.addAttribute("user",user);
return "redirect:/success";
} else {
return "redirect:/fail";
}
}
}

单元测试

  1. 配置一个基类(用于加载配置文件)

    1
    2
    3
    4
    5
    6
    @RunWith(SpringJUnit4ClassRunner.class) //使用junit4进行测试
    // 导入多个配置文件
    @ContextConfiguration(locations={"classpath:spring/spring-*.xml","classpath:mybatis-config.xml"}) //加载配置文件
    //所有继承该类的测试类都会遵循该配置
    public class BaseJunit4Test {
    }
  2. 在各个对应的包下建立单元测试,如;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class UserDaoTest extends BaseJunit4Test {
    @Autowired
    private UserDao userDao;

    @Test
    public void TestFindByUsername() {
    User user = userDao.findByUsername("rex");
    System.out.println(user);
    }
    }

页面编写

这里只举一个例子(其实主要就是jsp的用法),success.jsp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%--引入jstl标签库,很重要--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<!--添加背景图片-->
<body background="image/success.jpg">

<div style="margin: auto">
<div>
<%--利用jstl标签获取session中的user的值--%>
<strong style="font-size: 100px;color: red"> ${sessionScope.user.username}!</strong>
<strong style="font-size: 100px;color: blue"> ,你他妈登录成功了</strong>
</div>

<form action="/LoginDemo/outLogin" >
<button type="submit" class="btn btn-success col-lg-12" style="font-size: 100px;text-align: center">退出登录</button>
</form>

</div>
</body>
</html>

终于大功告成!!!

参考

SSM搭建(整合)+用户模块(登录和注销)实现