diy电子商城网站,威宁建设局网站,莱芜工商网站,建立一个国外的网站#x1f6eb;更多ssm知识见SSM_面向CRUD编程专栏 #x1f695;本博客总结自黑马程序员的ssm框架视频 #x1f692;博主对于该知识尚在学习阶段 #x1f684;如果发现存在问题请毫不吝啬的指出 #x1f680;#x1f680;扎哇太枣糕的博客主页#x1f680;#x1f680; 目… 更多ssm知识见SSM_面向CRUD编程专栏 本博客总结自黑马程序员的ssm框架视频 博主对于该知识尚在学习阶段 如果发现存在问题请毫不吝啬的指出 扎哇太枣糕的博客主页 目录
案例分析
框架结构
实现 如果说面试就像造航母工作就是拧螺丝的话那么SSM框架就是一把非常适合新手打基础使用的螺丝刀。 ——鲁迅 在前面的ssm专栏知识的学习中我们已经大致清楚了ssm框架有三个框架组合而成——spring、springMVC、MyBatis。这三个框架可已经节省了我们很多的开发时间现在要做的就是将这三个框架整合到一起让它们能更好的配合为我们节省更多的开发时间。
案例分析 由于本篇博客主要是为了讲解ssm框架的整合知识所以准备了一个比较简单的案例。项目需要连接数据库实现两个功能在页面上插入数据、查询数据并在页面上显示。
框架结构 ssm框架在项目src/main/java的目录下一般包含四个package也就是我们常说的四层从日常开发的顺序来分依次是domain层(也叫entity层)、mapper层(也叫dao层)、service层、controller层。复杂点的也会有五层多出来一个until层由于学习时间有限更复杂的情况就不知道了 除了domain层以外其他三层都有相应的配置文件配合spring框架代码的使用最后要在web.xml文件中将配置文件加载进去否则配置文件相当于白配并不会生效。除了上面这种配置文件对应方式还有一种方式就是将spring-xxx合成一个applicationContext.xml这样可以使配置文件的数量变得更少些但是对应关系没有上一种清晰当然配置文件改变了web.xml文件也会跟着改变。本次案例就采用第二种对应方式进行讲解。
实现 项目的层级结构
如果不会创建一个web项目的话参考往期博客进行创建【SSM面向CRUD编程专栏 3】关于黑马程序员最全SSM框架教程视频P37集老师跳过的模块创建以及tomcat下载安装配置和运行等诸多问题 pom.xml
dependencies!--spring相关--dependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.0.5.RELEASE/version/dependencydependencygroupIdorg.aspectj/groupIdartifactIdaspectjweaver/artifactIdversion1.8.7/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-jdbc/artifactIdversion5.0.5.RELEASE/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-tx/artifactIdversion5.0.5.RELEASE/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-test/artifactIdversion5.0.5.RELEASE/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-webmvc/artifactIdversion5.0.5.RELEASE/version/dependency!--servlet和jsp--dependencygroupIdjavax.servlet/groupIdartifactIdservlet-api/artifactIdversion2.5/version/dependencydependencygroupIdjavax.servlet.jsp/groupIdartifactIdjsp-api/artifactIdversion2.0/version/dependency!--mybatis相关--dependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.4.5/version/dependencydependencygroupIdorg.mybatis/groupIdartifactIdmybatis-spring/artifactIdversion1.3.1/version/dependencydependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.6/version/dependencydependencygroupIdc3p0/groupIdartifactIdc3p0/artifactIdversion0.9.1.2/version/dependencydependencygroupIdjstl/groupIdartifactIdjstl/artifactIdversion1.2/version/dependency/dependencies
domain层 数据库中account表对应的实体类首先需要参考下图创建一个数据库表 domain层下创建一个Account类对应数据库中的各个字段 public class Account {private Integer id;private String name;private Double money;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;}public Double getMoney() {return money;}public void setMoney(Double money) {this.money money;}
}mapper层 之前学过MyBatis的代理开发模式使用这种模式进行开发就不再需要实现类了但是需要满足以下四个条件 mapper标签的namespace 接口全限名接口方法 mapper字标签的id接口方法参数类型 mapper字标签的parameterType接口方法返回值类型 mapper字标签的resultType mapper层创建一个AccountMapper接口定义插入和查询功能的实现方法 public interface AccountMapper {public void save(Account account);public ListAccount findAll();} 创建AccountMapper.xml映射文件使用SQL语句对数据库进行操作 ?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtdmapper namespacecom.itheima.mapper.AccountMapperinsert idsave parameterTypeaccountinsert into account values(#{id},#{name},#{money})/insertselect idfindAll resultTypeaccountselect * from account/select/mapper 对数据库进行操作要连接到数据库在这里需要将数据库的配置抽取到jdbc.properties中方便日后修改(等于号右边的要配成自己数据库的值)又叫解耦合 jdbc.drivercom.mysql.jdbc.Driver
jdbc.urljdbc:mysql://localhost:3306/test
jdbc.usernameroot
jdbc.password123456 有了数据库配置之后就需要在applicationContest.xml中配置数据源信息 当然需要先加载上面的数据库配置了也就是常说的创建连接池连接池的好处相信大家都知道了吧 !--加载propeties文件--
context:property-placeholder locationclasspath:jdbc.properties/!--配置数据源信息--
bean iddataSource classcom.mchange.v2.c3p0.ComboPooledDataSourceproperty namedriverClass value${jdbc.driver}/propertyproperty namejdbcUrl value${jdbc.url}/propertyproperty nameuser value${jdbc.username}/propertyproperty namepassword value${jdbc.password}/property
/bean 下面的service层需要使用到AccountMapper对象调用其中的方法所以需要使用spring框架底层直接创建好对象之后service直接注入这样的话就需要我们在applicationContest.xml中让spring框架知道它需要做这件事了 !--配置sessionFactory--
bean idsqlSessionFactory classorg.mybatis.spring.SqlSessionFactoryBeanproperty namedataSource refdataSource/property!--加载mybatis核心文件--property nameconfigLocation valueclasspath:sqlMapConfig-spring.xml/property
/bean!--扫描mapper所在的包 为mapper创建实现类--
bean classorg.mybatis.spring.mapper.MapperScannerConfigurerproperty namebasePackage valuecom.itheima.mapper/property
/bean 数据库的操作又叫事务既然有事务就要在applicationContest.xml对它进行声明式事务控制 !--声明式事务控制--
!--平台事务管理器--
bean idtransactionManager classorg.springframework.jdbc.datasource.DataSourceTransactionManagerproperty namedataSource refdataSource/property
/bean!--配置事务增强--
tx:advice idtxAdvicetx:attributestx:method name*//tx:attributes
/tx:advice!--事务的aop织入--
aop:configaop:advisor advice-reftxAdvice pointcutexecution(* com.itheima.service.impl.*.*(..))/aop:advisor
/aop:config service层 service层有一个AccountService接口由于阐述业务需求也就是需要完成哪些功能一般来说它和AccountMapper接口一样 public interface AccountService {public void save(Account account);public ListAccount findAll();} service层下有个Implpackage又来放所有的接口实现类比如说这个案例的AccountServiceImpl类。之前创建好的AccountMapper的对象就可以使用注解直接注入然后调用它的方法 Service(accountService)
public class AccountServiceImpl implements AccountService {Autowiredprivate AccountMapper accountMapper;public void save(Account account) {accountMapper.save(account);}public ListAccount findAll() {return accountMapper.findAll();}
} 这里使用了Service注解所以需要在applicationContest.xml对注解进行扫描让框架知道应该创建相应的对象了 !--组件扫描 扫描service和mapper--
context:component-scan base-packagecom.itheima!--排除controller的扫描--context:exclude-filter typeannotation expressionorg.springframework.stereotype.Controller/context:exclude-filter
/context:component-scan controller层 controller层是与前端进行交互的层决定了请求和响应的具体事项下面先放代码再进行详解 Controller
RequestMapping(/account)
public class AccountController {Autowiredprivate AccountService accountService;// 保存数据RequestMapping(value /save, produces text/html;charsetUTF-8)ResponseBodypublic String save(Account account){accountService.save(account);return 保存成功;}//查询数据RequestMapping(/findAll)public ModelAndView findAll(){ListAccount accountList accountService.findAll();ModelAndView modelAndView new ModelAndView();modelAndView.addObject(accountList,accountList);modelAndView.setViewName(accountList);return modelAndView;}} 这里使用了controller注解所以需要在SpringMVC.xml配置注解驱动并对注解进行扫描让框架知道应该创建相应的对象了 !--组件扫描 主要扫描controller--
context:component-scan base-packagecom.itheima.controller/!--配置mvc注解驱动--
mvc:annotation-driven/ RequestMapping注解设置了方法的映射地址前端访问该映射地址的时候会执行对应的方法类上注解和方法上注解分别对应着两级不一样的映射路径也就是说当前端发送/account/save请求时就会调用save方法。produces属性是设置响应的编码格式以防返回给页面一个字符串的时候出现乱码 ResponseBody注解标明返回的只是一个字符串而不是进行页面的跳转如果是页面跳转的话需要开放静态资源(jsp页面)访问权限还可以在SpringMVC.xml中配置视图解析器给返回值加上前缀和后缀(因为开发时的前端页面都会放在一个统一的package下而且页面的后缀基本上都是jsp于是就可以减少开发时的代码书写) !--开放静态资源访问权限--
mvc:default-servlet-handler/!--内部资源视图解析器--
bean idresourceViewResolver classorg.springframework.web.servlet.view.InternalResourceViewResolverproperty nameprefix value/WEB-INF/pages//propertyproperty namesuffix value.jsp/property
/bean 存数据的jsp页面 % page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitleTitle/title
/head
bodyh1添加账户信息表单/h1form nameaccountForm action${pageContext.request.contextPath}/account/save methodpost账户名称:input typetext namenamebr账户金额:input typetext namemoneybrinput typesubmit value保存br/form
/body
/html查询数据对应的jsp页面 % page contentTypetext/html;charsetUTF-8 languagejava %
% taglib prefixc urihttp://java.sun.com/jsp/jstl/core %
html
headtitleTitle/title
/head
bodyh1展示账户数据列表/h1table border1trth账户id/thth账户名称/thth账户金额/th/trc:forEach items${accountList} varaccounttrtd${account.id}/tdtd${account.name}/tdtd${account.money}/td/tr/c:forEach/table
/body
/html web.xml文件 加载applicationContext.xml文件 !--spring 监听器--
context-paramparam-namecontextConfigLocation/param-nameparam-valueclasspath:applicationContext.xml/param-value
/context-param
listenerlistener-classorg.springframework.web.context.ContextLoaderListener/listener-class
/listener 加载SpringMVC.xml文件又叫前端控制器 !--springmvc的前端控制器--
servletservlet-nameDispatcherServlet/servlet-nameservlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-classinit-paramparam-namecontextConfigLocation/param-nameparam-valueclasspath:spring-mvc.xml/param-value/init-paramload-on-startup1/load-on-startup
/servlet
servlet-mappingservlet-nameDispatcherServlet/servlet-nameurl-pattern//url-pattern
/servlet-mapping 配置全局过滤器用于解决POST请求乱码问题 !--全局过滤器用于解决乱码问题--
filterfilter-nameCharacterEncodingFilter/filter-namefilter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-classinit-paramparam-nameencoding/param-nameparam-valueUTF-8/param-value/init-param
/filter
filter-mappingfilter-nameCharacterEncodingFilter/filter-nameurl-pattern/*/url-pattern
/filter-mapping至此ssm的框架整合就告一段落了每一位大国工匠都是从基础学起之所以能够异于常人。除了天赋以外就是在夯实基础功之外加之时间的沉淀和经验的积累。万丈高楼平地起这就是框架开发的第一站。 上一篇【SSM面向CRUD编程专栏 8】一篇博客快速上手使用MyBatis进行CRUD
下一篇未完待续……