闲来没事,想整理下一些知识。

这篇文章是关于spring的web程序的搭建,有什么不对的地方希望大家批评指正。

首先我们要了解什么是spring,这里可能很多大家也都明白,无非是一个管理对象的一个容器,主要体现在IOC注入和AOP切面编程。

关于上面的两点在后面一点会给大家更具体的说明一下是什么。

简单的来说,以前大家编程实例化都是自己在控制,这样真的好吗?

下面是不用spring的写法,我们先假定有一个类是下面这样的:

 public class Worker
{
public void sayHallo()
{
System.out.println("hallo,I'm worker!");
}
}

然后又有下面这个类:

 public class Manager
{
public static void main(String[] args) { Worker worker = new Worker();
worker.sayHallo();
}
}

很明显,是Manager类在调用Worker类,值得注意的是别人新实例化了一个Worker类,这个实例化过程是编程的人自己new的。

但是这种过程真的需要自己来做吗?因为在大家做业务的时候,会经常有这种操作,每次都手动的去做这件事好像有点麻烦。

所以spring就来解决这个问题了,有了spring,根本不需要你来做,spring帮你把这个过程给你做了,这也是我上面为什么说spring是一个容器,

在这里你可以先简单的理解为他这个容器可以容纳各种对象,并对这些对象进行管理。

说到这里,可能大家还感觉不到这个对我们编程会有多大的好处,即使下面举了例子,可能也不一定能感觉得到有什么不同,至少对没接触过spring的同学是这样。

下面我换种方式实现上面对等的功能,第一个Worker类不用变:

 public class Manager
{
private Worker worker; public static void callWorker()
{
worker.sayHallo();
} public Worker getWorker() {
return worker;
} public void setWorker(Worker worker) {
this.worker = worker;
} public static void main(String[] args) {
callWorker();
}
}

这里可以看见worker并没有实例化,但再main函数中就可以直接调用了。那这个实例化的过程就是spring来做的。

那spring怎么知道为哪个类提前实例化好某个对象呢?那这个就是在spring配置文件里写好这层关系的。

spring的配置文件叫做applicationContext.xml,这里面会有这样的代码

 <bean id = "manager" class = "xxx.xxx.xxx.Manager">
<property name = "worker" ref = "worker"></property>
</bean> <bean id = "worker" class = "xxx.xxx.xxx.Worker"></bean>

ref的值就是指Worker类所对应的id,意味着Manager需要的Woker的实例化就解决好了,不需要我们手动的去实例化,worker变量就会自动被相对应的类型初始化好。

这个过程我们就称之为spring的IOC,这个是spring的基础,当然AOP也是在这个基础上实现的。

AOP简单的讲就是面向切面的编程,比如每当一个方法执行前都会有一个特定的函数先做其他的某种处理,可以简单的理解成这样。

下面理解了spring的核心原理,我们就可以尝试着去搭建响应的一些框架。

这里我们选择的搭建环境是:

mysql-5.7.17 + hibernate5 + spring5 + springMvc组件 + apache-tomcat-8.5.16 + jdk8 的web程序。

这里所有的环境变量设置就大家自己去解决了。

首先我们应该下载好spring所需要的jar包,当然还有hibernate.....等也需要jar包,这里我图方便就把

包含spring在内的以及整个工程所需要的jar包都放在了一起,由于我用的版本都比较高,所以包与包之间的冲突问题还是比较多的,

解决的过程还是比较麻烦的,好在我最后把解决好的jar包都放在一起了,这里的jar细分有hibernate5,mysqlJdbcDriver,c3p0相关jar包,

servlet,spring5等。

为了方便,我将jar放在了一个文件夹下,然后由eclipse将这个文件夹下的所有jar包设置成用户自定义库,然后在引入项目中,最后部署的时候

也把jar复制到了webContent下的lib中。

可以看见所有jar包都在一起,当然由于图片太长,没有截完所有的图。

然后我就将这些jar包引入了工程。

然后先来看下我的spring配置文件:

简单的说一下,这里的所有bean对象实际上就是像我最先讲的注入是一个原理,这些bean都被放入了spring容器中,他们的相互关系可以从配置文件中看出来。

其中一个localSessionFactoryBean是管理hibernate的会话的,所有的会话都来由这里管理。其实这个配置可以更复杂的,比如hibernate.cfg.xml这种引用方式可以变成更多的property设置,因为

hibernate.cfg.xml中含有很多配置,有的人喜欢将hibernate的所有配置都写在applicationContext.xml中,但实际上是没必要的,因为常用的是在程序中或许hibernate的会话工厂就行了。

后面代码中也会给大家展示一下,另外代码中我也实现了hibernate会话工厂的单例模式。

另外一个值得注意的是我自定义了一个springContextUtil类,这个类实现了将Spring应用上下文环境ApplicationContext放入一个静态变量中,以便后期业务编写的时候用到ApplicationContext,

实现的原理是实现ApplicationContextAware接口,springContextUtil还定义了一个getBean函数,可以通过id名随时取到bean对象,这个也是后期很需要的。

可以看下springContextUtil的实现:

然后是hibernate单例模式的会话工厂实现:

在spring的applicationContext.xml中我们还可以看到我还实现了AOP,比如方法前的调用,方法后的调用,以及异常的时候调用。

这些切面实现在后期业务代码过程中,只需要简单的改下配置文件就可以做到aop编程,就很舒服了。

至于刚才提到的引用hibernate.cfg.xml,也和一般的hibernate配置是一样的。只不过这里经过spring配置后,所有的hibernate资源都交给了spring框架。

hibernate.cfg.xml由于图片太长,截不完所有的图片,截图了部分,如下:

可以看见我用c3p0来作为我的数据库连接池的实现的。

由于我们这个还是web程序,所以初始化spring的初始化工作需要交给web.xml。同时因为我还实现了springMvc框架,所以web程序的

所有请求转发给MVC的请求分发器的初始化工作也应该交给web.xml。还有比较重要的一点是,spring支持多个配置文件,所以个人喜欢将

mvc的有关配置单独放在一个文件spring-action.xml中,这个spring-action.xml记录了具体的分发配置和mvc返回ModelAndView对象所对应页面的相对路径前缀

和文件后缀名,spring-action.xml如下:

web.xml文件如下:

另外由于已经成为了web程序,尤其是因为SimpleUrlHandlerMapping类和InternalResourceViewResolver跟web有关,所以,就不能够

在java代码中初始化spring了,除非注释掉跟web有关的spring配置,所以应该通过tomcat服务器来做初始化spring的工作。

另外要记得将所有有关的class文件,jar包,jsp文件都放在webContent下,服务器才能正常运行不报错。

当然代码中也基本都是面向接口编程的,可以看我的文件目录看得出:

另外关于hibernate对象的映射我是通过注解的方式映射的,实际上还可以xml文件配置映射关系也可以。

映射可以从下图看出:

关于dao层同样是面向借口的编程,如图:

关于dao层的操作,只要继承刚才的单例会话工厂类就可以得到响应的会话,如图:

要注意的是session我并没有手动去关闭,因为getCurrentSessionOfHUtil中获取session的方式是

getCurrentSession(),这种方式是会自动关闭会话的,只要你的事务提交了或者回滚了都会帮你执行。

当你开启session后就可以按照你hibernate编程的方式来做了。这样就很好的将hibernate融入再spring框架中了。

另外mvc在spring都配置好了的情况下是很容易引进的,只要你的Controller类也放到spring容器中,以及Controller类继承好AbstractController类

就可以了。当然,前面的spring-action.xml加载和web.xml的初始化工作是少不了的。

mvc的某个方法如下:

当然框架的层级结构也是分层的,dao层查数据库,service层调用dao层,action层调用service。

目录结构可以看出这点:

最后我们来演示下框架是否搭建成功。

先启动tomcat,如图:

并没有报错。然后我们去浏览器客户端输入

http://localhost:8080/springMvcOrm/anonymous.mvc?method=add&contentName=bokeyuan,如图:

在看看后台的打印信息:

可以看见既有aop拦截器,也执行了数据库操作。

最后我们看下数据库是否存下了某个数据,因为刚才的add方法是存一个数据:

可以看见数据也进入了数据库

同时也返回了一个页面。

至此,基于springMvc+hibernate+mysql的web程序框架搭建完毕。

另外,像http://localhost:8080/springMvcOrm/anonymous.mvc这种没有方法参数的请求,我也设定了一个默认的方法,也可以进入后台。

最后也返回了一个页面,效果如下图,当然最后这个页面是我在网上找的,一个单纯的css做了动态页面效果,很好看,

但不知道作者是谁,不知道用这个页面加到我的项目中,这个作者会不会砍我。(勿怪,原作者看到这个页面可以联系我,实际上我是想向你学一些前段的特效,嘻嘻。)

如图:

大家有什么不明白的,可以留言,我有空会相继回复,也欢迎大家批评指正。

see you lala。。。。

springMvc+hibernate的web application的构建的更多相关文章

  1. 项目总结SpringMVC+hibernate框架 web.xml 分析(2)

    紧接 项目总结SpringMVC+hibernate框架 原理(MVC) applicationContext.xml 文件(3) 这一步讲解项目模块化的配置,项目中每个模块配置一个文件,命名规则为 ...

  2. 使用 Android 客户端向 Ruby on rails 构建的 Web Application 提交 HTTP GET 和 HTTP POST 请求

    最近想弄个能访问 Internet 的 Android 应用,因为求快所以用了 Ruby on Rails 来提供 HTTP 资源.这方面的资料还是比较少的,所以把尝试的过程记录下来. 1 使用 Ru ...

  3. spring+springmvc+hibernate 整合

    三大框架反反复复搭了很多次,虽然每次都能搭起来,但是效率不高.最近重新搭了一次,理顺了思路,整理了需要注意的地方,分享出来. 工具:Eclipse(jdk 1.7) spring和hibernate版 ...

  4. Spring+SpringMvc+Hibernate整合记录

    Spring+SpringMvc+Hibernate+Maven整合各大配置文件记录 1.Idea新建的Maven架构 2.Maven的对象模型的内容 <project xmlns=" ...

  5. Maven搭建SpringMVC+Hibernate项目详解 【转】

    前言 今天复习一下SpringMVC+Hibernate的搭建,本来想着将Spring-Security权限控制框架也映入其中的,但是发现内容太多了,Spring-Security的就留在下一篇吧,这 ...

  6. Apache Shiro权限框架在SpringMVC+Hibernate中的应用

    在做网站开发中,用户权限必须要考虑的,权限这个东西很重要,它规定了用户在使用中能进行哪 些操作,和不能进行哪些操作:我们完全可以使用过滤器来进行权限的操作,但是有了权限框架之后,使用起来会非常的方便, ...

  7. springmvc+hibernate入门-揭开神秘的面纱

            Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块.使用 Spring 可插入的 MVC 架构,可以选择是使用内置的 Spring Web 框架还是 Struts 这 ...

  8. Maven搭建SpringMVC+Hibernate项目详解

    前言 今天复习一下SpringMVC+Hibernate的搭建,本来想着将Spring-Security权限控制框架也映入其中的,但是发现内容太多了,Spring-Security的就留在下一篇吧,这 ...

  9. springMVC用法 以及一个简单的基于springMVC hibernate spring的配置

    替代struts 1  web.xml中配置springmvc中央控制器 <?xml version="1.0" encoding="UTF-8"?> ...

随机推荐

  1. 【1414软工助教】团队作业9——测试与发布(Beta版本) 得分榜

    题目 团队作业9--测试与发布(Beta版本) 往期成绩 个人作业1:四则运算控制台 结对项目1:GUI 个人作业2:案例分析 结对项目2:单元测试 团队作业1:团队展示 团队作业2:需求分析& ...

  2. 201521123020《Java程序设计》第8周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 本次作业题集集合 1.List中指定元素的删除(题目4-1) 1.1 实验总结 运用到了equ ...

  3. 201521123076 《Java程序设计》第6周学习总结

    1.本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖面 ...

  4. 201521123096《Java程序设计》第五周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 2. 书面作业 (1)代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过 ...

  5. 201521123023《Java程序设计》第13周学习总结

    1. 本周学习总结 (1)网络中为了进行数据交换(通信)而建立的规则.标准或约定(=语义+语法+规则)称之为协议(常用http/ftp) (2)大致熟悉了TCP协议,但是UDP怎么辣么蓝,好理解却用不 ...

  6. 201521123117 《Java程序设计》第13周学习总结

    1. 本周学习总结 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分析返回结果有何不同?为什么会有这样的不同? 分析结果:从 ...

  7. 201521123109 《java程序设计》第14周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自 ...

  8. 201521123109《java程序设计》第九周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1. 常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自 ...

  9. JSP第三篇【JavaBean的介绍、JSP的行为--JavaBean】

    什么是javaBean JavaBean就是一个普通的java类,也称之为简单java对象–POJO(Plain Ordinary Java Object),是Java程序设计中一种设计模式,是一种基 ...

  10. 源码跟读,Spring是如何解析和加载xml中配置的beans

    Spring版本基于: 跟踪代码源码基于: https://github.com/deng-cc/KeepLearning commit id:c009ce47bd19e1faf9e07f12086c ...