基于idea的SSM框架项目搭建
整合步骤
创建项目,添加jar包创建包、实体类与mapper添加连接数据库文件添加日志文件添加Spring配置文件添加SpringMVC配置文件修改web.xml文件
一、搭建整合环境
1.1创建表
CREATE TABLE `logs
` (
`logid
` int(11) NOT NULL AUTO_INCREMENT,
`username
` varchar(30) CHARACTER SET utf8
COLLATE utf8_general_ci
NOT NULL,
`ip
` varchar(30) CHARACTER SET utf8
COLLATE utf8_general_ci
NOT NULL,
`logtime
` date NOT NULL,
PRIMARY KEY (`logid
`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8
COLLATE = utf8_general_ci ROW_FORMAT
= Dynamic
;
CREATE TABLE `users
` (
`userid
` int(11) NOT NULL AUTO_INCREMENT,
`username
` varchar(30) CHARACTER SET utf8
COLLATE utf8_general_ci
NOT NULL,
`userpwd
` varchar(30) CHARACTER SET utf8
COLLATE utf8_general_ci
NOT NULL,
PRIMARY KEY (`userid
`) USING BTREE,
UNIQUE INDEX `username_uk
`(`username
`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8
COLLATE = utf8_general_ci ROW_FORMAT
= Dynamic
;
1.2 创建web项目
1.3 添加jar包
1.4 创建包、实体类与Mapper
二、配置SSM整合文件
2.1 添加连接数据库的properties文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm
jdbc.username=root
jdbc.password=xxxx
2.2 添加日志配置文件(log4j)
log4j.rootLogger=info,console
### appender.console输出到控制台 ###
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=<%d> %5p (%F:%L) [%t] (%c) - %m%n
log4j.appender.console.Target=System.out
### appender.logfile输出到日志文件 ###
log4j.appender.logfile=org.apache.log4j.RollingFileAppender
log4j.appender.logfile.File=SysLog.log
log4j.appender.logfile.MaxFileSize=500KB
log4j.appender.logfile.MaxBackupIndex=7
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=<%d> %p (%F:%L) [%t] %c - %m%n
2.3 添加Spring配置文件
在整合SSM框架时,为了对Spring配置项进行清晰的管理,我们可以采用“分而治之”的方式来定义Spring配置文件。将Spring配置文件分成三份:
applicationContext-dao.xml:用来配置与Mybatis整合
applicationContext-trans.xml:用来配置Spring声明式事务管理
applicationContext-services.xml:用来配置注解扫描以及其他的Spring配置
2.3.1 配置整合Mybatis
applicationContext-dao.xml
<?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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:property-placeholder location="classpath:db.properties"/>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="typeAliasesPackage" value="com.sky.pojo"/>
</bean>
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.sky.mapper"/>
</bean>
</beans>
2.3.2 配置Spring声明式事务管理
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<import resource="applicationContext-dao.xml"/>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:advice id="myAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="modify*" propagation="REQUIRED"/>
<tx:method name="drop*" propagation="REQUIRED"/>
<tx:method name="userLogin" propagation="REQUIRED"/>
<tx:method name="find*" read-only="true"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="myPointcut" expression="execution(* com.sky.service.*.*(..))"/>
<aop:advisor advice-ref="myAdvice" pointcut-ref="myPointcut"/>
</aop:config>
</beans>
2.3.3 配置注解扫描
<?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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.sky.service"/>
</beans>
2.4 配置SpringMVC
springmvc.xml
<?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: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.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="com.sky.web.controller"/>
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<mvc:resources mapping="/js/**" location="/WEB-INF/js/"/>
<mvc:resources mapping="/img/**" location="/WEB-INF/img/"/>
<mvc:resources mapping="/css/**" location="/WEB-INF/css/"/>
</beans>
2.5 配置web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<context-param>
<param-name>contextConfigLocation
</param-name>
<param-value>classpath:applicationContext-*.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>springmvc
</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation
</param-name>
<param-value>classpath:springmvc.xml
</param-value>
</init-param>
<load-on-startup>1
</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc
</servlet-name>
<url-pattern>/
</url-pattern>
</servlet-mapping>
<filter>
<filter-name>encodingFilter
</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding
</param-name>
<param-value>utf-8
</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter
</filter-name>
<url-pattern>/*
</url-pattern>
</filter-mapping>
</web-app>
三、实现用户登录
3.1 创建业务层
public interface UsersService {
Users
userLogin(Users users
);
}
3.2 创建业务层实现类
@Service
public class UsersServiceImpl implements UsersService {
@Autowired
private UsersMapper usersMapper
;
@Override
public Users
userLogin(Users users
) {
UsersExample usersExample
= new UsersExample();
UsersExample
.Criteria criteria
= usersExample
.createCriteria();
criteria
.andUsernameEqualTo(users
.getUsername());
criteria
.andUserpwdEqualTo(users
.getUserpwd());
List
<Users> list
= this.usersMapper
.selectByExample(usersExample
);
if(list
.isEmpty() || list
.size() <= 0) {
throw new UserNotFoundException("用户名或密码有误!");
}
return list
.get(0);
}
}
3.3 创建自定义异常
public class UserNotFoundException extends RuntimeException {
public UserNotFoundException() {
}
public UserNotFoundException(String message
) {
super(message
);
}
public UserNotFoundException(String message
, Throwable cause
) {
super(message
, cause
);
}
}
3.4 创建用户登录控制器
@Controller
@RequestMapping("/user")
public class UsersController {
@Autowired
private UsersService usersService
;
@RequestMapping("/userLogin")
public String
userLogin(UsersExt users
, HttpSession session
, HttpServletRequest request
) {
String ip
= request
.getRemoteAddr();
users
.setIp(ip
);
Users user
= this.usersService
.userLogin(users
);
session
.setAttribute("user", user
);
return "redirect:/page/index";
}
}
3.5 全局异常处理器
@ControllerAdvice
public class GlobalExceptionController {
@ExceptionHandler({com
.sky
.exception
.UserNotFoundException
.class})
public String
userNotFoundExceptionHandler(Exception e
, Model model
) {
model
.addAttribute("msg", e
.getMessage());
return "login";
}
@ExceptionHandler({java
.lang
.Exception
.class})
public String
exceptionHandler(Exception e
) {
return "redirect:/page/error";
}
}
3.6 创建用户登录页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${msg}
<form action="/user/userLogin" method="post">
用户名:<input type="text" name="username"/><br/>
密码:<input type="password" name="userpwd"/><br/>
<input type="submit" value="OK"/>
</form>
</body>
</html>
3.7 创建异常提醒页面
<%@ page contentType
="text/html;charset=UTF-8" language
="java" %>
<html>
<head>
<title>Title
</title
>
</head
>
<body>
出错了,请与管理员联系:sky
@sky.com
</body
>
</html
>
3.8 创建页面跳转控制器
@Controller
public class PageController {
@RequestMapping("/")
public String
showIndex() {
return "index";
}
@RequestMapping("/page/{page}")
public String
showPage(@PathVariable String page
) {
return page
;
}
}
3.9 创建判断用户是否登录的拦截器
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request
, HttpServletResponse response
, Object handler
) throws Exception
{
HttpSession session
= request
.getSession();
Users user
= (Users
) session
.getAttribute("user");
if(user
== null
|| user
.getUsername().length() >= 0) {
response
.sendRedirect("/page/login");
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request
, HttpServletResponse response
, Object handler
, ModelAndView modelAndView
) throws Exception
{
}
@Override
public void afterCompletion(HttpServletRequest request
, HttpServletResponse response
, Object handler
, Exception ex
) throws Exception
{
}
}
3.10 配置拦截器
在SpringMVC配置文件中配置拦截器
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/page/login"/>
<mvc:exclude-mapping path="/user/userLogin"/>
<mvc:exclude-mapping path="/page/error"/>
<bean class="com.sky.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
四、记录用户登录日志
4.1 创建登录日志记录切面
@Aspect
@Component
public class UsersLoginLogAOP {
@Autowired
private LogsMapper logsMapper
;
@Pointcut("execution(* com.sky.service.UsersService.userLogin(..))")
public void myPointcut() {
}
@AfterReturning("myPointcut()")
public void userLoginLog(JoinPoint joinPoint
) {
Object
[] objects
= joinPoint
.getArgs();
UsersExt users
= (UsersExt
) objects
[0];
Logs logs
= new Logs();
logs
.setLogtime(new Date());
logs
.setUsername(users
.getUsername());
logs
.setIp(users
.getIp());
this.logsMapper
.insertSelective(logs
);
}
}
4.2 创建Users扩展实体类
public class UsersExt extends Users {
private String ip
;
public String
getIp() {
return ip
;
}
public void setIp(String ip
) {
this.ip
= ip
;
}
}
4.3 修改控制器
@RequestMapping("/userLogin")
public String
userLogin(UsersExt users
, HttpSession session
, HttpServletRequest request
) {
String ip
= request
.getRemoteAddr();
users
.setIp(ip
);
Users user
= this.usersService
.userLogin(users
);
session
.setAttribute("user", user
);
return "redirect:/page/index";
}
4.4 配置切面
修改applicationContext-service文件
<!--配置注解扫描
-->
<context
:component
-scan base
-package="com.sky.service,com.sky.aop"/>
修改applicationContext-trans.xml文件
<aop:aspectj-autoproxy proxy-target-class="true"/>
五、项目总架构
六、运行结果
登录成功 -> 数据库记录登录信息
登录失败 -> 数据库不记录登录信息