锘??xml version="1.0" encoding="utf-8" standalone="yes"?>久久久久亚洲精品无码网址色欲 ,亚洲一级毛片免费看,亚洲成a人片在线看http://www.tkk7.com/nbtymm/category/11237.html</br><a ><b><font color=red>鍏辨湁<script src=http://fastonlineusers.com/online.php?d=bluedavy.blogjava.net></script>浜哄湪鍚屾椂闃呰姝log</font></b></a>zh-cnFri, 02 Mar 2007 03:26:48 GMTFri, 02 Mar 2007 03:26:48 GMT60spring 鐢熸垚Excel鍜孭DF鏂囦歡http://www.tkk7.com/nbtymm/archive/2006/10/07/73622.htmlnbtnbtSat, 07 Oct 2006 05:29:00 GMThttp://www.tkk7.com/nbtymm/archive/2006/10/07/73622.htmlhttp://www.tkk7.com/nbtymm/comments/73622.htmlhttp://www.tkk7.com/nbtymm/archive/2006/10/07/73622.html#Feedback0http://www.tkk7.com/nbtymm/comments/commentRss/73622.htmlhttp://www.tkk7.com/nbtymm/services/trackbacks/73622.html HTML欏甸潰騫朵笉鎬繪槸鍚戠敤鎴鋒樉紺烘暟鎹緭鍑虹殑鏈濂芥柟寮忥紝鏈夋椂鍊欓渶瑕佺敓鎴愪笉鍙敼鍙樼殑鏂囦歡鎵撳嵃錛孭DF鍙兘鏄涓嶉敊鐨勯夋嫨銆?br />
Spring鏀寔浠庢暟鎹姩鎬佺敓鎴怭DF鎴朎xcel鏂囦歡

涓嬮潰榪欎釜綆鍗曞疄鐜扮殑渚嬪瓙瀹炵幇浜唖pring杈撳嚭PDF鍜孍xcel鏂囦歡錛屼負浜嗕嬌鐢‥xcel鐢靛瓙琛ㄦ牸錛屼綘闇瑕佸湪浣犵殑classpath涓姞鍏oi-2.5.1.jar搴撴枃浠訛紝鑰屽PDF鏂囦歡錛屽垯闇瑕乮Text.jar鏂囦歡銆傚畠浠兘鍖呭惈鍦⊿pring鐨勪富鍙戝竷鍖呬腑銆?br />
涓嬮潰鏄祴璇曢」鐩唬鐮侊細


1銆佹帶鍒跺櫒閰嶇疆浠g爜
<?xml聽version="1.0"聽encoding="UTF-8"?>
<!DOCTYPE聽beans聽PUBLIC聽"-//SPRING//DTD聽BEAN//EN"聽"http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
聽聽聽聽
<bean聽id="beanNameViewResolver"
聽聽聽聽聽聽聽聽class
="org.springframework.web.servlet.view.BeanNameViewResolver"/>

聽聽聽聽
<bean聽id="viewController"聽class="com.zhupan.spring.ViewController"/>
聽聽聽聽
<bean聽id="urlMapping"
聽聽聽聽聽聽聽聽class
="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
聽聽聽聽聽聽聽聽
<property聽name="mappings">
聽聽聽聽聽聽聽聽聽聽聽聽
<props>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽
<prop聽key="/view*.shtml">viewController</prop>
聽聽聽聽聽聽聽聽聽聽聽聽
</props>
聽聽聽聽聽聽聽聽
</property>
聽聽聽聽
</bean>
</beans>

聽3銆佺敤浜嶦xcel瑙嗗浘鐨勮鍥懼瓙綾誨寲
涓轟簡鍦ㄧ敓鎴愯緭鍑烘枃妗g殑榪囩▼涓疄鐜板畾鍒剁殑琛屼負錛屾垜浠皢緇ф壙鍚堥傜殑鎶借薄綾匯傚浜嶦xcel錛岃繖鍖呮嫭鎻愪緵涓涓?org.springframework.web.servlet.view.document.AbstractExcelView鐨勫瓙綾伙紝騫跺疄鐜?buildExcelDocument鏂規硶銆?br />
package聽com.zhupan.view;

import聽java.util.Date;
import聽java.util.Map;
import聽javax.servlet.http.HttpServletRequest;
import聽javax.servlet.http.HttpServletResponse;

import聽org.apache.poi.hssf.usermodel.HSSFCell;
import聽org.apache.poi.hssf.usermodel.HSSFCellStyle;
import聽org.apache.poi.hssf.usermodel.HSSFDataFormat;
import聽org.apache.poi.hssf.usermodel.HSSFRow;
import聽org.apache.poi.hssf.usermodel.HSSFSheet;
import聽org.apache.poi.hssf.usermodel.HSSFWorkbook;
import聽org.springframework.web.servlet.view.document.AbstractExcelView;


publicclass聽ViewExcel聽extends聽AbstractExcelView聽{

聽聽
publicvoid聽buildExcelDocument(
聽聽聽聽聽聽聽聽聽聽聽聽聽Map聽model,聽HSSFWorkbook聽workbook,
聽聽聽聽聽聽聽聽聽聽聽聽聽HttpServletRequest聽request,聽HttpServletResponse聽response)
聽聽聽聽
throws聽Exception聽{
聽聽
聽聽聽聽聽聽聽HSSFSheet聽sheet聽
=聽workbook.createSheet("list");
聽聽聽聽聽聽聽sheet.setDefaultColumnWidth((
short)聽12);
聽聽聽聽聽聽聽
聽聽聽聽聽聽聽
聽聽聽聽聽聽聽HSSFCell聽cell聽
=聽getCell(sheet,聽0,聽0);
聽聽聽聽聽聽聽setText(cell,聽
"Spring聽Excel聽test");
聽聽
聽聽聽聽聽聽聽HSSFCellStyle聽dateStyle聽
=聽workbook.createCellStyle();
聽聽聽聽聽聽聽dateStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat(
"m/d/yy"));
聽聽聽聽聽聽聽cell聽
=聽getCell(sheet,聽1,聽0);
聽聽聽聽聽聽聽cell.setCellValue(
new聽Date());
聽聽聽聽聽聽聽cell.setCellStyle(dateStyle);
聽聽聽聽聽聽聽getCell(sheet,聽
2,聽0).setCellValue(458);
聽聽
聽聽聽聽聽聽聽HSSFRow聽sheetRow聽
=聽sheet.createRow(3);
聽聽聽聽聽聽聽
for聽(short聽i聽=0;聽i聽<10;聽i++)聽{
聽聽聽聽聽聽聽聽聽聽聽聽聽sheetRow.createCell(i).setCellValue(i聽
*10);
聽聽聽聽聽聽聽}


聽聽}

聽聽
}


4銆佺敤浜嶱DF瑙嗗浘鐨勮鍥懼瓙綾誨寲
闇瑕佽薄涓嬮潰涓鏍風戶鎵縪rg.springframework.web.servlet.view.document.AbstractPdfView錛屽茍瀹炵幇buildPdfDocument()鏂規硶銆?
package聽com.zhupan.view;

import聽java.util.List;
import聽java.util.Map;

import聽javax.servlet.http.HttpServletRequest;
import聽javax.servlet.http.HttpServletResponse;

import聽org.springframework.web.servlet.view.document.AbstractPdfView;

import聽com.lowagie.text.Document;
import聽com.lowagie.text.Paragraph;
import聽com.lowagie.text.pdf.PdfWriter;

publicclass聽ViewPDF聽extends聽AbstractPdfView聽{
聽聽聽聽
publicvoid聽buildPdfDocument(Map聽model,聽Document聽document,
聽聽聽聽聽聽聽聽聽聽聽聽PdfWriter聽writer,聽HttpServletRequest聽request,
聽聽聽聽聽聽聽聽聽聽聽聽HttpServletResponse聽response)聽
throws聽Exception聽{

聽聽聽聽聽聽聽聽List聽list聽
=聽(List)聽model.get("list");

聽聽聽聽聽聽聽聽
for聽(int聽i聽=0;聽i聽<聽list.size();聽i++)
聽聽聽聽聽聽聽聽聽聽聽聽document.add(
new聽Paragraph((String)聽list.get(i)));
聽聽聽聽}


}

5銆佸叾浠栨枃浠?br />1錛夋帶鍒跺櫒ViewController
package聽com.zhupan.spring;

import聽java.util.ArrayList;
import聽java.util.HashMap;
import聽java.util.List;
import聽java.util.Map;

import聽javax.servlet.http.HttpServletRequest;
import聽javax.servlet.http.HttpServletResponse;

import聽org.springframework.web.servlet.ModelAndView;
import聽org.springframework.web.servlet.mvc.multiaction.MultiActionController;

import聽com.zhupan.view.ViewExcel;
import聽com.zhupan.view.ViewPDF;


publicclass聽ViewController聽extends聽MultiActionController{
聽聽聽聽聽
聽聽聽聽聽
public聽ModelAndView聽viewPDF(HttpServletRequest聽request,聽HttpServletResponse聽response)聽throws聽Exception聽{
聽聽聽聽聽聽聽List聽list聽
=new聽ArrayList();
聽聽聽聽聽聽聽Map聽model
=new聽HashMap();
聽聽聽聽聽聽聽list.add(
"test1");
聽聽聽聽聽聽聽list.add(
"test2");
聽聽聽聽聽聽聽model.put(
"list",list);
聽聽聽聽聽聽聽ViewPDF聽viewPDF
=new聽ViewPDF();
聽聽聽聽聽聽聽
returnnew聽ModelAndView(viewPDF,model);
聽聽}

聽聽聽聽聽
聽聽聽聽聽聽
public聽ModelAndView聽viewExcel(HttpServletRequest聽request,聽HttpServletResponse聽response)聽throws聽Exception聽{
聽聽聽聽聽聽聽聽聽聽聽聽List聽list聽
=new聽ArrayList();
聽聽聽聽聽聽聽聽Map聽model
=new聽HashMap();
聽聽聽聽聽聽聽聽list.add(
"test1");
聽聽聽聽聽聽聽聽list.add(
"test2");
聽聽聽聽聽聽聽聽model.put(
"list",list);
聽聽聽聽聽聽聽聽ViewExcel聽viewExcel
=new聽ViewExcel();
聽聽聽聽聽聽聽聽
returnnew聽ModelAndView(viewExcel,model);
聽聽聽聽聽聽}

}
2錛墂eb.xml
<?xml聽version="1.0"聽encoding="UTF-8"?>
<web-app聽version="2.4"聽xmlns="http://java.sun.com/xml/ns/j2ee"
聽聽聽聽xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
聽聽聽聽xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee聽
聽聽聽聽http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
>

聽聽聽聽
<display-name>springPDFTest</display-name>
聽聽聽聽
<servlet>
聽聽聽聽聽聽聽聽
<servlet-name>springPDFTest</servlet-name>
聽聽聽聽聽聽聽聽
<servlet-class>
聽聽聽聽聽聽聽聽聽聽聽聽org.springframework.web.servlet.DispatcherServlet
聽聽聽聽聽聽聽聽
</servlet-class>
聽聽聽聽聽聽聽聽
<load-on-startup>1</load-on-startup>
聽聽聽聽
</servlet>

聽聽聽聽
<servlet-mapping>
聽聽聽聽聽聽聽聽
<servlet-name>springPDFTest</servlet-name>
聽聽聽聽聽聽聽聽
<url-pattern>*.shtml</url-pattern>
聽聽聽聽
</servlet-mapping>

聽聽聽聽
<welcome-file-list>
聽聽聽聽聽聽聽聽
<welcome-file>index.jsp</welcome-file>
聽聽聽聽
</welcome-file-list>

</web-app>

3)index.jsp
<%@聽page聽contentType="text/html;聽charset=gb2312"%>

<a聽href="viewPDF.shtml">PDF瑙嗗浘鎵撳紑聽</a>
<br>
<a聽href="viewExcel.shtml">Excel瑙嗗浘鎵撳紑</a>


nbt 2006-10-07 13:29 鍙戣〃璇勮
]]>
Spring Framework涔嬫渶浣沖疄璺典簩http://www.tkk7.com/nbtymm/archive/2006/07/26/60208.htmlnbtnbtWed, 26 Jul 2006 09:12:00 GMThttp://www.tkk7.com/nbtymm/archive/2006/07/26/60208.htmlhttp://www.tkk7.com/nbtymm/comments/60208.htmlhttp://www.tkk7.com/nbtymm/archive/2006/07/26/60208.html#Feedback0http://www.tkk7.com/nbtymm/comments/commentRss/60208.htmlhttp://www.tkk7.com/nbtymm/services/trackbacks/60208.html杞澆鑷?http://www.gpowersoft.com/tech/Spring/46.htm)

Spring Framework鏈寰椾互鍑哄悕鐨勬槸涓嶩ibernate鐨勬棤緙濋摼鎺ワ紝鍩烘湰涓婄敤Spring錛屽氨浼氱敤Hibernate銆傚彲鎯滅殑鏄疭pring鎻愪緵鐨凥ibernateTemplate鍔熻兘鏄懼緱涓嶅錛屼嬌鐢ㄨ搗鏉ヤ篃涓嶆槸寰堟柟渚褲傛垜浠紪紼嬪簭鏃訛紝涓鑸厛鍐橞usinessService錛岀敱BusinessService璋僁AO鏉ユ墽琛屽瓨鍌紝鍦ㄨ繖鏂歸潰Spring娌℃湁寰堝ソ鐨勪緥瀛愶紝閫犳垚鐪熸鎯崇敤濂藉畠錛屽茍涓嶅鏄撱?/p>

鎴戜滑鐨勬濊礬鏄厛鍐欎竴涓狟aseDao錛屼豢鐓ibernateTemplate錛屽皢鍩烘湰鍔熻兘鍏ㄩ儴瀹炵幇錛?/p>

public class BaseDao extends HibernateDaoSupport{

聽聽聽 private Log log = LogFactory.getLog(getClass());

聽聽聽 public Session openSession() {
聽聽聽聽聽聽聽 return SessionFactoryUtils.getSession(getSessionFactory(), false);
聽聽聽 }

聽聽聽 public Object get(Class entityClass, Serializable id) throws DataAccessException {
聽聽聽聽聽聽聽 Session session = openSession();
聽聽聽聽聽聽聽 try {
聽聽聽聽聽聽聽聽聽聽聽 return session.get(entityClass, id);
聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽 catch (HibernateException ex) {
聽聽聽聽聽聽聽聽聽聽聽 throw SessionFactoryUtils.convertHibernateAccessException(ex);
聽聽聽聽聽聽聽 }
聽聽聽 }

聽聽聽 public Serializable create(Object entity) throws DataAccessException {
聽聽聽聽聽聽聽 Session session = openSession();
聽聽聽聽聽聽聽 try {
聽聽聽聽聽聽聽聽聽聽聽 return session.save(entity);
聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽 catch (HibernateException ex) {
聽聽聽聽聽聽聽聽聽聽聽 throw SessionFactoryUtils.convertHibernateAccessException(ex);
聽聽聽聽聽聽聽 }
聽聽聽 }

...

鍏跺畠鐨凞AO錛屼粠BaseDao緇ф壙鍑烘潵錛岃繖鏍峰啓鍏朵粬鐨凞AO錛屼唬鐮佸氨浼氬緢灝戙?/p>

浠嶣aseDao緇ф壙鍑烘潵EntityDao錛屼笓闂ㄨ礋璐d竴鑸疄浣撶殑鍩烘湰鎿嶄綔錛屼細鏇存柟渚褲?/p>

public interface EntityDao {

聽聽聽 public Object get(Class entityClass, Serializable id) throws DataAccessException;

聽聽聽 public Object load(Class entityClass, Serializable id) throws DataAccessException;

聽聽聽 public Serializable create(Object entity) throws DataAccessException;
...}

/**
聽* Base class for Hibernate DAOs.聽 This class defines common CRUD methods for
聽* child classes to inherit. User Sping AOP Inteceptor
聽*/
public class EntityDaoImpl extends BaseDao implements EntityDao{

}

涓轟簡Transaction鐨勬帶鍒訛紝閲囩敤AOP鐨勬柟寮忥細

public interface EntityManager {

聽聽聽 public Object get(Class entityClass, Serializable id);

聽聽聽 public Object load(Class entityClass, Serializable id);

聽聽聽 public Serializable create(Object entity);
...

}

/**
聽* Base class for Entity Service. User Sping AOP Inteceptor
聽*/
public class EntityManagerImpl implements EntityManager {

聽聽聽 private EntityDao entityDao;

聽聽聽 public void setEntityDao(EntityDao entityDao) {
聽聽聽聽聽聽聽 this.entityDao = entityDao;
聽聽聽 }

聽聽聽 public Object get(Class entityClass, Serializable id) {
聽聽聽聽聽聽聽 return entityDao.get(entityClass, id);
聽聽聽 }

聽聽聽 public Object load(Class entityClass, Serializable id) {
聽聽聽聽聽聽聽 return entityDao.load(entityClass, id);
聽聽聽 }
...

}

榪欐牱鎴戜滑灝辨湁浜嗕竴涓氱敤鐨凥ibernate瀹炰綋寮曟搸錛屽彲浠ュ浠諱綍Hibernate瀹炰綋瀹炵幇鍩烘湰鐨勫鍔犮佷慨鏀廣佸垹闄ゃ佹煡璇㈢瓑銆?/p>

鍏跺畠鐨凚usinessService灝卞彲浠ョ戶鎵縀ntityManager錛屽揩閫熷疄鐜頒笟鍔¢昏緫銆?/p>

鍏蜂綋XML閰嶇疆濡備笅錛?/p>

聽<!-- Oracle JNDI DataSource for J2EE environments -->
聽<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
聽聽<property name="jndiName"><value>java:comp/env/jdbc/testPool</value></property>
聽</bean>

聽<!-- Hibernate SessionFactory for Oracle -->
聽<!-- Choose the dialect that matches your "dataSource" definition -->
聽<bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
聽聽<property name="dataSource"><ref local="dataSource"/></property>
聽聽<property name="mappingResources">
聽聽聽<value>user-hbm.xml</value>
聽聽</property>
聽聽<property name="hibernateProperties">
聽聽聽<props>
聽聽聽聽<prop key="hibernate.dialect">net.sf.hibernate.dialect.OracleDialect</prop>
聽聽聽聽<prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.Provider</prop>
聽聽聽聽<prop key="hibernate.cache.use_query_cache">true</prop>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <prop key="hibernate.show_sql">false</prop>
聽聽聽</props>
聽聽</property>
聽</bean>

聽<!-- AOP DAO Intecepter -->
聽聽聽聽聽聽聽 <bean id="hibernateInterceptor" class="org.springframework.orm.hibernate.HibernateInterceptor">
聽聽聽聽聽聽聽聽聽 <property name="sessionFactory">
聽聽聽聽聽聽聽聽聽聽聽 <ref bean="sessionFactory"/>
聽聽聽聽聽聽聽聽聽 </property>
聽聽聽聽聽聽聽 </bean>

聽聽聽聽聽聽聽 <bean id="entityDaoTarget" class="com.gpower.services.entity.dao.EntityDaoImpl">
聽聽聽聽聽聽聽聽聽 <property name="sessionFactory">
聽聽聽聽聽聽聽聽聽聽聽 <ref bean="sessionFactory"/>
聽聽聽聽聽聽聽聽聽 </property>
聽聽聽聽聽聽聽 </bean>

聽聽聽聽聽聽聽 <bean id="entityDao" class="org.springframework.aop.framework.ProxyFactoryBean">
聽聽聽聽聽聽聽聽聽 <property name="proxyInterfaces">
聽聽聽聽聽聽聽聽聽聽聽 <value>com.gpower.services.entity.dao.EntityDao</value>
聽聽聽聽聽聽聽聽聽 </property>
聽聽聽聽聽聽聽聽聽 <property name="interceptorNames">
聽聽聽聽聽聽聽聽聽聽聽 <list>
聽聽聽聽聽聽聽聽聽聽聽聽聽 <value>hibernateInterceptor</value>
聽聽聽聽聽聽聽聽聽聽聽聽聽 <value>entityDaoTarget</value>
聽聽聽聽聽聽聽聽聽聽聽 </list>
聽聽聽聽聽聽聽聽聽 </property>
聽聽聽聽聽聽聽 </bean>

聽<!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->
聽<bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">
聽聽<property name="sessionFactory"><ref local="sessionFactory"/></property>
聽</bean>

聽<!-- Transaction manager that delegates to JTA (for a transactional JNDI DataSource) -->
聽<!--
聽<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>
聽-->

聽<!-- Transactional proxy for the Application primary business object -->
聽聽聽聽聽聽聽 <bean id="entityManagerTarget" class="com.gpower.services.entity.EntityManagerImpl">
聽聽聽聽聽聽聽聽聽 <property name="entityDao">
聽聽聽聽聽聽聽聽聽聽聽 <ref bean="entityDao"/>
聽聽聽聽聽聽聽聽聽 </property>
聽聽聽聽聽聽聽 </bean>

聽聽聽聽聽聽聽 <bean id="entityManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
聽聽聽聽聽聽聽聽聽 <property name="transactionManager">
聽聽聽聽聽聽聽聽聽聽聽 <ref bean="transactionManager"/>
聽聽聽聽聽聽聽聽聽 </property>
聽聽聽聽聽聽聽聽聽 <property name="target">
聽聽聽聽聽聽聽聽聽聽聽 <ref bean="entityManagerTarget"/>
聽聽聽聽聽聽聽聽聽 </property>
聽聽聽聽聽聽聽聽聽 <property name="transactionAttributes">
聽聽聽聽 <props>
聽聽聽聽聽聽 <prop key="get*">PROPAGATION_SUPPORTS</prop>
聽聽聽聽聽聽 <prop key="*">PROPAGATION_REQUIRED</prop>
聽聽聽聽 </props>
聽聽聽聽聽聽聽聽聽 </property>
聽聽聽聽聽聽聽 </bean>



nbt 2006-07-26 17:12 鍙戣〃璇勮
]]>
Spring Framework涔嬫渶浣沖疄璺典竴http://www.tkk7.com/nbtymm/archive/2006/07/26/60206.htmlnbtnbtWed, 26 Jul 2006 09:08:00 GMThttp://www.tkk7.com/nbtymm/archive/2006/07/26/60206.htmlhttp://www.tkk7.com/nbtymm/comments/60206.htmlhttp://www.tkk7.com/nbtymm/archive/2006/07/26/60206.html#Feedback1http://www.tkk7.com/nbtymm/comments/commentRss/60206.htmlhttp://www.tkk7.com/nbtymm/services/trackbacks/60206.html

Spring Framework浠庤癁鐢熶箣鏃ヨ搗錛屽彈鍒頒簡瓚婃潵瓚婂鐨勫叧娉ㄣ傛渶榪戯紝鏂扮殑寮婧愰」鐩ぇ澶氭敮鎸丼pring Framework銆傚浗鍐呯洰鍓嶄篃鏈変笓闂ㄧ殑緗戠珯錛?a >http://spring.jactiongroup.net/錛夈傞偅瀹冧負浠涔堝姝ゅ彈嬈㈣繋鍛紵

鎴戞兂鏈閲嶈鐨勬槸錛孍JB璁╂瘡涓漢閮界棝鎭ㄣ傝緙栧啓涓涓狤JB錛岄渶瑕佸啓LocalHome, RemoteHome, Bean, LocalInterface, RemoteInterface錛岄渶瑕佷竴涓爣鍑嗘弿榪扮錛屼竴涓壒孌婂巶鍟嗘弿榪扮錛圵eblogic銆乄ebSphere閮戒笉涓鏍鳳級錛屽鏋滄槸Entity Bean錛岃繕闇瑕丮apping鏂囦歡銆傚姝や箣澶氾紝瀹炲湪楹葷儲銆備絾EJB鏈閲嶈鐨勬槸瑙e喅Transaction闂錛屾病鏈塖pring涔嬪墠錛屾病鏈夊叾浠栨柟娉曡兘澶熸弿榪板紡鐨勮В鍐沖畠銆傛瘡涓漢銆佹瘡涓叕鍙鎬負浜嗚В鍐砊ransaction鐨勯棶棰橈紝緙栫▼鐨勫啓娉曢兘涓嶄竴鏍鳳紝鐧捐姳榻愭斁銆備簬鏄紝鍦ㄦ渶闇瑕佸畠鐨勬椂鍊欙紝Spring鍑虹幇浜嗐?/p>

Spring鐨勫姛鑳介潪甯稿銆備絾瀵逛簬涓涓駭鍝侊紝鏈閲嶈鐨勬槸濡備綍鐢ㄥソ瀹冪殑綺懼崕銆係pring鍖呭惈AOP銆丱RM銆丏AO銆丆ontext銆乄eb銆丮VC鍑犱釜閮ㄥ垎緇勬垚銆俉eb銆丮VC鏆備笉鐢ㄨ冭檻錛岀敤鎴愮啛鐨凷truts銆丣SP鎴朩ebwork鏇村ソ銆侱AO鐢變簬鐩墠Hibernate銆丣DO鐨勬祦琛岋紝涔熷彲涓嶈冭檻銆傚洜姝ゆ渶闇瑕佺敤鐨勬槸AOP銆丱RM銆丆ontext銆?/p>

Context涓紝鏈閲嶈鐨勬槸Beanfactory錛屽畠鏄皢鎺ュ彛涓庡疄鐜板垎寮錛岄潪甯擱噸瑕併備互鍓嶆垜浠啓紼嬪簭錛屽涓涓帴鍙Document錛屼竴涓疄鐜扮被Document1銆傚湪鍐欑▼搴忔椂錛岄渶鍐欐垚IDocument doc = new Document1()錛屼竴鏃︽垜浠殑瀹炵幇綾婚渶鏀瑰彉鏃訛紝鍙樹負Document2錛屽垯紼嬪簭闇鍐欐垚IDocument doc = new Document2()錛屾墍鏈夌敤鍒扮殑鍦版柟鍏ㄩ渶鏀廣侭eanfactory甯垜浠В鍐充簡榪欎釜闂錛岀敤context鍚庯紝鍐欐硶鍙樹負IDocument doc=(IDocument)beanFactory.getBean("doc")銆傚鏋滃疄鐜扮被浠嶥ocument1鏀逛負Document2錛岀洿鎺ュ湪閰嶇疆鏂囦歡鏀瑰氨鍙互浜嗐侰ontext鏄疊ean factory鐨勮繘涓姝ユ娊璞°傚緢澶氫漢閮藉枩嬈㈢敤ApplicationConext錛岀敤Servlet鎶婂畠Load銆傝繖鏍峰氨鎶夿ean Factory涓嶹eb緇戝畾鍦ㄤ竴璧楓傚鏋滄槸Fat Client鎴朢emote璋冪敤錛屽垯榪欎簺Bean factory灝卞緢闅捐皟鐢紝瀹為檯鏄皢琛ㄧ幇灞備笌涓氬姟灞傜粦瀹氱殑澶揣銆傛帹鑽愮殑鏂規硶鏄疭ingletonBeanFactoryLocator銆傚叿浣撲負錛?/p>

聽聽 BeanFactoryLocator bfLocator = SingletonBeanFactoryLocator.getInstance();
聽聽聽BeanFactoryReference bf = bfLocator.useBeanFactory("beanFactory");
聽聽聽// now use some bean from factory
聽聽聽return bf.getFactory().getBean(name);

聽<beans>

聽聽聽聽 <bean id="beanFactory" class="org.springframework.context.support.ClassPathXmlApplicationContext">
聽聽聽聽 <constructor-arg>
聽聽聽聽聽 <list>
聽聽聽聽聽聽 <value>dataAccessContext.xml</value>
聽聽聽聽聽聽 <value>securityContext.xml</value>
聽聽聽聽聽聽 <value>...</value>
聽聽聽聽聽 </list>
聽聽聽聽 </constructor-arg>
聽聽聽 </bean>

</beans>


榪欐牱錛屽氨鍙殢鏃跺姩鎬佹墿灞曪紝瀹炵幇緇勪歡寮忕殑寮鍙戙?/p>

錛堟湭瀹岋紝寰呯畫錛?/p>

nbt 2006-07-26 17:08 鍙戣〃璇勮
]]>
鐢?Spring MVC 杞繪澗榪涜搴旂敤紼嬪簭寮鍙?杞澆)http://www.tkk7.com/nbtymm/archive/2006/06/15/53042.htmlnbtnbtThu, 15 Jun 2006 09:39:00 GMThttp://www.tkk7.com/nbtymm/archive/2006/06/15/53042.htmlhttp://www.tkk7.com/nbtymm/comments/53042.htmlhttp://www.tkk7.com/nbtymm/archive/2006/06/15/53042.html#Feedback0http://www.tkk7.com/nbtymm/comments/commentRss/53042.htmlhttp://www.tkk7.com/nbtymm/services/trackbacks/53042.html銆銆
銆銆鍦ㄥ紑濮嬩箣鍓嶏紝璇仿犱笅杞借繖綃囨枃绔犵殑婧愪唬鐮併傝鍙傞槄聽鍙傝冭祫鏂櫬犺闂燬pring聽妗嗘灦鍜屄燭omcat聽5.0錛岃繍琛岀ず渚嬮渶瑕佸畠浠?br />銆銆
銆銆Spring聽MVC聽妗嗘灦
銆銆
銆銆Spring聽妗嗘灦鎻愪緵浜嗘瀯寤郝燱eb聽搴旂敤紼嬪簭鐨勫叏鍔熻兘聽MVC聽妯″潡銆備嬌鐢燬pring聽鍙彃鍏ョ殑聽MVC聽鏋舵瀯錛屽彲浠ラ夋嫨鏄嬌鐢ㄥ唴緗殑聽Spring聽Web聽妗嗘灦榪樻槸聽Struts聽榪欐牱鐨劼燱eb聽妗嗘灦銆傞氳繃絳栫暐鎺ュ彛錛孲pring聽妗嗘灦鏄珮搴﹀彲閰嶇疆鐨勶紝鑰屼笖鍖呭惈澶氱瑙嗗浘鎶鏈紝渚嬪聽JavaServer聽Pages錛圝SP錛夋妧鏈乂elocity銆乀iles銆乮Text聽鍜屄燩OI銆係pring聽MVC聽妗嗘灦騫朵笉鐭ラ亾浣跨敤鐨勮鍥撅紝鎵浠ヤ笉浼氬己榪偍鍙嬌鐢燡SP聽鎶鏈係pring聽MVC聽鍒嗙浜嗘帶鍒跺櫒銆佹ā鍨嬪璞°佸垎媧懼櫒浠ュ強澶勭悊紼嬪簭瀵硅薄鐨勮鑹詫紝榪欑鍒嗙璁╁畠浠洿瀹規槗榪涜瀹氬埗銆?br />銆銆
銆銆Spring聽鐨劼燱eb聽MVC聽妗嗘灦鏄洿緇暵燚ispatcherServlet聽璁捐鐨勶紝瀹冩妸璇鋒眰鍒嗘淳緇欏鐞嗙▼搴忥紝鍚屾椂甯︽湁鍙厤緗殑澶勭悊紼嬪簭鏄犲皠銆佽鍥捐В鏋愩佹湰鍦拌璦銆佷富棰樿В鏋愪互鍙婁笂杞芥枃浠舵敮鎸併傞粯璁ょ殑澶勭悊紼嬪簭鏄潪甯哥畝鍗曠殑聽Controller聽鎺ュ彛錛屽彧鏈変竴涓柟娉暵燤odelAndView聽handleRequest(request,聽response)銆係pring聽鎻愪緵浜嗕竴涓帶鍒跺櫒灞傛緇撴瀯錛屽彲浠ユ淳鐢熷瓙綾匯傚鏋滃簲鐢ㄧ▼搴忛渶瑕佸鐞嗙敤鎴瘋緭鍏ヨ〃鍗曪紝閭d箞鍙互緇ф壙聽AbstractFormController銆傚鏋滈渶瑕佹妸澶氶〉杈撳叆澶勭悊鍒頒竴涓〃鍗曪紝閭d箞鍙互緇ф壙聽AbstractWizardFormController銆?br />銆銆
銆銆紺轟緥搴旂敤紼嬪簭鏈夊姪浜庣洿瑙傚湴瀛︿範榪欎簺鐗規с傞摱琛屽簲鐢ㄧ▼搴忓厑璁哥敤鎴鋒绱粬浠殑甯愭埛淇℃伅銆傚湪鏋勫緩閾惰搴旂敤紼嬪簭鐨勮繃紼嬩腑錛屽彲浠ュ鍒板浣曢厤緗燬pring聽MVC聽妗嗘灦鍜屽疄鐜版鏋剁殑瑙嗗浘灞傦紝瑙嗗浘灞傚寘鎷燡STL聽鏍囪錛堢敤浜庢樉紺鴻緭鍑虹殑鏁版嵁錛夊拰JavaServer聽Pages聽鎶鏈?br />銆銆
銆銆閰嶇疆聽Spring聽MVC
銆銆
銆銆瑕佸紑濮嬫瀯寤虹ず渚嬪簲鐢ㄧ▼搴忥紝璇烽厤緗燬pring聽MVC聽鐨劼燚ispatcherServlet銆傝鍦爓eb.xml聽鏂囦歡涓敞鍐屾墍鏈夐厤緗傛竻鍗暵?聽鏄劇ず浜嗗浣曢厤緗爏ampleBankingServlet銆?br />銆銆
銆銆娓呭崟聽1.聽閰嶇疆聽Spring聽MVC聽DispatcherServlet
銆銆
銆銆<servlet>
銆銆<servlet-name>sampleBankingServlet</servlet-name>
銆銆<servlet-class>
銆銆org.springframework.we.servlet.DispatcherServlet
銆銆<servlet-class>
銆銆<load-on-startup>1<load-on-startup>
銆銆<servlet>
銆銆
銆銆DispatcherServlet聽浠庝竴涓燲ML聽鏂囦歡瑁呭叆聽Spring聽搴旂敤紼嬪簭涓婁笅鏂囷紝XML聽鏂囦歡鐨勫悕縐版槸聽servlet聽鐨勫悕縐板悗闈㈠姞涓娐?servlet聽銆傚湪榪欎釜紺轟緥涓紝DispatcherServlet聽浼氫粠聽sampleBankingServlet-servlet.xml聽鏂囦歡瑁呭叆搴旂敤紼嬪簭涓婁笅鏂囥?br />銆銆
銆銆閰嶇疆搴旂敤紼嬪簭鐨劼燯RL
銆銆
銆銆涓嬩竴姝ユ槸閰嶇疆鎯寵聽sampleBankingServlet聽澶勭悊鐨劼燯RL銆傚悓鏍鳳紝榪樻槸瑕佸湪聽web.xml聽涓敞鍐屾墍鏈夎繖浜涗俊鎭?br />銆銆
銆銆娓呭崟聽2.聽閰嶇疆鎯寵澶勭悊鐨劼燯RL
銆銆
銆銆<servlet-mapping>
銆銆<servlet-name>聽sampleBankingServlet<servlet-name>
銆銆<url-pattern>*.jsp</url-pattern>
銆銆</servlet-mapping>
銆銆
銆銆瑁呭叆閰嶇疆鏂囦歡
銆銆
銆銆涓嬮潰錛岃鍏ラ厤緗枃浠躲備負浜嗗仛鍒拌繖鐐癸紝璇蜂負聽Servlet聽2.3聽瑙勮寖娉ㄥ唽聽ContextLoaderListener聽鎴栦負聽Servlet聽2.2聽鍙婁互涓嬬殑瀹瑰櫒娉ㄥ唽聽ContextLoaderServlet銆備負浜嗕繚闅滃悗鍚戝吋瀹規э紝璇風敤聽ContextLoaderServlet銆傚湪鍚姩聽Web聽搴旂敤紼嬪簭鏃訛紝ContextLoaderServlet聽浼氳鍏ヂ燬pring聽閰嶇疆鏂囦歡銆傛竻鍗暵?聽娉ㄥ唽浜喡燙ontextLoaderServlet銆?br />銆銆
銆銆娓呭崟聽3.聽娉ㄥ唽聽ContextLoaderServlet
銆銆
銆銆<servlet>
銆銆<servlet-name>context>servlet-name>
銆銆<servlet-class>
銆銆org.springframework.web.context.ContextLoaderServlet
銆銆</servlet-class>
銆銆<load-on-startup>1</load-on-startup>
銆銆</servlet>
銆銆
銆銆contextConfigLocation聽鍙傛暟瀹氫箟浜嗚瑁呭叆鐨劼燬pring聽閰嶇疆鏂囦歡錛屽涓嬮潰鐨劼爏ervlet聽涓婁笅鏂囨墍紺恒?br />銆銆
銆銆<context-param>
銆銆<param-value>contextConfigLocation</param-value>
銆銆<param-value>/WEB-INF/sampleBanking-services.xml</param-value>
銆銆</context-param>
銆銆
銆銆sampleBanking-services.xml聽鏂囦歡浠h〃紺轟緥閾惰搴旂敤紼嬪簭鏈嶅姟鐨勯厤緗拰聽bean聽閰嶇疆銆傚鏋滄兂瑁呭叆澶氫釜閰嶇疆鏂囦歡錛屽彲浠ュ湪聽<param-value>聽鏍囪涓敤閫楀彿浣滃垎闅旂銆?br />銆銆
銆銆Spring聽MVC聽紺轟緥
銆銆
銆銆紺轟緥閾惰搴旂敤紼嬪簭鍏佽鐢ㄦ埛鏍規嵁鎯熶竴鐨劼營D聽鍜屽彛浠ゆ煡鐪嬪笎鎴蜂俊鎭傝櫧鐒堵燬pring聽MVC聽鎻愪緵浜嗗叾浠栭夐」錛屼絾鏄垜灝嗛噰鐢燡SP聽鎶鏈綔涓鴻鍥鵑〉闈€傝繖涓畝鍗曠殑搴旂敤紼嬪簭鍖呭惈涓涓鍥鵑〉鐢ㄤ簬鐢ㄦ埛杈撳叆錛圛D聽鍜屽彛浠わ級錛屽彟涓欏墊樉紺虹敤鎴風殑甯愭埛淇℃伅銆?br />銆銆
銆銆鎴戜粠聽LoginBankController聽寮濮嬶紝瀹冩墿灞曚簡聽Spring聽MVC聽鐨劼燬impleFormController銆係impleFormContoller聽鎻愪緵浜嗘樉紺轟粠聽HTTP聽GET聽璇鋒眰鎺ユ敹鍒扮殑琛ㄥ崟鐨勫姛鑳斤紝浠ュ強澶勭悊浠幝燞TTP聽POST聽鎺ユ敹鍒扮殑鐩稿悓琛ㄥ崟鏁版嵁鐨勫姛鑳姐侺oginBankController聽鐢燗uthenticationService聽鍜屄燗ccountServices聽鏈嶅姟榪涜楠岃瘉錛屽茍鎵ц甯愭埛媧誨姩銆傗溌犻厤緗鍥懼睘鎬犫濅竴鑺備腑鐨劼犳竻鍗暵?聽鎻忚堪浜嗗浣曟妸聽AuthenticationService聽鍜屄燗ccountServices聽榪炴帴鍒奧燣oginBankController銆偮犳竻鍗暵?聽鏄劇ず浜喡燣oginBankController聽鐨勪唬鐮併?br />銆銆
銆銆閰嶇疆瑙嗗浘灞炴?br />銆銆
銆銆涓嬮潰錛屾垜蹇呴』娉ㄥ唽鍦ㄦ帴鏀跺埌聽HTTP聽GET聽璇鋒眰鏃舵樉紺虹殑欏甸潰銆傛垜鍦燬pring聽閰嶇疆涓敤聽formView聽灞炴ф敞鍐岃繖涓〉闈紝濡傛竻鍗暵?聽鎵紺恒俿ucessView聽灞炴т唬琛ㄨ〃鍗曟暟鎹彁浜よ屼笖聽doSubmitAction()聽鏂規硶涓殑閫昏緫鎴愬姛鎵ц涔嬪悗鏄劇ず鐨勯〉闈€俧ormView聽鍜屄爏ucessView聽灞炴ч兘浠h〃琚畾涔夌殑瑙嗗浘鐨勯昏緫鍚嶇О錛岄昏緫鍚嶇О鏄犲皠鍒板疄闄呯殑瑙嗗浘欏甸潰銆?br />銆銆
銆銆娓呭崟聽5.聽娉ㄥ唽聽LoginBankController
銆銆
銆銆<bean聽id="loginBankController"
銆銆class="springexample.controller.LoginBankController">
銆銆<property聽name="sessionForm"><value>true</value></property>
銆銆<property聽name="commandName"><value>loginCommand</value></property>
銆銆<property聽name="commandClass">
銆銆<value>springexample.commands.LoginCommand</value>
銆銆</property>
銆銆
銆銆<property聽name="authenticationService">
銆銆<ref聽bean="authenticationService"聽/>
銆銆</property>
銆銆<property聽name="accountServices">
銆銆<ref聽bean="accountServices"聽/>
銆銆</property>
銆銆<property聽name="formView">
銆銆<value>login</value>
銆銆</property>
銆銆<property聽name="successView">
銆銆<value>accountdetail</value>
銆銆</property>
銆銆
銆銆</bean>
銆銆
銆銆commandClass聽鍜屄燾ommandName聽鏍囪鍐沖畾灝嗗湪瑙嗗浘欏甸潰涓椿鍔ㄧ殑聽bean銆備緥濡傦紝鍙互閫氳繃聽login.jsp聽欏甸潰璁塊棶聽loginCommand聽bean錛岃繖涓〉闈㈡槸搴旂敤紼嬪簭鐨勭櫥褰曢〉闈€備竴鏃︾敤鎴鋒彁浜や簡鐧誨綍欏甸潰錛屽簲鐢ㄧ▼搴忓氨鍙互浠幝燣oginBankController聽鐨劼爋nSubmit()聽鏂規硶涓殑鍛戒護瀵硅薄媯绱㈠嚭琛ㄥ崟鏁版嵁銆?br />銆銆
銆銆瑙嗗浘瑙f瀽鍣?br />銆銆
銆銆Spring聽MVC聽鐨劼犺鍥捐В鏋愬櫒聽鎶婃瘡涓昏緫鍚嶇О瑙f瀽鎴愬疄闄呯殑璧勬簮錛屽嵆鍖呭惈甯愭埛淇℃伅鐨劼燡SP聽鏂囦歡銆傛垜鐢ㄧ殑鏄燬pring聽鐨劼營nternalResourceViewResolver錛屽聽娓呭崟聽6聽鎵紺恒?br />銆銆
銆銆鍥犱負鎴戝湪聽JSP聽欏甸潰涓嬌鐢ㄤ簡聽JSTL聽鏍囪錛屾墍浠ョ敤鎴風殑鐧誨綍鍚嶇О瑙f瀽鎴愯祫婧惵?jsp/login.jsp錛岃屄爒iewClass聽鎴愪負聽JstlView銆?br />銆銆
銆銆楠岃瘉鍜屽笎鎴鋒湇鍔?br />銆銆
銆銆灝卞儚鍓嶉潰鎻愬埌鐨勶紝LoginBankController聽鍐呴儴榪炴帴浜喡燬pring聽鐨劼燗ccountServices聽鍜屄燗uthenticationService銆侫uthenticationService聽綾誨鐞嗛摱琛屽簲鐢ㄧ▼搴忕殑楠岃瘉銆侫ccountServices聽綾誨鐞嗗吀鍨嬬殑閾惰鏈嶅姟錛屼緥濡傛煡鎵句氦鏄撳拰鐢墊眹銆傛竻鍗暵?聽鏄劇ず浜嗛摱琛屽簲鐢ㄧ▼搴忕殑楠岃瘉鍜屽笎鎴鋒湇鍔$殑閰嶇疆銆?br />銆銆
銆銆娓呭崟聽7.聽閰嶇疆楠岃瘉鍜屽笎鎴鋒湇鍔?br />銆銆
銆銆<beans>
銆銆
銆銆<bean聽id="accountServices"
銆銆class="springexample.services.AccountServices">
銆銆
銆銆</bean>
銆銆
銆銆<bean聽id="authenticationService"
銆銆class="springexample.services.AuthenticationService">
銆銆
銆銆</bean>
銆銆
銆銆</beans>
銆銆
銆銆浠ヤ笂鏈嶅姟鍦爏ampleBanking-services.xml聽涓敞鍐岋紝鐒跺悗瑁呭叆聽web.xml聽鏂囦歡涓紝灝卞儚聽鍓嶉潰璁ㄨ鐨勯偅鏍楓傛帶鍒跺櫒鍜屾湇鍔¢厤緗ソ鍚庯紝榪欎釜綆鍗曠殑搴旂敤紼嬪簭灝卞畬鎴愪簡銆傜幇鍦ㄦ垜浠潵鐪嬬湅閮ㄧ講鍜屾祴璇曞畠鏃朵細鍙戠敓浠涔?
銆銆
銆銆閮ㄧ講搴旂敤紼嬪簭
銆銆
銆銆鎴戞妸紺轟緥搴旂敤紼嬪簭閮ㄧ講鍦燭omcat聽servlet聽瀹瑰櫒涓俆omcat聽鏄燡ava聽Servlet聽鍜屄燡ava聽ServerPagest聽鎶鏈殑瀹樻柟鍙傝冨疄鐜頒腑浣跨敤鐨劼爏ervlet聽瀹瑰櫒銆傚鏋滀互鍓嶆病榪欎箞鍋氳繃錛岃聽涓嬭澆聽jakarta-tomcat-5.0.28.exe聽騫惰繍琛屽畠鎶娐燭omcat聽瀹夎鍒拌嚜宸卞枩嬈㈢殑浠諱綍浣嶇疆錛屼緥濡偮燾:\tomcat5.0銆?br />銆銆
銆銆鎺ヤ笅鏉ワ紝涓嬭澆紺轟緥浠g爜聽騫墮噴鏀懼埌椹卞姩鍣紙渚嬪聽c:\聽錛変笂銆傚垱寤轟簡聽Spring聽欏圭洰鐨勬枃浠跺す涔嬪悗錛屾墦寮瀹冨茍鎶娐爏pring-banking聽瀛愭枃浠跺す鎷瘋礉鍒奧燾:\tomvat5.0\webapps銆俿pring-banking聽鏂囦歡澶規槸涓涓燱eb聽妗f錛岄噷闈㈠寘鍚燬pring聽MVC聽紺轟緥搴旂敤紼嬪簭銆俵ib聽鏂囦歡澶瑰寘鍚簲鐢ㄧ▼搴忛渶瑕佺殑聽Spring聽妗嗘灦銆佷笌Spring聽鐩稿叧鐨劼燤VC聽搴撲互鍙娐燡STL聽鏍囪搴撳拰聽jar聽鏂囦歡銆?br />銆銆
銆銆瑕佸惎鍔燭omcat聽鏈嶅姟鍣紝璇蜂嬌鐢ㄤ互涓嬪懡浠わ細
銆銆
銆銆cd聽bin聽C:\Tomcat聽5.0\bin>聽catalina.bat聽start
銆銆Tomcat聽搴斿綋鍚姩騫墮儴緗猜燬pring聽MVC聽紺轟緥搴旂敤紼嬪簭銆?br />銆銆
銆銆嫻嬭瘯搴旂敤紼嬪簭
銆銆
銆銆瑕佹祴璇曞簲鐢ㄧ▼搴忥紝璇鋒墦寮聽Web聽嫻忚鍣紝鎸囧悜聽http://localhost:tomcatport/springbanking聽騫剁敤聽Tomcat聽鏈嶅姟鍣ㄥ疄闄呰繍琛岀殑绔彛鏇挎崲聽tomcatport銆傚簲褰撶湅鍒板浘聽1聽鎵紺虹殑鐧誨綍灞忓箷銆傝緭鍏ョ敤鎴仿營D聽鈥渁dmin鈥濆拰鍙d護鈥減assword鈥濓紝騫舵寜涓嬬櫥褰曟寜閽傚叾浠栫敤鎴仿營D聽鎴栧彛浠や細閫犳垚鏉ヨ嚜楠岃瘉鏈嶅姟鐨勯敊璇?br />銆銆
銆銆鍥韭?.聽Spring聽MVC聽紺轟緥鐧誨綍灞忓箷


鐧誨綍鎴愬姛涔嬪悗錛屼細鐪嬪埌鍥韭?聽鎵紺虹殑甯愭埛緇嗚妭欏甸潰銆?br />銆銆
銆銆鍥韭?.聽Spring聽MVC聽紺轟緥甯愭埛緇嗚妭欏甸潰
銆銆


銆銆緇撴潫璇?br />銆銆
銆銆鍦ㄤ笁閮ㄥ垎鐨劼燬pring聽緋誨垪聽鐨勭涓夌瘒鏂囩珷涓紝鎴戜粙緇嶄簡聽Spring聽MVC聽妗嗘灦鐨勭壒鎬с傛垜婕旂ず浜嗗浣曢厤緗拰寮鍙懧燬pring聽MVC聽搴旂敤紼嬪簭銆佸浣曢厤緗燬pring聽MVC聽鎺у埗鍣ㄥ拰鍚戝叾涓彃鍏ヤ緷璧栭」銆佸浣曠敤聽JavaServer聽Pages聽鎶鏈紑鍙戝簲鐢ㄧ▼搴忚鍥撅紝浠ュ強濡備綍鎶婅嚜宸辯殑欏甸潰涓幝燬pring聽MVC聽鐨勮鍥懼眰闆嗘垚銆傛葷粨榪欑瘒鏂囩珷鏃訛紝鎴戞紨紺轟簡濡備綍鍦燭omcat聽servlet聽瀹瑰櫒涓儴緗插簲鐢ㄧ▼搴忎互鍙婂浣曞湪嫻忚鍣ㄤ腑嫻嬭瘯瀹冦?img src ="http://www.tkk7.com/nbtymm/aggbug/53042.html" width = "1" height = "1" />

nbt 2006-06-15 17:39 鍙戣〃璇勮
]]>
Struts+Spring+Hibernate緇冧範(瀹屾暣)杞澆http://www.tkk7.com/nbtymm/archive/2006/06/15/52923.htmlnbtnbtThu, 15 Jun 2006 01:53:00 GMThttp://www.tkk7.com/nbtymm/archive/2006/06/15/52923.htmlhttp://www.tkk7.com/nbtymm/comments/52923.htmlhttp://www.tkk7.com/nbtymm/archive/2006/06/15/52923.html#Feedback0http://www.tkk7.com/nbtymm/comments/commentRss/52923.htmlhttp://www.tkk7.com/nbtymm/services/trackbacks/52923.html
宸ュ叿錛?/div>
聽聽聽聽Eclipse3.1銆丮yEclipse4.03銆乀omcat5.5.9銆丳roperties Editor鎻掍歡銆丮ySql4.1.13
鏂板緩宸ョ▼錛氬悕縐頒負 login
鍒涘緩Struts妗嗘灦
鍒涘緩 index.jsp錛屽鍔犱竴閾炬帴鎸囧悜 login.jsp
鎸変笅Ctrl + N錛屽垱寤?login.jsp銆丩oginAction錛屼嬌鐢∕yEclipse鐨勫悜瀵煎氨鍙互浜嗭紝璁板緱閫夊姝g‘鐨勭増鏈?/strong>
鍦ˋctionForm閰嶇疆欏典腑閫夋嫨綾誨瀷涓哄姩鎬丗orm錛屽茍緇ф壙浜嶥ynaValidatorForm錛屾柊澧炰袱涓睘鎬э細username銆乸assword錛屽湪鍒涘緩jsp鏂囦歡鎵撲笂閽╋紝灝嗚礬寰勬敼涓?login.jsp錛岀劧鍚庝笅涓姝ワ紝鏀筁oginAction鐨処nput source鏀逛負/login.jsp錛岀偣鍑誨畬鎴?/div>
鎸変笅Ctrl + N 鍒涘緩涓涓猣orwards錛?strong>璁板緱閫夊姝g‘鐨勭増鏈?/strong>
name 杈撳叆 indexGo
璺緞閫夋嫨 /index.jsp
閰嶇疆validator
鍏堟坊鍔燬truts鎻掍歡錛屼嬌鐢ㄥ悜瀵?/div>
Plugin class : org.apache.struts.validator.ValidatorPlugIn
Property : pathnames
Value : /WEB-INF/validator-rules.xml,/WEB-INF/validation.xml
榪欓噷闇瑕佷袱涓獂ml鏂囦歡
鐜板湪鍒涘緩鈥?/font> validation.xml 鈥?/font>聽鏂囦歡
鍦ㄨ繖閲岃鏄庝竴鐐癸紝鎴戜嬌鐢∕yEclipse鍒涘緩鐨凷truts妗嗘灦涓己灝戜簡validator-rules.xml鏂囦歡錛岄渶瑕佸姩鎷瘋礉鍒癢EB-INF鐩綍涓?/div>
姝ゆ枃浠跺彲浠ュ埌http://struts.apache.org/涓嬭澆
鏂囦歡鍐呭濡備笅錛?/div>
< form-validation >
< formset >
聽聽
< form聽 name ="loginForm" >
聽聽聽
< field聽 property ="username" 聽depends ="required" >
聽聽聽聽
< arg0聽 key ="prompt.username" />
聽聽聽
</ field >
聽聽聽
< field聽 property ="password" 聽depends ="required" >
聽聽聽聽
< arg0聽 key ="prompt.password" />
聽聽聽
</ field >
聽聽
</ form >
</ formset >
</ form-validation >
緙栬緫璧勬簮鏂囦歡鈥淎pplicationResources.properties鈥?/font>
澧炲姞浠ヤ笅鍐呭
prompt.username=User Name
prompt.password=User Password
errors.required={0} is required.
鍐嶅垱寤轟腑鏂囦歡璧勬簮鏂囦歡鈥淎pplicationResources_zh_CN.properties鈥?/font>

澧炲姞浠ヤ笅鍐呭

prompt.username=鐢ㄦ埛鍚嶇О
prompt.password=鐧誨綍瀵嗙爜
errors.required={0} 蹇呴渶濉啓錛?/font>
淇敼struts-config.xml鏂囦歡
鍦ㄤ互涓嬩綅緗鍔犵豢鑹插瓧浣撻儴浠?/div>
<action-mappings >
聽聽聽 <action
聽聽聽聽聽 attribute="loginForm"
聽聽聽聽聽 input="/login.jsp"
聽聽聽聽聽 name="loginForm"
聽聽聽聽聽 path="/login"
聽聽聽聽聽 scope="request"
聽聽聽聽聽 validate="true"
聽聽聽聽聽 type="com.test.struts.action.LoginAction" />
聽 </action-mappings>
榪欓噷璇存槑鎻愪氦鐨勬暟鎹繀闇緇忚繃楠岃瘉錛岃岄獙璇佸垯鏄氳繃validator妗嗘灦榪涜鐨勩?/div>
淇敼LoginAction.java鏂囦歡鐨別xecute鏂規硶錛屽唴瀹瑰涓?/div>
public ActionForward execute(
聽聽ActionMapping mapping,
聽聽ActionForm form,
聽聽HttpServletRequest request,
聽聽HttpServletResponse response) {
聽聽DynaValidatorForm loginForm = (DynaValidatorForm) form;
聽聽String username=loginForm.getString("username");
聽聽String password=loginForm.getString("password");
聽聽if(username.equals("test")||password.equals("test")){
聽聽聽return mapping.findForward("indexGo");
聽聽}else{
聽聽聽return mapping.getInputForward();
聽聽}
聽}
鐜板湪鍐嶄慨鏀逛竴涓媗ogin.jsp
澧炲姞浠ヤ笅緇胯壊瀛椾綋閮ㄤ喚
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
鍏朵腑charset=UTF-8 鏄嬌鐢║TF-8鐨勫瓧絎︾紪鐮侊紝榪欎篃鏄負浜嗘敮鎸佸浗闄呭寲鑰屼嬌鐢ㄧ殑銆?/font>
濂戒簡錛岀幇鍦ㄥ彲浠ュ惎鍔═omcat榪涜嫻嬭瘯浜?/div>
http://localhost/login/ 聽榪欓噷璇存槑涓涓嬶紝鎴戠殑Tomcat宸茬粡瑁呯鍙e彿鏀逛負80浜嗭紝鎵浠ュ氨涓嶅繀浣跨敤http://localhost:8080/login/榪欐牱鐨勬柟娉曚簡銆?/div>
濡傛灉涓嶈緭鍏ヤ換浣曟暟鎹岀洿鎺ユ彁浜よ〃鍗曠殑璇濆氨鍙互鐪嬪埌鏁堟灉浜嗐?/div>
濂戒簡錛屽鏋滄病鏈変粈涔堥棶棰樼殑璇濆氨緇х畫寰涓嬬湅鍚э紝濡傛灉鏈夐棶棰樼殑璇濆氨寰楀線涓婄湅浜哵_^
鐜板湪鍒涘緩Spring妗嗘灦浜嗭紝鍦ㄨ繖閲屾垜灝哠pring鎵鏈夌殑鍖呭叏閮ㄥ姞杞借繘鍘伙紝鍥犱負鎴戣繕涓嶇煡閬撳叿浣撶敤鍒板摢浜涚被錛屽叏閮ㄥ姞榪涘幓鏂逛究鐐?/div>
鍗曢夋閫夌浜屼釜錛岃繖鏍風殑璇濇墍鏈夌殑綾誨簱鍜屾爣絳劇瓑閮藉皢鎷瘋礉鍒伴」鐩腑鍘伙紝榪欐牱鏂逛究浠ュ悗鐨勫竷緗?/div>
涓嬩竴姝ュ悗鏄垱寤洪厤緗枃浠訛紝灝嗘枃浠舵斁鍒扳淲ebRoot/WEB-INF鈥濈洰褰曚笅錛屾枃浠跺悕縐頒負鈥渁pplicationContext.xml鈥?/div>
閰嶇疆struts-config.xml鏂囦歡錛屾坊鍔狅紙spring錛夌殑鎻掍歡
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
聽聽聽 <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" />
聽 </plug-in>
淇敼LoginAction閰嶇疆
鍘燂細
<action
聽聽聽聽聽 attribute="loginForm"
聽聽聽聽聽 input="/login.jsp"
聽聽聽聽聽 name="loginForm"
聽聽聽聽聽 path="/login"
聽聽聽聽聽 scope="request"
聽聽聽聽聽 validate="true"
聽聽聽聽聽 type="com.test.struts.action.LoginAction" />
聽 </action-mappings>
鏀逛負錛?/font>
<action
聽聽聽聽聽 attribute="loginForm"
聽聽聽聽聽 input="/login.jsp"
聽聽聽聽聽 name="loginForm"
聽聽聽聽聽 path="/login"
聽聽聽聽聽 scope="request"
聽聽聽聽聽 validate="true"
聽聽聽聽聽 type="org.springframework.web.struts.DelegatingActionProxy" />
聽 </action-mappings>
緇胯壊瀛椾綋閮ㄤ喚涓轟慨鏀瑰唴瀹?/font>
榪欓噷灝嗕嬌鐢╯pring鐨勪唬鐞嗗櫒鏉ュAction榪涜鎺у埗
褰撴彁浜ゅ埌/login.do鏄皢鎺у埗鏉冧氦緇欎簡spring錛岀劧鍚庣敱spring鏉ュ喅瀹氭槸鍚﹁漿鍥炲埌struts鐨凙ction
鐜板湪鏉ラ厤緗畇pring
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "
http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean name="/login" class="com.test.struts.action.LoginAction" singleton="false"></bean>
</beans>
緇胯壊瀛椾綋鏄叧浜庤漿浜ゆ帶鍒舵潈鐨勯厤緗唴瀹?/font>
灞炴ingleton="false"錛屾寚鏄庝簡Action 鐨勫疄渚嬭幏鍙栨柟寮忎負姣忔閲嶆柊鍒涘緩銆傝В鍐充簡Struts涓護浜鴻療鐥呯殑綰跨▼瀹夊叏闂錛圫truts涓紝鐢變竴涓狝ction瀹炰緥澶勭悊鎵鏈夌殑璇鋒眰錛岃繖灝卞鑷翠簡綾誨叕鐢ㄨ祫婧愬湪騫跺彂璇鋒眰涓殑綰跨▼鍚屾闂銆傦級錛堟憳鑷猻pring寮鍙戞寚鍗楋級
榪欐椂濡傛灉浣犺榪涜嫻嬭瘯涔熸槸鍙互鐨勶紝涓嶈繃涓轟簡鐪佺偣鏃墮棿灝變笉榪涜嫻嬭瘯浜嗐?/font>
寤虹珛鏁版嵁搴撳湪 榪欓噷鎴戜嬌鐢ㄧ殑鏄痬ysql4.1.13
CREATE TABLE `user` (
聽 `ID` int(11) NOT NULL auto_increment,
聽 `USERNAME` varchar(50) NOT NULL default '',
聽 `PASSWORD` varchar(50) NOT NULL default '',
聽 PRIMARY KEY聽 (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
娣誨姞璁板綍 insert into user (USERNAME,PASSWORD) values ('test','test')
鍒涘緩Hibernate妗嗘灦
鍦ㄩ厤緗晫闈腑閰嶇疆鏁版嵁搴撶殑榪炴帴閮ㄤ喚錛岄噸瑕佺殑鏄偣鍑婚摼鎺ュ皢jdbc鎷瘋礉鍒發ib鐩綍涓?/div>
浣跨敤MyEclipse鐨勬暟鎹瓺atabase Explorer宸ュ叿鍒涘緩User.hmb.xml銆丄bstractUser.java銆乁ser.java鏄犲皠鏂囦歡
鍒涘緩瀹屾垚鍚庡彲浠ュ皢鑷姩鐢熸垚鐨刪ibernate.cfg.xml鍒犻櫎
鍒涘緩UserDAO.java銆乁serDAOImp.java

UserDAO.java

public interface UserDAO {

聽聽 public abstract boolean isValidUser(String username, String password);

}

UserDAOImp.java

import java.util.List;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.test.Hibernate.SessionFactory;

public class UserDAOImp extends HibernateDaoSupport implements UserDAO {

聽聽聽 private SessionFactory sessionFactory;

聽聽聽 private static String hql = "from User u where u.username=? ";

聽聽聽 public boolean isValidUser(String username, String password) {

聽聽聽聽聽聽 List userList = this.getHibernateTemplate().find(hql, username);

聽聽聽聽聽聽 if (userList.size() > 0) {

聽聽聽聽聽聽聽聽聽聽 return true;

聽聽聽聽聽聽 }

聽聽聽聽聽聽 return false;

聽聽聽 }

}

淇敼LoginAction.java鏂囦歡錛屼嬌鐢╱serDao鐨勬柟娉曟潵榪涜鐢ㄦ埛楠岃瘉
package com.test.struts.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.validator.DynaValidatorForm;
import com.test.UserDAO;

public class LoginAction extends Action {

private UserDAO userDAO;
聽public UserDAO getUserDAO() {
聽聽return userDAO;
聽}
聽public void setUserDAO(UserDAO userDAO) {
聽聽this.userDAO = userDAO;
聽}
聽public ActionForward execute(ActionMapping mapping, ActionForm form,
聽聽聽HttpServletRequest request, HttpServletResponse response) {
聽聽DynaValidatorForm loginForm = (DynaValidatorForm) form;
聽聽// TODO Auto-generated method stub
聽聽String username = (String) loginForm.get("username");
聽聽String password = (String) loginForm.get("password");
聽聽loginForm.set("password", null);
聽聽if (userDAO.isValidUser(username,password)) {
聽聽聽return mapping.findForward("indexGo");
聽聽} else {
聽聽聽return mapping.getInputForward();
聽聽}
聽}
}
緇胯壊瀛椾綋涓轟慨鏀歸儴浠?/div>
鐜板湪鍓╀笅鏈鍚庣殑spring閰嶇疆浜?/div>
<?xml聽version="1.0"聽encoding="UTF-8"?>
<!DOCTYPE聽beans聽PUBLIC聽"-//SPRING//DTD聽BEAN//EN"聽"http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
<bean聽id="dataSource"聽class="org.apache.commons.dbcp.BasicDataSource"聽destroy-method="close">
聽聽
<property聽name="driverClassName">
聽聽聽
<value>com.mysql.jdbc.Driver</value>
聽聽
</property>
聽聽
<property聽name="url">
聽聽聽
<value>jdbc:mysql://localhost/test</value>
聽聽
</property>
聽聽
<property聽name="username">
聽聽聽
<value>root</value>
聽聽
</property>
聽聽
<property聽name="password">
聽聽聽
<value>root</value>
聽聽
</property>
</bean>

<!--聽閰嶇疆sessionFactory,聽娉ㄦ剰榪欓噷寮曞叆鐨勫寘鐨勪笉鍚屄犅?/span>-->
<bean聽id="sessionFactory"聽class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
聽聽
<property聽name="dataSource">
聽聽聽
<ref聽local="dataSource"/>
聽聽
</property>
聽聽
<property聽name="mappingResources">
聽聽聽
<list>
聽聽聽聽
<value>com/test/Hibernate/User.hbm.xml</value>
聽聽聽
</list>
聽聽
</property>
聽聽
<property聽name="hibernateProperties">
聽聽聽
<props>
聽聽聽聽
<prop聽key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
聽聽聽聽
<prop聽key="hibernate.show_sql">true</prop>
聽聽聽
</props>
聽聽
</property>
</bean>

<bean聽id="transactionManager"聽class="org.springframework.orm.hibernate3.HibernateTransactionManager">
聽聽
<property聽name="sessionFactory">
聽聽聽
<ref聽local="sessionFactory"/>
聽聽
</property>
</bean>

<bean聽id="userDAO"聽class="com.test.UserDAOImp">
聽聽
<property聽name="sessionFactory">
聽聽聽
<ref聽local="sessionFactory"/>
聽聽
</property>
</bean>

<bean聽id="userDAOProxy"聽class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
聽聽
<property聽name="transactionManager">
聽聽聽
<ref聽bean="transactionManager"/>
聽聽
</property>
聽聽
<property聽name="target">
聽聽聽
<ref聽local="userDAO"/>
聽聽
</property>
聽聽
<property聽name="transactionAttributes">
聽聽聽
<props>
聽聽聽聽
<prop聽key="insert*">PROPAGATION_REQUIRED</prop>
聽聽聽聽
<prop聽key="get*">PROPAGATION_REQUIRED,readOnly</prop>
聽聽聽聽
<prop聽key="is*">PROPAGATION_REQUIRED,readOnly</prop>
聽聽聽
</props>
聽聽
</property>
</bean>

<bean聽name="/login"聽class="com.test.struts.action.LoginAction"聽singleton="false">
聽聽
<property聽name="userDAO">
聽聽聽
<ref聽bean="userDAOProxy"/>
聽聽
</property>
</bean>
</beans>
鐜板湪鍙互榪涜嫻嬭瘯浜嗭紒
鍦ㄧ紪鍐欎唬鐮佹湁閰嶇疆鍐呭鏃朵竴瀹氳娉ㄦ剰 hibernate 鍜?hibernate3 錛岃繖涓や釜鍖呯殑鍚嶅瓧灝卞彧宸竴涓瓧錛屽崈涓囦笉瑕佹湁閿欙紝鍚﹀垯鎵鵑敊璇彲鏄緢闅劇殑銆?/div>


nbt 2006-06-15 09:53 鍙戣〃璇勮
]]>AOP緙栫▼鍏ラ棬(杞澆)http://www.tkk7.com/nbtymm/archive/2006/06/09/51700.htmlnbtnbtFri, 09 Jun 2006 07:33:00 GMThttp://www.tkk7.com/nbtymm/archive/2006/06/09/51700.htmlhttp://www.tkk7.com/nbtymm/comments/51700.htmlhttp://www.tkk7.com/nbtymm/archive/2006/06/09/51700.html#Feedback0http://www.tkk7.com/nbtymm/comments/commentRss/51700.htmlhttp://www.tkk7.com/nbtymm/services/trackbacks/51700.html

Aspect Oriented Programming(AOP)錛岄潰鍚戝垏闈㈢紪紼嬶紝鏄竴涓瘮杈冪儹闂ㄧ殑璇濋銆侫OP涓昏瀹炵幇鐨勭洰鐨勬槸閽堝涓氬姟澶勭悊榪囩▼涓殑鍒囬潰榪涜鎻愬彇錛屽畠鎵闈㈠鐨勬槸澶勭悊榪囩▼涓殑鏌愪釜姝ラ鎴栭樁孌碉紝浠ヨ幏寰楅昏緫榪囩▼涓悇閮ㄥ垎涔嬮棿浣庤﹀悎鎬х殑闅旂鏁堟灉銆傛瘮濡傛垜浠渶甯歌鐨勫氨鏄棩蹇楄褰曚簡錛屼婦涓緥瀛愶紝鎴戜滑鐜板湪鎻愪緵涓涓湇鍔℃煡璇㈠鐢熶俊鎭殑錛屼絾鏄垜浠笇鏈涜褰曟湁璋佽繘琛屼簡榪欎釜鏌ヨ銆傚鏋滄寜鐓т紶緇熺殑OOP鐨勫疄鐜扮殑璇濓紝閭f垜浠疄鐜頒簡涓涓煡璇㈠鐢熶俊鎭殑鏈嶅姟鎺ュ彛(StudentInfoService)鍜屽叾瀹炵幇綾伙紙StudentInfoServiceImpl.java錛夛紝鍚屾椂涓轟簡瑕佽繘琛岃褰曠殑璇濓紝閭f垜浠湪瀹炵幇綾?StudentInfoServiceImpl.java)涓娣誨姞鍏跺疄鐜拌褰曠殑榪囩▼銆傝繖鏍風殑璇濓紝鍋囧鎴戜滑瑕佸疄鐜扮殑鏈嶅姟鏈夊涓憿錛熼偅灝辮鍦ㄦ瘡涓疄鐜扮殑綾婚兘娣誨姞榪欎簺璁板綍榪囩▼銆傝繖鏍峰仛鐨勮瘽灝變細鏈夌偣綣佺悙錛岃屼笖姣忎釜瀹炵幇綾婚兘涓庤褰曟湇鍔℃棩蹇楃殑琛屼負绱ц﹀悎錛岃繚鍙嶄簡闈㈠悜瀵硅薄鐨勮鍒欍傞偅涔堟庢牱鎵嶈兘鎶婅褰曟湇鍔$殑琛屼負涓庝笟鍔″鐞嗚繃紼嬩腑鍒嗙鍑烘潵鍛紵鐪嬭搗鏉ュソ鍍忓氨鏄煡璇㈠鐢熺殑鏈嶅姟鑷繁鍦ㄨ繘琛岋紝浣嗘槸鑳屽悗鏃ュ織璁板綍瀵硅繖浜涜涓鴻繘琛岃褰曪紝浣嗘槸鏌ヨ瀛︾敓鐨勬湇鍔′笉鐭ラ亾瀛樺湪榪欎簺璁板綍榪囩▼錛岃繖灝辨槸鎴戜滑瑕佽璁篈OP鐨勭洰鐨勬墍鍦ㄣ侫OP鐨勭紪紼嬶紝濂藉儚灝辨槸鎶婃垜浠湪鏌愪釜鏂歸潰鐨勫姛鑳芥彁鍑烘潵涓庝竴鎵瑰璞¤繘琛岄殧紱伙紝榪欐牱涓庝竴鎵瑰璞′箣闂撮檷浣庝簡鑰﹀悎鎬э紝鍙互灝辨煇涓姛鑳借繘琛岀紪紼嬨?br />聽聽聽聽鎴戜滑鐩存帴浠庝唬鐮佸叆鎵嬪惂錛岃瀹炵幇浠ヤ笂鐨勭洰鏍囷紝鎴戜滑鍙互浣跨敤涓涓姩鎬佷唬鐞嗙被(Proxy)錛岄氳繃鎷︽埅涓涓璞$殑琛屼負騫舵坊鍔犳垜浠渶瑕佺殑鍔熻兘鏉ュ畬鎴愩侸ava涓殑java.lang.reflect.Proxy綾誨拰java.lang.reflect.InvocationHandler鎺ュ彛涓烘垜浠疄鐜板姩鎬佷唬鐞嗙被鎻愪緵浜嗕竴涓柟妗堬紝浣嗘槸璇ユ柟妗堥拡瀵圭殑瀵硅薄瑕佸疄鐜版煇浜涙帴鍙o紱濡傛灉閽堝鐨勭洰鐨勬槸綾葷殑璇濓紝cglib涓烘垜浠彁渚涗簡鍙﹀涓涓疄鐜版柟妗堛傜瓑涓嬩細璇存槑涓よ呯殑鍖哄埆銆?br />涓銆佹帴鍙g殑瀹炵幇鏂規錛?br />1錛夐鍏堢紪鍐欐垜浠殑涓氬姟鎺ュ彛錛圫tudentInfoService.java錛夛細
public interface StudentInfoService{
聽void findInfo(String studentName);
}
聽聽聽聽 鍙婂叾瀹炵幇綾伙紙StudentInfoServiceImpl.java錛夛細
public class StudentInfoServiceImpl implements StudentInfoService{
聽public void findInfo(String name){
聽聽System.out.println("浣犵洰鍓嶈緭鍏ョ殑鍚嶅瓧鏄?"+name);
聽}
}
2錛夌幇鍦ㄦ垜浠渶瑕佷竴涓棩蹇楀姛鑳斤紝鍦╢indInfo琛屼負涔嬪墠鎵ц騫惰褰曞叾琛屼負錛岄偅涔堟垜浠氨棣栧厛瑕佹嫤鎴琛屼負銆傚湪瀹為檯鎵ц鐨勮繃紼嬩腑鐢ㄤ竴涓唬鐞嗙被鏉ユ浛鎴戜滑瀹屾垚銆侸ava涓負鎴戜滑鎻愪緵浜嗗疄鐜板姩鎬佷唬鐞嗙被鐨勬柟妗堬細

1'澶勭悊鎷︽埅鐩殑鐨勭被錛圡yHandler.java錛?br />import org.apache.log4j.Logger;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.lang.reflect.Method;

public class MyHandler implements InvocationHandler{
聽private Object proxyObj;
聽private static Logger log=Logger.getLogger(MyHandler.class);

聽public Object bind(Object obj){
聽聽this.proxyObj=obj;
聽聽return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
聽}

聽public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{
聽聽Object result=null;
聽聽try{
聽聽聽//璇峰湪榪欓噷鎻掑叆浠g爜錛屽湪鏂規硶鍓嶈皟鐢?br />聽聽聽log.info("璋冪敤log鏃ュ織鏂規硶"+method.getName());
聽聽聽result=method.invoke(proxyObj,args); //鍘熸柟娉?br />聽聽聽//璇峰湪榪欓噷鎻掑叆浠g爜錛屾柟娉曞悗璋冪敤
聽聽}catch(Exception e){
聽聽聽e.printStackTrace();
聽聽}
聽聽return result;
聽}
}
2'鎴戜滑瀹炵幇涓涓伐鍘傦紝涓轟簡鏂逛究鎴戜滑浣跨敤璇ユ嫤鎴被(AOPFactory.java)錛?br />public class AOPFactory{
聽private static Object getClassInstance(String clzName){
聽聽Object obj=null;
聽聽try{
聽聽聽Class cls=Class.forName(clzName);
聽聽聽obj=(Object)cls.newInstance();
聽聽}catch(ClassNotFoundException cnfe){
聽聽聽System.out.println("ClassNotFoundException:"+cnfe.getMessage());
聽聽}catch(Exception e){
聽聽聽e.printStackTrace();
聽聽}
聽聽return obj;
聽}

聽public static Object getAOPProxyedObject(String clzName){
聽聽Object proxy=null;
聽聽MyHandler handler=new MyHandler();
聽聽Object obj=getClassInstance(clzName);
聽聽if(obj!=null) {
聽聽聽proxy=handler.bind(obj);
聽聽}else{
聽聽聽System.out.println("Can't get the proxyobj");
聽聽聽//throw
聽聽}
聽聽return proxy;
聽}
}

3)鍩烘湰鐨勬嫤鎴笌鍏跺伐鍘傛垜浠兘瀹炵幇浜嗭紝鐜板湪嫻嬭瘯錛圕lientTest.java錛夛細
public class ClientTest{
聽public static void main(String[] args){
聽聽StudentInfoService studentInfo=(StudentInfoService)AOPFactory.getAOPProxyedObject("StudentInfoServiceImpl");
聽聽studentInfo.findInfo("闃塊");
聽}
}
杈撳嚭緇撴灉錛堢湅浣犵殑log4j璁劇疆錛夛細
[INFO]璋冪敤log鏃ュ織鏂規硶findInfo
浣犵洰鍓嶈緭鍏ョ殑鍚嶅瓧鏄?闃塊
聽聽聽聽 榪欐牱鎴戜滑闇瑕佺殑鏁堟灉灝卞嚭鏉ヤ簡錛屼笟鍔″鐞嗚嚜宸卞湪榪涜錛屼絾鏄垜浠疄鐜頒簡鏃ュ織鍔熻兘錛岃屼笟鍔″鐞?StudentInfoService)鏍規湰涓嶇煡閬撳瓨鍦ㄨ琛屼負鐨勩備絾鏄疛ava涓彁渚涚殑鍔ㄦ佷唬鐞嗙被鐨勫疄鐜版槸閽堝瀹炵幇浜嗘煇浜涙帴鍙g殑綾伙紝濡傛灉娌℃湁瀹炵幇鎺ュ彛鐨勮瘽錛屼笉鑳藉垱寤轟唬鐞嗙被錛岀湅浠ヤ笂閮ㄥ垎錛?br />return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
鐪嬪埌浜嗘病鏈夛紵obj.getClass().getInterfaces()瑕佹眰瀹炵幇浜嗘煇浜涙帴鍙c備互涓嬫彁渚涘摢浜涙病鏈夊疄鐜版帴鍙g殑瀹炵幇鏂規錛?br />
浜屻佸瓙綾葷殑瀹炵幇鏂規銆?br />聽聽聽聽聽 棣栧厛錛岃涓婄綉涓婥GLib鐨勫寘錛?a >http://sourceforge.net/project/showfiles.php?group_id=56933聽銆傝緗ソclasspath璺緞錛孋GLib涓巎ava鏍囧噯搴撴彁渚涚殑瀹炵幇鏂規涓嶅悓錛宑glib涓昏鏄熀浜庡疄鐜扮被錛堝StudentInfoServiceImpl.java)鎵╁睍涓涓瓙綾繪潵瀹炵幇銆備笌Dynamic Proxy涓殑Proxy鍜孖nvocationHandler鐩稿搴旓紝net.sf.cglib.proxy.Enhancer鍜孧ethodInterceptor鍦–GLib涓礋璐e畬鎴愪唬鐞嗗璞″垱寤哄拰鏂規硶鎴幏澶勭悊,浜х敓鐨勬槸鐩爣綾葷殑瀛愮被鑰屼笉鏄氳繃鎺ュ彛鏉ュ疄鐜版柟娉曟嫤鎴殑錛孍nhancer涓昏鏄敤浜庢瀯閫犲姩鎬佷唬鐞嗗瓙綾繪潵瀹炵幇鎷︽埅錛孧ethodInterceptor錛堟墿灞曚簡Callback鎺ュ彛錛変富瑕佺敤浜庡疄鐜癮round advice錛圓OP涓殑姒傚康錛夛細
聽聽聽聽 1錛夋垜浠殑涓氬姟澶勭悊錛圫tudentInfoServiceImpl.java錛夛細
public class StudentInfoServiceImpl{
聽public void findInfo(String name){
聽聽System.out.println("浣犵洰鍓嶈緭鍏ョ殑鍚嶅瓧鏄?"+name);
聽}
}
聽聽聽聽 2錛夊疄琛屼竴涓伐鍏鋒潵澶勭悊鏃ュ織鍔熻兘錛圓OPInstrumenter.java錛夛細
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
import org.apache.log4j.Logger;

public class AOPInstrumenter implements MethodInterceptor{
聽private Logger log=Logger.getLogger(AOPInstrumenter.class);
聽private Enhancer enhancer=new Enhancer();

聽public Object getInstrumentedClass(Class clz){
聽聽enhancer.setSuperclass(clz);
聽聽enhancer.setCallback(this);
聽聽return enhancer.create();
聽}

聽public Object intercept(Object o,Method method,Object[] args,MethodProxy proxy) throws Throwable{
聽聽log.info("璋冪敤鏃ュ織鏂規硶"+method.getName());
聽聽Object result=proxy.invokeSuper(o,args);
聽聽return result;
聽}

}
聽聽聽聽 3錛夋垜浠潵嫻嬭瘯涓涓嬶紙AOPTest.java錛夛細
public class AOPTest{
聽public static void main(String[] args){
聽聽AOPInstrumenter instrumenter=new AOPInstrumenter();
聽聽StudentInfoServiceImpl studentInfo=(StudentInfoServiceImpl)instrumenter.getInstrumentedClass(StudentInfoServiceImpl.class);
聽聽studentInfo.findInfo("闃塊");
聽}
}
聽聽 杈撳嚭緇撴灉涓庝互涓婄浉鍚屻?br />聽CGLib涓負瀹炵幇浠ヤ笂鐩殑錛屼富瑕佹彁渚涚殑綾?br />1)Enhancer錛歴etCallback(Callback) ,setSuperclass(Class) ,create()榪斿洖鍔ㄦ佸瓙綾籓bject
2)MethodInterceptor蹇呴』瀹炵幇鐨勬帴鍙o細intercept(Object,Method,Object[],MethodProxy)榪斿洖鐨勬槸鍘熸柟娉曡皟鐢ㄧ殑緇撴灉銆傚拰Proxy鍘熺悊涓鏍楓?/p>

涓夈佷互涓婄殑涓や釜綆鍗曞疄鐜癆OP鐨勬柟妗堥兘涓轟綘鍑嗗濂戒簡錛屼綘鍙互鑷繁緙栧啓嫻嬭瘯涓涓嬶紝浠ヤ笅綆鍗曚粙緇嶄竴涓婣OP鐨勫熀鏈蹇碉細
1錛塧spect錛堝垏闈級錛氬疄鐜頒簡cross-cutting鍔熻兘錛屾槸閽堝鍒囬潰鐨勬ā鍧椼傛渶甯歌鐨勬槸logging妯″潡錛岃繖鏍鳳紝紼嬪簭鎸夊姛鑳借鍒嗕負濂藉嚑灞傦紝濡傛灉鎸変紶緇熺殑緇ф壙鐨勮瘽錛屽晢涓氭ā鍨嬬戶鎵挎棩蹇楁ā鍧楃殑璇濇牴鏈病鏈変粈涔堟剰涔夛紝鑰岄氳繃鍒涘緩涓涓猯ogging鍒囬潰灝卞彲浠ヤ嬌鐢ˋOP鏉ュ疄鐜扮浉鍚岀殑鍔熻兘浜嗐?br />2錛塲ointpoint錛堣繛鎺ョ偣錛夛細榪炴帴鐐規槸鍒囬潰鎻掑叆搴旂敤紼嬪簭鐨勫湴鏂癸紝璇ョ偣鑳借鏂規硶璋冪敤錛岃屼笖涔熶細琚姏鍑烘剰澶栥傝繛鎺ョ偣鏄簲鐢ㄧ▼搴忔彁渚涚粰鍒囬潰鎻掑叆鐨勫湴鏂癸紝鍙互娣誨姞鏂扮殑鏂規硶銆傛瘮濡備互涓婃垜浠殑鍒囩偣鍙互璁や負鏄痜indInfo(String)鏂規硶銆?br />3錛塧dvice錛堝鐞嗛昏緫錛夛細advice鏄垜浠垏闈㈠姛鑳界殑瀹炵幇錛屽畠閫氱煡紼嬪簭鏂扮殑琛屼負銆傚鍦╨ogging閲岋紝logging advice鍖呮嫭logging鐨勫疄鐜頒唬鐮侊紝姣斿鍍忓啓鏃ュ織鍒頒竴涓枃浠朵腑銆俛dvice鍦╦ointpoint澶勬彃鍏ュ埌搴旂敤紼嬪簭涓備互涓婃垜浠湪MyHandler.java涓疄鐜頒簡advice鐨勫姛鑳?br />4錛塸ointcut錛堝垏鐐癸級錛歱ointcut鍙互鎺у埗浣犳妸鍝簺advice搴旂敤浜巎ointpoint涓婂幓錛岄氬父浣犱嬌鐢╬ointcuts閫氳繃姝e垯琛ㄨ揪寮忔潵鎶婃槑鏄劇殑鍚嶅瓧鍜屾ā寮忚繘琛屽尮閰嶅簲鐢ㄣ傚喅瀹氫簡閭d釜jointpoint浼氳幏寰楅氱煡銆?br />5錛塱ntroduction錛氬厑璁告坊鍔犳柊鐨勬柟娉曞拰灞炴у埌綾諱腑銆?br />6錛塼arget錛堢洰鏍囩被錛夛細鏄寚閭d簺灝嗕嬌鐢╝dvice鐨勭被錛屼竴鑸槸鎸囩嫭绔嬬殑閭d簺鍟嗗姟妯″瀷銆傛瘮濡備互涓婄殑StudentInfoServiceImpl.

7)proxy錛堜唬鐞嗙被錛夛細浣跨敤浜唒roxy鐨勬ā寮忋傛槸鎸囧簲鐢ㄤ簡advice鐨勫璞★紝鐪嬭搗鏉ュ拰target瀵硅薄寰堢浉浼箋?br />8錛墂eaving(鎻掑叆錛夛細鏄寚搴旂敤aspects鍒頒竴涓猼arget瀵硅薄鍒涘緩proxy瀵硅薄鐨勮繃紼嬶細complie time錛宑lassload time錛宺untime



nbt 2006-06-09 15:33 鍙戣〃璇勮
]]>鐜╃帺Spring涔婭OC(涓)(杞澆)http://www.tkk7.com/nbtymm/archive/2006/06/09/51655.htmlnbtnbtFri, 09 Jun 2006 03:57:00 GMThttp://www.tkk7.com/nbtymm/archive/2006/06/09/51655.htmlhttp://www.tkk7.com/nbtymm/comments/51655.htmlhttp://www.tkk7.com/nbtymm/archive/2006/06/09/51655.html#Feedback0http://www.tkk7.com/nbtymm/comments/commentRss/51655.htmlhttp://www.tkk7.com/nbtymm/services/trackbacks/51655.html
聽聽聽聽 Spring鐨勫姛鑳芥槸寰堝己澶х殑錛屽湪鍏垛滅粷涓嶅彂鏄庤嚜宸辮涓哄ソ鐨勮疆瀛愶紝鑰屽彧鍙戞槑鑷繁璁や負涓嶅ソ鐨勮疆瀛愨濈殑鎸囧鎬濇兂涓嬶紝閫氳繃鍏呭垎瀹炶返浜嗏滀竴鍒囧疄浜嬫眰鏄佲樺驚璇佹灦鏋勨欑殑宸ヤ綔鏂瑰紡鈥濈殑鐞嗚錛屽熀鏈笂鎶婅交閲忕駭鐨凧2EE搴旂敤妗嗘灦錛堝ORM銆丮VC絳夛級榪涜浜嗘暣鍚堬紝騫舵瀯鏋朵簡涓浜涘父鐢ㄧ殑鍔熻兘(濡侱AO)錛屽艦鎴愪簡涓涓姛鑳藉己澶х殑J2EE杞婚噺綰т紒涓氬簲鐢ㄦ鏋躲?br />銆銆鐒惰岋紝鎴栬鏄ぇ瀹跺Spring鎺屾彙寰楄繕涓嶉忓交鐨勭紭鏁呭惂錛岀湅鍒板緢澶氳蔣浠朵紒涓氫腑鐢ㄥ埌鐨凷pring鍔熻兘錛屽熀鏈笂澶у鏁伴兘鍙槸鐢ㄥ叾IOC鍔熻兘錛屾湁鏃跺欓檮甯︾敤浜嗗叾涓殑AOP浜嬪姟綆$悊鍔熻兘銆?br />銆銆IOC鍙夾OP铏界劧涓嶆槸Spring棣栧垱錛岀劧鑰屽叾鍦ㄨ繖涓ゅ潡閮芥槸鍋氬緱寰堜笉閿欑殑錛屽簲璇ヨ鏁翠釜Spring妗嗘灦灝辨槸鍥寸粫鐫鍏禝OC瀹炵幇鍙夾OP瀹炵幇鏋惰璧鋒潵鐨勩傛垜鎯籌紝娣卞叆鎸栨帢IOC銆丄OP浠ュ強Spring涓殑瀹炵幇錛屼嬌鐢ㄧ瓑錛屽浜庡垵瀛﹁呭府鍔╀細闈炲父澶э紝鍥犳錛屼粠鏈湡寮濮嬶紝澶у場鐨勩婄帺鐜㏒pring緋誨垪銆嬪皢浼撮殢澶у涓璧瘋蛋榪汭OC鍙夾OP鐨勪笘鐣屻?br />銆銆鐢變簬鏈漢姘村鉤鏈夐檺錛屾枃涓毦鍏嶆湁寰堝涓嶈凍鐢氳嚦閿欒涔嬪錛岃繕璇峰悇浣嶆湅鍙嬩笉鍚濇壒璇勬寚鏁欍?br />聽
涓銆両OC綆浠?/b>
銆銆IOC-鍏ㄧОInversion聽of聽Control錛屼腑鏂囪В閲婏細鎺у埗鍙嶈漿銆傚彟澶栵紝IOC鍙堢ОDI(鍏ㄧО)Dependency聽Injection錛屼腑鏂囪В閲婏細渚濊禆娉ㄥ叆銆?br />銆銆鍛靛懙錛岃繖浜涘悕璇嶆悶寰楁湁鐐瑰儚瀛﹀彜鏂囩殑鍛抽亾鍝堛傚緢澶氬ぇ甯堣繕閮借IOC涓湁涓涓憲鍚嶇殑濂借幈鍧炵悊璁猴細浣犲憜鐫鍒姩錛屽埌鏃舵垜浼氭壘浣犮備綘鍛嗙潃鍒姩錛屽埌鏃舵垜浼氭壘浣犮傜敱浜庢湰浜烘湭鍒拌繃濂借幈鍧炲弬鍔犺繃紺句細瀹炶返錛屽洜姝わ紝榪欏彞璇濈悊瑙f湁鐐瑰洶闅俱?br />銆銆IOC鏄竴縐嶆柊鐨勮璁℃ā寮忥紝鍗矷OC妯″紡錛岀郴緇熶腑閫氳繃寮曞叆瀹炵幇浜咺OC妯″紡鐨処OC瀹瑰櫒錛屽嵆鍙敱IOC瀹瑰櫒鏉ョ鐞嗗璞$殑鐢熷懡鍛ㄦ湡銆佷緷璧栧叧緋葷瓑錛屼粠鑰屼嬌寰楀簲鐢ㄧ▼搴忕殑閰嶇疆鍜屼緷璧栨ц鑼冧笌瀹為檯鐨勫簲鐢ㄧ▼搴忎唬鐮佸垎寮銆傚叾涓竴涓壒鐐瑰氨鏄氳繃鏂囨湰鐨勯厤浠舵枃浠惰繘琛屽簲鐢ㄧ▼搴忕粍浠墮棿鐩鎬簰鍏崇郴鐨勯厤緗紝鑰屼笉鐢ㄩ噸鏂頒慨鏀瑰茍緙栬瘧鍏蜂綋鐨凧ava浠g爜銆?br />銆銆褰撳墠姣旇緝鐭ュ悕鐨処OC瀹瑰櫒鏈夛細Pico聽Container銆丄valon聽銆丼pring銆丣Boss銆丠iveMind銆丒JB絳夛紝鍥藉唴鐢辨澘妗ラ噷浜鴻礋璐g殑鍥戒駭寮婧愰」鐩甁don妗嗘灦錛屼篃鏄叿鏈塈OC瀹瑰櫒鍔熻兘(鐢變簬娌℃潵寰楀強璁ょ湡鐮旇鍏舵簮鐮侊紝浼間箮jdon涓璉OC閮ㄤ喚鏄皟鐢≒ico鐨処OC瀹瑰櫒鍔熻兘鏉ュ疄鐜扮殑)銆?br />銆銆鍦ㄤ笂闈㈢殑鍑犱釜IOC瀹瑰櫒涓紝杞婚噺綰х殑鏈塒ico聽Container銆丄valon銆丼pring銆丠iveMind絳夛紝瓚呴噸閲忕駭鐨勬湁EJB錛岃屽崐杞誨崐閲嶇殑鏈夊鍣ㄦ湁JBoss錛孞don絳夈?br />銆銆
銆銆IOC絀剁珶鏄粈涔堬紵IOC鏄浣曚駭鐢熺殑?鐢ㄥ湪浠涔堝満鍚?涓轟粈涔堟垜浠互鍓嶄笉鐢↖OC錛岃岀幇鍦ㄨ鐢↖OC錛熲滅墿鏈夋湰鏈紝浜嬫湁緇堝鈥濓紝涓轟簡鏇村姞閫忓交鐨勭悊瑙h繖涓闂錛屽ぇ宄℃墦綆椾粠鑷繁鎵鐞嗚В鐨勯潰鍚戝璞?OO)璁捐鍙婄紪紼嬪彂灞曞巻紼嬫潵榪涜鍒嗘瀽錛屼篃璁歌繖鏍瘋兘璁㊣OC鐨勫垵瀛﹁呮洿鍔犱簡瑙OC鐨勫彂灞曠殑鍓嶅洜鍚庢灉錛屼簤鍙栧仛鍒扳滅煡鍏剁劧錛岀煡鍏舵墍浠ョ劧錛屼嬌鍏剁劧!鈥濄?br />銆銆鑻ュぇ瀹剁瓑涓嶆ヤ簡錛屽氨鐩存帴鐧懼害涓涓嬫湁鍏矷OC鐨勫叾瀹冩枃绔狅紝榪欐柟闈㈠浗鍐呭緢澶氬厛椹變滑宸茬粡浣滀簡寰堝浠嬬粛銆傚鍐頒簯鐨勩奍OC璇﹁В銆嬨佹澘妗ラ噷浜虹殑璁捐妯″紡鍙奍OC鐞嗚絳夈?br />聽
浜屻伮犳渶鑰佺殑OO緙栫▼
銆銆璁板緱鏇劇粡鐪嬨奣hink聽in聽Java銆嬫渶鏃╃増鏈殑鏃跺欙紝閲岄潰鏈夎繖涔堜竴鍙ヨ浜烘尟濂嬭瘽錛氫竴鍒囬兘鏄璞°傝繖鏃舵垜浠琌O緙栫▼鐨勬牳蹇冩槸鍥寸粫鐫闈㈠悜瀵硅薄緙栫▼鐨勪笁涓壒鎬у嵆鈥滅戶鎵庫濄佲滃皝瑁呪濄佲滃鎬佲濇潵灞曞紑鐨勩?br />2.1聽灝佽
銆銆閭f椂鎴戜滑瀛︿細浜嗗鐜板疄灝辯殑浜嬬墿鍙婅蔣浠舵ā鍨嬭繘琛屼簡鎶借薄銆傛瘮濡傝鎻忚堪涓鍙尗錛岄偅涔堣繖鏀尗搴旇鏈夆滈鑹測濄佲滈噸閲忊濄佲滃叕姣嶁濄佲滆劸姘斺濄佲滃嚭鐢熸棩鏈熲濈瓑灞炴э紝鍙﹀榪樻湁鈥滆窇鈥濄佲滃悆鈥濄佲滃彨鈥濄佲滅尗鎹夎侀紶鈥濈瓑鏂規硶銆傚Java浠g爜鏉ヨ〃紺猴紝澶ц嚧灝辨槸濡備笅錛?br />public聽Class聽Cat
{
private聽String聽color;//棰滆壊
private聽String聽weight;//閲嶉噺
private聽String聽sex;//鍏瘝
private聽String聽temper;//鑴炬皵
private聽String聽birthday;//鍑虹敓鏃ユ湡
private聽void聽run聽();//璺?br />private聽void聽eat聽(Food聽food);聽//鍚?椋熺墿)
private聽void聽shout(int聽type);//鍙?綾誨埆)
private聽boolean聽chase(Mice聽mice);//鐚崏鑰侀紶
}

2.2聽緇ф壙
銆銆鏈鏃╃殑OO緙栫▼鏃舵湡錛屾垜浠繕浼氬紩鍏ョ戶鎵匡紝榪樼粡甯擱紦鍔卞ぇ瀹跺鐢ㄧ戶緇紝璁や負緇ф壙灝辨槸OO緙栫▼鎬濇兂鐨勬牳蹇冦傜戶鎵跨殑鏍稿績灝辨槸鍥寸粫鐫濡備綍鎶婄被涓庣被涔嬮棿鍏鋒湁鍏卞悓鐗規х殑閮ㄤ喚鎶借薄鍒板熀綾諱腑銆傝涓鴻繖鏍蜂笉浣嗚兘浣跨敤浜哋O鐨勭壒鎬э紝榪樺噺灝戜簡寰堝瀛愮被鐨勪唬鐮併?br />銆銆鎴戜滑閫氳繃鏃ュ父鐢熸椿鐨勫父璇嗙煡閬擄紝鐚槸涓縐嶅姩鐗╋紝鍥犳鍔ㄧ墿鏈夌殑鐗規т粬鍩烘湰涓婇兘鏈夈備簬鏄紝濡傛灉鎴戜滑鐨勭郴緇熶腑涓嶄絾鏈夌尗錛岃繕浼氭湁寰堝鍏跺畠鐨勫姩鐗╁嚭鐜般傛垜浠氨浼氳璁′竴涓姩鐗╃被錛屾妸鎵鏈夊姩鐗╃殑鍏辨ф娊璞″埌涓涓熀綾諱腑銆傝繖閲岋紝鐚強鍔ㄧ墿鍩虹被鐨勪唬鐮佸ぇ鑷村涓嬶細
public聽abstract聽Class聽Animal{
private聽String聽color;//棰滆壊
private聽String聽weight;//閲嶉噺
private聽String聽sex;//鍏瘝
private聽String聽temper;//鑴炬皵
private聽String聽birthday;//鍑虹敓鏃ユ湡
private聽void聽run聽();//璺?br />private聽void聽eat聽(Food聽food);聽//鍚?椋熺墿)
private聽void聽shout(int聽type);//鍙?綾誨埆)
}
public聽Class聽Cat聽extends聽Animal
聽private聽int聽power;//鑳藉姏
聽private聽int聽agility;//鏁忔嵎搴?br />聽聽聽//聽聽鐚崏鑰侀紶鏄壒鏈夌殑鏂規硶
聽private聽boolean聽chase(Mice聽mice)聽{
聽聽return聽true;
聽};
}


2.3聽澶氭?/b>
銆銆榪欐椂鎴戜滑榪樹細涓嶆椂浣跨敤鍒癘O鐨勫彟澶栦竴涓壒鎬у鎬併傚鎬佹槸寰堥噸瑕佺殑涓闂ㄦ妧鏈紝鐒惰屽緢澶氭椂鍊欏嵈娌℃湁寰堝ソ鐨勭悊瑙e茍浣跨敤錛屽洖澶寸湅浠ュ墠鐨勪唬鐮侊紝鎴戜滑鐪嬪埌鏈夊緢澶氬湴鏂瑰睘浜庢晠寮勭巹铏氱殑瀚岀枒銆?br />銆銆鎺ヤ笂闈㈢殑渚嬪瓙錛屽亣濡傛垜浠鍐欎竴涓杺鍏誨疇鐗?鏈夌尗銆佺嫍銆佺尓銆佽憊銆佽侀紶絳?鐨勭▼搴忋傚埄鐢↗ava鐨勫鎬佺壒鎬э紝鎴戜滑鐨勫ぇ鑷翠唬鐮佸涓嬶細
public聽class聽PetManage聽{
聽//鍠傞鎴戠殑瀹犵墿
聽public聽void聽feeding(Animal聽a)
聽{聽聽
聽}聽
聽/**
聽聽*聽@param聽args
聽聽*/
聽public聽static聽void聽main(String[]聽args)聽{聽
聽聽Animal聽myPet=new聽Cat();
聽聽PetManage聽pm=new聽PetManage();聽聽聽聽聽
聽聽pm.feeding(myPet);
聽}
}
銆銆閫氳繃浣跨敤澶氭佺壒鎬э紝鍝竴澶╄嫢鎴戜滑鐨勪笉鍠滄鐚紝鑰屾槸鍠滄鍏葷尓鐨勬椂鍊欙紝鍙鎶妌ew聽Cat()鍙樻垚new聽Pig()錛屽嵆鍙?br />聽
2.4聽瀵硅薄鐢熷懡鍛ㄦ湡
銆銆榪欎竴闃舵鐨凮O紼嬪簭涓紝鎴戜滑鐭ラ亾瑕佺敤涓涓璞$殑鏃跺欙紝灝辮浣跨敤Java涓殑鍏抽敭瀛梟ew鏉ョ敓鎴愪竴涓潵鐢ㄥ嵆鍙侽O瀵逛簬鎴戜滑鏉ヨ錛屼竴鍒囬兘鏄偅涔堢畝鍗曪紝寰堝鏃跺欑敋鑷蟲劅瑙塐O璺烵P鐨勭紪紼嬫柟娉曚篃娌″お澶у尯鍒備唬鐮佸涓嬶細
Cat聽myCat=new聽Cat();//鍒涘緩涓鏀叿浣撶殑鐚?br />myCat.shout();//鍙竴澹?br />銆銆姝ゆ椂錛屾垜浠Java铏氭嫙鏄潪甯鎬俊浠葷殑錛屾垜浠殑鎬濇兂涔熷緢鍗曠函錛屾垜浠煡閬揓ava瀵硅薄鐨勭敓鍛藉紑濮嬩簬new鍏抽敭璇嶃傛垜浠笉澶叧蹇冨璞$敓鍛界殑緇撴潫錛屾垜浠煡閬揓ava鏈変竴涓瘮C璇█鍘嗗銆佹櫤鑳藉寲鐨勫瀮鍦炬敹闆嗗櫒錛屼粬浼氬府鎴戜滑鑷繁鐨勬竻鐞嗗唴瀛樹腑涓嶇敤鐨勫璞°?br />銆銆褰撶劧錛屼篃鏈夌殑浜虹敱浜庡鍨冨溇鏀墮泦鍣ㄥ繝璇氬害鐨勬鐤戯紝涓嶆斁蹇冨瀮鍦炬敹闆嗗櫒鐨勮兘鍔涳紝浜庢槸鍦ㄧ▼搴忎腑緇忓父瑕佸姞涓鍙ョ被浼尖渕yPet=null鈥濈殑浠g爜鏉ョ粨鏉熷璞$殑鐢熷懡銆?br />銆銆褰撶劧錛屾垜浠篃鐭ラ亾鏈変竴浜涘閮ㄨ祫婧愬鏁版嵁搴撹繛鎺ョ瓑錛岄渶瑕佹墜鍔ㄧ啛鎮夎祫婧愩備簬鏄煡閬撳湪浣跨敤綾諱技璧勬簮鐨勬椂鍊欏繀欏婚兘鍔犱笂涓鍙ワ細conn.close()錛屾湁鏃跺欒繕瑕佸湪close()鍚庨潰鍐嶅姞涓鍙ワ細conn=null銆傚懙鍛碉紝闈炲父鏈夋剰鎬濄?br />聽
2.5灝忕粨
銆銆鐜板湪鐪嬫潵錛屽叾瀹為偅鏃剁‘瀹炵姱浜嗗緢澶氬辜紼氱殑閿欒錛屼篃璧頒簡涓嶅皯鐨勫集璺紝鍋氫簡寰堝鐢昏泧娣昏凍鐨勫伐浣滐紝鍐欎簡寰堝闅句笌緇存姢鐨勪唬鐮併?br />銆銆瀵規瘮浠婂ぉ鐨処OC妯″紡錛岃嫢瑕佷粠鏃╃殑OO鏂規硶涓‖瑕佹壘涓涓被浼糞pring鐨勫鍣ㄧ殑璇濓紝閭e氨鏄細鈥滅▼搴忓憳錛婮VM鏈韓鈥濄傛槸紼嬪簭鍛樹互鍙奐VM涓璧鋒垜浠鐞嗗璞$殑鐢熷懡鍛ㄦ湡銆佸璞′箣闂寸殑鍏崇郴絳夈傞偅鏃跺欒嫢鏈変換浣曞彉鍔ㄩ兘闇瑕佹敼浠g爜錛岋紙铏界劧濂界殑璁捐浠g爜淇敼浼氶潪甯稿皯錛屼絾涔熷緱鏀癸紒錛夛紝鐒跺悗緙栬瘧錛岀劧鍚庢嬁鍒版祴璇曠幆澧冨強鐢ㄦ埛鐜涓墽琛屻傚姝ゅ弽澶嶏紝騫存棩澶嶄竴鏃ャ佸勾澶嶄竴騫淬?br />銆銆閭f椂鎴戜滑鐨勪唬鐮佸鐢ㄧ敤寰楁渶澶氱殑灝辨槸OO鐨勭戶鎵垮姛鑳斤紝鍙﹀榪樻湁寰堝OP鏂規硶涓甫榪囨潵鐨勫嚱鏁般?br />銆銆鏈枃涓秹鍙婂埌鐨勫嚑涓畝鍗曟簮鐮侊紝璇峰埌EasyJF寮婧愬洟闃熷畼緗戜笅杞斤紝鍦板潃錛?br />銆銆http://www.easyjf.com/html/bbs/20060602/12718636-1843943.htm?ejid=1287314863003738

銆銆


nbt 2006-06-09 11:57 鍙戣〃璇勮
]]>
主站蜘蛛池模板: 亚洲精品成人久久久| 亚洲精品国产电影| 亚洲精品成a人在线观看| 亚洲国产精品国自产拍电影| 亚洲日韩精品无码专区| 一级毛片无遮挡免费全部| 84pao国产成视频免费播放| 国产v片免费播放| 亚洲免费视频网站| 美女被免费视频网站a| 日韩精品无码一区二区三区免费| 日韩高清在线高清免费| 亚洲AV日韩AV鸥美在线观看| 国产精品亚洲精品久久精品| 久久久久成人精品免费播放动漫| 午夜免费福利网站| 亚洲av日韩av高潮潮喷无码| 国产亚洲视频在线观看| 久久久久久国产精品免费无码| 国产三级免费电影| 亚洲精品第一国产综合精品| 搜日本一区二区三区免费高清视频| 67194熟妇在线永久免费观看| 亚洲欧洲精品成人久久曰影片 | 亚洲小说图片视频| 久久99久久成人免费播放| 成人超污免费网站在线看| 亚洲日本精品一区二区| 黄页免费视频播放在线播放| 免费能直接在线观看黄的视频| 国产精品亚洲综合专区片高清久久久| 亚洲人成网网址在线看| 黄页免费在线观看| 亚洲美女在线国产| 亚洲av午夜电影在线观看| 亚洲免费视频播放| 亚洲av无码专区在线播放| 一级做a免费视频观看网站| 日韩免费电影在线观看| 亚洲日本在线看片| 两性色午夜免费视频|