SSM实现三层架构

来源:互联网 发布:淘宝可以买彩票吗 编辑:程序博客网 时间:2024/04/28 20:46

当尝试使用Spring+SpingMVC+MyBatis框架实现三层架构,出现了一些没有预想到的异常,所幸最终完美解决。

一、这是我所使用的文件结构:

结构图

具体的三层架构解释及理解可以参考这篇博客:点击跳转。理解为主,我没有完全按照他的写法来设计结构。

二、各个类的主要代码:

1.model:Menu.java

package com.diecolor.model;public class Menu {    private Integer id;    private String name;    private Integer pre_level_id;    private String url;    private String tab_name;    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name == null ? null : name.trim();    }    public Integer getPre_level_id() {        return pre_level_id;    }    public void setPre_level_id(Integer pre_level_id) {        this.pre_level_id = pre_level_id;    }    public String getUrl() {        return url;    }    public void setUrl(String url) {        this.url = url == null ? null : url.trim();    }    public String getTab_name() {        return tab_name;    }    public void setTab_name(String tab_name) {        this.tab_name = tab_name == null ? null : tab_name.trim();    }}

2.mapper(dao):MenuMapper.xml+MenuMapper.java(我把这两个放到了一个package下)

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" ><mapper namespace="com.diecolor.mapper.MenuMapper" >  <resultMap id="BaseResultMap" type="com.diecolor.model.Menu" >   <id column="id" property="id" jdbcType="INTEGER" />    <result column="name" property="name" jdbcType="VARCHAR" />    <result column="pre_level_id" property="pre_level_id" jdbcType="INTEGER" />    <result column="url" property="url" jdbcType="VARCHAR" />    <result column="tab_name" property="tab_name" jdbcType="VARCHAR" />    <result column="level" property="level" jdbcType="INTEGER" />  </resultMap>   <sql id="Base_Column_List" >    id, name, pre_level_id, url, tab_name,level  </sql>  <select id="selectAllLevel" resultType="java.util.Map" >    SELECT        m.id,        m. name,        m.pre_level_id,        (SELECT name FROM menu WHERE m.pre_level_id=id) pre_level_name,        m.url,        m.tab_name,        m.level    FROM        menu m  </select>  <select id="selectByPreLevelId" resultType="java.util.Map" parameterType="java.lang.Integer" >    select     <include refid="Base_Column_List" />    from menu    where pre_level_id = #{pre_level_id,jdbcType=INTEGER}  </select>  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >    select     <include refid="Base_Column_List" />    from menu    where id = #{id,jdbcType=INTEGER}  </select>  <delete id="deleteByPreLevelId" parameterType="java.lang.Integer" >    delete from menu    where pre_level_id = #{pre_level_id,jdbcType=INTEGER}  </delete>  <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >    delete from menu    where id = #{id,jdbcType=INTEGER}  </delete>  <insert id="insert" parameterType="com.diecolor.model.Menu" >    insert into menu (id, name, pre_level_id,       url, tab_name)    values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, #{pre_level_id,jdbcType=INTEGER},       #{url,jdbcType=VARCHAR}, #{tab_name,jdbcType=VARCHAR})  </insert>  <insert id="insertSelective" parameterType="com.diecolor.model.Menu" >    insert into menu    <trim prefix="(" suffix=")" suffixOverrides="," >      <if test="id != null" >        id,      </if>      <if test="name != null" >        name,      </if>      <if test="pre_level_id != null" >        pre_level_id,      </if>      <if test="url != null" >        url,      </if>      <if test="tab_name != null" >        tab_name,      </if>    </trim>    <trim prefix="values (" suffix=")" suffixOverrides="," >      <if test="id != null" >        #{id,jdbcType=INTEGER},      </if>      <if test="name != null" >        #{name,jdbcType=VARCHAR},      </if>      <if test="pre_level_id != null" >        #{pre_level_id,jdbcType=INTEGER},      </if>      <if test="url != null" >        #{url,jdbcType=VARCHAR},      </if>      <if test="tab_name != null" >        #{tab_name,jdbcType=VARCHAR},      </if>    </trim>  </insert>  <update id="updateByPrimaryKeySelective" parameterType="com.diecolor.model.Menu" >    update menu    <set >      <if test="name != null" >        name = #{name,jdbcType=VARCHAR},      </if>      <if test="pre_level_id != null" >        pre_level_id = #{pre_level_id,jdbcType=INTEGER},      </if>      <if test="url != null" >        url = #{url,jdbcType=VARCHAR},      </if>      <if test="tab_name != null" >        tab_name = #{tab_name,jdbcType=VARCHAR},      </if>    </set>    where id = #{id,jdbcType=INTEGER}  </update>  <update id="updateByPrimaryKey" parameterType="com.diecolor.model.Menu" >    update menu    set name = #{name,jdbcType=VARCHAR},      pre_level_id = #{pre_level_id,jdbcType=INTEGER},      url = #{url,jdbcType=VARCHAR},      tab_name = #{tab_name,jdbcType=VARCHAR}    where id = #{id,jdbcType=INTEGER}  </update></mapper>
package com.diecolor.mapper;import java.util.List;import com.diecolor.model.Menu;public interface MenuMapper {    int deleteByPrimaryKey(Integer id);    int insert(Menu record);    int insertSelective(Menu record);    Menu selectByPrimaryKey(Integer id);    int updateByPrimaryKeySelective(Menu record);    int updateByPrimaryKey(Menu record);    /**     * 根据上一级id查询     * @param pre_level_id     * @return     */    List<Menu> selectByPreLevelId(Integer pre_level_id);    /**     * 查询所有菜单项     * @return     */    List<Menu> selectAllLevel();    int deleteByPreLevelId(Integer pre_level_id);}

3.service:MenuService.java

package com.diecolor.service;import java.util.List;import com.diecolor.model.Menu;public interface MenuService {     int deleteByPrimaryKey(Integer id);        int insertSelective(Menu record);        Menu selectByPrimaryKey(Integer id);        int updateByPrimaryKeySelective(Menu record);        /**         * 根据上一级id查询         * @param pre_level_id         * @return         */        List<Menu> selectByPreLevelId(Integer pre_level_id);        /**         * 查询所有菜单项         * @return         */        List<Menu> selectAllLevel();        int deleteByPreLevelId(Integer pre_level_id);}

4.service.impl:MenuServiceImpl.java

package com.diecolor.service.impl;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.diecolor.mapper.MenuMapper;import com.diecolor.model.Menu;import com.diecolor.service.MenuService;@Servicepublic class MenuServiceImpl implements MenuService{    @Autowired    private MenuMapper mapper;    @Override    public int deleteByPrimaryKey(Integer id) {        // TODO Auto-generated method stub        return mapper.deleteByPrimaryKey(id);    }    @Override    public int insertSelective(Menu record) {        // TODO Auto-generated method stub        return mapper.insertSelective(record);    }    @Override    public Menu selectByPrimaryKey(Integer id) {        // TODO Auto-generated method stub        return mapper.selectByPrimaryKey(id);    }    @Override    public int updateByPrimaryKeySelective(Menu record) {        // TODO Auto-generated method stub        return mapper.updateByPrimaryKeySelective(record);    }    @Override    public List<Menu> selectByPreLevelId(Integer pre_level_id) {        // TODO Auto-generated method stub        return mapper.selectByPreLevelId(pre_level_id);    }    @Override    public List<Menu> selectAllLevel() {        // TODO Auto-generated method stub        return mapper.selectAllLevel();    }    @Override    public int deleteByPreLevelId(Integer pre_level_id) {        // TODO Auto-generated method stub        return 0;    }}

PS.切记,serviceImpl类的class一定要加上@Service注解,否则会使程序异常导致无法发布
5.controller

package com.ssm.controller;import java.util.List;import java.util.Map;import javax.servlet.http.HttpServletResponse;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.servlet.ModelAndView;import com.diecolor.mapper.MenuMapper;import com.diecolor.model.Goods;import com.diecolor.model.GridBean;import com.diecolor.model.Menu;import com.diecolor.service.MenuService;import com.diecolor.utils.JsonUtil;import com.diecolor.utils.ResultBean;import com.github.pagehelper.PageHelper;import com.github.pagehelper.PageInfo;import com.sun.org.apache.bcel.internal.generic.NEW;@Controller@RequestMapping("menu")public class MenuController {    @Autowired    private MenuService mapper;    @RequestMapping("/display")    public String menu() {        return "menu/menu";    }    /**     * 根据pid获取子菜单项     * @param response     * @param pre_level_id     */    @RequestMapping("/level")    public void displayLevel(HttpServletResponse response,String pre_level_id) {        if (pre_level_id==null) {            pre_level_id="0";        }        List<Menu> list= mapper.selectByPreLevelId(Integer.valueOf(pre_level_id));        JsonUtil.printjson(response, list);    }    /**     * 一次查询所有菜单项     * @param response     */    @RequestMapping("/alllevel")    public void displayAllLevel(HttpServletResponse response) {        List<Menu> list= mapper.selectAllLevel();        JsonUtil.printjson(response, list);    }    /**     * 分页查询     * @param pageIndex     * @param pageSize     * @param response     */    @RequestMapping("/find")    public void findbypage(int pageIndex,int pageSize,HttpServletResponse response) {        //调用分页方法-开始分页        PageHelper.startPage(pageIndex,pageSize);        //查询获取集合        List<Menu> list=mapper.selectAllLevel();        //对集合进行判断        if (list!=null&&list.size()>0) {            //通过pageinfo对集合进行分页            PageInfo<Menu> gods=new PageInfo<Menu>(list);            GridBean bean=new GridBean<Menu>(gods.getList(),(int)gods.getTotal());            JsonUtil.printjson(response, bean);        }    }    /**     * 跳转到数据操作页面-更新     * @param mView     * @return     */    @RequestMapping("/toupdate")    public ModelAndView toUpdate(ModelAndView mView,Integer id) {        mView.addObject("form_state", 1);//1-更新        //绑定数据        Menu record=mapper.selectByPrimaryKey(id);        mView.addObject("record",record);        //跳转页面        mView.setViewName("menu/update");        return mView;    }    /**     * 更新菜单栏数据     * @param response     * @param record     */    @RequestMapping("/update")    public void update(HttpServletResponse response,Menu record) {        if (record.getId()!=null) {            int i=mapper.updateByPrimaryKeySelective(record);            if (i>0) {                JsonUtil.printjson(response, new ResultBean());            }        }    }    /**     * 跳转到数据操作页面-新增     * @param mView     * @return     */    @RequestMapping("/toinsert")    public ModelAndView toInsert(ModelAndView mView) {        mView.addObject("form_state", 0);//0-新增        mView.setViewName("menu/update");        return mView;    }    /**     * 插入新的菜单项     * @param response     * @param record     */    @RequestMapping("/insert")    public void insert(HttpServletResponse response,Menu record) {        if (record.getId()!=null) {            int i=mapper.insertSelective(record);            if (i>0) {                JsonUtil.printjson(response, new ResultBean());            }        }    }    /**     * 删除菜单项     *  先删除子项,再删除当前项     * @param response     * @param id     */    @RequestMapping("/delete_all")    public void deleteAllLevel(HttpServletResponse response,String id) {        if (id==null) {            return;        }        //首先删除子项        int iChild=mapper.deleteByPreLevelId(Integer.valueOf(id));        if (iChild>0) {            //其次删除当前项            int iThis=mapper.deleteByPrimaryKey(Integer.valueOf(id));            if (iThis>0) {                JsonUtil.printjson(response, new ResultBean());            }        }    }    @RequestMapping("/delete")    public void deleteOneLevel(HttpServletResponse response,String id) {        if (id==null) {            return;        }        int iThis=mapper.deleteByPrimaryKey(Integer.valueOf(id));        if (iThis>0) {            JsonUtil.printjson(response, new ResultBean());        }    }}

Ps.controller部分需要加上@Controller注解,所使用到的service类也需要加上@Autowried

6.application-context.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:p="http://www.springframework.org/schema/p"    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-3.0.xsd    http://www.springframework.org/schema/context     http://www.springframework.org/schema/context/spring-context-3.0.xsd    http://www.springframework.org/schema/mvc     http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd    ">    <!-- <bean id="dbproperties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">        <property name="location" value="classpath:db.properties"></property>    </bean> -->    <context:property-placeholder location="classpath:db.properties"/>    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">        <property name="url" value="${url}"></property>        <property name="driverClassName" value="${driver}"></property>        <property name="username" value="${username}"></property>        <property name="password" value="${password}"></property>        <!-- 最大连接数 -->        <property name="maxActive" value="${maxActive}"></property>        <!-- 最大空闲 -->        <property name="maxIdle" value="${maxIdle}"></property>        <!-- 最大等待时间 -->        <property name="maxWait" value="${maxWait}"></property>    </bean>    <bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">        <!-- 加载mybatis-分页的配置文件 -->        <property name="configLocation" value="classpath:myBatis-config.xml"/>        <property name="dataSource" ref="dataSource"></property>    </bean>    <!-- mybatis自动扫描所有mapper -->    <bean class="com.diecolor.mybaits.Scanner.MapperScannerConfig">          <property name="sqlSessionFactory"  ref="sessionFactory"/>          <property name="basePackage" value="classpath:/com/**/mapper"></property>      </bean>      <context:annotation-config/>    <context:component-scan base-package="com.ssm.controller com.diecolor.service.impl"></context:component-scan>    <mvc:annotation-driven/>    <mvc:default-servlet-handler/>    <mvc:resources location="/css/**" mapping="/css/"/>    <mvc:resources location="/layer/**" mapping="/layer/"/>    <mvc:interceptors>        <mvc:interceptor>            <!-- 匹配的是url路径, 如果不配置或/**,将拦截所有的Controller -->          <mvc:mapping path="/cate/**" />          <mvc:mapping path="/user/**" />          <mvc:mapping path="/test/**" />          <mvc:mapping path="/com/**" />         <mvc:mapping path="/dis/**" />         <mvc:mapping path="/god/**" />         <mvc:mapping path="/hgred/**" />         <bean class="com.diecolor.utils.CommonInterceptor"></bean>        </mvc:interceptor>      <!-- 当设置多个拦截器时,先按顺序调用preHandle方法,然后逆序调用每个拦截器的postHandle和afterCompletion方法 -->  </mvc:interceptors> </beans>

三、碰到的一些异常

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'menuController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.diecolor.service.MenuService com.ssm.controller.MenuController.mapper; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.diecolor.service.MenuService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:285)    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1074)    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:580)    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:276)    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:197)    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47)    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5077)    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5591)    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1574)    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1564)    at java.util.concurrent.FutureTask.run(Unknown Source)    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)    at java.lang.Thread.run(Unknown Source)Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.diecolor.service.MenuService com.ssm.controller.MenuController.mapper; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.diecolor.service.MenuService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:502)    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:84)    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:282)    ... 22 moreCaused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.diecolor.service.MenuService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:920)    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:789)    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:703)    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:474)    ... 24 more

原因是application-context.xml中对于Autowrid主动注解的package漏了一个service.impl,补全即可:

0 0
原创粉丝点击