练习来源:黑马程序员SSM框架教程 “p89-p106”
盘点所有遇到的问题
由于MySQL以及IDEA版本和视频里的不同(我的是MySQL8.0和IDEA2020),环境搭建和配置项目过程中遇到不少问题,在这盘点总结一下。
-
MySQL不同版本需要选用不同的驱动,以及jdbc配置文件的编写也不同
如MySQL8.0版本使用以下驱动:
配置文件的编写:
注意:
- 使用的Driver全类名为
com.mysql.cj.jdbc.Driver
,而MySQL5.0版本使用的是com.mysql.jdbc.Driver
- url条目的编写:8.0版本需要在
jdbc:mysql://localhost:3306/test
后添加参数characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
。
- 使用的Driver全类名为
-
在
out/WEB-INF/lib
目录下确认导入所有需要的包
这里我也暂时不太清楚为什么明明pom.xml下已经导入所有的坐标之后,仍然会出现问题。如:jsp文件中无法导入jstl库、启动项目时出现java.lang.ClassNotFoundException: org.springframework.jdbc.core.JdbcTemplate
。后来经过查询发现lib目录下并没有包含所有需要的jar包(jdbc和jstl等等),而在lib下导入所有jar包后,问题就解决了。 -
启动服务器报错:
Access denied for user ‘root’@‘localhost’ (using password: YES)
这里要确保jdbc配置文件中url和用户名密码等没有输错,我在确认以后仍然报这个错,查询发现只需将jdbc配置文件中的key username 改为 user 即可。不知道为什么。。。折腾我一下午
该项目是一个简单的数据后台管理项目,要求展示用户和角色,包括对应的添加和删除功能。一个用户可以拥有多个角色,而一个角色可被多个用户所拥有,形成多对多的关系。
接下来总结一下项目的部署过程:
ps:不够完善,后面再慢慢补充吧…
环境搭建
-
在pom.xml文件下导入所有坐标
<dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> </dependency> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.10</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.0.5.RELEASE</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.2.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.3</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.7</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>5.0.5.RELEASE</version> </dependency> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> </dependencies>
-
导入静态资源
-
创建包结构,controller(对应web层)、service(业务层)、dao(数据操作层)、domain(实例包)、utils(工具包)
-
在数据库中导入对应的数据库脚本
-
创建POJO类
-
创建配置文件(applicationContext.xml、spring-mvc.xml、jdbc.properties、log4j.properties)
展示所有角色
步骤:
- 点击角色管理菜单发送请求(修改用户管理菜单的url地址)
- 在Web层创建RoleController和showList()方法
- 在service层创建RoleService和showList()方法
- 在DAO层创建RoleDao和findAll()方法
- 使用JdbcTemplate完成查询
- 将数据存储到ModeAndView对象中
- 转发到对应页面展示
添加角色
步骤:
- 点击列表页面新建按钮跳转到角色添加页面
- 输入角色信息,点击保存按钮,表单数据提交服务器
- 编写RoleController的save()方法
- 编写RoleService的save()方法
- 编写RoleDao的save()方法
- 使用JdbcTemplate保存Role数据到数据库中的sys_role表
- 跳转回角色列表页面
注意:
-
中文乱码问题:在web.xml中使用过滤器设置编码
<!--配置过滤器解决乱码问题--> <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>
展示所有用户
步骤:
大体和角色展示思路相同
- 点击用户管理菜单发送请求到服务器端(修改用户管理菜单的url地址)
- 创建RoleController和showList()方法
- 创建RoleService和showList()方法
- 创建RoleDao和findAll()方法
- 使用JdbcTemplate完成查询操作
- 将查询数据存储到Model中
- 转发到user-list.jsp页面进行展示
添加用户
步骤:
- 点击列表页面新建按钮跳转到角色添加页面
- 输入角色信息,点击保存按钮,表单数据提交服务器
- 编写RoleController的save()方法
- 编写RoleService的save()方法
- 编写RoleDao的save()方法
- 使用JdbcTemplate保存Role数据到sys_role
- 跳转回角色列表页面
注意:
- 页面中角色的动态展示
- 角色多选框数据的提交
- 用户与角色的关系存储,需要存储到关系表维护
删除用户
步骤:
- 点击用户列表的删除按钮,发送请求到服务器端
- 编写UserController的deleteById()方法
- 编写UserService的deleteById()方法
- 编写UserDao的deleteById()方法
- 编写UserDao的deleteRelByUid()方法
- 跳回当前用户列表页面
注意:
- 确认提示框的展示
- 用户表与关系表的主从关系,需要先删除关系表中对应用户的所有关系,才可删除用户表中对应的用户
配置文件
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>
<!--spring监听器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--配置SpringMVC的前端控制器-->
<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>/</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>
</web-app>
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
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.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--加载jdbc配置文件-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--配置数据源对象-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${driverClassName}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
</bean>
<!--配置jdbcTemplate-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--配置RoleServiceBean-->
<bean id="roleService" class="com.zyl.service.Impl.RoleServiceImpl">
<property name="roleDAO" ref="roleDAO"/>
</bean>
<!--配置RoleDAOBean-->
<bean id="roleDAO" class="com.zyl.DAO.Impl.RoleDAOImpl">
<property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
<!--配置UserServiceBean-->
<bean id="userService" class="com.zyl.service.Impl.UserServiceImpl">
<property name="userDAO" ref="userDAO"/>
<property name="roleDAO" ref="roleDAO"/>
</bean>
<!--配置UserDAOBean-->
<bean id="userDAO" class="com.zyl.DAO.Impl.UserDAOImpl">
<property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
</beans>
spring-mvc.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/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--注解驱动-->
<mvc:annotation-driven/>
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--静态资源权限开放-->
<mvc:default-servlet-handler/>
<!--Controller的注解组件扫描-->
<context:component-scan base-package="com.zyl.Controller"/>
</beans>
总结
项目比较简单,采用了MVC的架构,并在Web层使用了注解开发,相较于JavaWeb阶段所学的更为方便一些。对spring和springMVC以及相关的业务逻辑有了进一步的理解,但是仍有部分环节的原理理解不够透彻(ModelAndView对象,一些注解等等),再复习复习巩固下吧。