├── .gitignore
├── README.md
├── pom.xml
├── ssm-common
├── pom.xml
└── src
│ └── main
│ └── java
│ └── com
│ └── leeyom
│ ├── pojo
│ └── DataGridResult.java
│ └── utils
│ ├── DateUtils.java
│ └── StringUtils.java
├── ssm-dao
├── pom.xml
└── src
│ └── main
│ └── java
│ └── com
│ └── leeyom
│ └── dao
│ └── user
│ └── UserMapper.java
├── ssm-pojo
├── pom.xml
└── src
│ └── main
│ └── java
│ └── com
│ └── leeyom
│ └── pojo
│ └── User.java
├── ssm-service
├── pom.xml
└── src
│ └── main
│ └── java
│ └── com
│ └── leeyom
│ └── service
│ └── user
│ ├── UserService.java
│ └── impl
│ └── UserServiceImpl.java
└── ssm-web
├── pom.xml
└── src
├── main
├── java
│ └── com
│ │ └── leeyom
│ │ ├── controller
│ │ └── UserController.java
│ │ └── filter
│ │ └── CorsFilter.java
├── resources
│ ├── jdbc.properties
│ ├── log4j.properties
│ ├── mapper
│ │ └── UserMapper.xml
│ ├── spring
│ │ ├── mybatis-config.xml
│ │ ├── spring-mvc.xml
│ │ └── spring-mybatis.xml
│ └── t_user.sql
└── webapp
│ ├── WEB-INF
│ ├── test.jsp
│ └── web.xml
│ └── index.jsp
└── test
└── java
└── TestMybatis.java
/.gitignore:
--------------------------------------------------------------------------------
1 | # Created by .ignore support plugin (hsz.mobi)
2 | ### Maven template
3 | target/
4 | pom.xml.tag
5 | pom.xml.releaseBackup
6 | pom.xml.versionsBackup
7 | pom.xml.next
8 | release.properties
9 | dependency-reduced-pom.xml
10 | buildNumber.properties
11 | .mvn/timing.properties
12 |
13 | # Avoid ignoring Maven wrapper jar file (.jar files are usually ignored)
14 | !/.mvn/wrapper/maven-wrapper.jar
15 | .idea/
16 | *.iml
17 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |

2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 | # 项目结构
12 | ## 项目目录
13 | ```
14 | ssm-demo
15 | ├── ssm-common -- 公共模块,主要存放一些工具类
16 | | ├── src
17 | | ├── pom.xml -- 打包方式:jar
18 | ├── ssm-dao -- 存放mybatis相关的mapper接口
19 | | ├── src
20 | | ├── pom.xml -- 打包方式:jar
21 | ├── ssm-pojo -- 存放实体类
22 | | ├── src
23 | | ├── pom.xml -- 打包方式:jar
24 | ├── ssm-service -- 存放业务逻辑类
25 | | ├── src
26 | | ├── pom.xml -- 打包方式:jar
27 | ├── ssm-web -- 存放前台页面,客户端交互相关的controller
28 | | ├── src
29 | | ├── pom.xml -- 打包方式:war
30 | ├── pom.xml --打包方式为pom,一些公用的依赖
31 | ```
32 |
33 | ## 模块依赖关系
34 |
35 | 
36 |
37 | # 过程
38 |
39 | 更具体的内容可以参考我博客文章:[《Maven的多模块 Spring MVC + Spring + Mybatis 项目的搭建》](http://www.leeyom.top/2017/08/01/tech-maven-multi-module-ssm/),这里就不详述了。
40 |
--------------------------------------------------------------------------------
/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | com.leeyom.ssm
8 | ssm
9 | pom
10 | 1.0-SNAPSHOT
11 |
12 |
13 | ssm-web
14 | ssm-service
15 | ssm-common
16 | ssm-dao
17 | ssm-pojo
18 |
19 |
20 |
21 |
22 | 4.1.7.RELEASE
23 | 1.7.7
24 | 1.2.17
25 | 2.4
26 | 4.9
27 | 1.2.35
28 | 2.2.4
29 | 3.3.2
30 |
31 |
32 | UTF-8
33 | 1.8
34 | 1.8
35 | 1.8
36 |
37 |
38 |
39 |
40 |
41 |
42 | com.leeyom.ssm
43 | ssm-common
44 | 1.0-SNAPSHOT
45 |
46 |
47 |
48 |
49 | org.springframework
50 | spring-core
51 | ${spring.version}
52 |
53 |
54 |
55 | org.springframework
56 | spring-beans
57 | ${spring.version}
58 |
59 |
60 |
61 | org.springframework
62 | spring-web
63 | ${spring.version}
64 |
65 |
66 |
67 | org.springframework
68 | spring-webmvc
69 | ${spring.version}
70 |
71 |
72 |
73 | org.springframework
74 | spring-oxm
75 | ${spring.version}
76 |
77 |
78 |
79 | org.springframework
80 | spring-tx
81 | ${spring.version}
82 |
83 |
84 |
85 | org.springframework
86 | spring-orm
87 | ${spring.version}
88 |
89 |
90 |
91 | org.springframework
92 | spring-jdbc
93 | ${spring.version}
94 |
95 |
96 |
97 | org.springframework
98 | spring-context
99 | ${spring.version}
100 |
101 |
102 |
103 | org.springframework
104 | spring-context-support
105 | ${spring.version}
106 |
107 |
108 |
109 | org.springframework
110 | spring-test
111 | ${spring.version}
112 |
113 |
114 |
115 | org.springframework
116 | spring-aspects
117 | ${spring.version}
118 |
119 |
120 |
121 | org.springframework
122 | spring-aop
123 | ${spring.version}
124 |
125 |
126 |
127 |
128 | junit
129 | junit
130 | ${junit.version}
131 | test
132 |
133 |
134 |
135 |
136 | log4j
137 | log4j
138 | ${log4j.version}
139 |
140 |
141 |
142 | org.slf4j
143 | slf4j-api
144 | ${slf4j.version}
145 |
146 |
147 |
148 | org.slf4j
149 | slf4j-log4j12
150 | ${slf4j.version}
151 |
152 |
153 |
154 |
155 | com.google.code.gson
156 | gson
157 | ${gson.version}
158 |
159 |
160 | net.sf.json-lib
161 | json-lib
162 | ${json-lib.version}
163 | jdk15
164 |
165 |
166 |
167 | com.alibaba
168 | fastjson
169 | ${fastjson.version}
170 |
171 |
172 |
173 |
174 | org.apache.commons
175 | commons-lang3
176 | ${commons-lang3.version}
177 |
178 |
179 |
--------------------------------------------------------------------------------
/ssm-common/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 | com.leeyom.ssm
7 | ssm-common
8 | 1.0-SNAPSHOT
9 | jar
10 |
11 |
12 | UTF-8
13 | 1.8
14 | 1.8
15 | 1.8
16 |
17 |
--------------------------------------------------------------------------------
/ssm-common/src/main/java/com/leeyom/pojo/DataGridResult.java:
--------------------------------------------------------------------------------
1 | package com.leeyom.pojo;
2 |
3 | import java.util.List;
4 |
5 | /**
6 | * 分页结果封装实体
7 | * @author leeyom
8 | */
9 | public class DataGridResult {
10 | /**
11 | * 总的记录数
12 | */
13 | Long total;
14 | /**
15 | * 数据集
16 | */
17 | List> rows;
18 |
19 | public Long getTotal() {
20 | return total;
21 | }
22 |
23 | public void setTotal(Long total) {
24 | this.total = total;
25 | }
26 |
27 | public List> getRows() {
28 | return rows;
29 | }
30 |
31 | public void setRows(List> rows) {
32 | this.rows = rows;
33 | }
34 |
35 | }
36 |
--------------------------------------------------------------------------------
/ssm-common/src/main/java/com/leeyom/utils/DateUtils.java:
--------------------------------------------------------------------------------
1 | package com.leeyom.utils;
2 |
3 | import java.text.DateFormat;
4 | import java.text.ParseException;
5 | import java.text.SimpleDateFormat;
6 | import java.util.ArrayList;
7 | import java.util.Calendar;
8 | import java.util.Date;
9 | import java.util.List;
10 |
11 | /**
12 | * 日期工具类
13 | * @author Leeyom Wang
14 | * @date 2017年10月19日 12:05
15 | */
16 | public class DateUtils {
17 |
18 | private static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
19 | private static final SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
20 |
21 | /**
22 | * 将日期转化为指定格式的字符串
23 | * @param date 需要转化的日期
24 | * @param pattern 转化规则
25 | * @return 指定格式的日期字符串
26 | */
27 | public static String getString(Date date, String pattern) {
28 | DateFormat df = new SimpleDateFormat(pattern);
29 | return df.format(date);
30 | }
31 |
32 | /**
33 | * 将日期字符串转换为指定格式的日期对象
34 | * @param strDate 日期字符串
35 | * @param format 转化规则
36 | * @return 指定格式的日期对象
37 | */
38 | public static Date getDate(String strDate, String format) {
39 | DateFormat df = new SimpleDateFormat(format);
40 | try {
41 | return df.parse(strDate);
42 | } catch (ParseException e) {
43 | throw new IllegalArgumentException("Can't parse " + strDate + " using " + format);
44 | }
45 | }
46 |
47 | /**
48 | * 获取两个日期对象之间相差的天数
49 | * @param beginDate 开始时间
50 | * @param endDate 结束时间
51 | * @return 相差天数
52 | */
53 | public static int getDays(Date beginDate, Date endDate) {
54 | int days = -1;
55 | long beginMillisecond = beginDate.getTime();
56 | long endMillisecond = endDate.getTime();
57 | long millisecondForDay = 24 * 60 * 60 * 1000;
58 | days = (int) ((endMillisecond - beginMillisecond) / millisecondForDay);
59 | return days;
60 | }
61 |
62 | /**
63 | * 获得两个日期对象之间相差的小时数
64 | * @param beginDate 开始时间
65 | * @param endDate 结束时间
66 | * @return 相差小时
67 | */
68 | public static long getTimes(Date beginDate, Date endDate) {
69 | long time = -1;
70 | long beginMillisecond = beginDate.getTime();
71 | long endMillisecond = endDate.getTime();
72 | long millisecondForDay = 60 * 60 * 1000;
73 | time = (long) ((endMillisecond - beginMillisecond) / millisecondForDay);
74 | return time;
75 | }
76 |
77 | /**
78 | * 指定的日期加上或者减去指定的天数
79 | * @param date 日期
80 | * @param day 天数
81 | * @return 修改后的日期
82 | */
83 | public static Date addDays(Date date, int day) {
84 | Calendar calendar = Calendar.getInstance();
85 | calendar.setTime(date);
86 | calendar.add(Calendar.DATE, day);
87 | return calendar.getTime();
88 | }
89 |
90 | /**
91 | * 判断当前时间是上午还是下午
92 | * @param date 日期
93 | * @return 上午or下午
94 | */
95 | public static String getAmOrPm(Date date) {
96 | String str = "";
97 | Calendar calendar = Calendar.getInstance();
98 | calendar.setTime(date);
99 | int num = calendar.get(Calendar.AM_PM);
100 | if (num == 0) {
101 | str = "上午";
102 | } else if (num == 1) {
103 | str = "下午";
104 | }
105 | return str;
106 | }
107 |
108 | /**
109 | * 获取指定时间的星期数
110 | * @param date 日期
111 | * @return 例如:星期一
112 | */
113 | public static String getStrWeek(Date date) {
114 | String strWeek = "";
115 | Calendar calendar = Calendar.getInstance();
116 | calendar.setTime(date);
117 | int weekNum = calendar.get(Calendar.DAY_OF_WEEK);
118 | if (weekNum == 1) {
119 | strWeek = "星期天";
120 | } else if (weekNum == 2) {
121 | strWeek = "星期一";
122 | } else if (weekNum == 3) {
123 | strWeek = "星期二";
124 | } else if (weekNum == 4) {
125 | strWeek = "星期三";
126 | } else if (weekNum == 5) {
127 | strWeek = "星期四";
128 | } else if (weekNum == 6) {
129 | strWeek = "星期五";
130 | } else if (weekNum == 7) {
131 | strWeek = "星期六";
132 | }
133 | return strWeek;
134 | }
135 |
136 | /**
137 | * 获取指定时间的星期数
138 | * @param date
139 | * @return 例如:1
140 | */
141 | public static int getIntWeek(Date date) {
142 | int intWeek = 0;
143 | Calendar calendar = Calendar.getInstance();
144 | calendar.setTime(date);
145 | int weekNum = calendar.get(Calendar.DAY_OF_WEEK);
146 | if (weekNum == 1) {
147 | intWeek = 7;
148 | } else if (weekNum == 2) {
149 | intWeek = 1;
150 | } else if (weekNum == 3) {
151 | intWeek = 2;
152 | } else if (weekNum == 4) {
153 | intWeek = 3;
154 | } else if (weekNum == 5) {
155 | intWeek = 4;
156 | } else if (weekNum == 6) {
157 | intWeek = 5;
158 | } else if (weekNum == 7) {
159 | intWeek = 6;
160 | }
161 | return intWeek;
162 | }
163 |
164 | /**
165 | * 获取当前时间的下个星期一
166 | * @return 下个星期一的Date对象
167 | */
168 | public static Date getNextMonday() {
169 | Date date = new Date();
170 | int w = getIntWeek(date);
171 | if (w == 1) {
172 | return addDays(date, 7);
173 | }
174 | if (w == 2) {
175 | return addDays(date, 6);
176 | }
177 | if (w == 3) {
178 | return addDays(date, 5);
179 | }
180 | if (w == 4) {
181 | return addDays(date, 4);
182 | }
183 | if (w == 5) {
184 | return addDays(date, 3);
185 | }
186 | if (w == 6) {
187 | return addDays(date, 2);
188 | }
189 | return null;
190 | }
191 |
192 | /**
193 | * 获取当月第一天
194 | * @return
195 | */
196 | public static String getFirstDayOfMonth() {
197 | String str = "";
198 | SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
199 | Calendar lastDate = Calendar.getInstance();
200 | lastDate.set(Calendar.DATE, 1);// 设为当前月的1 号
201 | str = sdf.format(lastDate.getTime());
202 | return str;
203 | }
204 |
205 | /**
206 | * 获取上月第一天
207 | * @return
208 | */
209 | public static String getPreviousMonthFirst() {
210 | String str = "";
211 | SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
212 | Calendar lastDate = Calendar.getInstance();
213 | lastDate.set(Calendar.DATE, 1);// 设为当前月的1 号
214 | lastDate.add(Calendar.MONTH, -1);// 减一个月,变为下月的1 号
215 | // lastDate.add(Calendar.DATE,-1);//减去一天,变为当月最后一天
216 | str = sdf.format(lastDate.getTime());
217 | return str;
218 | }
219 |
220 | /**
221 | * 获得上月最后一天的日期
222 | * @return
223 | */
224 | public static String getPreviousMonthEnd() {
225 | String str = "";
226 | SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
227 | Calendar lastDate = Calendar.getInstance();
228 | lastDate.add(Calendar.MONTH, -1);// 减一个月
229 | lastDate.set(Calendar.DATE, 1);// 把日期设置为当月第一天
230 | lastDate.roll(Calendar.DATE, -1);// 日期回滚一天,也就是本月最后一天
231 | str = sdf.format(lastDate.getTime());
232 | return str;
233 | }
234 |
235 | /**
236 | * 获取给定的两个日期之间的所有的Date
237 | * @param startDate 开始时间
238 | * @param endDate 结束时间
239 | * @return 日期结果集
240 | * @throws Exception 开始时间大于结束时间的异常
241 | */
242 | public static List dateSplit(Date startDate, Date endDate) throws Exception {
243 | if (!startDate.before(endDate))
244 | throw new Exception("开始时间应该在结束时间之后");
245 | Long spi = endDate.getTime() - startDate.getTime();
246 | Long step = spi / (24 * 60 * 60 * 1000);// 相隔天数
247 |
248 | List dateList = new ArrayList();
249 | dateList.add(endDate);
250 | for (int i = 1; i <= step; i++) {
251 | dateList.add(new Date(dateList.get(i - 1).getTime() - (24 * 60 * 60 * 1000)));// 比上一天减一
252 | }
253 | return dateList;
254 | }
255 | }
256 |
--------------------------------------------------------------------------------
/ssm-common/src/main/java/com/leeyom/utils/StringUtils.java:
--------------------------------------------------------------------------------
1 | package com.leeyom.utils;
2 |
3 | import sun.misc.BASE64Decoder;
4 |
5 | import java.io.UnsupportedEncodingException;
6 | import java.util.ArrayList;
7 | import java.util.List;
8 | import java.util.Vector;
9 |
10 | /**
11 | * 字符串处理工具类
12 | * @author Leeyom Wang
13 | * @date 2017年10月19日 11:53
14 | */
15 | public class StringUtils {
16 | /**
17 | * 将String数组转换为String字符串
18 | * @param strArray 要处理的String数组
19 | * @return 字符串
20 | */
21 | public static String array2String(String[] strArray) {
22 |
23 | StringBuffer strBuffer = new StringBuffer();
24 |
25 | for (int i = 0; i < strArray.length; i++) {
26 | strBuffer.append(strArray[i]);
27 | }
28 | return strBuffer.toString();
29 | }
30 |
31 | /**
32 | * 以type为分界符分离str字符,返回分离后的数组
33 | * @param str 待处理字符串
34 | * @param type 分界符
35 | * @return array 处理后的字符串数数组
36 | */
37 | public static String[] split(String str, String type) {
38 | int begin = 0;
39 | int pos = 0;
40 | String tempstr = "";
41 | String[] array = null;
42 | Vector vec = null;
43 | int len = str.trim().length();
44 | str = str + type;
45 |
46 | if (len > 0) {
47 | while (str.length() > 0) {
48 |
49 | if (vec == null) {
50 | vec = new Vector();
51 | }
52 | pos = str.indexOf(type, begin);
53 | tempstr = str.substring(begin, pos);
54 | str = str.substring(pos + type.length(), str.length());
55 | vec.add(tempstr);
56 | }
57 | }
58 | if (vec != null) {
59 | array = new String[vec.size()];
60 | for (int i = 0; i < vec.size(); i++) {
61 | array[i] = (String) vec.get(i);
62 | }
63 | } else {
64 | array = new String[0];
65 | }
66 | return array;
67 | }
68 |
69 | /**
70 | * 判断字符串是否为null
71 | * @param s 要判断字符串对象
72 | * @return true 表示不为null false 为空
73 | * @throws Exception
74 | */
75 | public static boolean notNull(String s) {
76 | if (s == null || s.trim().length() <= 0 || "".equals(s) || "null".equals(s)) {
77 | return false;
78 | } else {
79 | return true;
80 | }
81 | }
82 |
83 | /**
84 | * 判断两个字符胡灿是否相等
85 | * @param objstr 字符串
86 | * @param bjstr 字符串
87 | * @return false 表示不相等 true 相等
88 | * @throws Exception
89 | */
90 | public static boolean equals(String objstr, String bjstr) {
91 | boolean lean = false;
92 | lean = (objstr != null) && objstr.equals(bjstr);
93 | return lean;
94 | }
95 |
96 | /**
97 | * 替换source中的str1为str2
98 | * @param source 待替换的字符串
99 | * @param str1 待替换的字符
100 | * @param str2 替换的字符串
101 | * @return java.lang.String 替换后的字符串
102 | */
103 | public static String replace(String source, char str1, String str2) {
104 | return replace(source, String.valueOf(str1), str2);
105 | }
106 |
107 | /**
108 | * 替换source中的str1为str2
109 | * @param source 待替换的字符串
110 | * @param str1 待替换的部分字符串
111 | * @param str2 替换的字符串
112 | * @return java.lang.String 替换后的字符串
113 | */
114 | public static String replace(String source, String str1, String str2) {
115 | if (source == null) {
116 | return "";
117 | }
118 | String desc = "";
119 | int posstart = 0;
120 | int posend = source.indexOf(str1, 0);
121 | int len = source.length();
122 | while (posend >= 0 && posstart < len) {
123 | desc += source.substring(posstart, posend) + str2;
124 | posstart = posend + str1.length();
125 | posend = source.indexOf(str1, posstart);
126 | }
127 | if (posstart < len) {
128 | desc += source.substring(posstart, len);
129 | }
130 | return desc;
131 | }
132 |
133 | /**
134 | * 将字符串列表转换成字符串数组
135 | * @param list List 字符串列表
136 | * @return String[] 字符串数组
137 | */
138 | public static String[] list2Array(List list) {
139 | String[] strs = new String[list.size()];
140 | for (int i = 0; i < strs.length; i++) {
141 | strs[i] = (String) list.get(i);
142 | }
143 | return strs;
144 | }
145 |
146 | /**
147 | * 将字符串数组转换成字符串列表
148 | * @param array String[] array 字符串数组
149 | * @return List 字符串列表集合
150 | */
151 | public static List array2List(String[] array) {
152 | List list = new ArrayList();
153 | if (array != null) {
154 | for (int i = 0; i < array.length; i++) {
155 | list.add(array[i]);
156 | }
157 | }
158 | return list;
159 | }
160 |
161 | /**
162 | * 过滤Html的特殊字
163 | * @param in
164 | * @return
165 | */
166 | public static String htmlEscape(String in) {
167 | StringBuffer out = new StringBuffer();
168 | for (int i = 0; i < in.length(); i++) {
169 | char c = in.charAt(i);
170 | switch (c) {
171 | case '"':
172 | out.append(""");
173 | break;
174 | case '&':
175 | out.append("&");
176 | break;
177 | case '<':
178 | out.append("<");
179 | break;
180 | case '>':
181 | out.append(">");
182 | break;
183 | default:
184 | out.append(c);
185 | break;
186 | }
187 | }
188 | return out.toString();
189 | }
190 |
191 | /**
192 | * 将字符串中的大写字母转化为"_"加小写字母
193 | * @param sentence
194 | * @return
195 | */
196 | public static String capTurn(String sentence) {
197 | char[] retChars = sentence.toCharArray();
198 | String retString = "";
199 | for (int i = 0; i < retChars.length; i++) {
200 | char curchar = retChars[i];
201 |
202 | if (Character.isUpperCase(curchar)) {
203 | retString = retString + "_" + Character.toLowerCase(curchar);
204 | } else {
205 | retString = retString + curchar;
206 | }
207 | }
208 | return retString;
209 | }
210 |
211 | /**
212 | * 把文本编码为Html代码
213 | * @param target 目标字符串
214 | * @return 编码后的字符串
215 | */
216 | public static String htmEncode(String target) {
217 | StringBuffer stringbuffer = new StringBuffer();
218 | int j = target.length();
219 | for (int i = 0; i < j; i++) {
220 | char c = target.charAt(i);
221 | switch (c) {
222 | case 60:
223 | stringbuffer.append("<");
224 | break;
225 | case 62:
226 | stringbuffer.append(">");
227 | break;
228 | case 38:
229 | stringbuffer.append("&");
230 | break;
231 | case 34:
232 | stringbuffer.append(""");
233 | break;
234 | case 169:
235 | stringbuffer.append("©");
236 | break;
237 | case 174:
238 | stringbuffer.append("®");
239 | break;
240 | case 165:
241 | stringbuffer.append("¥");
242 | break;
243 | case 8364:
244 | stringbuffer.append("€");
245 | break;
246 | case 8482:
247 | stringbuffer.append("");
248 | break;
249 | case 13:
250 | if (i < j - 1 && target.charAt(i + 1) == 10) {
251 | stringbuffer.append("
");
252 | i++;
253 | }
254 | break;
255 | case 32:
256 | if (i < j - 1 && target.charAt(i + 1) == ' ') {
257 | stringbuffer.append(" ");
258 | i++;
259 | break;
260 | }
261 | default:
262 | stringbuffer.append(c);
263 | break;
264 | }
265 | }
266 | return new String(stringbuffer.toString());
267 | }
268 |
269 | /**
270 | * base64解码
271 | * @param context
272 | * @return
273 | */
274 | public static String decodeString(String context) {
275 | BASE64Decoder decoder = new BASE64Decoder();
276 | try {
277 | byte[] fileNameStr = decoder.decodeBuffer(context);
278 | context = new String(fileNameStr, "UTF-8");
279 | } catch (Exception e) {
280 | e.printStackTrace();
281 | }
282 | return context;
283 | }
284 |
285 | /**
286 | * base64编码
287 | * @param str
288 | * @return
289 | */
290 | public static String encodeString(String str) {
291 | String base64Str = null;
292 | try {
293 | base64Str = new sun.misc.BASE64Encoder().encode(str.getBytes("UTF-8"));
294 | } catch (UnsupportedEncodingException e) {
295 | e.printStackTrace();
296 | }
297 | return base64Str;
298 | }
299 | }
300 |
--------------------------------------------------------------------------------
/ssm-dao/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 | com.leeyom.ssm
7 | ssm-dao
8 | 1.0-SNAPSHOT
9 | jar
10 |
11 |
12 | 3.3.0
13 | 1.2.3
14 | 4.1.4
15 | 5.1.37
16 | 1.1.2
17 |
18 | UTF-8
19 | 1.8
20 | 1.8
21 | 1.8
22 |
23 |
24 |
25 |
26 | com.leeyom.ssm
27 | ssm-pojo
28 | 1.0-SNAPSHOT
29 |
30 |
31 |
32 |
33 | org.mybatis
34 | mybatis
35 | ${mybatis.version}
36 |
37 |
38 |
39 |
40 | org.mybatis
41 | mybatis-spring
42 | ${mybatis-spring.version}
43 |
44 |
45 |
46 |
47 | mysql
48 | mysql-connector-java
49 | ${mysql-connector.version}
50 | runtime
51 |
52 |
53 |
54 |
55 | com.github.pagehelper
56 | pagehelper
57 | ${pagehelper.version}
58 |
59 |
60 |
61 |
62 | com.alibaba
63 | druid
64 | ${druid.version}
65 |
66 |
67 |
68 |
--------------------------------------------------------------------------------
/ssm-dao/src/main/java/com/leeyom/dao/user/UserMapper.java:
--------------------------------------------------------------------------------
1 | package com.leeyom.dao.user;
2 |
3 | import com.leeyom.pojo.User;
4 |
5 | import java.util.List;
6 |
7 | public interface UserMapper {
8 | int deleteByPrimaryKey(Integer uId);
9 |
10 | int insert(User record);
11 |
12 | User selectByPrimaryKey(Integer uId);
13 |
14 | List selectAll();
15 |
16 | int updateByPrimaryKey(User record);
17 | }
--------------------------------------------------------------------------------
/ssm-pojo/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 | com.leeyom.ssm
7 | ssm-pojo
8 | 1.0-SNAPSHOT
9 | jar
10 |
11 |
12 | UTF-8
13 | 1.8
14 | 1.8
15 | 1.8
16 |
17 |
--------------------------------------------------------------------------------
/ssm-pojo/src/main/java/com/leeyom/pojo/User.java:
--------------------------------------------------------------------------------
1 | package com.leeyom.pojo;
2 |
3 | public class User {
4 | private Integer uId;
5 |
6 | private String uName;
7 |
8 | private String uPassword;
9 |
10 | public Integer getuId() {
11 | return uId;
12 | }
13 |
14 | public void setuId(Integer uId) {
15 | this.uId = uId;
16 | }
17 |
18 | public String getuName() {
19 | return uName;
20 | }
21 |
22 | public void setuName(String uName) {
23 | this.uName = uName == null ? null : uName.trim();
24 | }
25 |
26 | public String getuPassword() {
27 | return uPassword;
28 | }
29 |
30 | public void setuPassword(String uPassword) {
31 | this.uPassword = uPassword == null ? null : uPassword.trim();
32 | }
33 | }
--------------------------------------------------------------------------------
/ssm-service/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 | ssm
7 | com.leeyom.ssm
8 | 1.0-SNAPSHOT
9 |
10 | 4.0.0
11 | ssm-service
12 | jar
13 |
14 |
15 |
16 | UTF-8
17 | 1.8
18 | 1.8
19 | 1.8
20 |
21 |
22 |
23 |
24 |
25 | com.leeyom.ssm
26 | ssm-dao
27 | 1.0-SNAPSHOT
28 |
29 |
30 |
--------------------------------------------------------------------------------
/ssm-service/src/main/java/com/leeyom/service/user/UserService.java:
--------------------------------------------------------------------------------
1 | package com.leeyom.service.user;
2 |
3 | import com.leeyom.pojo.User;
4 |
5 | public interface UserService {
6 | public User getUserById(Integer userId);
7 | }
8 |
--------------------------------------------------------------------------------
/ssm-service/src/main/java/com/leeyom/service/user/impl/UserServiceImpl.java:
--------------------------------------------------------------------------------
1 | package com.leeyom.service.user.impl;
2 |
3 | import com.leeyom.dao.user.UserMapper;
4 | import com.leeyom.pojo.User;
5 | import com.leeyom.service.user.UserService;
6 | import org.springframework.beans.factory.annotation.Autowired;
7 | import org.springframework.stereotype.Service;
8 |
9 | @Service("userService")
10 | public class UserServiceImpl implements UserService {
11 |
12 | @Autowired
13 | UserMapper userMapper;
14 |
15 |
16 | @Override
17 | public User getUserById(Integer userId) {
18 | return userMapper.selectByPrimaryKey(userId);
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/ssm-web/pom.xml:
--------------------------------------------------------------------------------
1 |
3 | com.leeyom.ssm
4 | 1.0-SNAPSHOT
5 | 4.0.0
6 | ssm-web
7 | war
8 | ssm-web
9 | http://www.leeyom.top
10 |
11 |
12 |
13 | 4.9
14 | 7.0
15 | 1.2
16 | 2.3.1
17 | 3.1.0
18 | 1.3.1
19 | 2.4
20 | 1.9
21 |
22 | UTF-8
23 | 1.8
24 | 1.8
25 | 1.8
26 |
27 |
28 |
29 |
30 |
31 | junit
32 | junit
33 | ${junit.version}
34 | test
35 |
36 |
37 |
38 | jstl
39 | jstl
40 | ${jstl.version}
41 |
42 |
43 |
44 | javax.servlet
45 | javax.servlet-api
46 | ${servlet-api.version}
47 | provided
48 |
49 |
50 |
51 | javax.servlet.jsp
52 | javax.servlet.jsp-api
53 | ${jsp-api.version}
54 | provided
55 |
56 |
57 |
58 |
59 | javax
60 | javaee-api
61 | ${javaee-api.version}
62 | provided
63 |
64 |
65 |
66 |
67 | commons-fileupload
68 | commons-fileupload
69 | ${commons-fileupload.version}
70 |
71 |
72 | commons-io
73 | commons-io
74 | ${commons-io.version}
75 |
76 |
77 | commons-codec
78 | commons-codec
79 | ${commons-codec.version}
80 |
81 |
82 |
83 |
84 | com.leeyom.ssm
85 | ssm-service
86 | 1.0-SNAPSHOT
87 |
88 |
89 |
90 |
91 | ssm
92 |
93 |
94 |
95 | org.apache.maven.plugins
96 | maven-compiler-plugin
97 |
98 |
99 | 1.8
100 | 1.8
101 | UTF-8
102 | true
103 |
104 |
105 | src\main\webapp\WEB-INF\lib
106 |
107 |
108 |
109 |
110 |
111 |
112 | org.apache.tomcat.maven
113 | tomcat7-maven-plugin
114 | 2.2
115 |
116 |
117 |
118 | /ssm-demo
119 |
120 | 8080
121 | UTF-8
122 |
123 | http://localhost:8080/manager/html
124 | tomcat7
125 | admin
126 | admin
127 |
128 |
129 |
130 |
131 |
132 |
--------------------------------------------------------------------------------
/ssm-web/src/main/java/com/leeyom/controller/UserController.java:
--------------------------------------------------------------------------------
1 | package com.leeyom.controller;
2 |
3 | import com.leeyom.pojo.User;
4 | import com.leeyom.service.user.UserService;
5 | import com.leeyom.utils.StringUtils;
6 | import org.springframework.beans.factory.annotation.Autowired;
7 | import org.springframework.stereotype.Controller;
8 | import org.springframework.ui.Model;
9 | import org.springframework.web.bind.annotation.RequestMapping;
10 | import org.springframework.web.bind.annotation.RequestMethod;
11 |
12 | import javax.servlet.http.HttpServletRequest;
13 |
14 | @Controller
15 | public class UserController {
16 |
17 | @Autowired
18 | UserService userService;
19 |
20 | /**
21 | * 测试 spring mvc
22 | * @param request
23 | * @param model
24 | * @return
25 | */
26 | @RequestMapping(value = "/getUserById", method = {RequestMethod.POST, RequestMethod.GET})
27 | public String getUserById(HttpServletRequest request, Model model) {
28 | //参数
29 | Integer userId = StringUtils.notNull(request.getParameter("userId")) ? Integer.parseInt(request.getParameter("userId")) : 1;
30 | User user = userService.getUserById(userId);
31 | model.addAttribute("user", user);
32 | return "test";
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/ssm-web/src/main/java/com/leeyom/filter/CorsFilter.java:
--------------------------------------------------------------------------------
1 | package com.leeyom.filter;
2 |
3 | import org.apache.commons.lang.StringUtils;
4 | import org.apache.log4j.Logger;
5 | import org.springframework.stereotype.Component;
6 |
7 | import javax.servlet.*;
8 | import javax.servlet.http.HttpServletResponse;
9 | import java.io.IOException;
10 |
11 | /**
12 | * 处理跨域的过滤器
13 | * @author Leeyom Wang
14 | * @date 2017年10月19日 14:47
15 | */
16 | @Component
17 | public class CorsFilter implements Filter {
18 |
19 | private static final Logger LOGGER = Logger.getLogger(CorsFilter.class);
20 |
21 | private String allowOrigin;
22 | private String allowMethods;
23 | private String allowCredentials;
24 | private String allowHeaders;
25 | private String exposeHeaders;
26 |
27 | @Override
28 | public void init(FilterConfig filterConfig) throws ServletException {
29 | allowOrigin = filterConfig.getInitParameter("allowOrigin");
30 | allowMethods = filterConfig.getInitParameter("allowMethods");
31 | allowCredentials = filterConfig.getInitParameter("allowCredentials");
32 | allowHeaders = filterConfig.getInitParameter("allowHeaders");
33 | exposeHeaders = filterConfig.getInitParameter("exposeHeaders");
34 | }
35 |
36 | /**
37 | * 通过CORS技术实现AJAX跨域访问, 只要将CORS响应头写入response对象中即可
38 | * @param req
39 | * @param res
40 | * @param chain
41 | * @throws IOException
42 | * @throws ServletException
43 | */
44 | @Override
45 | public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
46 | HttpServletResponse response = (HttpServletResponse) res;
47 | if (StringUtils.isNotEmpty(allowOrigin)) {
48 | //允许访问的客户端域名,例如:http://web.xxx.com,若为*,则表示从任意域都能访问,即不做任何限制;
49 | response.setHeader("Access-Control-Allow-Origin", allowOrigin);
50 | }
51 | if (StringUtils.isNotEmpty(allowMethods)) {
52 | //允许访问的请求方式,多个用逗号分割,例如:GET,POST,PUT,DELETE,OPTIONS;
53 | response.setHeader("Access-Control-Allow-Methods", allowMethods);
54 | }
55 | if (StringUtils.isNotEmpty(allowCredentials)) {
56 | //是否允许请求带有验证信息,若要获取客户端域下的cookie时,需要将其设置为true;
57 | response.setHeader("Access-Control-Allow-Credentials", allowCredentials);
58 | }
59 | if (StringUtils.isNotEmpty(allowHeaders)) {
60 | //允许服务端访问的客户端请求头,多个请求头用逗号分割,例如:Content-Type,Access-Token,timestamp
61 | response.setHeader("Access-Control-Allow-Headers", allowHeaders);
62 | }
63 | if (StringUtils.isNotEmpty(exposeHeaders)) {
64 | //允许客户端访问的服务端响应头,多个响应头用逗号分割。
65 | response.setHeader("Access-Control-Expose-Headers", exposeHeaders);
66 | }
67 | chain.doFilter(req, res);
68 | }
69 |
70 | @Override
71 | public void destroy() {
72 |
73 | }
74 |
75 | }
76 |
--------------------------------------------------------------------------------
/ssm-web/src/main/resources/jdbc.properties:
--------------------------------------------------------------------------------
1 | jdbc.url=jdbc:mysql://localhost:3306/ssm-demo?useUnicode=true&characterEncoding=utf8
2 | jdbc.username=root
3 | jdbc.password=root
--------------------------------------------------------------------------------
/ssm-web/src/main/resources/log4j.properties:
--------------------------------------------------------------------------------
1 | #\u5B9A\u4E49LOG\u8F93\u51FA\u7EA7\u522B
2 | log4j.rootLogger=INFO,Console,File
3 | #\u5B9A\u4E49\u65E5\u5FD7\u8F93\u51FA\u76EE\u7684\u5730\u4E3A\u63A7\u5236\u53F0
4 | log4j.appender.Console=org.apache.log4j.ConsoleAppender
5 | log4j.appender.Console.Target=System.out
6 | #\u53EF\u4EE5\u7075\u6D3B\u5730\u6307\u5B9A\u65E5\u5FD7\u8F93\u51FA\u683C\u5F0F\uFF0C\u4E0B\u9762\u4E00\u884C\u662F\u6307\u5B9A\u5177\u4F53\u7684\u683C\u5F0F
7 | log4j.appender.Console.layout=org.apache.log4j.PatternLayout
8 | log4j.appender.Console.layout.ConversionPattern=[%c] - %m%n
9 | #\u6587\u4EF6\u5927\u5C0F\u5230\u8FBE\u6307\u5B9A\u5C3A\u5BF8\u7684\u65F6\u5019\u4EA7\u751F\u4E00\u4E2A\u65B0\u7684\u6587\u4EF6
10 | log4j.appender.File=org.apache.log4j.RollingFileAppender
11 | #\u6307\u5B9A\u8F93\u51FA\u76EE\u5F55
12 | log4j.appender.File.File=${catalina.home}/logs/ssm.log
13 | #\u5B9A\u4E49\u6587\u4EF6\u6700\u5927\u5927\u5C0F
14 | log4j.appender.File.MaxFileSize=10MB
15 | # \u8F93\u51FA\u6240\u4EE5\u65E5\u5FD7\uFF0C\u5982\u679C\u6362\u6210DEBUG\u8868\u793A\u8F93\u51FADEBUG\u4EE5\u4E0A\u7EA7\u522B\u65E5\u5FD7
16 | log4j.appender.File.Threshold=ALL
17 | log4j.appender.File.layout=org.apache.log4j.PatternLayout
18 | log4j.appender.File.layout.ConversionPattern=[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n
--------------------------------------------------------------------------------
/ssm-web/src/main/resources/mapper/UserMapper.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 | delete from t_user
11 | where u_id = #{uId,jdbcType=INTEGER}
12 |
13 |
14 | insert into t_user (u_id, u_name, u_password
15 | )
16 | values (#{uId,jdbcType=INTEGER}, #{uName,jdbcType=VARCHAR}, #{uPassword,jdbcType=VARCHAR}
17 | )
18 |
19 |
20 | update t_user
21 | set u_name = #{uName,jdbcType=VARCHAR},
22 | u_password = #{uPassword,jdbcType=VARCHAR}
23 | where u_id = #{uId,jdbcType=INTEGER}
24 |
25 |
30 |
34 |
--------------------------------------------------------------------------------
/ssm-web/src/main/resources/spring/mybatis-config.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/ssm-web/src/main/resources/spring/spring-mvc.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/ssm-web/src/main/resources/spring/spring-mybatis.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
11 |
12 |
13 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
70 |
71 |
72 |
73 |
74 |
--------------------------------------------------------------------------------
/ssm-web/src/main/resources/t_user.sql:
--------------------------------------------------------------------------------
1 | /*
2 | SQLyog 企业版 - MySQL GUI v8.14
3 | MySQL - 5.7.12-log : Database - ssm-demo
4 | *********************************************************************
5 | */
6 |
7 | /*!40101 SET NAMES utf8 */;
8 |
9 | /*!40101 SET SQL_MODE=''*/;
10 |
11 | /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
12 | /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
13 | /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
14 | /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
15 | CREATE DATABASE /*!32312 IF NOT EXISTS*/`ssm-demo` /*!40100 DEFAULT CHARACTER SET utf8 */;
16 |
17 | USE `ssm-demo`;
18 |
19 | /*Table structure for table `t_user` */
20 |
21 | DROP TABLE IF EXISTS `t_user`;
22 |
23 | CREATE TABLE `t_user` (
24 | `u_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
25 | `u_name` varchar(50) NOT NULL,
26 | `u_password` varchar(100) NOT NULL,
27 | PRIMARY KEY (`u_id`)
28 | ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
29 |
30 | /*Data for the table `t_user` */
31 |
32 | insert into `t_user`(`u_id`,`u_name`,`u_password`) values (1,'leeyom','123');
33 |
34 | /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
35 | /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
36 | /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
37 | /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
38 |
--------------------------------------------------------------------------------
/ssm-web/src/main/webapp/WEB-INF/test.jsp:
--------------------------------------------------------------------------------
1 | <%--
2 | Created by IntelliJ IDEA.
3 | User: leeyom
4 | Date: 17/7/31
5 | Time: 22:36
6 | To change this template use File | Settings | File Templates.
7 | --%>
8 | <%@ page contentType="text/html;charset=UTF-8" language="java" %>
9 |
10 |
11 | 测试spring mvc
12 |
13 |
14 | hello world!
${user.uName}
15 |
16 |
17 |
--------------------------------------------------------------------------------
/ssm-web/src/main/webapp/WEB-INF/web.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 | ssm-demo
7 |
8 |
9 |
10 | contextConfigLocation
11 | classpath:spring/spring-mybatis.xml
12 |
13 |
14 |
15 |
16 | encodingFilter
17 | org.springframework.web.filter.CharacterEncodingFilter
18 | true
19 |
20 | encoding
21 | UTF-8
22 |
23 |
24 |
25 | encodingFilter
26 | /*
27 |
28 |
29 |
30 |
31 | org.springframework.web.context.ContextLoaderListener
32 |
33 |
34 |
35 |
36 | org.springframework.web.util.IntrospectorCleanupListener
37 |
38 |
39 |
40 |
41 | SpringMVC
42 | org.springframework.web.servlet.DispatcherServlet
43 |
44 | contextConfigLocation
45 | classpath:spring/spring-mvc.xml
46 |
47 | 1
48 | true
49 |
50 |
51 | SpringMVC
52 | /
53 |
54 |
55 | /index.jsp
56 |
57 |
--------------------------------------------------------------------------------
/ssm-web/src/main/webapp/index.jsp:
--------------------------------------------------------------------------------
1 |
2 |
3 | Hello World!
4 |
5 |
6 |
--------------------------------------------------------------------------------
/ssm-web/src/test/java/TestMybatis.java:
--------------------------------------------------------------------------------
1 | import com.leeyom.pojo.User;
2 | import com.leeyom.service.user.UserService;
3 | import org.junit.Before;
4 | import org.junit.Test;
5 | import org.springframework.context.ApplicationContext;
6 | import org.springframework.context.support.ClassPathXmlApplicationContext;
7 |
8 | public class TestMybatis {
9 |
10 | private ApplicationContext ac = null;
11 | private UserService userService = null;
12 |
13 | @Before
14 | public void before() {
15 | ac = new ClassPathXmlApplicationContext("classpath:spring/spring-mybatis.xml");
16 | userService = (UserService) ac.getBean("userService");
17 | }
18 |
19 | @Test
20 | public void testMybtis() {
21 | User user = userService.getUserById(1);
22 | System.out.println(user.getuName() + "------>" + user.getuPassword());
23 | }
24 |
25 | }
26 |
--------------------------------------------------------------------------------