1.springâAOPä¸äºå¡
2.@Lazy注解源码分析
3.6. Spring源码篇之FactoryBean
4.å¦ä½ä½¿ç¨NetBeans IDEå建ç®åçWebåºç¨ç¨åº
springâAOPä¸äºå¡
title: springââAOPä¸äºå¡.mddate: -- ::
categories: [Spring]
tags: [AOP,框架框架äºå¡]
toc: true
å ååºæºç ä¸æ¯è¾éç¹çå 个类ï¼
1ã<aop:before method="before" pointcut-ref="myMethods"/>å è£ æä¸ä¸ªadvisor
2ãAspectJAwareAdvisorAutoProxyCreatorï¼å½å®ä¾åææbeané½ä¼æ§è¡å°AspectJAwareAdvisorAutoProxyCreatorç±»
å®ä¼æ£æµbeanæ¯å¦advisor以åadviceåå¨ï¼å¦ææ就说æè¿ä¸ªbeanæåé¢ï¼æåé¢é£ä¹å°±ä¼çæ代ç
3ãjdkç代çï¼beanéé¢çææadvisorå å ¥å°proxyFactoryã
4ãjdkDynamicProxy invokeï¼æ¿å°beanéé¢çææInterceptorï¼ä¼å¾ªç¯proxyFactoryéé¢çææadvisor
éé¢æadviceï¼éé¢çadviceæ两ç§ç±»åï¼è¦ä¹æ¯adviceï¼è¦ä¹æ¯MethodInterceptorç±»åç
5ãå½ä»£ç对象è°ç¨æ¹å¼ï¼æ¯ä¸ä¸ªMethodInterceptorç±»åçç±»çé¾å¼è°ç¨è¿ç¨ï¼ç´å°å®¹å¨ç大å°åç´¢å¼ä¸è´çæ¶åè°ç¨JoinPointç®æ æ¹æ³
beforeï¼this.advice.before(),invocation.processd();
è£ é åæ°ï¼åé¢éé¢beforeæ¹æ³çmethod对象ï¼method.getParamterTypes()[0]
æç»ä¼æadviceå°è£ æMethodInterceptorç±»åç对象
ç¨åºæ§è¡çæ个ç¹å®ä½ç½®ï¼å¦ç±»å¼å§åå§ååãç±»åå§ååãç±»æ个æ¹æ³è°ç¨åãè°ç¨åãæ¹æ³æåºå¼å¸¸åãä¸ä¸ªç±»æä¸æ®µç¨åºä»£ç æ¥æä¸äºå ·æè¾¹çæ§è´¨çç¹å®ç¹ï¼è¿äºç¹ä¸çç¹å®ç¹å°±ç§°ä¸ºâè¿æ¥ç¹âãSpringä» æ¯ææ¹æ³çè¿æ¥ç¹ï¼å³ä» è½å¨æ¹æ³è°ç¨åãæ¹æ³è°ç¨åãæ¹æ³æåºå¼å¸¸æ¶ä»¥åæ¹æ³è°ç¨ååè¿äºç¨åºæ§è¡ç¹ç»å ¥å¢å¼ºãè¿æ¥ç¹ç±ä¸¤ä¸ªä¿¡æ¯ç¡®å®ï¼ç¬¬ä¸æ¯ç¨æ¹æ³è¡¨ç¤ºçç¨åºæ§è¡ç¹ï¼ç¬¬äºæ¯ç¨ç¸å¯¹ç¹è¡¨ç¤ºçæ¹ä½ã
æ¯ä¸ªç¨åºç±»é½æ¥æå¤ä¸ªè¿æ¥ç¹ï¼å¦ä¸ä¸ªæ¥æ两个æ¹æ³çç±»ï¼è¿ä¸¤ä¸ªæ¹æ³é½æ¯è¿æ¥ç¹ï¼å³è¿æ¥ç¹æ¯ç¨åºç±»ä¸å®¢è§åå¨çäºç©ãAOPéè¿âåç¹âå®ä½ç¹å®çè¿æ¥ç¹ãè¿æ¥ç¹ç¸å½äºæ°æ®åºä¸çè®°å½ï¼èåç¹ç¸å½äºæ¥è¯¢æ¡ä»¶ãåç¹åè¿æ¥ç¹ä¸æ¯ä¸å¯¹ä¸çå ³ç³»ï¼ä¸ä¸ªåç¹å¯ä»¥å¹é å¤ä¸ªè¿æ¥ç¹ãå¨Springä¸ï¼åç¹éè¿org.springframework.aop.Pointcutæ¥å£è¿è¡æè¿°ï¼å®ä½¿ç¨ç±»åæ¹æ³ä½ä¸ºè¿æ¥ç¹çæ¥è¯¢æ¡ä»¶ï¼Spring AOPçè§å解æå¼æè´è´£åç¹æ设å®çæ¥è¯¢æ¡ä»¶ï¼æ¾å°å¯¹åºçè¿æ¥ç¹ãå ¶å®ç¡®åå°è¯´ï¼ä¸è½ç§°ä¹ä¸ºæ¥è¯¢è¿æ¥ç¹ï¼å 为è¿æ¥ç¹æ¯æ¹æ³æ§è¡åãæ§è¡åçå æ¬æ¹ä½ä¿¡æ¯çå ·ä½ç¨åºæ§è¡ç¹ï¼èåç¹åªå®ä½å°æ个æ¹æ³ä¸ï¼æ以å¦æå¸æå®ä½å°å ·ä½è¿æ¥ç¹ä¸ï¼è¿éè¦æä¾æ¹ä½ä¿¡æ¯ã
å¢å¼ºæ¯ç»å ¥å°ç®æ ç±»è¿æ¥ç¹ä¸çä¸æ®µç¨åºä»£ç ï¼å¨Springä¸ï¼å¢å¼ºé¤ç¨äºæè¿°ä¸æ®µç¨åºä»£ç å¤ï¼è¿æ¥æå¦ä¸ä¸ªåè¿æ¥ç¹ç¸å ³çä¿¡æ¯ï¼è¿ä¾¿æ¯æ§è¡ç¹çæ¹ä½ãç»åæ§è¡ç¹æ¹ä½ä¿¡æ¯ååç¹ä¿¡æ¯ï¼æ们就å¯ä»¥æ¾å°ç¹å®çè¿æ¥ç¹ã
å¢å¼ºé»è¾çç»å ¥ç®æ ç±»ãå¦æ没æAOPï¼ç®æ ä¸å¡ç±»éè¦èªå·±å®ç°ææé»è¾ï¼èå¨AOPç帮å©ä¸ï¼ç®æ ä¸å¡ç±»åªå®ç°é£äºé横åé»è¾çç¨åºé»è¾ï¼èæ§è½çè§åäºå¡ç®¡ççè¿äºæ¨ªåé»è¾åå¯ä»¥ä½¿ç¨AOPå¨æç»å ¥å°ç¹å®çè¿æ¥ç¹ä¸ã
å¼ä»æ¯ä¸ç§ç¹æ®çå¢å¼ºï¼å®ä¸ºç±»æ·»å ä¸äºå±æ§åæ¹æ³ãè¿æ ·ï¼å³ä½¿ä¸ä¸ªä¸å¡ç±»åæ¬æ²¡æå®ç°æ个æ¥å£ï¼éè¿AOPçå¼ä»åè½ï¼æ们å¯ä»¥å¨æå°ä¸ºè¯¥ä¸å¡ç±»æ·»å æ¥å£çå®ç°é»è¾ï¼è®©ä¸å¡ç±»æ为è¿ä¸ªæ¥å£çå®ç°ç±»ã
ç»å ¥æ¯å°å¢å¼ºæ·»å 对ç®æ ç±»å ·ä½è¿æ¥ç¹ä¸çè¿ç¨ãAOPåä¸å°ç»å¸æºï¼å°ç®æ ç±»ãå¢å¼ºæå¼ä»éè¿AOPè¿å°ç»å¸æºå¤©è¡£æ ç¼å°ç¼ç»å°ä¸èµ·ãæ ¹æ®ä¸åçå®ç°ææ¯ï¼AOPæä¸ç§ç»å ¥çæ¹å¼ï¼
aãç¼è¯æç»å ¥ï¼è¿è¦æ±ä½¿ç¨ç¹æ®çJavaç¼è¯å¨ã
bãç±»è£ è½½æç»å ¥ï¼è¿è¦æ±ä½¿ç¨ç¹æ®çç±»è£ è½½å¨ã
cãå¨æ代çç»å ¥ï¼å¨è¿è¡æ为ç®æ 类添å å¢å¼ºçæåç±»çæ¹å¼ã
Springéç¨å¨æ代çç»å ¥ï¼èAspectJéç¨ç¼è¯æç»å ¥åç±»è£ è½½æç»å ¥ã
ä¸ä¸ªç±»è¢«AOPç»å ¥å¢å¼ºåï¼å°±äº§åºäºä¸ä¸ªç»æç±»ï¼å®æ¯èåäºåç±»åå¢å¼ºé»è¾ç代çç±»ãæ ¹æ®ä¸åç代çæ¹å¼ï¼ä»£çç±»æ¢å¯è½æ¯ååç±»å ·æç¸åæ¥å£çç±»ï¼ä¹å¯è½å°±æ¯åç±»çåç±»ï¼æ以æ们å¯ä»¥éç¨è°ç¨åç±»ç¸åçæ¹å¼è°ç¨ä»£çç±»ã
åé¢ç±åç¹åå¢å¼ºï¼å¼ä»ï¼ç»æï¼å®æ¢å æ¬äºæ¨ªåé»è¾çå®ä¹ï¼ä¹å æ¬äºè¿æ¥ç¹çå®ä¹ï¼Spring AOPå°±æ¯è´è´£å®æ½åé¢çæ¡æ¶ï¼å®å°åé¢æå®ä¹ç横åé»è¾ç»å ¥å°åé¢ææå®çè¿æ¥ç¹ä¸ã
advisorï¼ pointCut advice
ä¸ç±»åè½çå¢å¼º
aroundæ¹æ³éé¢ä»£ç åé¢
äºå¡åé¢
ç¼ååé¢
æ¥å¿åé¢
äºå¡ï¼Transactionï¼ï¼ä¸è¬æ¯æè¦åçææåçäºæ ãå¨è®¡ç®æºæ¯è¯ä¸æ¯æ访é®å¹¶å¯è½æ´æ°æ°æ®åºä¸åç§æ°æ®é¡¹çä¸ä¸ªç¨åºæ§è¡åå (unit)ãæ¯æ°æ®åºæä½çæå°å·¥ä½åå ï¼æ¯ä½ä¸ºå个é»è¾å·¥ä½åå æ§è¡çä¸ç³»åæä½ï¼è¿äºæä½ä½ä¸ºä¸ä¸ªæ´ä½ä¸èµ·åç³»ç»æ交ï¼è¦ä¹é½æ§è¡ãè¦ä¹é½ä¸æ§è¡ï¼äºå¡æ¯ä¸ç»ä¸å¯ååå²çæä½éåï¼å·¥ä½é»è¾åå ï¼ã
大è´æµç¨å½¢å¦
æ°æ®åºäºå¡æ¥æå 大ç¹æ§ï¼
äºå¡çå大ç¹æ§ï¼
äºå¡æ¯æ°æ®åºçé»è¾å·¥ä½åä½ï¼äºå¡ä¸å å«çåæä½è¦ä¹é½åï¼è¦ä¹é½ä¸å
äº å¡æ§è¡çç»æå¿ é¡»æ¯ä½¿æ°æ®åºä»ä¸ä¸ªä¸è´æ§ç¶æåå°å¦ä¸ä¸ªä¸è´æ§ç¶æãå æ¤å½æ°æ®åºåªå å«æåäºå¡æ交çç»ææ¶ï¼å°±è¯´æ°æ®åºå¤äºä¸è´æ§ç¶æãå¦ææ°æ®åºç³»ç» è¿è¡ä¸åçæ éï¼æäºäºå¡å°æªå®æ就被迫ä¸æï¼è¿äºæªå®æäºå¡å¯¹æ°æ®åºæåçä¿®æ¹æä¸é¨åå·²åå ¥ç©çæ°æ®åºï¼è¿æ¶æ°æ®åºå°±å¤äºä¸ç§ä¸æ£ç¡®çç¶æï¼æè è¯´æ¯ ä¸ä¸è´çç¶æã
ä¸ä¸ªäºå¡çæ§è¡ä¸è½å ¶å®äºå¡å¹²æ°ãå³ä¸ä¸ªäºå¡å é¨çæä½å使ç¨çæ°æ®å¯¹å ¶å®å¹¶åäºå¡æ¯é离çï¼å¹¶åæ§è¡çå个äºå¡ä¹é´ä¸è½äºç¸å¹²æ°ã
ä¹ç§°æ°¸ä¹ æ§ï¼æä¸ä¸ªäºå¡ä¸æ¦æ交ï¼å®å¯¹æ°æ®åºä¸çæ°æ®çæ¹åå°±åºè¯¥æ¯æ°¸ä¹ æ§çãæ¥ä¸æ¥çå ¶å®æä½ææ éä¸åºè¯¥å¯¹å ¶æ§è¡ç»ææä»»ä½å½±åã
个人ç解ï¼äºå¡å¨Springä¸æ¯åå©AOPææ¯æ¥å®ç°çï¼å¯ä»¥ä½ä¸ºAOPä¸çä¸ä¸ªäºå¡åé¢ãspringæºç 对äºå¡çå¤çé»è¾ï¼èªå·±ç 究å§ï¼
ORMæ¡æ¶ä¸ä»¥Mybatis为ä¾ï¼äºå¡å¤çå°±æ¯ç¨å°äºä¸ä¸ªç±»Transactionï¼é¨åæºç å¦ä¸
å¯ä»¥çåºTransaction管ççå°±æ¯ä¸ä¸ªconnectionï¼èconnectionæ们å¾æ¸ æ¥æ¯ä¸ç¨æ·ä¼è¯æé©çã
é£ä¹å ³ç³»å°±æ¯Transaction 管çConnection ï¼èconnectionä¸ ç¨æ·sessionä¸å¯¹ä¸åå¨ã
å¨springBootä¸ï¼åªéè¦å å ¥POMå°±å¯ä»¥äºï¼é å注解使ç¨å³å¯ã
æ¥ä¸æ¥å°±æ¯äºå¡çæ§å¶äºã
é¦å äºå¡æå å¤§ä¼ æå±æ§ï¼
å ¶ä¸æ常è§çï¼ç¨å¾æå¤å°± PROPAGATION_REQUIREDãPROPAGATION_REQUIRES_NEWã PROPAGATION_NESTED è¿ä¸ç§ãäºå¡çä¼ æå±æ§æ¯ spring ç¹æçï¼æ¯ spring ç¨æ¥æ§å¶æ¹æ³äºå¡çä¸ç§æ段ï¼è¯´ç´ç½ç¹å°±æ¯ç¨æ¥æ§å¶æ¹æ³æ¯å¦ä½¿ç¨åä¸äºå¡çä¸ç§å±æ§ï¼ä»¥åæç §ä»ä¹è§ååæ»çä¸ç§æ段ã
ä¸é¢ç¨ä»£ç æ¼ç¤ºè¿ä¸ç§å±æ§çæºå¶ï¼
äºå¡çé»è®¤å±æ§å°±æ¯requiredï¼éè¿Transactional.javaä¸çPropagation propagation() default Propagation.REQUIRED; å¯ä»¥çåºã
è¿ç§æ åµå°±æ¯äºå¡1ï¼äºå¡2 é½å å ¥å°äºäºå¡0ä¸ãä¸ç®¡æ¯1ï¼2åªä¸ªäºå¡æåºå¼å¸¸ï¼äºå¡0é½ä¼åæ»ãæ°æ®æ·»å ä¼å¤±è´¥ã
è¿ç§æ åµå°±æ¯ï¼
äºå¡0ï¼requiredï¼ {
äºå¡1 ï¼REQUIRES_NEWï¼
äºå¡2
}
æ¤æ¶ã
æ åµaï¼
1ãå¦æåªæ¯äºå¡2åºç°äºå¼å¸¸ï¼é£ä¹äºå¡1ä¼æ交ï¼äºå¡2å å ¥å°äºå¡0ä¸ä¼åæ»ã
2ãå¦æåªæ¯äºå¡1åºç°äºå¼å¸¸ï¼é£ä¹äºå¡1ä¼åæ»ï¼åä¸å±äºå¡0æå¼å¸¸ï¼äºå¡2ä¼å å ¥å°äºå¡0ä¸ï¼è¿æ¶é½ä¼åæ»ã
æ åµbï¼
å¦æäºå¡1ï¼äºå¡2é½æ¯REQUIRES_NEWä¼ æå±æ§ãé£ä¹ç»æå°±æ¯ï¼
1ãå¦æäºå¡1ï¼æåºäºå¼å¸¸ï¼é£ä¹äºå¡2æ¯ä¸ä¼æ§è¡çï¼é£ä¹äºå¡0å¿ ç¶åæ»ã
2ãå¦æäºå¡2ï¼æåºå¼å¸¸ï¼é£ä¹äºå¡1ä¼æ交ï¼è¡¨ä¸ä¼ææ°æ®ãäºå¡2æå¼å¸¸åæ»å¹¶æåºï¼äºå¡0åæ»ã
NESTEDå±æ§å ¶å®å°±æ¯å建äºåæ»ç¹ï¼æå¼å¸¸æ¶ï¼ä¼åæ»å°æå®çåæ»ç¹ã
å¨è¿éè¿ä»£ç æµè¯ï¼åºç°ä¸ç§æ åµæ¯ï¼æ 论äºå¡1ï¼äºå¡2åªä¸ªæå¼å¸¸ï¼æ°æ®é½ä¸ä¼æå ¥æåï¼åå æ¯ï¼ä¸è®ºæ¯äºå¡1è¿æ¯äºå¡2é½ä¼åäºå¡0æåºå¼å¸¸ï¼äºå¡0æè·å°å¼å¸¸åï¼æ§è¡rollback()æ¹æ³ï¼è¿å°±æä½æäºï¼äºå¡çå ¨é¨åæ»ã
å¦ææ³è¦äºå¡1åäºå¡2 æ³è¦æ ¹æ®èªå·±çåæ»ç¹åæ»ï¼é£ä¹äºå¡0å¿ é¡»èªå·±å¤çå¼å¸¸ï¼ä¸è®©springæè·å°è¿ä¸ªå¼å¸¸ï¼é£ä¹å°±æ»¡è¶³äºãæ代ç æ¹æè¿ç§ï¼
Jack大佬æä¾äºï¼ä¼ªä»£ç åææ³ã
æç §Springæºç çäºå¡å¤çé»è¾ï¼ä¼ªä»£ç 大è´ä¸ºï¼
@Lazy注解源码分析
@Lazy注解是Spring框架3.0版本后引入的,用于控制bean的源码源代懒加载行为,主要用途是框架框架延迟依赖注入的初始化。默认情况下,源码源代当ApplicationContext启动和刷新时,框架框架所有的源码源代任天堂html5源码单例bean会被立即初始化。然而,框架框架有时可能希望某些bean在首次使用时才被初始化。源码源代实现这一目标的框架框架方法是将@Lazy注解应用到bean或注入点,如@Autowired,源码源代以创建懒解析代理,框架框架从而实现延迟注入。源码源代
@Lazy注解对@Bean、框架框架@Component或@Bean定义的源码源代msgrcv源码bean的延迟初始化特别有用。当用在@Configuration类上时,框架框架它会影响该配置中的所有@Bean定义。通过在启动类入口使用AnnotationConfigApplicationContext并提供MyConfiguration组件类,从MyService bean获取并调用其show方法,可以观察到MyBean在首次被请求时才被初始化,而MyService的初始化则立即进行。MyBean类的构造函数在被调用时打印"MyBean的构造函数被调用了!",show方法则打印"hello world!"。MyService类通过@Autowired注入MyBean,由于在注入点上添加了@Lazy注解,myBean的实际注入被延迟,直到首次尝试访问它时。
源码分析表明,concurenthashmap源码在启动类构造函数中,执行了三个步骤以初始化实例。在refresh方法中,重点关注了finishBeanFactoryInitialization方法,该方法会对所有剩余非懒加载的单例bean对象进行初始化,除非它们显式标记为懒加载。在preInstantiateSingletons方法中,确保所有非懒加载的单例bean在容器启动时被初始化,除非它们被标记为懒加载。这使得@Lazy注解对于希望推迟bean初始化的场景非常有用。
在getBean()方法中,通过doGetBean方法执行了创建bean的过程。在doCreateBean方法中,源码 tree对bean的属性进行注入。在populateBean方法中,如果一个属性被标记为@Autowired,并且与@Lazy结合使用,那么实际的懒加载逻辑会在其他部分处理,特别是通过AutowiredAnnotationBeanPostProcessor。在resolveFieldValue方法中,解析@Autowired字段的值,并确定应为目标字段注入哪个bean。在resolveDependency方法中,如果依赖关系标记为懒加载,它将返回一个懒加载代理,只有在应用程序真正访问该依赖时,introspector源码实际的bean才会被初始化。
总结而言,@Lazy注解提供了在Spring容器中控制bean初始化的灵活性,允许开发者根据需要延迟依赖注入的初始化,从而优化应用性能和资源管理。在实践过程中,注意合理使用@Lazy注解,确保代码的清晰性和可维护性。同时,理解Spring容器在bean初始化过程中的工作原理,可以帮助开发者更有效地利用该框架的特性,实现更高效的应用开发。
6. Spring源码篇之FactoryBean
FactoryBean是Spring提供的一个功能强大的小型工厂,用于灵活创建所需Bean。在框架与Spring整合时,尤其是Mybatis-plus中,通过注解可以自动生成Spring Bean,而FactoryBean的功能正是实现批量动态生成Bean。下面详细介绍FactoryBean的源码解析。
首先,我们来看看如何判断一个对象是否为FactoryBean。在Spring的实例化过程中,如果类实现了FactoryBean接口,则会被识别为FactoryBean。而获取FactoryBean时,通常在Bean名称前加上"&"符号。
接下来,我们深入分析FactoryBean的接口。
FactoryBean接口定义了如何创建Bean,包含两个主要方法:getObject和isInstance。getObject用于返回创建的Bean实例,isInstance用于判断一个对象是否由FactoryBean创建。
SmartFactoryBean是FactoryBean的子接口,它提供了额外的特性,允许决定是否提前实例化对象。
在实际使用中,FactoryBean的实例化过程较为关键。如果不希望立即实例化某个非懒加载单例Bean,则需要确保它未被识别为FactoryBean。例如,UserBean的实例化代码在正常情况下不会打印任何输出,表明并未实例化。而通过将UserBean实现为SmartFactoryBean,并使isEagerInit返回true,就能在控制台中观察到UserBean的实例化过程。
获取FactoryBean创建的Bean有多种方式。通过在Bean名称前加"&",可以获取到由getObject方法生成的Bean。此外,若需要获取FactoryBean本身,则可以使用多个"&"符号,Spring会循环遍历,直至获取到实际的Bean。
在Spring实例化完成后,通常会调用getObjectForBeanInstance方法来获取真正的Bean实例。这一过程包括了共享实例(sharedInstance)的引用和Bean名称的处理。最终,通过调用getObject方法,我们能够获取到由FactoryBean生成的实际Bean。
以Mybatis-plus中的MapperFactoryBean为例,说明了如何在实际项目中应用FactoryBean。MapperFactoryBean是Mybatis-plus提供的一个FactoryBean,用于自动注册Mapper接口为Spring Bean。
总结而言,FactoryBean在Spring中扮演着灵活创建和管理Bean的重要角色,尤其在需要动态生成或自定义Bean创建逻辑的场景中。通过理解其源码和使用方法,开发者可以更高效地整合各类框架与Spring,实现更为灵活和高效的系统构建。
å¦ä½ä½¿ç¨NetBeans IDEå建ç®åçWebåºç¨ç¨åº
ãå¨æ§è¡ Web & Java EE å®è£ æ¶ï¼æ¨å¯ä»¥éæ©å®è£ GlassFish 2.1 åºç¨æå¡å¨å 6.0.x çæ¬ç Apache Tomcat Servlet 容å¨ãå¿ é¡»å®è£ å ¶ä¸ä¸ä¸ªæè½å¦å®æ¬æç¨ã
ããè¦å©ç¨ NetBeans IDE ç Java EE 5 åè½ï¼è¯·ä½¿ç¨å®å ¨ç¬¦å Java EE 5 è§èçåºç¨æå¡å¨ï¼ä¾å¦ GlassFish 2.1 UR2 åºç¨æå¡å¨ãå¦æ使ç¨çæ¯å ¶ä»æå¡å¨ï¼è¯·æ¥é åè¡è¯´æå常è§é®é¢è§£çï¼äºè§£å·²ç¥é®é¢å解å³æ¹æ³ãæå ³æ¯æçæå¡å¨å Java EE å¹³å°ç详ç»ä¿¡æ¯ï¼è¯·åè§åè¡è¯´æã
ããå¦æéè¦å°é¡¹ç®ä¸å·¥ä½è§£å³æ¹æ¡è¿è¡æ¯è¾ï¼å¯ä»¥ä¸è½½æ ·ä¾åºç¨ç¨åºã
ãã设置 Web åºç¨ç¨åºé¡¹ç®
ããä»ä¸»èåä¸éæ©âæ件â>âæ°å»ºé¡¹ç®â(Ctrl-Shift-N)ãå¨âç±»å«âä¸ï¼éæ©âJava Webâãå¨â项ç®âä¸éæ©âWeb åºç¨ç¨åºâï¼ç¶ååå»âä¸ä¸æ¥âã
ããå¨æ¥éª¤ 2 ä¸ï¼å¨â项ç®å称âææ¬æ¡ä¸è¾å ¥ HelloWebã
ããå°â项ç®ä½ç½®âæå®ä¸ºè®¡ç®æºä¸çä»»æç®å½ãå¨æ¬æç¨ä¸ï¼å°æ¤ç®å½ç§°ä¸º $PROJECTHOMEã
ããï¼å¯éï¼éä¸â使ç¨ä¸ç¨æ件夹åå¨åºâå¤éæ¡ï¼å¹¶æå®åºæ件夹çä½ç½®ãæå ³æ¤é项ç详ç»ä¿¡æ¯ï¼è¯·åè§å ±äº«é¡¹ç®åºã
ããåå»âä¸ä¸æ¥âãâæå¡å¨å设置âé¢æ¿æå¼ãéæ©è¦ä¸åºç¨ç¨åºä¸èµ·ä½¿ç¨ç Java EE çæ¬ã
ããéæ©è¦å¨å ¶ä¸é¨ç½²åºç¨ç¨åºçæå¡å¨ãè¿éä» ååºäºå·²å¨ IDE ä¸æ³¨åçæå¡å¨ã请注æï¼æå¡å¨ä¸çä¸ä¸æè·¯å¾å°å为 /HelloWebï¼åºäºæ¨å¨ä¸ä¸æ¥ä¸ä¸ºé¡¹ç®æå®çå称ï¼ã
ããåå»âä¸ä¸æ¥âãå¨âæ¡æ¶âé¢æ¿ä¸ï¼åå»âå®æâ以å建项ç®ã
ããIDE å°å建 $PROJECTHOME/HelloWeb 项ç®æ件夹ãæ¤é¡¹ç®æ件夹å å«æææºä»£ç åé¡¹ç® meta æ°æ®ï¼ä¾å¦é¡¹ç®ç Ant çæèæ¬ãå¨ IDE ä¸ï¼å°æå¼ HelloWeb 项ç®ãå¨ä¸»çªå£çæºä»£ç ç¼è¾å¨ä¸ï¼å°æå¼æ¬¢è¿é¡µ index.jspãæ¨å¯ä»¥å¨âæ件âçªå£ (Ctrl-2) ä¸æ¥ç项ç®çæ件ç»æï¼å¨â项ç®âçªå£ (Ctrl-1) ä¸æ¥çå ¶é»è¾ç»æã
ããå建并ç¼è¾ Web åºç¨ç¨åºæºæ件
ããå建并ç¼è¾æºæä»¶æ¯ IDE ææä¾çæéè¦çåè½ãæ¯ç«ï¼è¿å¤§æ¦æ¯æ¨è±è´¹æ¶é´æå¤çå·¥ä½ãIDE æä¾äºåç§å·¥å ·æ¥è¿åä»»ä½å¼åè ç个人é£æ ¼ï¼æ 论æ¨æ¯æ¿ææå¨ç¼åææ代ç ï¼è¿æ¯å¸æ IDE 为æ¨çæ大é代ç ã
ããå建 Java å å Java æºæ件
ããå¨â项ç®âçªå£ä¸ï¼å±å¼âæºå âèç¹ã请注æï¼âæºå âèç¹ä» å å«ä¸ä¸ªç©ºç缺çå èç¹ã
ããå³é®åå»âæºå âèç¹ï¼ç¶åéæ©âæ°å»ºâ>âJava ç±»âãå¨âç±»åâææ¬æ¡ä¸è¾å ¥ NameHandlerï¼å¹¶å¨âå âç»åæ¡ä¸é®å ¥ org.mypackage.helloãåå»âå®æâã请注æï¼å°å¨æºä»£ç ç¼è¾å¨ä¸æå¼æ°ç NameHandler.java æ件ã
ããå¨æºä»£ç ç¼è¾å¨ä¸ï¼éè¿å¨ç´§é 类声æçä¸æ¹é®å ¥ä»¥ä¸ä»£ç è¡æ¥å£°æä¸ä¸ª String åéã String name;
ããå°ä»¥ä¸æé å½æ°æ·»å å°ç±»ä¸ï¼ public NameHandler()
ããå¨ NameHandler() æé å½æ°ä¸æ·»å 以ä¸ä»£ç è¡ï¼ name = null;
ããçæ getter å setter æ¹æ³
ããå¨æºä»£ç ç¼è¾å¨ä¸å³é®åå» name å段ï¼ç¶åéæ©âéæâ>âå°è£ å段âãå°æå¼âå°è£ å段â对è¯æ¡ï¼å ¶ä¸ååº name å段ã请注æï¼ç¼ºçæ åµä¸å°âå段çå¯è§æ§â设置为 "private"ï¼å°âååæ¹æ³çå¯è§æ§â设置为 "public"ï¼è¿è¡¨ç¤ºç±»åé声æç访é®ä¿®é¥°ç¬¦å°è¢«æå®ä¸º privateï¼è getter å setter æ¹æ³å°åå«ä»¥ public å private 修饰符çæã
ããåå»âéæâãå°ä¸º name å段çæ getter å setter æ¹æ³ãç±»åéç修饰符å°è¢«è®¾ç½®ä¸º privateï¼è getter å setter æ¹æ³å°ä»¥ public 修饰符çæã
ããç¼è¾ç¼ºçç JavaServer Pages æ件
ããéè¿åå»å¨æºä»£ç ç¼è¾å¨é¡¶é¨æ¾ç¤ºç "index.jsp" æ件æ ç¾ä»¥éæ°éä¸è¯¥æ件ã
ããå¨ä½äºæºä»£ç ç¼è¾å¨å³ä¾§çç»ä»¶é¢æ¿ (Ctrl-Shift-8) ä¸ï¼å±å¼âHTML 表åâï¼ç¶åå°ä¸ä¸ªè¡¨å项æè³æºä»£ç ç¼è¾å¨ä¸
ããæ è®°åçæ个ä½ç½®ã
ããå°æ¾ç¤ºâæå ¥è¡¨åâ对è¯æ¡ã
ãã请æå®ä»¥ä¸å¼ï¼
ããæä½ï¼response.jsp
ããæ¹æ³ï¼GET
ããå称ï¼Name Input Form
ããåå»âç¡®å®âãå°å¨ index.jsp æ件ä¸æ·»å ä¸ä¸ª HTML 表åã
ããå°ä¸ä¸ªææ¬è¾å ¥é¡¹æè³ç´§é æ è®°åé¢çä½ç½®ï¼ç¶åæå®ä»¥ä¸å¼ï¼
ããå称ï¼name
ããç±»åï¼ææ¬
ããåå»âç¡®å®âãå°å¨ æ è®°ä¹é´æ·»å ä¸ä¸ª HTML æ è®°ã
ããå°ä¸ä¸ªæé®é¡¹æè³ç´§é æ è®°åé¢çä½ç½®ã请æå®ä»¥ä¸å¼ï¼
ããæ ç¾ï¼OK
ããç±»åï¼æ交
ããåå»âç¡®å®âãå°å¨ æ è®°ä¹é´æ·»å ä¸ä¸ª HTML æé®ã
ããå¨ç´§é 第ä¸ä¸ª æ è®°åé¢çä½ç½®é®å ¥ Enter your name:ï¼ç¶åå°
ããæ è®°ä¹é´ç缺ç Hello World! ææ¬æ´æ¹ä¸º Entry Formã
ããå建 JavaServer Pages æ件
ããå¨â项ç®âçªå£ä¸ï¼å³é®åå» "HelloWeb" 项ç®èç¹ï¼ç¶åéæ©âæ°å»ºâ> "JSP"ãå°æå¼âæ°å»º JSP æ件âå导ãå°æ件å½å为 responseï¼ç¶ååå»âå®æâã请注æï¼å¨â项ç®âçªå£ä¸ç "index.jsp" ä¸æ¹å°æ¾ç¤º "response.jsp" æ件èç¹ï¼å¹¶ä¸ä¼å¨æºä»£ç ç¼è¾å¨ä¸æå¼æ°æ件ã
ããå¨ä½äºæºä»£ç ç¼è¾å¨å³ä¾§çç»ä»¶é¢æ¿ä¸ï¼å±å¼ "JSP"ï¼ç¶åå°ä¸ä¸ªä½¿ç¨ Bean 项æè³æºä»£ç ç¼è¾å¨ä¸ç´§é æ è®°ä¸æ¹çä½ç½®ãå°æå¼âæå ¥ä½¿ç¨ Beanâ对è¯æ¡ãæå®ä¸å¾ä¸æ¾ç¤ºçå¼ã
ããIDï¼mybean
ããç±»ï¼org.mypackage.hello.NameHandler
ããèå´ï¼session
ããåå»âç¡®å®âã请注æï¼å°å¨ æ è®°çä¸æ¹æ·»å æ è®°ã
ããå°ä¸ä¸ªè®¾ç½® Bean å±æ§é¡¹ä»ç»ä»¶é¢æ¿æè³ç´§é <h1> æ è®°åé¢çä½ç½®ï¼ç¶ååå»âç¡®å®âãå¨åºç°ç æ è®°ä¸ï¼å é¤ç©ºç value å±æ§ï¼ç¶åå°å ¶ç¼è¾ä¸ºä»¥ä¸ä»£ç ãå¦æ IDE åå»ºäº value = "" å±æ§ï¼è¯·å°å ¶å é¤ï¼å¦åï¼å®ä¼è¦çä¼ éå° index.jsp ä¸ç name çå¼ã
ããæ£å¦ ææ¡£ä¸æè¿°ï¼å¯ä»¥éè¿åç§æ¹æ³æ¥è®¾ç½®å±æ§å¼ãå¨æ¬ä¾ä¸ï¼index.jsp 页ä¸çç¨æ·è¾å ¥å°æä¸ºä¼ éè³ request 对象çå称/å¼å¯¹ãå½ä½¿ç¨ æ 记设置å±æ§æ¶ï¼å¯ä»¥æ ¹æ® request 对象ä¸å å«çå±æ§å称æ¥æå®å¼ãå æ¤ï¼éè¿å° property 设置为 nameï¼å¯ä»¥æ£ç´¢ç±ç¨æ·è¾å ¥ææå®çå¼ã
ããæ´æ¹ <h1> æ è®°ä¹é´çææ¬ï¼ä»¥ä½¿å ¶å¦ä¸æç¤ºï¼ <h1>Hello, !
ããå°ä¸ä¸ªè·å Bean å±æ§é¡¹ä»ç»ä»¶é¢æ¿ææ¾å°
ããæ è®°ä¹é´çéå·åé¢ãå¨âæå ¥è·å Bean å±æ§â对è¯æ¡ä¸æå®ä»¥ä¸å¼ï¼
ããBean å称ï¼mybean
ããå±æ§å称ï¼name
ããåå»âç¡®å®âã请注æï¼æ¤æ¶å°å¨ <h1> æ è®°ä¹é´æ·»å <jsp:getProperty> æ è®°ã