Spring环境搭建步骤
① 创建工程(Project&Module)
② 导入静态页面
③ 在pom.xml中导入需要坐标
④ 创建包结构(controller、service、dao、domain、utils)
⑤ 创建或导入数据库脚本
⑥ 创建POJO类
⑦ 创建配置文件(applicationContext.xml、spring-mvc.xml、jdbc.properties、log4j.properties,其中含不需要创建但需要我们配置的web.xml文件)
环境搭建
在创建一个spring项目之后,需要我们提前配置好的一些主要环境如下。
web.xml
<!--全局初始化参数contextConfigLocation,这里配置的是spring配置文件的地址-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- Spring的监听器-->
<!--ContextLoaderListener监听器的作用就是启动Web容器时,自动装配ApplicationContext的配置信息。
因为它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法。-->
<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>
<!--在配置核心控制器时,告诉spring-mvc的配置文件在哪,配置上下文参数-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<!--这里的/表示每次访问任何请求都要访问这个servlet-->
<url-pattern>/</url-pattern>
</servlet-mapping>
spring-mvc.xml
<!-- 1、mvc的注解驱动-->
<mvc:annotation-driven/>
<!-- 2、内部资源视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 静态资源权限开放-->
<mvc:default-servlet-handler/>
applicationContext.xml
<!-- 1、加载jdbc.properties-->
<context:property-placeholder location="jdbc.properties"/>
<!-- 2、配置数据源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!-- 3、配置jdbcTemplate对象-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
请求和响应
基本操作
① 点击角色管理菜单发送请求到服务器端(修改角色管理菜单的url地址)
② 创建RoleController和list()方法
③ 创建RoleService和list()方法
④ 创建RoleDao和findAll()方法
⑤ 使用JdbcTemplate完成查询操作
⑥ 将查询数据存储到Model中
⑦ 转发到role-list.jsp页面进行展示
<!--修改请求地址-->
<li><a href="${pageContext.request.contextPath}/role/list">
<i class="fa fa-circle-o"></i> 角色管理</a></li>
//创建RoleController和list()方法
@Controller
@RequestMapping("/user")
public class UserController {
//这里使用注解的方式注入,可以将set方法省略
@Autowired
private UserService userService;
@Autowired
private RoleService roleService;
@RequestMapping("/list")
public ModelAndView list(){
ModelAndView modelAndView = new ModelAndView();
List<User> userList = userService.list();
modelAndView.addObject("userList",userList);//将查询数据存储到Model中
modelAndView.setViewName("user-list");//设置视图
return modelAndView;
}
}
public class UserServiceImpl implements UserService {
//这里采用配置文件的方式注入,需要我们创建它的set方法
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
private RoleDao roleDao;
public void setRoleDao(RoleDao roleDao) {
this.roleDao = roleDao;
}
public List<User> list() {
List<User> userList = userDao.findAll();
//封装userList中的每一个User的Roles数据
for (User user : userList) {
//获得UserID
Long id = user.getId();
//将id作为参数查询当前对应的Role的集合数据
List<Role> roles = roleDao.findRoleByUserId(id);
user.setRoles(roles);
}
return userList;
}
}
//创建RoleDao和findAll()方法
public class UserDaoImpl implements UserDao {
//这里采用配置文件的方式注入
JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public List<User> findAll() {
String sql = "select * from `sys_user`";
List<User> userList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<User>(User.class));
return userList;
}
}
<!--转发到role-list.jsp页面进行展示
注:需要我们导入<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-->
<tbody>
<c:forEach items="${roleList}" var="role">
<tr>
<td><input name="ids" type="checkbox"></td>
<td>${role.id}</td>
<td>${role.roleName}</td>
<td>${role.roleDesc}</td>
<td class="text-center">
<a href="#" class="btn bg-olive btn-xs">删除</a>
</td>
</tr>
</c:forEach>
</tbody>
部分细节
若数据库的两个表之间存在关联,并且有中间表,届时,在添加和删除操作时需要注意一些细节问题。
在添加操作时
//在service层需要我们分别调用两个表的存储方法
public void save(User user, Long[] roleIds) {
//第一步,向sys_user表中存储一条数据
Long userId = userDao.save(user);
//第二步,向sys_user_role中添加多条数据
userDao.saveUserRoleRel(userId,roleIds);
}
//Dao层
//由于在表中的id数值是自动生成的,非我们输入,而jdbcTemplate中没有可以返回userId的方法,届时需要我们手动创建导入数据库,并通过GeneratedKeyHolder获取id
public Long save(final User user) {
//jdbcTemplate.update(sql,null,user.getUsername(),user.getEmail(),user.getPassword(),user.getPhoneNum());
//创建PreparedStatementCreator对象
PreparedStatementCreator creator = new PreparedStatementCreator() {
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
//使用原始的jdbc完成有个PreparedStatement的组建
PreparedStatement preparedStatement = connection.prepareStatement("insert into sys_user values(?,?,?,?,?)", PreparedStatement.RETURN_GENERATED_KEYS);
preparedStatement.setObject(1,null);
preparedStatement.setObject(2,user.getUsername());
preparedStatement.setObject(3,user.getEmail());
preparedStatement.setObject(4,user.getPassword());
preparedStatement.setObject(5,user.getPhoneNum());
return preparedStatement;
}
};
//创建keyHolder
GeneratedKeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(creator,keyHolder);
//获得生成的组建
long userId = keyHolder.getKey().longValue();
return userId;//返回当前保存的用户ID,该id是数据库自动生成的
}
public void saveUserRoleRel(Long userId, Long[] roleIds) {
String sql = "insert into sys_user_role values(?,?)";
for (Long roleId : roleIds) {
jdbcTemplate.update(sql,userId,roleId);
}
}
删除操作时
删除表中的数据时,需要先删除从表之间德关联关系,再删除主表德数据
//service层
public void del(Long userId) {
//1、删除关系表sys_Role_User的数据
userDao.delUserRoleRel(userId);
//2、删除sys_user表的数据
userDao.del(userId);
}
//Dao层
public void delUserRoleRel(Long userId) {
jdbcTemplate.update("delete from sys_user_role where userId=?",userId);
}
public void del(Long userId) {
jdbcTemplate.update("delete from sys_user where id=?",userId);
}