項目的結構
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>hz-ssm</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 配置了一個servlet 名字是:testServlet -->
<!-- <servlet>
<servlet-name>testServlet</servlet-name>
<servlet-class>cn.dw.hz.servlet.TestServlet</servlet-class>
</servlet> -->
<!-- 配置testSErvlet的訪問地址 -->
<!-- <servlet-mapping>
<servlet-name>testServlet</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping> -->
<!-- 配置springmvc的dispatherServlet 默認找的是:servlet的名字-servlet.xml配置文件 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置spring的配置文件的路徑參數 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:application.xml</param-value>
</init-param>
<!-- 項目啓動的時候初始化dispatcherservlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 配置spirngmvc的攔截地址 -->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 開發靜態資源攔截 -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/static/*</url-pattern>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
</web-app>
Application.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"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
<!-- 傳統的配置方式
<bean id="roleController" class="cn.dw.hz.controller.RoleController"></bean>
-->
<!-- 開啓包掃描機制 -->
<context:component-scan base-package="cn.dw.hz"></context:component-scan>
<!-- spring整合mybatis -->
<!-- 1.配置數據源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/hz-ssm?characterEncoding=utf8"></property>
<property name="username" value="root"></property>
<property name="password" value="123456"></property>
</bean>
<!-- 2.配置mybatis的sqlsessionfactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="mapperLocations" value="classpath:cn/dw/hz/dao/xml/*.xml"></property>
<!-- <property name="typeAliasesPackage" value="cn.dw.hz.model"></property> -->
</bean>
<!-- 3.spring整合mybatis的核心配置 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
<property name="basePackage" value="cn.dw.hz.dao"></property>
</bean>
<!-- 配置事務管理器的bean -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 開啓事務的註解驅動,就是去識別@transaction註解 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- aop面向切面的配置 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<!-- mvc頁面跳轉的前後綴 /WEB-INF/jsp/user/list.jsp-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 開啓註解驅動 -->
<!-- <mvc:annotation-driven></mvc:annotation-driven> -->
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<!-- 註冊字符串轉換器,把編碼設置爲utf-8 -->
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=utf-8</value>
<value>text/html;charset=utf-8</value>
<value>application/x-www-form-urlencoded</value>
</list>
</property>
</bean>
<!-- 自動把controller中的返回對象序列化成json格式
依賴:3個包:jackson開頭的包
-->
<bean
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>
</mvc:message-converters>
</mvc:annotation-driven>
</beans>
log4j.properties
log4j.rootLogger=DEBUG ,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[hz-ssm] %d - %c -%-4r [%t] %-5p %c %x - %m%n
cn.dw.modole.User.java
/**
*
*/
package cn.dw.hz.model;
import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.format.annotation.NumberFormat;
/**
* @author aubrey
* @date 上午10:06:53
*
*/
public class User {
private Integer id;
private String name;
private String loginId;
private Integer sex;
private Integer age;
private String password;
/*注意大小寫*/
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date registerTime;
private Integer status;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLoginId() {
return loginId;
}
public void setLoginId(String loginId) {
this.loginId = loginId;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getRegisterTime() {
return registerTime;
}
public void setRegisterTime(Date registerTime) {
this.registerTime = registerTime;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
}
cn.dw.hz.dto.UserDto
/**
*
*/
package cn.dw.hz.dto;
import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat;
import cn.dw.hz.model.User;
/**
* @author aubrey
* @date 下午5:08:21
*
*/
public class UserDto extends User {
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date startTime;
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date endTime;
private String ids;
public Date getStartTime() {
return startTime;
}
public void setStartTime(Date startTime) {
this.startTime = startTime;
}
public Date getEndTime() {
return endTime;
}
public void setEndTime(Date endTime) {
this.endTime = endTime;
}
}
cn.dw.hz.dao.UserMapper.java
/**
*
*/
package cn.dw.hz.dao;
import java.util.List;
import cn.dw.hz.model.User;
/**
* @author aubrey
* @date 上午10:28:11
*
*/
public interface UserMapper {
public void add(User user);
public void update(User user);
public void delete(User user);
public List<User> query(User user);
}
cn.dw.hz.dao.xml.UserMapper.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">
<!-- namespace配置的是對應接口的具體路徑名稱 -->
<mapper namespace="cn.dw.hz.dao.UserMapper">
<!-- id對應的是namespace所配置的接口裏面的方法名稱 -->
<insert id="add" parameterType="cn.dw.hz.model.User">
<!-- insert into user(name,password) values('abc','123456') -->
insert into user
<trim prefix="(" suffix=")" suffixOverrides=",">
<!-- 只要字符串類型才需要加上 !='' 的判斷 -->
<if test="name !=null and name !='' ">
name,
</if>
<if test="loginId !=null and loginId !='' ">
<!-- 裏面對應的是數據庫表的字段名稱 -->
login_id,
</if>
<if test="sex !=null">
sex,
</if>
<if test="age !=null">
age,
</if>
<if test="password !=null and password !='' ">
password,
</if>
<if test="registerTime !=null">
register_time,
</if>
<if test="status !=null">
status,
</if>
</trim>
values
<trim prefix="(" suffix=")" suffixOverrides=",">
<!-- 只要字符串類型才需要加上 !='' 的判斷 -->
<if test="name !=null and name !='' ">
#{name},
</if>
<if test="loginId !=null and loginId !='' ">
<!-- 裏面對應的是數據庫表的字段名稱 -->
#{loginId},
</if>
<if test="sex !=null">
#{sex},
</if>
<if test="age !=null">
#{age},
</if>
<if test="password !=null and password !='' ">
#{password},
</if>
<if test="registerTime !=null">
#{registerTime},
</if>
<if test="status !=null">
#{status},
</if>
</trim>
</insert>
<delete id="delete" parameterType="cn.dw.hz.model.User">
delete from user where id = #{id}
</delete>
<!-- 把數據庫表中字段跟類型的屬性不對應的做轉換 -->
<resultMap type="cn.dw.hz.model.User" id="resultMap">
<result column="login_id" property="loginId"/>
<result column="register_time" property="registerTime"/>
</resultMap>
<!-- 查詢 parameterType傳遞過來的是子類的實際對象-->
<!-- resultType="cn.dw.hz.model.User" 要求返回的記錄字段名稱能屬性一致-->
<select id="query" parameterType="cn.dw.hz.dto.UserDto" resultMap="resultMap">
select * from user
<where>
<if test="id !=null">
and id = #{id}
</if>
<if test="name !=null and name !=''">
and name = #{name}
</if>
<if test="loginId !=null and loginId !=''">
and login_id = #{loginId}
</if>
<if test="startTime !=null">
and register_time >= #{startTime}
</if>
<if test="endTime !=null">
<!-- <是< ; >是>-->
and register_time <= #{endTime}
</if>
</where>
</select>
<update id="update" parameterType="cn.dw.hz.model.User">
update user
<set>
<if test="name !=null and name !=''">
name = #{name},
</if>
<if test="loginId !=null and loginId !=''">
login_id = #{loginId},
</if>
</set>
where id = #{id}
</update>
</mapper>
cn.dw.hz.dao.xml.RoleMapper.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="cn.dw.hz.dao.RoleMapper">
<insert id="add" parameterType="cn.dw.hz.model.Role">
insert into role
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="name != null and name !=''">
name,
</if>
<if test="notes != null and notes !=''">
notes,
</if>
</trim>
values
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="name != null and name !=''">
#{name},
</if>
<if test="notes != null and notes !=''">
#{notes},
</if>
</trim>
</insert>
<update id="update" parameterType="cn.dw.hz.model.Role">
update role
<set>
<if test="name != null and name !=''">
name = #{name},
</if>
<if test="notes != null and notes !=''">
notes = #{notes},
</if>
</set>
where id = #{id}
</update>
<delete id="delete" parameterType="cn.dw.hz.model.Role">
delete from role where id =
#{id}
</delete>
<select id="query" parameterType="cn.dw.hz.model.Role"
resultType="cn.dw.hz.model.Role">
select * from role
<where>
<if test="name != null and name !=''">
and name = #{name}
</if>
<if test="notes != null and notes !=''">
and notes = #{notes}
</if>
</where>
</select>
<select id="queryRoleUser" parameterType="cn.dw.hz.model.Role"
resultType="cn.dw.hz.vo.RoleVo">
select
r.name as name,
u.id as userId,
u.name as userName
from role r , role_user ru, user u
where
r.id = ru.role_id
and u.id = ru.user_id
and r.id = #{id}
</select>
</mapper>
cn.dw.hz.dao.xml.RoleUserMapper.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="cn.dw.hz.dao.RoleUserMapper">
<insert id="add" parameterType="cn.dw.hz.model.RoleUser">
insert into role_user(user_id,role_id) values(#{userId},#{roleId})
</insert>
<delete id="delete" parameterType="cn.dw.hz.model.RoleUser">
delete from role_user where id = #{id}
</delete>
</mapper>
cn.dw.hz.service.UserService
/**
*
*/
package cn.dw.hz.service;
import java.util.List;
import cn.dw.hz.model.User;
/**
* @author aubrey
* @date 上午10:45:45
*
*/
public interface UserService {
public void add(User user);
public void update(User user);
public void delete(User user);
public List<User> query(User user);
}
cn.dw.hz.service.impl.UserServiceImpl
/**
*
*/
package cn.dw.hz.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import cn.dw.hz.dao.UserMapper;
import cn.dw.hz.model.User;
import cn.dw.hz.service.UserService;
/**
* @author aubrey
* @date 上午10:52:51
*
*/
@Service
public class UserServiceImpl implements UserService {
/*先按類型名字,再類型*/
// @Resource("userMapper")
/*先按類型查找,再按名字*/
@Autowired
private UserMapper userMapper;
@Override
@Transactional /*開啓事務*/
public void add(User user) {
userMapper.add(user);
/*如果此處報錯,整個方法回滾*/
/*int i = 1/0;*/
/*手動捕獲異常事務是不會回滾*/
/*try {
int i = 1/0;
}catch (Exception e) {
e.printStackTrace();
}*/
// userMapper.add(user);
}
@Override
public void update(User user) {
userMapper.update(user);
}
@Override
public void delete(User user) {
userMapper.delete(user);
}
@Override
public List<User> query(User user) {
return userMapper.query(user);
}
}
cn.dw.hz.service.impl.RoleServiceImpl
/**
*
*/
package cn.dw.hz.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import cn.dw.hz.dao.RoleMapper;
import cn.dw.hz.dao.RoleUserMapper;
import cn.dw.hz.dto.RoleDto;
import cn.dw.hz.model.Role;
import cn.dw.hz.model.RoleUser;
import cn.dw.hz.service.RoleService;
import cn.dw.hz.vo.RoleVo;
/**
* @author aubrey
* @date 上午10:54:23
*
*/
@Service
public class RoleServiceImpl implements RoleService {
@Autowired
private RoleMapper roleMapper;
@Autowired
private RoleUserMapper roleUserMapper;
@Override
public void add(Role role) {
roleMapper.add(role);
}
@Override
public void update(Role role) {
roleMapper.update(role);
}
@Override
public void delete(Role role) {
roleMapper.delete(role);
}
@Override
public List<Role> query(Role role) {
return roleMapper.query(role);
}
/**
* 根據角色添加用戶
*/
@Override
public void addRoleUser(RoleDto role) {
//添加角色所屬的用戶
String strIds = role.getUserIds();
if(strIds == null || "".equals(strIds))return;
String[] userIds = strIds.split(",");
for(String id : userIds) {
RoleUser ru1 = new RoleUser(Integer.parseInt(id),role.getId());
roleUserMapper.add(ru1);
}
}
public List<RoleVo> queryRoleUser(Role role) {
return roleMapper.queryRoleUser(role);
}
}
cn.dw.hz.controller.UserController
/**
*
*/
package cn.dw.hz.controller;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.http.HttpMethod;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.alibaba.fastjson.JSONObject;
import cn.dw.hz.dto.UserDto;
import cn.dw.hz.model.User;
import cn.dw.hz.service.UserService;
import jdk.nashorn.internal.ir.RuntimeNode.Request;
/**
* @author aubrey
* @date 上午10:59:18
*
*/
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/page")
// @ResponseBody
public String page(User user,HttpServletRequest request) {
HttpSession session =request.getSession();
session.setAttribute("name", "admin");
return "user/list";
}
@RequestMapping("/login")
@ResponseBody
public String login(User user,HttpServletRequest request) {
HttpSession session =request.getSession();
String name = (String) session.getAttribute("name");
if(name != null && !"".equals(name)) {
return "已經登錄!";
}else {
return "請先登錄";
}
}
@Autowired
// @Qualifier("userService1")
// @Resource(name="userService1")
private UserService userService;
/* 指定請求的類型:method=RequestMethod.POST*/
@RequestMapping(value="/add")
@ResponseBody /*如果要直接返回數據(如:json)需要加上此註解*/
public String add(User user) {
userService.add(user);
JSONObject json =
new JSONObject();
json.put("result", "success");
/*return "{\"result\":\"success\"}";*/
return json.toJSONString();
}
@RequestMapping("/delete")
@ResponseBody
public String delete(User user) {
userService.delete(user);
JSONObject json = new JSONObject();
json.put("result", "success");
/*return "{\"result\":\"success\"}";*/
return json.toJSONString();
}
@RequestMapping("/query")
@ResponseBody
public String query(UserDto user) {
List<User> results = userService.query(user);
JSONObject json = new JSONObject();
json.put("result", results);
return json.toJSONString();
// return results;
}
@RequestMapping("/update")
@ResponseBody
public String update(User user) {
userService.update(user);
return "success";
}
}
cn.dw.hz.controller.RoleController
/**
*
*/
package cn.dw.hz.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.alibaba.fastjson.JSONObject;
import cn.dw.hz.dto.RoleDto;
import cn.dw.hz.model.Role;
import cn.dw.hz.service.RoleService;
import cn.dw.hz.vo.RoleVo;
/**
* @author aubrey
* @date 上午10:59:27
*
*/
@Controller
@RequestMapping("/role")
public class RoleController {
@Autowired
private RoleService roleService;
/* 指定請求的類型:method=RequestMethod.POST*/
@RequestMapping(value="/add")
@ResponseBody /*如果要直接返回數據(如:json)需要加上此註解*/
public String add(RoleDto role) {
roleService.add(role);
return "success";
}
/**
* 根據角色id添加對應的用戶到關聯表
* @param role
* @return
*/
@RequestMapping(value="/addRoleUser")
@ResponseBody
public String addRoleUser(RoleDto role) {
roleService.addRoleUser(role);
return "success";
}
/**
* 根據角色id查詢對應的用戶
* @param role
* @return
*/
@RequestMapping(value="/queryRoleUser")
@ResponseBody
public String queryRoleUser(Role role) {
List<RoleVo> results = roleService.queryRoleUser(role);
JSONObject json = new JSONObject();
json.put("result", results);
// int i = 1/0;
return json.toJSONString();
}
@RequestMapping("/delete")
@ResponseBody
public String delete(Role role) {
roleService.delete(role);
return "success";
}
@RequestMapping("/query")
@ResponseBody
public String query(Role role) {
List<Role> results = roleService.query(role);
JSONObject json = new JSONObject();
json.put("result", results);
return json.toJSONString();
// return results;
}
@RequestMapping("/update")
@ResponseBody
public String update(Role role) {
roleService.update(role);
return "success";
}
}
cn.dw.hz.controller.TestController
/**
*
*/
package cn.dw.hz.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* @author aubrey
* @date 下午3:38:49
*
*/
@Controller
//@RequestMapping("/test")
public class TestController {
@RequestMapping("/test")
@ResponseBody
public String test() {
return "testcontroller";
}
}
cn.dw.hz.dao.aop.LogAspect
/**
*
*/
package cn.dw.hz.dao.aop;
import java.awt.PointerInfo;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
/**
* @author aubrey
* @date 上午11:52:52
*
*/
@Component
@Aspect
public class LogAspect {
/*第一個* 表示返回值,
cn.dw.hz.controller 表示包名
第二個* 表示包下面所有的類
第三個* 表示類下面的所有方法
.. 表示方法的所有參數*/
@Pointcut("execution(* cn.dw.hz.controller.*.*(..)) || execution(* cn.dw.hz.service.impl.*.*(..))")
public void log() {};
@Before("log()")
public void before(JoinPoint joinPoint) {
System.out.println("======開始===========");
}
@After("log()")
public void after(JoinPoint joinPoint) {
System.out.println("======結束===========");
}
@AfterThrowing("log()")
public void afterThrowing(JoinPoint joinPoint) {
System.out.println("======afterThrowing===========");
}
@AfterReturning("log()")
public void afterReturning(JoinPoint joinPoint) {
System.out.println("======afterReturning===========");
}
@Around("log()")
public Object arround(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("======arround===========");
System.out.println("=========before==========");
Object obj = pjp.proceed();
System.out.println("=========after==========");
return obj;
}
}