Spring框架学习笔记

----------第一天--------2

Spring框架的作用和优点:2

Spring容器:2

*3)Spring容器的使用方法3

Spring容器对bean组件的管理:3

*1)创建Bean对象的方式3

如何使用Spring容器的ioc机制:4

1)DI(依赖注入技术)4

-------第二天-------9

各种类型数据的注入9

什么是AOP,解决什么问题10

5.通知11

6.切入点11

*1)方法限定表达式11

*2.类型限定表达式12

3.Bean的Id或Name名称限定12

第三天14

采用AOP记录异常信息。14

Log4j日志工具14

Spring注解配置:15

AOP注解配置15

-----------Spring整合-------16

比如对JDBC的整合:16

对Hibernate进行整合:16

2.Spring如何与Struts2整合17

第四天17

Spring的事务管理:17

Spring提供一些两种形式事务管理方法:1)声明式:17

2)编程式事务管理,了解(基于Java代码实现)19

Spring的MVC框架:20

----------第一天--------

总结:struts框架的作用:充当前端控制器。利用struts框架主要的作用是来接收请求,和处理请求。Hibernate框架的作用,主要是实现对数据库的访问,有3种访问方式,主要是查询语句的使用方式。Spring查找到配置文件中的东西用到的是JAVA的反射技术。

Spring框架的作用和优点:

Spring框架是一个整合其他软件框架的框架,可以在这个平台上使用struts,hibernate,jdbc技术。单独使用这些技术也可以,但是Spring提供了Ioc和aop机制的实现,可以改善程序结构,提高系统的灵活性,便于维护和扩展。替换组件的时候不影响其他的组件。提供一个组件耦合度比较低的平台,主要的优势是使耦合度降至最低,也就是解耦。Spring是一个开源框架,为javaEE应用提供轻量级的解决方案,提倡“最少侵入”是一个优秀的MVC框架,基于依赖注入的核心机制,基于AOP的声明式事务管理。在SSH使用中,Spring提供了一个容器,该容器具有IOC和AOP机制,利用这个容器IOC机制管理程序中的DAO,SERVICE等组件,采用AOP机制实现事务,异常等共通处理。面试的时候介绍这种应用的东西的时候可以先介绍一下相关的理论,然后加上一些代码或者项目经验,比如说在哪个项目中怎么使用了这个组件,这样会让别人更加踏实。

Spring容器:

Spring容器是Spring框架的基础和核心,该容器具有以下功能: a可以创建和初始化一个bean组件对象,可以使用单例模式,b可以管理bean对象的生命周期。c可以利用IOC机制建立Bean对象之间的关系。他们之家只有调用关系。d可以利用扩展的AOP机制将共通组件给某一批目标组件对象建立关联。(需要单独引入AOP扩展jar包);2)Spring容器类型可以使BeanFactory或者

ApplicationContext.

--Spring容器实例化

ApplicationContextac=

newClasspathXmlApplicationContext(xml配置);

--从Spring容器获取Bean对象

接口类型变量=(接口类型)ac.getBean("id属性");

--销毁Spring容器

使用AbstractApplicationContext类型的close();

*3)Spring容器的使用方法

--引入spring核心包

--在src下添加spring配置文件

--在spring配置文件定义Bean组件

<beanid="标识符"class="包名.实现类名">

</bean>

--实例化spring容器,通过容器的

getBean("标识符")方法获取Spring容器实例化的过程://获取Spring容器中的CostDAO

//第一步实例化Spring容器

Stringconf="applicationContext.xml";

//用于加载src下的xml配置文件

AbstractApplicationContextac=

newClassPathXmlApplicationContext(conf);

//FileSystemXmlApplicationContext用于加载磁盘路径的xml配置

//获取容器中的DAO

CostDAOcostDao=

(CostDAO)ac.getBean("costDao");

costDao.save();

costDao.update();

//ac.close();//销毁Spring容器

ApplicationContext里面没有Close()这个方法。

Spring容器对bean组件的管理:

*1)创建Bean对象的方式

Spring可以采用单例和非单例模式创建Bean对象。

默认情况下,采用单例模式创建Bean对象。

在<beanscope="">中利用scope属性控制创建模式。scope="singleton"采用单例模式,

scope="prototype"采用原型(非单例)模式

(在JavaWeb环境中,scope属性值还可以指定request,session等范围,判断是不是同一个request,session)

2)Bean对象的创建时机

如果scope="singleton",Spring容器实例化时,会自动创建Bean组件对象。(延时机制的时候可以使用)

如果scope="prototype",Spring容器会在调用getBean方法时创建Bean对象。属性layz-init=true是表示延时创建

3)Bean对象的初始化和销毁

使用<beaninit-method=""destroy-method="">

 可以指定Bean对象创建和销毁时触发的方法。

destroy-method只适用于scope="singleton"模式.

当调用applicationcontext.close()时,容器会自动销毁所有单例对象,此时会触发指定destory-method方法。

init-method指定的初始化方法可以在构造方法执行后自动执行。

如何使用Spring容器的ioc机制:

使用接口技术来实现对这个注入对象的控制。实现对两个组件之间的相互调用,这就是IOC的思想,当你改变或者更换其中的一个组件的时候不会影响另外一个组件。Spring提供的IOC主要是用于建立两个对象之间的关系,好处是低耦合方式:

1)DI(依赖注入技术)

dependencyinjection称为依赖注入,就是两个组件之间存在调用关系采用的注入关系。在主要的类中主要使用全局变量和set的方法来实现调用,Spring采用的是DI技术实现了IOC控制思想。DI技术可以分成以下几类:a.setter方式注入,(依靠属性的set方法注入)

B.构造方法注入:(依靠构造方法的参数注入)c.接口方式注入:2)IOC思想:inverseofController(反向控制或者控制反转)确切来说应该称为控制转移。控制权:指的是负责对象的创建,初始化以及销毁等工作。组件的替换其实就是要把控制权给换掉。比如:两个组件,当A调用B时,原有方式需要在A里面编写控制权逻辑代码,当需要替换B组时,需要修改控制权逻辑,因此A和B组件的耦合度比较高;采用IOC思想后,就是讲A中的控制权逻辑转移给第三方容器或者框架,由第三方框架负责A/B对象的创建,释放,初始化和关系等指定工作。*3)Action--->DAO采用Spring的IoC方式

--在Action中定义一个DAO接口类型的变量

--在Action中定义一个setter方法,主要作用是接收spring注入进来DAO对象。

--将Action和DAO都交给Spring容器,Action配置如下:

<beanid="action标识符"

 class="action实现类">

<!--setter方式注入配置-->

<propertyname="属性名"

ref="dao定义时的Bean组件Id值">

</property>

</bean>

4)采用构造方式注入重构3示例

--定义带参数构造方法替代setter方法

--定义Action的<bean>时,采用

<constructor-arg>替代<property>配置

<constructor-argindex="构造参数索引"

ref="要注入的Bean对象的id">

</constructor-arg>

补充:单独的测试方法:不需要使用main方法;在每个测试方法前面加一个@Test这个东西,加上去后要引入jar包,运行的时候直接runas就可以,结果的显示界面如果是绿色就是运行成功,如果是红色就表示异常,如果是蓝色表示的调用的方法逻辑异常。不影响运行但是运行不出预期的结果。使用asseter来输出。

测试Spring容器创建的bean对象是不是单例模式:取出两个bean对象,判断两个对象是不是相等,相等的话就是同一个是单例。

单例模式容易出现线程并发的问题,如果想改变这个模式的话可以这么改,在xml里面使用属性,scope=“”;里面如果是:protoytpe,是非单例的意思,singleton是单例的意思。工厂对象一般会使用单例模式。

属性init-method=””是初始化方法,不管单例还是不是单例;或者可以直接写在构造方法里面。

属性destroy-method=””;是销毁容器的方法。使用的条件一定是单例模式的对象,而且要有close()才会调用这个方法。

-------第二天-------

各种类型数据的注入

基本类型注入:利用value属性指定,可以注入字符串,数值等简单数据,

Bean对象注入:利用ref属性指定,可以注入一个bean组件对象

集合数据注入:

<beanid="msgBean"scope="singleton"

class="com.tarena.service.MessageBean">

<propertyname="name"value="露丝"></property>

<propertyname="age"value="18"></property>

<propertyname="friends">

<list>

<value>TOM</value>

<value>JACK</value>

<value>张三丰</value>

</list>

</property>

<propertyname="cities">

<set>

<value>北京</value>

<value>上海</value>

<value>深圳</value>

</set>

</property>

<propertyname="includeTypes"

value="jpegg,if,jpg">

</property>

<propertyname="books">

<map>

<entrykey="1001"value="CoreJava基础"></entry>

<entrykey="1002"value="Struts框架详解"></entry>

<entrykey="1003"value="编程之美"></entry>

</map>

</property>

<propertyname="dbParams">

<props>

<propkey="username">root</prop>

<propkey="password">1234</prop>

</props>

</property>

</bean>

什么是AOP,解决什么问题

AspectOrientedProgramming面向方面编程或者是面向切面编程,面向方面编程是以(OOP)面向对象编程为基础,这两种编程思想侧重点不同,OOP侧重于对象,根据需求提炼出对象结构,AOP侧重于方面对象,方面关注的是共通处理部分。例如事务管理,权限控制,日志记录等。把这些共通的处理部分封装成一个类,也就是一个方面组件。AOP主要是解决一对多调用的问题,一个共通组件被多个目标组件调用,降低组件的关联性。AOP和IOC必须是要在Spring容器里面才有效。

Spring容器AOP的基本思想:1)引入spring-aop开发包

2)编写方面组件,封装共通的处理逻辑

3)在spring配置文件中,定义方面组件,利用aop配置,将方面组件方法和目标组件方法作用在一起。

AOP的相关概念:1)方面(Aspect):方面组件,用于封装共通处理,可以被切入到多个目标对象方法上的组件,只有定义成方面组件才能作用到多个目标对象方法上。2)切入点(Pointcut):是一个表达式,用于指定哪些组件和方法作为组件的切入目标3)连接点(joinPoint):切入点是连接点的集合,就是方面组件作用的目标对象的目标方法的作用处,也就是代表方面组件和某一个目标方法的关联点,在获取详细的操作信息的时候会用上,4)通知(advice):用于指定目标方法和方面组件作用的时机,比如前置通知,beforemethod=’’表示的是先执行方面组件,后执行目标方法。5)目标对象(target):应用方面组件的对象,或者是与切入点表达式匹配的对象,6)动态代理(autoproty):Spring采用了动态代理技术事项了AOP控制,如果Spring采用AOP配置后,容器的getbean方法返回的组件对象时一个动态生成类型,也就是动态代理类,代理类负责调用目标对象方法和方面对象方法。Spring采用的动态代理技术有两种:

a.采用cglib.jar工具包

适用于目标组件没有接口实现的情况。

 publicclass$Service$$Enhancer$CGLIBextends原目标组件类型{

//重写目标对象的方法,在重写的方法中调用目标对象和方面组件对象功能}

b.采用JDKProxyAPI

适用于目标组件有接口实现的情况。publicclass$Proxy4implements原目标组件接口{

//重写目标接口方法,在重写的方法中调用目标对象和方面组件对象功能}

5.通知

Spring提供了5种类型的通知。用于指定方面组件在目标方法哪个位置切入。

a.前置通知<aop:before>

先执行方面组件,再执行目标组件方法

b.后置通知<aop:after-returning>

先执行目标组件方法,没有异常再执行方面组件。

如果发生异常,不会执行方面组件

c.异常通知<aop:after-throwing>

当目标方法抛出异常之后,执行方面组件。

d.最终通知<aop:after>

先执行目标方法,无论有没有异常都执行方面组件

e.环绕通知<aop:around>

相当于前置+后置通知。在目标方法前和后都执行方面组件

try{

//前置通知切入

//目标组件方法

//后置通知切入

}catch(){

//异常通知切入

}finally{

//最终通知切入

}

6.切入点

*1)方法限定表达式

可以规定哪些方法被切入方面组件,哪些不被切入

格式如下:

execution(修饰符?返回类型方法名(参数)

throws异常?)

示例1:匹配容器中Bean对象的find开始的方法

execution(*find*(..))

示例2:匹配CostServiceImpl类中所有方法

execution(*tarena.service.CostServiceImpl.*(..))

示例3:匹配tarena.service包下所有类的所有方法

execution(*tarena.service.*.*(..))

示例4:匹配tarena.service包及其子包下所有类所有方法

execution(*tarena.service..*.*(..))

示例5:匹配容器Bean对象中的find开始的方法,并且是publicvoid修饰的

execution(publicvoidfind*(..))

*2.类型限定表达式

可以规定哪个类中的所有方法被切入方面组件

格式:within(包名.类型名)

示例1:匹配CostServiceImpl类中所有方法

within(tarena.service.CostServiceImpl)

示例2:匹配tarena.service包下所有类所有方法

within(tarena.service.*)

示例3:匹配tarena.service包及其子包中所有类所有方法

within(tarena.service..*)

3.Bean的Id或Name名称限定

可以按<bean>定义时,id或name属性值匹配

bean(beanIdOrName)

示例1:匹配容器中id=costService的Bean对象

bean(costService)

示例2:匹配容器中id值以Service结尾的对象

bean(*Service)

4.参数类型限定

args(参数类型列表)

示例1:匹配有且只有一个参数,参数类型符合Serializable类型的方法

args(java.io.Serializable)

注意:上述切入点表达式可以联合使用,采用&&,||连接

第三天

主要是使用IOC来实现DAO和ACTION的接藕。

要想达到灵活扩展的功能,使用动态代理的功能,在调用原有的组件功能的基础上再使用AOP机制使用新的组件功能进行扩展。

采用AOP记录异常信息。

编写记录异常信息的方面组件2)编写切入点表达式,指定目标对象3)指定通知类型,目标方法发生异常后执行方面组件。

Log4j日志工具

主要是用于消息输出,可以控制消息输出的级别,输出方式,格式。该工具主要有三类组件构成:

1)Logger日志器

用于将消息分成级别输出。

2)Appender输出器

用于实现消息输出的不同方式。例如控制台,文件等

3)Layout布局器

用于格式化消息内容

Spring注解配置:

组件自动扫描技术:可以自动扫描指定包下的组件,当遇到组件类定义前面有下面注解标注时,会将该组件纳入Spring容器。等价于:<bean>定义--首先需要在spring配置中开启组件扫描技术

<context:component-scan

base-package="要扫描的包路径"/>

--如果发现类定义前有以下注解标记

@Component:各个情况都可使用

@Controller:建议在Action组件使用

@Service:建议在Service组件使用

@Repository:建议在DAO组件使用

默认将组件扫描到Spring容器,id值使用的是类名首字母小写,如果需要指定id,可以使用@Service("id值")格式定义.

可以使用@Scope注解指定scope=""属性值,使用格式@Scope("prototype")

--如果两个组件之间有注入关系

可以使用@Resource或@Autowired

按类型匹配注入也可以按名称匹配注入,如果按名称匹配注入,@Resource(name="id属性")

在类名的前面加@Service默认的情况下是类名第一个字母小写,如果要自定义的话可以这样@Service(“自定义的ID值”)这种格式定义。默认的情况下单例的,如果要设置成不是单例的,可以在@service这个注解下面加一个@scope(“prototype”)来设定是不是单例的。

声明了全局变量以后使用标注@Resource它会自动从xml文件中寻找相关的bean组件来给它注入值,可以省去set方法,主要是使用在DAO上。使用@Autowired也是可以的,相同的功能。这是使用在两个组件之间存在注入关系的。自定义的时候可以这么定义@Resource(name=”id值”)。

AOP注解配置

--在spring配置中开启AOP注解方式

<aop:aspectj-autoproxy/>

--在方面组件中使用以下注解标记…主要是在这样的方面组件里面使用。

======类定义前使用======

@Component//将组件扫描到容器

@Asepect//将组件指定为方面组件

======通知方法前使用======

@Around("切入点表达式"):环绕通知切入

@Before("切入点表达式"):前置通知切入

@AfterReturning():后置通知切入

@AfterThrowing():异常通知切入

@After():最终通知切入

-----------Spring整合-------

Spring对数据访问技术的支持

提供了一致的异常处理层次Spring将各种不同访问技术的异常类型封装,统一成了Spring的异常类型,DataAccessException,

提供了编写DAO的一些工具类,提供了DaoSupport,Template这些工具类。比如:采用JDBC技术,提供了jdbcDaoSupport,jdbcTemplate.封装了jdbc的操作。采用Hibernate技术,提供了HibernateDaoSupport,HibernateTemplate,这几个工具类。

提供了声明式事务管理方法:原理就是采用AOP机制实现了事务管理,在使用的时候只要追加事务配置就可以。一般就是采用的环绕通知。都已经封装好,需要做的配置是切入点和方面组件的声明。

比如对JDBC的整合:

1)引入Spring开发包和配置文件

2)引入JDBC开发包(驱动包)

3)编写数据表对应的实体类POJO

4)编写DAO接口和实现类

实现类extendsJdbcDaoSupport后,可以使用this.getJdbcTemplate方法获取Template对象。利用Template对象方法执行增删改查操作。

5)在Spring容器中定义DAO,注意必须给DAO注入一个dataSource对象。

6)引入dbcp连接池开发包,在Spring容器中定义一个dataSource对象,给DAO注入

对Hibernate进行整合:

给DAO注入比JDBC多了一个sessionfatory;是用来管理事务和数据库连接的。

1)引入开发框架

--Spring开发包

--数据库驱动包和dbcp连接池包

--Hibernate开发包

2)在src下添加Spring的配置文件applicationContext.xml

3)添加实体类POJO和映射描述文件hbm.xml

4)编写DAO接口和HibernateDAO实现类

需要继承HibernateDaoSupport,使用HibernateTemplate工具类完成增删改查操作。

5)需要在applicationContext.xml定义DAO组件,需要给DAO注入sessionFactory;SessionFactory需要注入DataSource.

==============================

JdbcCostDAO(JdbcTemplate)<---DataSourceHibernateCostDAO(HibernateTemplate)

<---SessionFactory<---DataSource

==============================

在使用hibernate的时候要是使用session建议使用回调模式进行调用。

2.Spring如何与Struts2整合

1)将Action纳入到Spring容器中

可以采用扫描注解方式也可以采用XML的<bean>定义。

2)Action使用Service或DAO组件时,采用注入方式,将Service和DAO给Action注入

3)引入一个struts2-spring-plugin-2.1.8.jar开发包

(当发生action请求时,StrutsFilter控制器会通过该开发包去Spring容器寻找Action对象,进行请求处理)

===struts2-spring-plugin-2.1.8.jar原理=====

 该组件提供了一个StrutsSpringObjectFactory,当引入该jar包后,会利用StrutsSpringObjectFactory替代原Struts框架中的ObjectFactory负责生成Action对象。

 StrutsSpringObjectFactory可以访问Spring容器。

该Factory会按struts.xml中<action>配置的class属性值作为原则寻找Spring容器中的Bean对象。

a.利用class属性当做Bean组件的id值去Spring容器寻找

4-1)修改struts.xml中所有<action>的class属性值,修改成容器中对应Action组件的id值

 b.

====================================

5)在web.xml中定义ContextLoaderListener,用于在服务器启动时,实例化Spring容器。

第四天

Spring的事务管理:

Spring提供一些两种形式事务管理方法:1)声明式:

<!--声明式事务管理,采用AOP形式切入-->

<beanid="txManager"

class="org.springframework.orm.hibernate3.HibernateTransactionManager">

<propertyname="sessionFactory"ref="sessionFactory"/>

</bean>

<tx:adviceid="txAdvice"transaction-manager="txManager">

<tx:attributes>

<tx:methodname="update*"propagation="REQUIRED"/>

<tx:methodname="delete*"propagation="REQUIRED"/>

<tx:methodname="add*"propagation="REQUIRED"/>

<tx:methodname="find*"read-only="true"/>

<tx:methodname="get*"read-only="true"/>

</tx:attributes>

</tx:advice>

<aop:configproxy-target-class="true">

<aop:pointcutid="serviceOperation"expression="within(com.tarena.netctoss.action..*)"/>

<aop:advisoradvice-ref="txAdvice"pointcut-ref="serviceOperation"/>

</aop:config>

1.Spring的事务管理

Spring提供以下两种形式事务管理方法。

*1)声明式事务管理(基于配置实现)

a.基于XML方式配置

--定义事务管理Bean

Hibernate采用HibernateTransactionManager

JDBC采用DataSourceTransactionManager

--定义<tx:advice>事务通知

--定义<aop:config>切入配置

注意:如果将事务切入到Action组件,需要在<aop:config>添加proxy-target-class="true",指定采用CGLIB技术生成动态代理类实现AOP切入。目标对象有接口,不需要指定。

b.基于注解方式配置

--定义事务管理Bean

--在spring配置文件中开启事务注解配置

<tx:annotation-drivenproxy-target-class="true"

transaction-manager="txManager"/>

--在目标组件中使用@Transactional注解

定义在方法前:该方法采用指定事务管理

定义在类前:该类所有方法采用指定事务管理

@Transactiona(readOnly=true,

propagation=Propagation.REQUIRED)

2)编程式事务管理,了解(基于Java代码实现)

publicclassSimpleServiceimplementsService{

publicObjectsomeServiceMethod(){

returntransactionTemplate.execute(

newTransactionCallback(){

publicObjectdoInTransaction(TransactionStatusstatus){

updateOperation1();

returnresultOfUpdateOperation2();

}

});

}

}

事务管理中的attributes里面可以有很多个method是用来定义怎么样的事务管理,定义了那个方法怎么管理,propagation=“required”的事务管理方式,name=方法的表达式。Read-only=true只读的方式管理,可以减少数据库的开销;定义好了以后,就可以把拦截器给去掉,相关的配置也要删掉。事务要是切入action中的时候一定要加一个属性:proxy-target-class=true.指定目标对象时一个类,没有接口,这时动态代理技术的一种实现方法。

Spring中常用事务类型:

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

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

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

REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。

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

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

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

拥有多个可以回滚的保存点,内部回滚不会对外部事务产生影响。只对DataSourceTransactionManager有效

基于注解方式配置:@可以写在类的定义前面也可以写在方法定义前面。在xml里面开启注解:在类的前面加上了以后,相当于整个类里面的所有方法都会在事务管理的范围内,默认的是required.如果要有单独的方法不需要是required的可以在这个方法前面加上注解声明式read-noly的。

使用Spring的优点就在于:

首先,可以使用IoC方式进行注入

其次,可以使用AOP的思想进行切面编程

再次,就是控制事务相对简单

Hibernate延迟加载功能,要再web.xml里面加上opensessionview的文件配置。在spring里面的事务管理和session关闭打开的管理是分开的,所以要使用到session的时候要通过文件配置打开。

Spring的MVC框架:

结构加流程就是这个框架的原理:

SpringMVC结构:控制器:DispatcherServlet,Controller,HandlerMapping,

视图:ViewResolver,jsp模型:ModelAndView,

SpringMVC流程:

MVC框架的主要流程:1.引入jar包2.写配置文件3引入主控制器。

2.Spring整合Hibernate后,为了支持Hibernate延迟加载用法,提供了一个OpenSessionInViewFilter组件,

在web.xml中配置了该过滤器之后,Session关闭会推迟到JSP解析之后。

(默认情况下,HibernateTemplate在执行完其方法时就会关闭Session.)

注意:使用时需要定义在strutsfilter控制器之前。

==================================

3.SpringMVC框架

1)SpringMVC结构

控制器:DispatcherServlet,Controller,

HandlerMapping

视图:ViewResolver,JSP

模型:ModelAndView

2)SpringMVC流程

a.客户端发请求,进入控制器DispatcherServlet

b.控制器调用HandlerMapping组件,根据请求和Controller映射信息,调用相应的Controller组件处理请求

c.控制器执行Controller组件对象的约定处理方法处理请求。在该方法中可以调用DAO,Service等组件

d.Controller处理完毕后,会返回一个ModelAndView对象实例。该实例可以封装模型数据和视图名称。

e.控制器调用ViewResolver组件解析ModelAndVIew对象的信息,找到View组件。

f.在View组件中,利用标签或表达式将数据显示到页面,生成响应内容,给客户输出。

3)SpringMVC入门示例

a.添加Spring核心包和spring-webmvc.jar

b.src添加Spring配置文件applicationContext.xml

c.在web.xml中定义DispatcherServlet控制器

d.定义Controller组件(基于注解)

定义一个业务方法,方法可以有以下格式:

publicStringf1(){}

publicStringf2(HttpServletRequestreq){}

publicStringf3(HttpServletRequestreq,

HttpServletResponseres){}

publicStringf4(HttpServletRequestreq,

HttpServletResponseres,

HttpSessionsession){}

//user可以接收表单信息

publicStringf5(Useruser){}

//model可以向下一个界面传递模型数据

publicStringf6(Modelmodel){}

在上述方法上,利用@RequestMapping注解指定该方法和哪一个请求对应

e.基于组件扫描基于将Controller组件扫描到容器

f.在容器中定义一个HandlerMapping组件,采用支持注解配置的AnnotationMethodHandlerAdapter

g.在容器中定义一个ViewResolver

---------------示例spring05_2流程------------------

tologin.do-->DispatcherServlet-->HandlerMapping

-->ToLoginController-->ModelAndView

-->ViewResolver-->WEB-INF/jsp/login.jsp

login.do-->LoginController-->success.jsp(login.jsp)

----------------------------------------------------------

如果想学习SpringMVC建议看Spring05_1基于XML配置,帮助理解。然后采用Spring05_2注解用法使用。

(SpringMVC其他应用可参考Spring中文参考手册)

相关推荐