参考博客:
1 简介SSM
SSM在这里具体指Spring+SpringMVC+Mybatis,也有其他的SSM比如说Structs2+Spring+Mybatis,不过本文介绍第一个ssm,而且个人觉得Spring+SpringMVC+Mybatis相对于Structs2+Spring+Mybatis存在一定的优势,至于优势具体是什么,可以从SpringMVC和Structs2两个框架对比开始入手,从效率、实现、以及底层实现机制入手了解一下,再次就不多做介绍了。
2 工具
maven + eclipse + 浏览器
版本并没有多少限制,前提是eclipse里面有maven插件,如果eclipse没有maven插件,详见地址: http://www.cnblogs.com/dzdwr3/p/6433563.html (Maven的安装配置以及Eclipse中Maven插件的安装和配置).当然,最好知道自己电脑中maven版本和eclispe版本和jdk版本等等前置信息,防止后续出问题,准确定位.
3 构建SSM项目(demo)
搭建完整的SSM项目结构如下所示:
项目结构中的config包下,是为了用java配置方式代替xml配置方式,在本片博文中,就只用xml方式配置,所以config可以忽略.
构建SSM项目分为一下几个过程:
3.1 eclipse新建maven工程
推荐博客:http://blog.csdn.net/zhshulin/article/details/37921705
3.2 pom.xml和spring + mybatis 和springMVC三者的配置文件
(1)添加ssm必须依赖项到pom.xml中
下面这个pom.xml文件一个完成ssm的pom.xml文件,可以在其中选择需要的jar包依赖项加入到工程中的pom.xml文件当中.
添加完所需的依赖项之后,最好clean一下项目.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.testLg</groupId>
<artifactId>testLg</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>testLg Maven Webapp</name>
<url>http://maven.apache.org</url>
<!-- 版本号 -->
<properties>
<!-- spring版本号 -->
<spring.version>4.0.2.RELEASE</spring.version>
<!-- mybatis版本号 -->
<mybatis.version>3.2.6</mybatis.version>
<!-- log4j日志文件管理包版本 -->
<slf4j.version>1.7.7</slf4j.version>
<log4j.version>1.2.17</log4j.version>
</properties>
<!-- 依赖项 -->
<dependencies>
<!-- 单元测试依赖项 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<!-- 表示开发的时候引入,发布的时候不会加载此包 -->
<scope>test</scope>
</dependency>
<!-- spring核心包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- mybatis核心包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- mybatis/spring包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.2</version>
</dependency>
<!-- 导入java ee jar 包 -->
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
</dependency>
<!-- 导入Mysql数据库链接jar包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.36</version>
</dependency>
<!-- postgresql -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.4.1212.jre7</version>
</dependency>
<!-- 导入dbcp的jar包,用来在applicationContext.xml中配置数据库 -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.2.2</version>
</dependency>
<!-- JSTL标签类 -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- 日志文件管理包 -->
<!-- log start -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- 格式化对象,方便输出日志 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.41</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- log end -->
<!-- 映入JSON -->
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
<!-- 上传组件包 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.9</version>
</dependency>
<!-- validator校验 -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.4.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator-annotation-processor</artifactId>
<version>5.2.4.Final</version>
</dependency>
</dependencies>
<build>
<finalName>testLg</finalName>
<plugins>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.2.8.v20150217</version>
<configuration>
<httpConnector>
<port>80</port>
</httpConnector>
<stopKey>shutdown</stopKey>
<stopPort>9966</stopPort>
</configuration>
</plugin>
</plugins>
</build>
</project>
(2)新建spring-mybatis.xml文件
spring+mybatis配置文件如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
<!-- 扫包 -->
<context:component-scan base-package="com.cn"></context:component-scan>
<!-- 引入配置文件 -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:jdbc.properties" />
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
<!-- 初始化连接大小 -->
<property name="initialSize" value="${initialSize}"></property>
<!-- 连接池最大数量 -->
<property name="maxActive" value="${maxActive}"></property>
<!-- 连接池最大空闲 -->
<property name="maxIdle" value="${maxIdle}"></property>
<!-- 连接池最小空闲 -->
<property name="minIdle" value="${minIdle}"></property>
<!-- 获取连接最大等待时间 -->
<property name="maxWait" value="${maxWait}"></property>
</bean>
<!-- 因为spring和mybatis的整合,导致mybatis的配置文件没有了存在的必要了 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<!-- 自动扫描mapping.xml文件 -->
<property name="mapperLocations" value="classpath:com/cn/mapper/*.xml"></property>
</bean>
<!-- dao接口所在包名,Spring会自动查找其下的类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.cn.dao"></property>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
<!-- 事物管理 transaction manager, use JtaTransactionManager for global tx -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
</beans>
(3)新建spring-mvc.xml文件
springMVC的配置文件如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
<!-- 自动扫包 -->
<context:component-scan base-package="com.cn"></context:component-scan>
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 定义跳转的文件的前后缀 ,视图模式配置-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 这里的配置我的理解是自动给后面action的方法return的字符串加上前缀和后缀,变成一个 可用的url地址 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
*3.3 SSM项目代码编写
(1)User.java文件编写
package com.cn.entity;
import java.io.Serializable;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;
public class User implements Serializable{
@NotBlank(message="登录名不能为空")
private String c_username;//用户账号
@NotBlank(message="密码不能为空")
private String c_password;//用户账号
@NotBlank(message="颜值不能为空")
private String c_salt;
public User() {
super();
}
public String getC_username() {
return c_username;
}
public void setC_username(String c_username) {
this.c_username = c_username;
}
public String getC_password() {
return c_password;
}
public void setC_password(String c_password) {
this.c_password = c_password;
}
public String getC_salt() {
return c_salt;
}
public void setC_salt(String c_salt) {
this.c_salt = c_salt;
}
@Override
public String toString() {
return "用户信息: [c_username=" + c_username + ", c_password=" + c_password
+ ", c_salt=" + c_salt + "]";
}
}
(2) IUserDao.java文件编写
package com.cn.dao;
import java.util.List;
import com.cn.entity.User;
public interface IUserDao {
/**
* 查询所有用户信息
* @return
*/
public List<User> selectAllUserInformation();
/**
* 依据用户登录名称查询用户信息
* @return
*/
public User selectUserByUserName(String username);
}
(3) UserMapping.xml文件编写
<?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.cn.dao.IUserDao">
<!-- 查询所有用户信息 -->
<select id="selectAllUserInformation" resultType="com.cn.entity.User">
select
*
from
center_login
</select>
<!-- 依据用户登录名称查询用户登录信息 -->
<select id="selectUserByUserName" parameterType="string" resultType="com.cn.entity.User">
select
*
from
center_login
where
c_username = #{c_username}
</select>
</mapper>
(4) IUserService.java文件编写
package com.cn.service;
import java.util.List;
import com.cn.entity.User;
public interface IUserService {
/**
* 查询所有用户信息
* @return
*/
public List<User> findAllUserInformation();
/**
* 核对用户登录信息
* @return
*/
public boolean checkUserLoginInformation(User user);
}
(5)UserServiceImpl.java文件编写
package com.cn.service.impl;
import java.util.List;
import javax.annotation.Resource;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import com.cn.dao.IUserDao;
import com.cn.entity.User;
import com.cn.service.IUserService;
@Service(value="userServiceImpl")
public class UserServiceImpl implements IUserService{
private Logger logger = Logger.getLogger(UserServiceImpl.class);
@Resource
private IUserDao userDao;
@Override
public List<User> findAllUserInformation() {
logger.info(" find all user information in UserServiceImpl --> findAllUserInformation");
List<User> allUserInformation = userDao.selectAllUserInformation();
return allUserInformation;
}
@Override
public boolean checkUserLoginInformation(User user) {
logger.info(" find all user information in UserServiceImpl --> checkUserLoginInformation");
if(StringUtils.isEmpty(user)){
return false;
}
User userFromDB = userDao.selectUserByUserName(user.getC_username());
System.out.println(userFromDB.getC_username());
if(!StringUtils.isEmpty(userFromDB) && user.getC_username().equals(userFromDB.getC_username()) && user.getC_password().equals(userFromDB.getC_password())){
return true;
}
return false;
}
}
(6)UserController.java文件编写
package com.cn.controller;
import java.util.List;
import javax.validation.Valid;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.cn.config.validator.UserValidator;
import com.cn.entity.User;
import com.cn.service.IUserService;
@Controller
@RequestMapping(value="/user")
public class UserController {
private Logger logger = Logger.getLogger(UserController.class);
@Autowired
private IUserService userServiceImpl;
/**
* 进入登录界面
* @return
*/
@RequestMapping(value = "/getLoginJSP", method = RequestMethod.GET)
public String getLoginJSP(Model model){
User user = new User();
model.addAttribute("user", user);
return "login";
}
/**
* 检查用户登录信息
* @param user
* @param errors
* @param model
* @return
*/
@RequestMapping(value = "/loginMainJSP", method = RequestMethod.POST)
public String loginMainJSP(@Valid User user, BindingResult result, Model model){
logger.info("check user information in UserController --> loginMainJSP");
if(result.hasErrors()){
return "login";
}
boolean flag = userServiceImpl.checkUserLoginInformation(user);
if(flag){
model.addAttribute("user", user);
return "main";
}else{
model.addAttribute("errorMessage", "登录名或者密码或者颜值出错");
return "login";
}
}
/**
* 查询所有用户信息
* @param model
* @return
*/
@RequestMapping(value = "/selectALLUserInformation", method = RequestMethod.GET)
public Object getAllUserInformation(Model model){
logger.info("query all user information in UserController --> getAllUserInformation");
List<User> allUserInformation = userServiceImpl.findAllUserInformation();
model.addAttribute("allUserInformation", allUserInformation);
return "showUser";
}
}
4 SSM测试
使用eclipse内置tomcat或者自己安装的tomcat启动项目,访问路径为:http://localhost:8080/testLg/user/getLoginJSP.