您好,登錄后才能下訂單哦!
Spring的知識點有什么,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
1. Spring框架的作用
輕量:Spring是輕量級的,基本的版本大小為2MB
控制反轉:Spring通過控制反轉實現了松散耦合,對象們給出它們的依賴,而不是創建或查找依賴的對象們。
面向切面的編程AOP:Spring支持面向切面的編程,并且把應用業務邏輯和系統服務分開。
容器:Spring包含并管理應用中對象的生命周期和配置
MVC框架: Spring-MVC
事務管理:Spring提供一個持續的事務管理接口,可以擴展到上至本地事務下至全局事務JTA
異常處理:Spring提供方便的API把具體技術相關的異常
2. Spring的組成
Spring由7個模塊組成:
Spring Core: 核心容器提供 Spring 框架的基本功能。核心容器的主要組件是BeanFactory,它是工廠模式的實現。BeanFactory 使用控制反轉 (IOC) 模式將應用程序的配置和依賴性規范與實際的應用程序代碼分開。
Spring 上下文:Spring 上下文是一個配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企業服務,例如 JNDI、EJB、電子郵件、國際化、校驗和調度功能。
Spring AOP:通過配置管理特性,Spring AOP 模塊直接將面向方面的編程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何對象支持 AOP。Spring AOP 模塊為基于 Spring 的應用程序中的對象提供了事務管理服務。通過使用 Spring AOP,不用依賴 EJB 組件,就可以將聲明性事務管理集成到應用程序中。
Spring DAO:JDBC DAO 抽象層提供了有意義的異常層次結構,可用該結構來管理異常處理和不同數據庫供應商拋出的錯誤消息。異常層次結構簡化了錯誤處理,并且極大地降低了需要編寫的異常代碼數量(例如打開和關閉連接)。Spring DAO 的面向 JDBC 的異常遵從通用的 DAO 異常層次結構。
Spring ORM:Spring 框架插入了若干個 ORM 框架,從而提供了 ORM 的對象關系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有這些都遵從 Spring 的通用事務和 DAO 異常層次結構。
Spring Web 模塊:Web 上下文模塊建立在應用程序上下文模塊之上,為基于 Web 的應用程序提供了上下文。所以,Spring 框架支持與 Jakarta Struts 的集成。Web 模塊還簡化了處理多部分請求以及將請求參數綁定到域對象的工作。
Spring MVC 框架:MVC 框架是一個全功能的構建 Web 應用程序的 MVC 實現。通過策略接口,MVC 框架變成為高度可配置的,MVC 容納了大量視圖技術,其中包括 JSP、Velocity、Tiles、iText 和 POI。
3. Spring容器
Sping的容器可以分為兩種類型
1. BeanFactory:(org.springframework.beans.factory.BeanFactory接口定義)是最簡答的容器,提供了基本的DI支持。最常用的BeanFactory實現就是XmlBeanFactory類,它根據XML文件中的定義加載beans,該容器從XML文件讀取配置元數據并用它去創建一個完全配置的系統或應用。
2. ApplicationContext應用上下文:(org.springframework.context.ApplicationContext)基于BeanFactory之上構建,并提供面向應用的服務。
4. ApplicationContext通常的實現
ClassPathXmlApplicationContext:從類路徑下的XML配置文件中加載上下文定義,把應用上下文定義文件當做類資源。
FileSystemXmlApplicationContext:讀取文件系統下的XML配置文件并加載上下文定義。
XmlWebApplicationContext:讀取Web應用下的XML配置文件并裝載上下文定義。
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
5. IOC & DI
Inversion of Control, 一般分為兩種類型:依賴注入DI(Dependency Injection)和依賴查找(Dependency Lookup).依賴注入應用比較廣泛。
Spring IOC扶著創建對象,管理對象(DI),裝配對象,配置對象,并且管理這些對象的整個生命周期。
優點:把應用的代碼量降到***。容器測試,最小的代價和最小的侵入性使松散耦合得以實現。IOC容器支持加載服務時的餓漢式初始化和懶加載。
DI依賴注入是IOC的一個方面,是個通常的概念,它有多種解釋。這概念是說你不用床架對象,而只需要描述它如何被創建。你不在代碼里直接組裝你的組件和服務,但是要在配置文件里描述組件需要哪些服務,之后一個IOC容器輔助把他們組裝起來。
IOC的注入方式:1. 構造器依賴注入;2. Setter方法注入。
6. 如何給spring容器提供配置元數據
XML配置文件
基于注解的配置
基于Java的配置@Configuration, @Bean
7. bean標簽中的屬性:
id
name
class
init-method:Bean實例化后會立刻調用的方法
destory-method:Bean從容器移除和銷毀前,會調用的方法
factory-method:運行我們調用一個指定的靜態方法,從而代替構造方法來創建一個類的實例。
scope:Bean的作用域,包括singleton(默認),prototype(每次調用都創建一個實例), request,session, global-session(注意spring中的單例bean不是線程安全的)
autowired:自動裝配 byName, byType, constructor, autodetect(首先闡釋使用constructor自動裝配,如果沒有發現與構造器相匹配的Bean時,Spring將嘗試使用byType自動裝配)
8. beans標簽中相關屬性
default-init-method
default-destory-method
default-autowire:默認為none,應用于Spring配置文件中的所有Bean,注意這里不是指Spring應用上下文,因為你可以定義多個配置文件
9. Bean的生命周期
1) 創建Bean的實例(factory-method, autowireConstrutor)
2) 屬性注入(autowireByName, autowireByType)
3) 初始化Bean
3.1 激活Aware方法:(invokeAwaresMethods)Spring中提供了一些Aware相關接口,比如BeanNameAware, BeanFactoryAware, ApplicationContextAware等,實現這些Aware接口的bean在被初始化之后,可以取得一些相對應的資源。
private void invokeAwareMethods(final String beanName, final Object bean){
if(bean instanceof Aware)
{
if(bean instanceof BeanNameAware){
((BeanNameAware) bean).setBeanName(beanName);
}
if(bean instanceof BeanClassLoaderAware){
((BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader());
}
if(bean instanceof BeanFactoryAware){
((BeanFactoryAware) bean).setBeanFactory(AbstactAutowire CapableBeanFactory.this);
}
}
}
3.2 處理器的應用(BeanPostProcessor接口):調用客戶自定義初始化方法前以及調用自定義初始化方法后分別會調用BeanPostProcessor的postProcessBeforeInitialization和postProcessAfterInitialization方法,使用戶可以根據自己的業務需求進行響應的處理。3.3 激活自定義的init方法(init-method & 自定義實現InitializingBean接口)
protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinetion mbd){
if(System.getSecurityManager() != null){
AccessController.doPrivileged(new PrivilegedAction<Object>(){
@Override
public Object run()
{
invokeAwareMethods(beanName,bean);
return null;
}
});
}
else{
//對特殊的bean處理:Aware, BeanClassLoaderAware, BeanFactoryAware
invokeAwareMethods(beanName,bean);
}
Object wrappedBean = bean;
if(mbd == null !! !mbd.isSynthetic()){
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wappedBean,beanName);
}
try{
invokeInitMethods(beanName, wappedBean, mbd);
}
catch(Throwable ex){
throw new BeanCreationException((mbd != null ? mbd.getResourceDescription():null),beanName,"Invocation of init method failed",ex);
}
if(mbd == null || !mbd.isSynthetic()){
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}
return wappedBean;
}
4) 使用Bean。 駐留在應用的上下文中,直到該應用上下文被銷毀。5) 銷毀(destory-mthod & 實現DisposableBean接口)
Or represent like this:
1. Bean的構造
2. 調用setXXX()方法設置Bean的屬性
3. 調用BeanNameAware的setBeanName()
4. 調用BeanFactoryAware的setBeanFactory()方法
5. 調用BeanPostProcessor的postProcessBeforeInitialization()方法
6. 調用InitializingBean的afterPropertiesSet()方法
7. 調用自定義的初始化方法
8. 調用BeanPostProcessor類的postProcessAfterInitialization()方法
9. 調用DisposableBean的destroy()方法
10. 調用自定義的銷毀方法
10. Spring中注入集合
<list>允許值相同
<set>不允許值相同
<map><entry key=”” value=”“></map>鍵和值都可以為任意類型,key, key-ref, value-ref, value可以任意搭配
<props><prop key=”“>XXX</prop></props>鍵和值都只能是String類型
11. 裝配空值
<property name="xxx"><null/></property>
12. 自動裝配(autowiring)
有助于減少甚至消除配置<property>和<constructor-arg>元素,讓Spring自動識別如何裝配Bean的依賴關系。<context:annotation-config/>與之對應的是:自動檢測(autodiscovery),比自動裝配更近了一步,讓Spring能夠自動識別哪些類需要被配置成SpringBean,從而減少對<bean>元素的使用。<context:component-scan>
13. 注解
Spring容器默認禁用注解裝配。最簡單的開啟方式<context:annotation-config/>。Spring支持的幾種不同的用于自動裝配的注解:
Spring自帶的@Autowired注解
JSR-330的@Inject注解
JSR-250的@Resource注解
14. @Autowired
@Autowired具有強契約特征,其所標注的屬性或參數必須是可裝配的。如果沒有Bean可以裝配到@Autowired所標注的屬性或參數中,自動裝配就會失敗,拋出NoSuchBeanDefinitionException.屬性不一定非要裝配,null值也是可以接受的。在這種場景下可以通過設置@Autowired的required屬性為false來配置自動裝配是可選的,如:
@Autowired(required=false)
private Object obj;
注意required屬性可以用于@Autowired注解所使用的任意地方。但是當使用構造器裝配時,只有一個構造器可以將@Autowired的required屬性設置為true。其他使用@Autowired注解所標注的構造器只能將required屬性設置為false。此外,當使用@Autowired標注多個構造器時,Spring就會從所有滿足裝配條件的構造器中選擇入參最多的那個構造器。可以使用@Qualifier明確指定要裝配的Bean.如下:
@Autowired
@Qualifier("objName")
private Object obj;
15. 自定義的限定器
@Target({ElementType.FIELF, ElementType.PARAMETER, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @Interface SpecialQualifier{}
此時,可以通過自定義的@SpecialQualifier注解來代替@Qualifier來標注,也可以和@Autowired一起使用:
@Autowired
@SpecialQualifier
private Object obj;
此時,Spring會把自動裝配的范圍縮小到被@SpecialQualifier標注的Bean中。如果被@SpecialQualifier標注的Bean有多個,我們還可以通過自定義的另一個限定器@SpecialQualifier2來進一步縮小范圍。
16. @Autowired優缺點
Spring的@Autowired注解是減少Spring XML配置的一種方式。但是它的類會映入對Spring的特定依賴(即使依賴只是一個注解)。
17. @Inject
和@Autowired注解一樣,@Inject可以用來自動裝配屬性、方法和構造器;與@Autowired不同的是,@Inject沒有required屬性。因此@Inject注解所標注的依賴關系必須存在,如果不存在,則會拋出異常。
18. @Named
相對于@Autowired對應的Qualifier,@Inject所對應的是@Named注解。
@Inject
@Named("objName")
private Object obj;
19. SpEL表達式
語法形式在#{}中使用表達式,如:
<property name="count" value="#{5}"/>
20. @Value
@Value是一個新的裝配注解,可以讓我們使用注解裝配String類型的值和基本類型的值,如int, boolean。我們可以通過@Value直接標注某個屬性,方法或者方法參數,并傳入一個String類型的表達式來裝配屬性,如:
@Value("Eruption")
private String song;
@Value可以配合SpEL表達式一起使用,譬如有些情況下需要讀取properties文件中的內容,可以使用:
@Value("#{configProperties['ora_driver']}")
詳細可以參考 Spring+Mybatis多數據源配置(三)——Spring如何獲取Properties文件的信息
21. 自動檢測Bean
<context:component-scan>元素除了完成與<context:annotation-config>一樣的工作,還允許Spring自動檢測Bean和定義Bean.<context:component-scan>元素會掃描指定的包和其所有子包,如下:
<context:component-scan base-package="com.zzh.dao" />
22. 為自動檢測標注Bean
默認情況下,查找使用構造型(stereotype)注解所標注的類,這些特殊的注解如下:
- @Component:通用的構造型注解,標志此類為Spring組件
- @Controller:標識將該類定義為SpringMVC controller
- @Repository:標識將該類定義為數據倉庫
- @Service:標識將該類定義為服務
以@Component為例:
@Component
public class Guitar implements Intrument{}
這里@Component會自動注冊Guitar 為Spring Bean,并設置默認的Bean的Id為guitar,首字母大寫變小寫。注意如果***個和第二個字母都是大寫,默認的Bean的id會有特殊處理。也可以指定Bean的Id如:
@Component("guitarOne")
public class Guitar implements Intrument{}
23. AOP
面向切面的編程AOP,是一種編程技術,允許程序模塊化橫向切割關注點,或橫切典型的責任劃分,如日志和事務管理。
AOP的核心是切面,它將多個類的通用行為封裝成可重用的模塊,該模塊含有一組API提供橫切功能。比如,一個日志模塊可以被稱作日志的AOP切面。根據需求的不同,一個應用程序可以有若干切面。在SpringAOP中,切面通過帶有@Aspect注解的類實現。
關注點是應用中的一個模塊的行為,一個關注點可能會被定義成一個我們想實現的一個功能。
橫切關注點一個關注點,此關注點是整個應用都會使用的功能,并影響整個應用,比如日志,安全和數據傳輸,幾乎應用的每個模塊都需要的功能。因此這些都屬于橫切關注點。
連接點代表一個應用程序的某個位置,在這個位置我們可以插入一個AOP切面,它實際上是個應用程序執行Spring AOP的位置。
切點是一個或一組連接點,通知將在這些位置執行。可以通過表達式或匹配的方式指明切入點。
引入運行我們在已存在的類中添加新的方法和屬性。
24. AOP通知
通知是個在方法執行前后要做的動作,實際上是程序執行時要通過SpringAOP框架觸發的代碼
Spring切面可以應用五種類型的通知:
before:前置通知,在一個方法執行前被調用。@Before
after: 在方法執行之后調用的通知,無論方法執行是否成功。@After
after-returning: 僅當方法成功完成后執行的通知。@AfterReturning
after-throwing: 在方法拋出異常退出時執行的通知。@AfterThrowing
around: 在方法執行之前和之后調用的通知。@Around
25. Spring的事務類型
編程式事務管理:這意味你通過編程的方式管理事務,給你帶來極大的靈活性,但是難維護。聲明式事務管理:這意味著你可以將業務代碼和事務管理分離,你只需用注解和XML配置來管理事務。
26. ACID
Atomic原子性:事務是由一個或多個活動所組成的一個工作單元。原子性確保事務中的所有操作全部發生或者全部不發生。
Consistent一致性:一旦事務完成,系統必須確保它所建模的業務處于一致的狀態
Isolated隔離線:事務允許多個用戶對象頭的數據進行操作,每個用戶的操作不會與其他用戶糾纏在一起。
Durable持久性:一旦事務完成,事務的結果應該持久化,這樣就能從任何的系統崩潰中恢復過來。
27. JDBC事務
如果在應用程序中直接使用JDBC來進行持久化,譬如博主采用的是Mybatis,DataSourceTransactionManager會為你處理事務邊界。譬如:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="zzh" />
<property name="password" value="zzh" />
<property name="validationQuery" value="SELECT 1"/>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
28. JTA事務
如果你的事務需要跨多個事務資源(例如:兩個或多個數據庫;或者如Sping+ActiveMQ整合 需要將ActiveMQ和數據庫的事務整合起來),就需要使用JtaTransactionManager:
<bean id="jtaTransactionManager"class="org.springframework.transaction.jta.JtaTransactionManager"/>
JtaTransactionManager將事務管理的職責委托給了一個JTA的實現。JTA規定了應用程序與一個或多個數據源之間協調事務的標準API。transactionManagerName屬性指明了要在JNDI上查找的JTA事務管理器。JtaTransactionManager將事務管理的職責委托給javax.transaction.UserTransaction和javax.transaction.TransactionManager對象。通過UserTransaction.commit()方法來提交事務。類似地,如果事務失敗,UserTransaction的rollback()方法將會被調用。
29. 聲明式事務
盡管Spring提供了多種聲明式事務的機制,但是所有的方式都依賴這五個參數來控制如何管理事務策略。因此,如果要在Spring中聲明事務策略,就要理解這些參數。(@Transactional)
1. 傳播行為(propagation)
ISOLATION_DEFAULT: 使用底層數據庫預設的隔離層級
ISOLATION_READ_COMMITTED: 允許事務讀取其他并行的事務已經送出(Commit)的數據字段,可以防止Dirty read問題
ISOLATION_READ_UNCOMMITTED: 允許事務讀取其他并行的事務還沒送出的數據,會發生Dirty、Nonrepeatable、Phantom read等問題
ISOLATION_REPEATABLE_READ: 要求多次讀取的數據必須相同,除非事務本身更新數據,可防止Dirty、Nonrepeatable read問題
ISOLATION_SERIALIZABLE: 完整的隔離層級,可防止Dirty、Nonrepeatable、Phantom read等問題,會鎖定對應的數據表格,因而有效率問題
2. 隔離級別(isolation)
PROPAGATION_REQUIRED–支持當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。
PROPAGATION_SUPPORTS–支持當前事務,如果當前沒有事務,就以非事務方式執行。
PROPAGATION_MANDATORY–支持當前事務,如果當前沒有事務,就拋出異常。
PROPAGATION_REQUIRES_NEW–新建事務,如果當前存在事務,把當前事務掛起。
PROPAGATION_NOT_SUPPORTED–以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
PROPAGATION_NEVER–以非事務方式執行,如果當前存在事務,則拋出異常。
PROPAGATION_NESTED–如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則進行與PROPAGATION_REQUIRED類似的操作。
3. 只讀(read-only)
如果事務只進行讀取的動作,則可以利用底層數據庫在只讀操作時發生的一些***化動作,由于這個動作利用到數據庫在只讀的事務操作***化,因而必須在事務中才有效,也就是說要搭配傳播行為PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEW、PROPAGATION_NESTED來設置。
4. 事務超時(timeout)
有的事務操作可能延續很長一段的時間,事務本身可能關聯到數據表的鎖定,因而長時間的事務操作會有效率上的問題,對于過長的事務操作,考慮Roll back事務并要求重新操作,而不是***時的等待事務完成。 可以設置事務超時期間,計時是從事務開始時,所以這個設置必須搭配傳播行為PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEW、PROPAGATION_NESTED來設置。
5. 回滾規則(rollback-for, no-rollback-for):rollback-for指事務對于那些檢查型異常應當回滾而不提交;no-rollback-for指事務對于那些異常應當繼續運行而不回滾。默認情況下,Spring聲明事務對所有的運行時異常都進行回滾。
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" />
</tx:attributes>
</tx:advice>
30. SpringMVC
核心架構的具體流程:
首先用戶發送請求——>DispatcherServlet,前端控制器收到請求后自己不進行處理,而是委托給其他的解析器進行處理,作為統一訪問點,進行全局的流程控制;
DispatcherServlet——>HandlerMapping, HandlerMapping將會把請求映射為HandlerExecutionChain對象(包含一個Handler處理器(頁面控制器)對象、多個HandlerInterceptor攔截器)對象,通過這種策略模式,很容易添加新的映射策略;
DispatcherServlet——>HandlerAdapter,HandlerAdapter將會把處理器包裝為適配器,從而支持多種類型的處理器,即適配器 設計模式 的應用,從而很容易支持很多類型的處理器;
HandlerAdapter——>處理器功能處理方法的調用,HandlerAdapter將會根據適配的結果調用真正的處理器的功能處理方法,完成功能處理;并返回一個ModelAndView對象(包含模型數據、邏輯視圖名);
ModelAndView的邏輯視圖名——> ViewResolver, ViewResolver將把邏輯視圖名解析為具體的View,通過這種策略模式,很容易更換其他視圖技術;
View——>渲染,View會根據傳進來的Model模型數據進行渲染,此處的Model實際是一個Map數據結構,因此很容易支持其他視圖技術;
返回控制權給DispatcherServlet,由DispatcherServlet返回響應給用戶,到此一個流程結束。
31. DispatcherServlet
SpringMVC的核心是DispatcherServlet,這個Servlet充當SpringMVC的前端控制器。與其他Servlet一樣,DispatcherServlet必須在Web應用程序的web.xml文件中進行配置。
<servlet>
<servlet-name>viewspace</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
默認情況下,DispatcherServlet在加載時會從一個基于這個Servlet名字的XML文件中加載Spring應用上下文。因為servlet的名字是viewspace,所以配置文件的名稱為viewspace-servlet.xml。接下來,必須申明DispatcherServlet處理那些URL:
<servlet-mapping>
<servlet-name>viewspace</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
通過將DispatcherServlet映射到/,聲明了它會作為默認的servlet并且會處理所有的請求,包括對靜態資源的請求。可以配置:
<mvc:resources mapping="/images/**" location="/images/"
cache-period="31556926" />
<mvc:resources mapping="/js/**" location="/js/"
cache-period="31556926" />
<mvc:resources mapping="/css/**" location="/css/"
cache-period="31556926" />
處理靜態資源。
32. 配置HandlerMapping
Spring自帶了多個處理器映射實現:
BeanNameUrlHandlerMapping:根據控制器Bean的名字將控制器映射到URL。
ControllerBeanNameHandlerMapping:與BeanNameUrlHandlerMapping類似,根據控制器Bean的名字將控制器映射到URL。使用該處理器映射實現,Bean的名字不需要遵循URL的約定。
ControllerClassNameHandlerMapping:通過使用控制器的類名作為URL基礎將控制器映射到URL。
DefaultAnnotationHandlerMapping:將請求映射給使用@RequestingMapping注解的控制器和控制器方法。
SimpleUrlHandlerMapping:使用定義在Spring應用上下文的熟悉集合將控制器映射到URL。
使用如上這些處理器映射通常只需在Spring中配置一個Bean。如果沒有找到處理器映射Bean,DisapatchServlet將創建并使用BeanNameUrlHandlerMapping和DefaultAnnotationHandlerMapping。我們一般使用基于注解的控制器類。
<mvc:annotation-driven />
<bean id="defaultAnnotationHandlerMapping"
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
</bean>
在構建控制器的時候,我們還需要使用注解將請求參數綁定到控制器的方法參數上進行校驗以及信息轉換。提供注解驅動的特性。
33. 配置HandlerAdapter
<bean id="annotationMethodHandlerAdapter"
class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
34. 配置視圖
在SpringMVC中大齡使用了約定優于配置的開發模式。InternalResourceViewResolver就是一個面向約定的元素。它將邏輯視圖名稱解析為View對象,而該對象將渲染的任務委托給Web應用程序上下文中的一個模板。
<!-- 配置視圖解析器,將ModelAndView及字符串解析為具體的頁面 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
當DispatcherServlet要求InternalResourceViewResolver解析視圖的時候,它將獲取一個邏輯視圖名稱,添加”/WEB-INF/jsp/”前綴和”.jsp”后綴。等待的結果就是渲染輸出的JSP路徑。在內部,InternalResourceViewResolver接下來會將這個路徑傳遞給View對象,View對象將請求傳遞給JSP.
看完上述內容,你們掌握Spring的知識點有什么的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。