手把手教你入门SSM框架开发
关于项目
测试环境
后端:spring+mybatis+springmvc
前端:bootstrap+Font Awesome图标集
测试环境:IDEA + tomcat8 + mysql5.7 + jdk8 + maven
项目功能
1. 实现用户登录功能
2. 实现客户信息的增删改查功能
3. 实现分页查询功能(使用PageHelper分页插件实现)
项目结构
.
├── README.md
├── img -- 放了一些README.md文档所需要的图片,没有实际意义
├── pom.xml
└── src
└── main
├── java
│ └── cn
│ └── tycoding
│ ├── controller -- SpringMVC-WEB层控制器
│ ├── mapper -- Mybatis接口和映射文件。本项目采用了mybatis的接口开发,所以接口和映射文件放在同一目录下,并且名称相同。
│ ├── pojo -- JavaBean实体类
│ └── service -- service业务层
├── resources -- maven项目存放配置文件的根目录(classpath:)
│ ├── sys_schema.sql -- 项目数据库创建和表创建的SQL语句
│ ├── resource -- 日志打印和数据源配置文件
│ └── spring -- spring和springmvc的配置文件
└── webapp -- 项目的根目录
├── WEB-INF
├── fonts -- 字体的配置文件
└── lib -- 前端静态资源
整合思路
那么,接下来我们就需要了解如何在此基础上整合Mybatis框架。 首先须知Mybatis框架是一个持久层框架,而Spring MVC是WEB层框架,Spring框架则充当着业务层的角色。那么将三者联系起来正好组成了web--service--dao
的三层架构体系。那么整合思路就如下所示了:
- 整合dao(即mapper),实现Mybatis和Spring的整合
- 整合service,由Spring管理service接口,在service中可以调用dao(mapper)
- 整合web(controller),实现Spring MVC和Spring的整合,在controller中调用service
需求实现
1. 实现用户登录功能
1.1 创建表结构
SQL语句请查看GitHub中resources目录下的.sql文件 除了创建表,我们同样要创建pojo
对象,并提供属性setter和getter方法。(注意尽量保持pojo
属性参数和表字段名称对应相等)
1.2 编写Controller层
@RequestMapping(value = "/login")
public String login(@RequestParam String username,@RequestParam String password, Model model) {
User user = userService.login(username);
if (user != null) {
if (user.getPassword().equals(password)) {
//登录成功
return "page/page";
} else {
model.addAttribute("message", "登录失败");
return "page/loginInfo";
}
} else {
model.addAttribute("message", "你输入的用户名或密码有误");
return "page/loginInfo";
}
}
注意
-
@RequestMapping
标注login()
方法有两个作用(前提是必须在XML中开启注解扫描<context:component-scan/>
):1.表示该方法是请求处理方法;2.指明了该方法的请求路径。 -
@RequestMapping
可以标记类或方法,分别表示了不同层级的请求路径。例如当前的login()
方法的请求路径应为:localhost:8080/xxx/login.do
(需要注意的是:本例中使用了IDEA开发工具,访问其部署到Tomcat上的项目默认是不加项目名的,但是使用eclipse访问项目可能默认需要加上项目名,具体要看实际开发工具中对Tomcat的配置) -
对于请求体中包含多个参数的情况,我们尽量用
@RequestParam
注解标记参数,以免出现未知错误(但这不是必须的)。@RequestParam
注解能帮助识别请求体中的参数,比如请求体中传递的参数名是id
,但是你用int uid
接收就可能会报错400(请求参数错误),这时我们使用@RequestParam("id")
就能帮助Spring装配这个参数。
用户登录,我们首先获取到用户登录的用户名username
和密码password
,然后根据用户名查询并返回,根据此用户名查询到的密码与登录的密码进行equals
,如果相等就登录成功。(当然我们要判断根据username
查询后的返回值是否为null,不做判断会产生空指针问题,如果一个空值和另一个值相比显然会报错)。 如果登录成功,将返回到page/page.jsp
页面(这是根据我们在springmvc.xml
下配置的视图解析器InternalResourceViewResolver
决定的);如果登录失败将返回到page/loginInfo.jsp
页面。比如本项目中配置的视图解析器:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"/>
<property name="suffix" value=".jsp"/>
</bean>
只要在SpringMVC的配置文件中配置了这个选项,SpringMVC就默认匹配Controller层(用@Controller标识的类)中返回值为String类型的映射方法中return
的数据和webapps/WEB-INF/xx.jsp
中JSP页面的文件名,映射方法(用@RequestMapping标识的方法)return
的值和/WEB-INF/
下某个JSP页面文件名相同就跳转到这个页面,否者就报错404。当然除了使用@ResponseBody
标识的方法和@RestController
标识的类,因为这两个注解会将其下的方法返回值都转换为JSON 格式的数据,并且不会被InternalResourceViewResolver
识别。
1.3 编写Mapper.xml
<select id="login" parameterType="String" resultType="User">
select * from user where username = #{username}
</select>
我们使用了Mybatis的接口代理开发模式(保证接口和配置文件在同一目录下且名称相同),直接在Mapper.xml
中编写原生sql语句,即可进行与数据库间的交互。其中:
-
id
指明是哪个方法调用这个sql; -
parameterType
指定了接口传递的参数类型(我们根据用户名查询所以是String类型); -
resultType
指定该查询语句返回值的数据类型(因为我们已经在配置文件启用了别名配置<