天天看点

day6:Spring练习1

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);
}