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
- SSM实现三层架构
- ssm框架与三层架构
- 【ssm架构】系统架构-三层架构
- 【ssm架构】系统架构-SSM与三层架构的关系
- ssm项目加载顺序 及 三层架构
- 三层架构之实现
- MVC,SSM与三层架构的构成及相互关系
- 三层架构在SSM框架中应用的示意图
- 如何实现asp三层架构
- 三层架构的实现详解
- c#三层架构实现分页
- C#中实现三层架构
- VC++ ADO实现三层架构
- 三层架构 C# 实现篇
- 三层架构实现用户登录
- 三层架构实现分页查询
- .net中实现简单三层架构
- 如何实现asp.net三层架构
- 作为一个iOS开发程序员,在Mac 上写后台的艰辛历程
- ios map给一个经纬度的数组怎么能在连线后自动判断该缩放多少把线显示在最中间呢?
- Dagger2:上手就爱不释手
- 你十八?好巧,我也是!
- eclipse常用快捷鍵
- SSM实现三层架构
- html5 canvas清空画布方法
- 欢迎使用CSDN-markdown编辑器
- Web服务器的运行原理及application内置对象
- 用 vagrant 快速部署 docker 虚拟机集群
- Android 热修复方案Tinker(六) Gradle插件实现
- AppStore提示iOS版本太低不能下载这个提示怎么做的?
- 基于注解配置的spring mvc 4 + spring security 4实例与解析
- 5分钟搞懂Android DeepLink