0%

SSM重新学习总结

SSM重新学习总结

概述

SSM是Spring MVC、Spring、Mybatis三大框架的综合,SpringMVC负责Web层(具体表现为Controller),Spring负责整合与业务层(具体表现为Service,包括接口和实现),Mybatis负责数据访问层(具体表现为Dao),在实际使用中通常可与Maven配合使用

配置与使用

1、pom.xml中依赖导入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.zephon</groupId>
<artifactId>ssm-all</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<!-- 模块化配置 -->
<modules>
<module>ssm-all_dao</module>
<module>ssm-all_service</module>
<module>ssm-all_domain</module>
<module>ssm-all_utils</module>
<module>ssm-all_web</module>
</modules>

<!-- 版本配置 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring.version>5.2.3.RELEASE</spring.version>
<spring.security.version>5.1.5.RELEASE</spring.security.version>
<slf4j.version>2.0.0-alpha1</slf4j.version>
<log4j.version>1.2.17</log4j.version>
<mysql.version>8.0.18</mysql.version>
<mybatis.version>3.4.6</mybatis.version>
</properties>

<!-- SSM-->
<dependencies>
<!-- AOP -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</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-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</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.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>${spring.security.version}</version>
</dependency>

<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- servlet与jsp、jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>


<!-- log日志-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</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>


<!-- mybatis配置 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.3</version>
</dependency>

<!-- druid配置 -->
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.mchange</groupId>-->
<!-- <artifactId>c3p0</artifactId>-->
<!-- <version>0.9.5.5</version>-->
<!--&lt;!&ndash; <type>jar</type>&ndash;&gt;-->
<!--&lt;!&ndash; <scope>compile</scope>&ndash;&gt;-->
<!-- </dependency>-->

<!-- 分页配置 -->
<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.11</version>
</dependency>

<!-- 权限控制-->
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>jsr250-api</artifactId>
<version>1.0</version>
</dependency>

<!-- 页面端权限控制-->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>${spring.security.version}</version>
</dependency>


</dependencies>

<!-- tomcat插件配置 -->
<!-- 不能在<pluginManagement>中使用,否则会在maven插件中不显示-->
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8888</port>
</configuration>
</plugin>
</plugins>
</build>
</project>

2、在web模块中配置web.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
69
70
71
<?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,classpath*:spring-security.xml</param-value>
</context-param>

<!-- 配置监听器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 监听request域对象的创建和销毁-->
<!-- 用于在日志AOP中获取request-->
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

<!-- 配置前端控制器-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>


<!-- 配置解决中文乱码的过滤器-->
<filter>
<filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<!-- 配置Spring-security-->
<!--委派过滤器-->
<filter>
<!-- 固定名称:springSecurityFilterChain,不能改变-->
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>

</web-app>

3、在web模块中配置spring-mvc.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<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:aop="http://www.springframework.org/schema/aop"
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 http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
<context:component-scan base-package="com.zephon.controller"/>
<!-- 配置视图解析器-->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 设置静态资源过滤-->
<mvc:resources mapping="/css/**" location="/css/"/>
<mvc:resources mapping="/js/**" location="/js/"/>
<mvc:resources mapping="/images/**" location="/images/"/>
<!-- <mvc:resources mapping="/plugins/**" location="/plugins/"/>-->

<!-- 开启SpringMVC框架注解支持-->
<mvc:annotation-driven/>

<!-- 支持AOP的注解支持,AOP底层使用代理技术
proxy-target-class="true" 默认使用cglib方式
-->
<aop:aspectj-autoproxy proxy-target-class="true"/>
</beans>

4、在web模块中配置applicationContext.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
<?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: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/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">

<!-- 开启注解扫描-->
<context:component-scan base-package="com.zephon.service"/>
<context:component-scan base-package="com.zephon.dao"/>

<context:property-placeholder location="classpath:db.properties"/>

<!-- Spring 整合Mybatis框架-->
<!-- 配置连接池-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<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>
<!-- 配置SqlSessionFactory工厂-->
<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- 传入PageHelper的插件-->
<property name="plugins">
<array>
<!-- 传入插件的对象-->
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<props>
<!-- 数据库类型-->
<prop key="helperDialect">mysql</prop>
<!-- 分页合理化,不会越界-->
<prop key="reasonable">true</prop>
</props>
</property>
</bean>
</array>
</property>
</bean>

<!-- mybatis-配置mapper,扫描dao接口-->
<!-- 指定映射配置文件的位置,映射配置文件指每个dao独立的配置文件 -->
<!-- 如果是用注解来配置的话,此处应该使用class属性指定被注解的dao全限定类名-->
<bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.zephon.dao"/>
</bean>

<!-- 声明式事务-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>

</beans>

5、在web模块中配置db.properties

1
2
3
4
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql:///ssm
jdbc.username=root
jdbc.password=123456

6、在web模块中配置log4j.properties

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
#you cannot specify every priority with different file for log4j
log4j.rootLogger=debug,stdout,info,debug,warn,error
#log4j.rootLogger=info,stdout

#console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern= [%d{yyyy-MM-dd HH:mm:ss a}]:%p %l%m%n

#info log
log4j.logger.info=info
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender
log4j.appender.info.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.info.File=./src/com/zephon/log/error.log
log4j.appender.info.Append=true
log4j.appender.info.Threshold=INFO
log4j.appender.info.layout=org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n

#debug log
log4j.logger.debug=debug
log4j.appender.debug=org.apache.log4j.DailyRollingFileAppender
log4j.appender.debug.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.debug.File=./src/com/zephon/log/error.log
log4j.appender.debug.Append=true
log4j.appender.debug.Threshold=DEBUG
log4j.appender.debug.layout=org.apache.log4j.PatternLayout
log4j.appender.debug.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n

#warn log
log4j.logger.warn=warn
log4j.appender.warn=org.apache.log4j.DailyRollingFileAppender
log4j.appender.warn.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.warn.File=./src/com/zephon/log/error.log
log4j.appender.warn.Append=true
log4j.appender.warn.Threshold=WARN
log4j.appender.warn.layout=org.apache.log4j.PatternLayout
log4j.appender.warn.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n

#error
log4j.logger.error=error
log4j.appender.error = org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.error.File = ./src/com/zephon/log/error.log
log4j.appender.error.Append = true
log4j.appender.error.Threshold = ERROR
log4j.appender.error.layout = org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n

7、在web模块中配置spring-security.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
69
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:security="http://www.springframework.org/schema/security"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security.xsd">
<!-- 配置不拦截的资源-->
<security:http pattern="/login.jsp" security="none"/>
<security:http pattern="/failer.jsp" security="none"/>
<security:http pattern="/css/**" security="none"/>
<security:http pattern="/img/**" security="none"/>
<security:http pattern="/plugins/**" security="none"/>


<!-- 配置具体的规则
auto-config="true":不用自己编写登录页面,框架提供默认登录页面
use-expressions="false":是否使用SPEL表达式
-->
<security:http auto-config="true" use-expressions="false">
<!-- 配置具体的拦截的规则patten="请求的规则",access="访问系统的人,必须有ROLE_USER的角色"-->
<security:intercept-url pattern="/**" access="ROLE_USER,ROLE_ADMIN"/>
<!-- 定义跳转的具体页面-->
<!-- 如果jsp中的name不是username和password要另行配置-->
<security:form-login
login-page="/login.jsp"
login-processing-url="/login.do"
default-target-url="/index.jsp"
authentication-failure-url="/failer.jsp"
authentication-success-forward-url="/pages/main.jsp"/>

<!-- 关闭跨域请求-->
<security:csrf disabled="true"/>

<!-- 退出-->
<security:logout invalidate-session="true"
logout-url="/logout.do"
logout-success-url="/login.jsp"/>

</security:http>

<!-- 切换成数据库中的用户名和密码-->
<security:authentication-manager>
<security:authentication-provider user-service-ref="userService">
<!-- 配置加密方式-->
<security:password-encoder ref="passwordEncoder"/>
</security:authentication-provider>
</security:authentication-manager>

<!-- 配置加密类-->
<bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>

<!-- 权限控制-->
<!-- 选择一-->
<!-- 配置JSR250(权限控制用)-->
<!-- @RoleAllowed("ADMIN")注解在方法上 允许角色使用-->
<!-- 可以省略ROLE_前缀-->
<!-- <security:global-method-security jsr250-annotations="enabled"/>-->

<!-- 选择二-->
<!-- @Secured("ROLE_ADMIN")-角色权限配置 -->
<!-- 不能省略ROLE_前缀,但不用pom新导入依赖-->
<security:global-method-security secured-annotations="enabled"/>

<!-- 使用SPEL表达式-->
<!-- <security:global-method-security pre-post-annotations="enabled"-->

</beans>

7、编写其它代码

  • 在domain模块编写实体类

    • 可使用@DateTimeFormat(pattern="yyyy-MM-dd'T'HH:mm")进行日期的解析,当从html中获取的日期类型与Spring框架和默认格式不一样时可使用该注解进行解析

      1
      2
      @DateTimeFormat(pattern="yyyy-MM-dd'T'HH:mm")
      private Date departureTime;
    • 实体类中的成员变量的数量并不是必须和数据库中对应表的列数完全一样,例如:

      • 在用户的实体类中,有变量 status可取值0(关闭)、1(开启),则可以使用String statusStr用来表示status对应的状态,在get方法中根据status进行判断返回对应的字符串,从而在前端取值时可直接使用statusStr获取对应的字符串,而不用再进行判断取值

        1
        2
        3
        4
        public String getStatusStr() {
        StatusStr=(status==0)?"未开启":"开启";
        return StatusStr;
        }
      • 在用户的实体类中,可能一个用户有多种角色,所以,可能需要使用一个List< Role > roles代表,而该成员变量的值,如果需要的话可以在dao层中使用多表查询或其它方式进行获取赋值

  • 在dao模块中编写IxxxDao接口,由于使用Mybatis可以不用写具体实现

    • 涉及常用注解:@Repository("userDao"),其中userDao是命名,在其它地方使用时可直接使用userDao,若不命名,默认则是类名首字母变小写

      1
      2
      @Autowired
      private IUserDao userDao;
    • 关联查询中的一对一,例:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      /**
      * 查询订单
      * @return
      * @throws Exception
      */
      @Select("select * from orders")
      @Results({
      @Result(id=true,property = "id",column = "id"),
      @Result(property = "orderNum",column = "orderNum"),
      @Result(property = "orderTime",column = "orderTime"),
      @Result(property = "orderStatus",column = "orderStatus"),
      @Result(property = "peopleCount",column = "peopleCount"),
      @Result(property = "payType",column = "payType"),
      @Result(property = "orderDesc",column = "orderDesc"),
      @Result(property = "product",column = "productId",javaType = Product.class
      ,one = @One(select="com.zephon.dao.IProductDao.findById"))
      })
      List<Orders> findAll() throws Exception;
    • 关联查询中的一对多,例:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      /**
      * 根据用户id查询出所有对应的角色
      * @param userId
      * @return
      */
      @Select("select * from role where id in " +
      "(select roleId from users_role where userId=#{userId})")
      @Results({
      @Result(id = true,property = "id",column = "id"),
      @Result(property = "roleName",column = "roleName"),
      @Result(property = "roleDesc",column = "roleDesc"),
      @Result(property = "permissions",column = "id",javaType = java.util.List.class,
      many=@Many(select = "com.zephon.dao.IPermissionDao.findPermissionByRoleId"))
      })
      List<Role> findByUserId(String userId);
  • 在service模块编写IxxxService接口和xxxServiceImpl实现类,在实现类中使用注解

    • service层中常用注解:

      • @Service("userService"):与dao层的@Repository作用类似;
      • @Transactional::用户事务控制,对应的在applicationContext.xml中进行配置
    • 若涉及到用户登录时的密码加密的可:

      1
      2
      3
      4
      5
      6
      7
      8
      private BCryptPasswordEncoder bCryptPasswordEncoder;
      @Override
      public void save(UserInfo user) throws Exception {
      // 密码加密,每次加密结果不同
      user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));
      System.out.println(bCryptPasswordEncoder.encode("admin"));
      userDao.save(user);
      }
  • 在web模块编写xxxController

    • 常用注解:
      • @Controller:与@Service类似
      • @RequestMapping("/user"):地址匹配
      • @Secured("ROLE_ADMIN"):用户权限控制
    • 注意,Controller中如果涉及到反射获取方法的,如AOP日志配置中的获取方法,不可使用Model model变量,int需用Integer替代,否则会报错NoSuchMethod,具体原因暂时还不清楚,所以通常涉及到变量赋值时,最好还是使用ModelAndView的方式
  • 将代码中涉及到的一些工具类在utils模块中进行编写

  • 如使用maven中tomcat插件,需要先clean再install再tomcat:run