spring mvc 好难”吃“啊

一:spring 的工作原理:

1.spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。

2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller.

3.DispatcherServlet请请求提交到目标Controller

4.Controller进行业务逻辑处理后,会返回一个ModelAndView

5.Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象

6.视图对象负责渲染返回给客户端。

不要嫌太多,你仔细观察一下,主要的就是DispatcherServlet在中间的关联最多。附上一张我自己画的图,帮你们理一下思路,别嫌丑。⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄

 

图中,前端控制器就是DispatcherServlet.

扫描二维码关注公众号,回复: 624298 查看本文章

 

 

二:为什么要用spring?

 ioc 控制反转, 是spring的核心技术,用白话说,以前被调用者调用的方法是调用者创建的,但是现在,被调用者的方法不需要调用者创建了,而是通过spring的bean创建的,调用者只需要注入bean里边,这就叫控制反转。

aop 面向切面,他是一种思想,把非业务核心的部分提取出来,特别处理。比如,访问数据库的过程中,你需要打印日志,但是访问数据库的类很多,你不能在每个类里边都写打印日志的代码,用aop技术,你可以把打印日志的功能提取出来,在类中,你只需要调用输出日志的语句就好了。

 

Spring即使一个AOP框架,也是一IOC容器。 Spring 最好的地方是它有助于您替换对象。有了 Spring,只要用 JavaBean 属性和配置文件加入依赖性(协作对象)。然后可以很容易地在需要时替换具有类似接口的协作对象。

 

我说的够白吗?(⊙_⊙)? 这都是我自己的理解,有什么问题,你们可以提出来,咱们共同进步!

 

三:说到spring mvc ,咱们就关联的说一下SSH的整合 吧。

SSH大家都都都都都都都都都都都都知道吧(我没结巴,我是故意的

Struts(表示层)+Spring(业务层)+Hibernate(持久层) 

struts:是一个表示层框架,主要作用是页面展示,接受请求,分发请求。

MVC框架中,Struts属于VC层次,负责界面表现,负责MVC关系的分发。(View:沿用JSPHTTPFormTagResourse ControllerActionServletstruts-config.xmlAction

Hibernate:是一个持久层框架,它只负责与关系数据库的操作。

Spring:是一个业务层框架,是一个整合的框架,能够很好地黏合表示层与持久层。

 

spring还有一个知识点,就是spring事物,这个我自己也没琢磨透,不知道怎么用白话给你们说,有知道的同学,要记得在评论下边分享(⊙o⊙)哦。

我这边有一些官方的spring事物管理的知识,先给你们看:

四:Spring的事务管理:

事务就是对一系列的数据库操作(比如插入多条数据)进行统一的提交或回滚操作,如果插入成功,那么一起成功,如果中间有一条出现异常,那么回滚之前的所有操作。

这样可以防止出现脏数据,防止数据库数据出现问题。

开发中为了避免这种情况一般都会进行事务管理。Spring中也有自己的事务管理机制,一般是使用TransactionMananger进行管理,可以通过Spring的注入来完成此功能。

 

spring提供了几个关于事务处理的类:

TransactionDefinition //事务属性定义

TranscationStatus //代表了当前的事务,可以提交,回滚。

PlatformTransactionManager这个是spring提供的用于管理事务的基础接口,其下有一个实现的抽象类AbstractPlatformTransactionManager,我们使用的事务管理类例如DataSourceTransactionManager等都是这个类的子类。

 

一般事务定义步骤:

 

TransactionDefinition td = new TransactionDefinition();

TransactionStatus ts = transactionManager.getTransaction(td);

try

{ //do sth

transactionManager.commit(ts);

}

catch(Exception e){transactionManager.rollback(ts);}

 spring提供的事务管理可以分为两类:编程式的和声明式的。编程式的,比较灵活,但是代码量大,存在重复的代码比较多;声明式的比编程式的更灵活。

 

编程式主要使用transactionTemplate。省略了部分的提交,回滚,一系列的事务对象定义,需注入事务管理对象.

void add(){

transactionTemplate.execute( new TransactionCallback(){

pulic Object doInTransaction(TransactionStatus ts)

{ //do sth}

}

}

 

 声明式:

 

使用TransactionProxyFactoryBean:

 

PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED,readOnly 

围绕Poxy的动态代理 能够自动的提交和回滚事务

org.springframework.transaction.interceptor.TransactionProxyFactoryBean

 

PROPAGATION_REQUIRED–支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

 

PROPAGATION_SUPPORTS–支持当前事务,如果当前没有事务,就以非事务方式执行。

 

PROPAGATION_MANDATORY–支持当前事务,如果当前没有事务,就抛出异常。

 

PROPAGATION_REQUIRES_NEW–新建事务,如果当前存在事务,把当前事务挂起。

 

PROPAGATION_NOT_SUPPORTED–以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

 

PROPAGATION_NEVER–以非事务方式执行,如果当前存在事务,则抛出异常。

 

PROPAGATION_NESTED–如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。

 

看傻眼了吧,其实我也看傻眼了…………我感觉如果看一遍别人怎么写代码的视频就会很容易理解了。看书面文字真是太伤神了!我会去找找看,有新资源的话会告诉你们的。眺望一下远方,缓冲一下大脑,接着往下看spring的下一个知识点。

 

五:Spring里面如何配置数据库驱动

使用”org.springframework.jdbc.datasource.DriverManagerDataSource”数据源来配置数据库驱动。示例如下:

<bean id=”dataSource”>

    <property name=”driverClassName”>

        <value>org.hsqldb.jdbcDriver</value>

</property>

    <property name=”url”>

        <value>jdbc:hsqldb:db/appfuse</value>

    </property>

    <property name=”username”><value>sa</value></property>

    <property name=”password”><value></value></property>

</bean> 

 配置这块如果记住关键字的话就容易多了。是吧。

 

六、Spring里面applicationContext.xml文件能不能改成其他文件名?

ContextLoaderListener是一个ServletContextListener, 它在你的web应用启动的时候初始化。缺省情况下, 它会在WEB-INF/applicationContext.xml文件找Spring的配置。 你可以通过定义一个<context-param>元素名字为”contextConfigLocation”来改变Spring配置文件的位置。示例如下:

<listener>

    <listener-class>org.springframework.web.context.ContextLoaderListener    

<context-param>

        <param-name>contextConfigLocation</param-name>

        <param-value>/WEB-INF/xyz.xml</param-value>

    </context-param>   

 </listener-class>

</listener> 

 

七、如何在web应用里面配置spring?

web.xml中加入如下同容,在启动web服务器时加载/WEB-INF/applicationContext.xml中的内容。

<servlet>

<servlet-name>context</servlet-name>

<servlet-class>

org.springframework.web.context.ContextLoaderServlet

</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

通过如下类得到ApplicationContext实例

    WebApplicationContextUtils.getWebApplicationContext

 

八、Spring里面如何定义hibernate mapping

添加hibernate mapping 文件到web/WEB-INF目录下的applicationContext.xml文件里面。示例如下:

 <property name=”mappingResources”>

    <list>

        <value>org/appfuse/model/User.hbm.xml</value>

    </list>

</property>

 

九、解释一下Dependency injection(DI,依赖注入)IOC(Inversion of control,控制反转)?

 

依赖注入DI是一个程序设计模式和架构模型, 一些时候也称作控制反转,尽管在技术上来讲,依赖注入是一个IOC的特殊实现,依赖注入是指一个对象应用另外一个对象来提供一个特殊的能力,例如:把一个数据库连接已参数的形式传到一个对象的结构方法里面而不是在那个对象内部自行创建一个连接。控制反转和依赖注入的基本思想就是把类的依赖从类内部转化到外部以减少依赖

应用控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用,传递给它。也可以说,依赖被注入到对象中。所以,控制反转是,关于一个对象如何获取他所依赖的对象的引用,这个责任的反转。 

 

 十、spring中的BeanFactoryApplicationContext的作用有哪些?

 

1. BeanFactory负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的声明周期。

2. ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能:

a. 国际化支持

b. 资源访问:Resource rs = ctx. getResource(classpath:config.properties), file:c:/config.properties

c. 事件传递:通过实现ApplicationContextAware接口

3. 常用的获取ApplicationContext的方法:

FileSystemXmlApplicationContext:从文件系统或者url指定的xml配置文件创建,参数为配置文件名或文件名数组

ClassPathXmlApplicationContext:从classpathxml配置文件创建,可以从jar包中读取配置文件

WebApplicationContextUtils:从web应用的根目录读取配置文件,需要先在web.xml中配置,可以配置监听器或者servlet来实现

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

<servlet>

这两种方式都默认配置文件为web-inf/applicationContext.xml,也可使用context-param指定配置文件

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>/WEB-INF/myApplicationContext.xml</param-value>

</context-param>

<servlet-name>context</servlet-name>

<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet> 

 

十一、如何在web环境中配置applicationContext.xml文件?

 

<listener>

   <listener-class>

    org.springframework.web.context.ContextLoaderListener

   </listener-class>

</listener>

或:

<servlet>

   <servlet-name>context</servlet-name>

    <servlet-class>

     org.springframework.web.context.ContextLoaderServlet

    </servlet-class>

   <load-on-startup>1</load-on-startup>

</servlet>

通过如下方法取出applicationContext实例:

ApplicationContext ac=WebApplicationContextUtils.getWebApplicationContext(this.getServletContext);

 

十二、如何配置spring+struts?

 

struts-config.xml加入一个插件,通过它加载applicationContext.xml

? struts-config.xml修改action-mapping标记,具体action交给了DelegateActionProxy

? 通过DelegateActionProxy进入一spring的环境。

? springapplicationContext.xml加入<bean name=/loginclass=" singleton=false/> 

 

十三、spring+hibernate的配置文件中的主要类有那些?如何配置?

dataSource

   sessionFactory:hibernate.cfg.xml

   transactionManager

   userDao (extends HibernateDaoSupport)

   sessionFactory

   facade

   proxy

   sessionFactory

   transactionManager

   facade

 

myeclipse中先加入spring环境再加入hibernate环境。

如果springhibernate结合在一起可以不需要hibernate.cfg.xml文件是否正确

 

十四、如何在spring中实现国际化?

applicationContext.xml加载一个bean

<bean id=”messageSource” class=”org.springframework.context.support.ResourceBundleMessageSource”>

   <property name=”basename”>

    <value>message</value>

   </property>

</bean>

? src目录下建多个properties文件

? 对于非英文的要用native2ascii -encoding gb2312 源 目转化文件相关内容

? 其命名格式是message_语言_国家。

? 页面中的中显示提示信息,键名取键值。

? 当给定国家,系统会自动加载对应的国家的properties信息。

? 通过applictionContext.getMessage(“键名”,”参数”,”区域”)取出相关的信息。

十五、spring中的核心类有那些,各有什么作用?

 

BeanFactory:产生一个新的实例,可以实现单例模式

BeanWrapper:提供统一的getset方法

ApplicationContext:提供框架的实现,包括BeanFactory的所有功能

 

是不是看的都困了。。。。。。。。。

反正我是困了。。。。。。。。 

今天的知识点先给你们说到这。。。。。。

spring的用处很大很广,大多数公司都会用到,我以前的公司也用到了,所以面试的时候你们也会碰到,不要嫌麻烦,一天三、四个知识点,用不到几天就会掌握spring。边学边用效果更好。

祝你们早日成为大神!

 

猜你喜欢

转载自fengxiaoshuang429201406254717.iteye.com/blog/2305595