在Javaè¯è¨€ä¸ï¼ŒJDBCåQˆJava DataBase ConnectionåQ‰æ˜¯åº”用½E‹åºä¸Žæ•°æ®åº“沟通的桥æ¢,
  å³Javaè¯è¨€é€šè¿‡JDBC技术访问数æ®åº“。JDBC是一¿U“开æ”ä€çš„æ–ÒŽ¡ˆåQŒå®ƒä¸ºæ•°æ®åº“应用开å‘äh员﹑数æ®åº“å‰å°å·¥å…·å¼€å‘äh员æä¾›äº†ä¸€¿Uæ ‡å‡†çš„åº”ç”¨½E‹åºè®¾è®¡æŽ¥å£åQŒä‹Éå¼€å‘äh员å¯ä»¥ç”¨¾U¯Javaè¯è¨€¾~–写完整的数æ®åº“应用½E‹åºã€‚JDBCæä¾›ä¸¤ç§APIåQŒåˆ†åˆ«æ˜¯é¢å‘å¼€å‘äh员的APIå’Œé¢å‘底层的JDBC驱动½E‹åºAPIåQŒåº•层主è¦é€šè¿‡ç›´æŽ¥çš„JDBC驱动和JDBC-ODBC桥驱动实çŽîC¸Žæ•°æ®åº“çš„˜qžæŽ¥ã€?/p>
  一般æ¥è¯ß_¼ŒJava应用½E‹åºè®‰K—®æ•°æ®åº“çš„˜q‡ç¨‹åQˆå¦‚å›?所½Cºï¼‰æ˜¯ï¼š
  ①装载数æ®åº“驱动½E‹åºåQ?/p>
  ②通过JDBC建立数æ®åº“连接;
  ③访问数æ®åº“åQŒæ‰§è¡ŒSQLè¯å¥åQ?/p>
  ④æ–开数æ®åº“连接ã€?/p>
2.¾lƒä¹ åšä¸€ä¸ªå®žä¾‹ï¼š
一个用æˆäh³¨å†Œç³»¾lŸï¼Œç”¨æˆ·é€šè¿‡¾|‘页输入相关信æ¯åQšæ³¨å†ŒIDåøP¼Œå¯†ç åQŒEMAILåQŒè‹¥æ³¨å†ŒæˆåŠŸåQŒåˆ™˜q”回æˆåŠŸæç¤ºä¿¡æ¯åQŒå之出现注册失败æ½CÞZ¿¡æ¯ã€?
以下是相å…Ïx–‡ä»¶çš„éƒ¨åˆ†æ ¸å¿ƒä»£ç ã€?
™å¹ç›®å»ºç«‹åQ?
æ£å¼å¼€å‘å‰åQŒéœ€è¦åœ¨TocmatåQˆæˆ‘çš„tomcat装在c: omcatåQ‰ä¸å»ºç«‹æ¤é¡¹ç›®ã€‚比较快的一¿Uå¾ç«‹æ–¹å¼äØ“åQšåœ¨C: omcatwebapps下新建目录teståQŒå†ž®†C: omcatwebappsstruts-example下的
WEB-INF目录拯‚´åˆ°test目录下,然厞®†testWEB-INF下的srcå’Œclasses目录清空åQŒä»¥åŠstruts-config.xmlæ–‡äšgä¸å†…å®Òޏ…½Iºå³å¯ã€‚è¿™æ øP¼Œæˆ‘们需è¦çš„Struts¾cÕdŒ…åŠç›¸å…³çš„é…置文äšgž®±éƒ½é½äº†ã€?
开呿—¶åQŒå°†JSPæ–‡äšg攑֜¨test目录下,Java原文件放在testWEB-INFsrc下,¾~–译åŽçš„¾cÀL–‡ä»¶æ”¾åœ¨testWEB-INFclasses下ã€?
注册™åµé¢åQšreguser.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="/WEB-INF/Struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/Struts-html.tld" prefix="html" %>
<html:html locale="true">
<head>
<title>RegUser</title>
<html:base/>
</head>
<body bgcolor="white">
<html:errors/>
<html:form action="/regUserAction" focus="logname">
<table border="0" width="100%">
<tr>
<th align="right">
Logname:
</th>
<td align="left">
<html:text property="logname" size="20" maxlength="20"/>
</td>
</tr>
<tr>
<th align="right">
Password:
</th>
<td align="left">
<html:password property="password" size="20" maxlength="20"/>
</td>
</tr>
<tr>
<th align="right">
E-mail:
</th>
<td align="left">
<html:password property="email" size="30" maxlength="50"/>
</td>
</tr>
<tr>
<td align="right">
<html:submit property="submit" value="Submit"/>
</td>
<td align="left">
<html:reset/>
</td>
</tr>
</table>
</html:form>
</body>
</html:html>
æ¤JSP™åµé¢ä¸åŒäºŽæ™®é€šçš„JSP™åµï¼Œå› äØ“å®ƒå¤§é‡è¿ç”¨äº†taglibåQŒè¿™äº›taglib对åˆå¦è€…而言åQŒå¯èƒ½éš¾äºŽæŽŒæ¡ï¼Œå¯è¿™å´æ˜¯Struts的精åŽä¹‹ä¸€ã€‚絋z»è¿ç”¨ï¼Œž®†å¤§å¤§æé«˜å¼€å‘效率ã€?
Struts-config.xmlåQ?
<Struts-config>
<form-beans>
<form-bean name="regUserForm"
type="org.cjea.Struts.example. RegUserForm "/>
</form-beans>
<action-mappings>
<action path="/regUserAction"
type=" org.cjea.Struts.example.RegUserAction "
attribute=" regUserForm "
scope="request"
validate="false">
<forward name="failure" path="/ messageFailure.jsp"/>
<forward name="success" path="/ messageSuccess.jsp"/>
</action>
</action-mappings>
</Struts-config>
Strutsçš„æ ¸å¿ƒæ˜¯ControlleråQŒå³ActionServletåQŒè€ŒActionServletçš„æ ¸å¿ƒå°±æ˜¯Struts-config.xmlåQŒStruts-config.xml集ä¸äº†æ‰€æœ‰é¡µé¢çš„坯Dˆªå®šä¹‰ã€‚对于大型的WEB™å¹ç›®åQŒé€šè¿‡æ¤é…¾|®æ–‡ä»¶å³å¯è¿…速把æ¡å…¶è„‰ç»œåQŒè¿™ä¸ç®¡æ˜¯å¯¹äºŽå‰æœŸçš„å¼€å‘,˜q˜æ˜¯åŽæœŸçš„维护或å‡çñ”都是大有裨益的。掌æ¡Struts-config.xml是掌æ¡Struts的关键所在ã€?
FormBeanåQšRegUserForm
package org.cjea.Struts.example;
import javax.Servlet.http.HttpServletRequest;
import org.apache.Struts.action.ActionForm;
import org.apache.Struts.action.ActionMapping;
public final class RegUserForm extends ActionForm{
private String logname;
private String password;
private String email;
public RegUserForm(){
logname = null;
password = null;
email = null;
}
public String getLogName() {
return this.logname;
}
public void setLogName(String logname) {
this.logname = logname;
}
public void setPassWord(String password) {
this.password = password;
}
public String getPassWord() {
return this.password;
}
public void setEmail(String email) {
this.email = email;
}
public String getEmail() {
return this.email;
}
public void reset(ActionMapping mapping, HttpServletRequest request)
{
logname = null;
password = null;
email = null;
}
}
æ¯ä¸€ä¸ªFormBean 都必™åÈ‘ô承ActionForm¾c»ï¼ŒFormBean是对™åµé¢è¯äh±‚çš„å°è£…ã€‚å³æŠŠHTTP request ž®è£…在一个对象ä¸åQŒéœ€è¦è¯´æ˜Žçš„一点就是多个HTTP requestå¯ä»¥å…Þq”¨ä¸€ä¸ªFormBeanåQŒä¾¿äºŽç»´æŠ¤å’Œé‡ç”¨ã€?
ActionBeanåQšRegUserAction
package org.cjea.Struts.example;
import javax.Servlet.http.*;
import org.apache.Struts.action.*;
public final class RegUserAction extends Action
{
public ActionForward perform(ActionMapping mapping,
ActionForm form, HttpServletRequest req,
HttpServletResponse res)
{
String title = req.getParameter("title");
String password = req.getParameter("password");
String email = req.getParameter("email");
/*
å–得用户è¯äh±‚,åšç›¸åº”æ•°æ®åº“æ“作åQŒç•¥
*/
}
}
FormBeançš„äñ”生是ä¸ÞZº†æä¾›æ•°æ®¾l™ActionBeanåQŒåœ¨ActionBeanä¸å¯ä»¥å–å¾—FormBeanä¸å°è£…的数æ®åQŒç»ç›¸åº”的逻辑处ç†åŽï¼Œè°ƒç”¨ä¸šåŠ¡æ–ÒŽ³•完æˆç›¸åº”ä¸šåŠ¡è¦æ±‚ã€?
Servlet的演å˜ï¼šåœ¨å¸¸è§„çš„ JSPåQŒServletåQŒJavaBean三层¾l“æž„ä¸ï¼ŒJSP实现View的功能,Servlet实现Controller的功能,JavaBean实现Model的实现ã€?
在Strutsä¸ï¼Œž®†å¸¸è§„情况下的Servlet拆分与ActionServletã€FormBeanã€ActionBean三个部分。ActionServleté…åˆStruts-config.xmlåQŒä¸“èŒå®Œæˆé¡µé¢å¯¼èˆªï¼Œè€Œä¸å†è´Ÿè´£å…·ä½“的数æ®èŽ·å–与相应逻辑åQŒè¿™ä¸¤éƒ¨åˆ†åŠŸèƒ½ç”±FormBeanå’ŒActionBeanæ¥å®Œæˆã€?
3.Struts优缺�
优点åQ?
Strutsè·ŸTomcatã€Turbine½{‰è¯¸å¤šApache™å¹ç›®ä¸€æ øP¼Œæ˜¯å¼€æºèÊYä»Óž¼Œ˜q™æ˜¯å®ƒçš„一大优ç‚V€‚ä‹Éå¼€å‘者能更深入的了解其内部实现机制ã€?
除æ¤ä¹‹å¤–åQŒStruts的优点主è¦é›†ä¸ä½“现在两个斚w¢åQšTaglib和页é¢å¯¼èˆªã€‚Taglib是Strutsçš„æ ‡è®°åº“åQŒçµ‹zÕdŠ¨ç”¨ï¼Œèƒ½å¤§å¤§æé«˜å¼€å‘效率。å¦å¤–,ž®Þq›®å‰å›½å†…çš„JSPå¼€å‘者而言åQŒé™¤äº†ä‹É用JSPè‡ªå¸¦çš„å¸¸ç”¨æ ‡è®°å¤–åQŒå¾ˆž®‘å¼€å‘自å·Þqš„æ ‡è®°åQŒæˆ–许Struts是一个很好的èµïL‚¹ã€?
关于™åµé¢å¯ÆDˆªåQŒæˆ‘è®¤äØ“é‚£å°†æ˜¯ä»ŠåŽçš„一个å‘展方å‘,事实上,˜q™æ ·åšï¼Œä½¿ç³»¾lŸçš„è„‰ç»œæ›´åŠ æ¸…æ™°ã€‚é€šè¿‡ä¸€ä¸ªé…¾|®æ–‡ä»Óž¼Œå›_¯æŠŠæ¡æ•´ä¸ª¾pÈ»Ÿå„部分之间的è”ç³»åQŒè¿™å¯¹äºŽåŽæœŸçš„维护有ç€èŽ«å¤§çš„å¥½å¤„ã€‚å°¤å…¶æ˜¯å½“å¦ä¸€æ‰¹å¼€å‘者接手这个项目时åQŒè¿™¿Uä¼˜åŠ¿ä½“çŽ°å¾—æ›´åŠ æ˜Žæ˜¾ã€?
¾~ºç‚¹åQ?
Taglib是Struts的一大优势,但对于åˆå¦è€…而言åQŒå´éœ€è¦ä¸€ä¸ªæŒ¾lå¦ä¹ çš„˜q‡ç¨‹åQŒç”šè‡Œ™¿˜ä¼šæ‰“ä¹×ƒ½ ¾|‘页¾~–å†™çš„ä¹ æƒ¯ï¼Œä½†æ˜¯åQŒå½“ä½ ä¹ æƒ¯äº†å®ƒæ—¶åQŒä½ 会觉得它真的很棒ã€?
Strutsž®†MVCçš„Controllerä¸€åˆ†äØ“ä¸‰ï¼Œåœ¨èŽ·å¾—ç»“æž„æ›´åŠ æ¸…æ™°çš„åŒæ—¶åQŒä¹Ÿå¢žåŠ äº†ç³»¾lŸçš„夿‚度ã€?
Struts从äñ”生到现在˜q˜ä¸åˆ°åŠòqß_¼Œä½†å·²é€æ¥‘Šæ¥‘Šå¤š˜q用于商业èÊY件。虽然它现在˜q˜æœ‰ä¸å°‘¾~ºç‚¹åQŒä½†å®ƒæ˜¯ä¸€¿Uéžå¸æ€¼˜¿U€çš„J2EE MVC实现方å¼åQŒå¦‚æžœä½ çš„ç³»¾lŸå‡†å¤‡é‡‡ç”¨J2EE MVCæž¶æž„åQŒé‚£ä¹ˆï¼Œä¸å¦¨è€ƒè™‘一下Strutsã€?
4.Struts实施¾l验åQ?
1)ã€åŸºäºŽStruts架构的项目开å‘ï¼Œé¦–å…ˆéœ€è¦æœ‰ä¸€ä¸ªå¾ˆå¥½çš„æ•´ä½“规划åQŒæ•´ä¸ªç³»¾lŸä¸åŒ…æ‹¬å“ªå‡ ä¸ªæ¨¡å—,æ¯ä¸ªæ¨¡å—å„需è¦å¤šž®‘FormBeanå’ŒActionBean½{‰ï¼Œè€Œä¸”最好有专ähè´Ÿè´£Struts-config.xml的管ç†ã€‚å¼€å‘基于Struts的项目的隄¡‚¹åœ¨äºŽé…ç½®½Ž¡ç†åQŒå°¤å…¶æ˜¯å¯¹Struts-config.xml的管ç?
2)ã€å¦‚æžœä½ çš„é¡¹ç›®éžå¸¸ç´§åQŒåƈ且项目组ä¸åˆæ²¡æœ‰å¯Œæœ‰¾l验的Strutså¼€å‘ähå‘˜ï¼Œå»ø™®®ä¸è¦å†’然采用Struts。Struts的掌æ¡éœ€è¦ä¸€ä¸ªè¿‡½E‹ï¼Œå¯¹äºŽä¸€ä¸ªç†Ÿ¾lƒçš„JSP½E‹åºå‘˜ï¼Œè‡ªå¦å¤§æ¦‚需è¦åŠä¸ªæœˆå·¦å³çš„æ—¶é—´ã€‚如果结åˆtitlsåQŒåˆ™éœ€è¦æ›´é•¿çš„æ—‰™—´
3)ã€å¦‚æžœä½ åœ¨ç½‘™åµä¸å¤§é‡˜q用taglibåQŒé‚£ä¹ˆä½ 的美工将åšå‡ºéƒ¨åˆ†ç‰ºç‰²ã€‚å½“ä½ ç»“åˆTilesåQŒåŠŸèƒ½å¢žå¼ºçš„åŒæ—¶åQŒè¿™¿U牺牲尤为明显。当ç„Óž¼Œä½ 对功能和美观的å–èˆç”׃½ 自己军_®š
4)ã€Taglib是一个好东西åQŒä½†ç‰|´»˜q用它å´éœ€è¦ä¸€ä¸ªè¿‡½E‹ï¼Œå¦‚æžœä½ ä¸æƒ›_œ¨Taglib上花太多的时é—ß_¼Œé‚£ä¹ˆåªéœ€ç†è§£ä¸ŽFORMæœ‰å…³çš„å‡ ä¸ªæ ‡è®ŽÍ¼Œå…¶å®ƒçš„æ ‡è®°å°±æ”„¡€å§ï¼Œä»¥åŽå†çœ‹åQŒå…ˆåŽÈ ”½I¶ActionServletå’ŒStruts-config.xmlåQŒä½ 会觉得很有戞®±æ„Ÿ
5)ã€Struts是å¦åªé€‚åˆäºŽå¤§åž‹é¡¹ç›®å‘¢åQŸNoåQStruts适åˆäºŽå„¿U大ž®çš„™å¹ç›®åQŒå½“ç„Óž¼Œå¯¹äºŽå¤§åž‹™å¹ç›®åQŒå®ƒæ‰€ä½“现出æ¥çš„ä¼˜åŠ¿æ›´åŠ æ˜Žæ˜¾ã€?/P>
æ¤å¤–Java Web¾~–程å¦ä¹ çš„é‡ç‚¹è¦æ”‘Öœ¨Web Application的设计模å¼ä¸ŠåQŒå¦‚何进行业务逻辑的分æžï¼Œòq¶ä¸”˜q›è¡Œåˆç†çš„设计,按照MVC设计模å¼çš„è¦æ±‚,˜q用Servletå’?/SPAN>JSP分别完æˆä¸åŒçš„逻辑层,掌æ¡å¦‚何åœ?/SPAN>Servletå’?/SPAN>JSP之间˜q›è¡Œ‹¹ç¨‹çš„æŽ§åˆ¶å’Œæ•°æ®çš„共享,以åŠWeb Application应该如何é…置和部¾|ŒÓ€?/SPAN>
***************************************J2EE¾~–程*********************************************
  以上的å¦ä¹ 过½E‹å¦‚果是比较™åºåˆ©çš„è¯åQŒè¿›è¡Œåˆ°˜q™ä¸€æ¥ï¼Œéš‘Öº¦åˆé™¡ç„¶æé«˜ã€‚å› ä¸ÞZ¸Šé¢çš„çŸ¥è¯†å†…å®¹éƒ½æ˜¯åªæ¶‰åŠä¸€ä¸ªæ–¹é¢ï¼Œè€ŒåƒEJBåQ?/SPAN>JMSåQ?/SPAN>JTA½{‰æ ¸å¿ƒçš„J2EEè§„èŒƒå¾€å¾€æ˜¯å‡ ¿U?/SPAN>Java技术的¾l¼åˆ˜q用的结æ™Óž¼Œæ‰€ä»¥æŽŒæ¡è“væ¥éš¾åº¦æ¯”较大ã€?/SPAN>
  首先一定è¦å¦ä¹ å¥?/SPAN>JNDIåQ?/SPAN>JNDIæ˜?/SPAN>App Serverå®šä½æœåŠ¡å™¨èµ„æºï¼ˆEJB¾l„äšgåQ?/SPAN>DatasouceåQ?/SPAN>JMSåQ‰æŸ¥æ‰¾æ–¹æ³•,如果å¯?/SPAN>JNDIä¸ç†Ÿæ‚‰çš„è¯ï¼ŒEJBåQ?/SPAN>JMS˜q™äº›ä¸œè¥¿å‡ 乎å¦ä¸ä¸‹åŽ»ã€?/SPAN>JNDI其实ž®±æ˜¯javax.naming.*˜q™ä¸ªåŒ…,˜q用èµäh¥å¾ˆç®€å•。难点在于æœåŠ¡å™¨èµ„æºæ–‡äšg的酾|®ã€‚对于æœåŠ¡å™¨èµ„æºæ–‡äšg的酾|®ï¼Œž®±éœ€è¦çœ‹çœ‹ä¸“门的文档规范了,比如web.xml的写法,ejb-jar.xml的写法牽{‰ã€‚é’ˆå¯Òޝ¿Uä¸åŒçš„App ServeråQŒè¿˜æœ‰è‡ªå·Þqš„æœåŠ¡èµ„æºé…置文äšgåQŒä¹Ÿæ˜¯éœ€è¦ç†Ÿæ‚‰çš„ã€?/SPAN>
  然åŽå¯ä»¥å¦ä¹ JTAåQŒä¸»è¦æ˜¯è¦ç†è§?/SPAN>JTA对于事务的控制的æ–ÒŽ³•åQŒä»¥åŠè¯¥åœ¨ä»€ä¹ˆåœºåˆä‹Éç”?/SPAN>JTA。这里å¯ä»¥ç®€å•的举个例ååQŒæˆ‘们知é“一般情况å¯ä»¥å¯¹äºŽä¸€ä¸ªæ•°æ®åº“˜qžæŽ¥˜q›è¡Œäº‹åŠ¡æŽ§åˆ¶(conn.setAutoCommit(false),....,conn.commit())åQŒåšä¸ÞZ¸€ä¸ªåŽŸåæ“ä½œï¼Œä½†æ˜¯å‡è®¾æˆ‘çš„ä¸šåŠ¡éœ€æ±‚æ˜¯è¦æŠŠå¯¹ä¸¤ä¸ªä¸åŒæ•°æ®åº“çš„æ“作åšä¸ÞZ¸€ä¸ªåŽŸåæ“ä½œï¼Œä½ èƒ½åšçš„到å—åQŸè¿™æ—¶å€™åªèƒ½ç”¨JTA了。å‡è®¾æ“作过½E‹æ˜¯å…ˆå¾€Aæ•°æ®åº“æ’一æ¡è®°å½•,然åŽåˆ 除Bæ•°æ®åº“å¦ä¸€ä¸ªè®°å½•ï¼Œæˆ‘ä»¬è‡ªå·±å†™ä»£ç æ˜¯æŽ§åˆ¶ä¸äº†æŠŠæ•´ä¸ªæ“作åšä¸ÞZ¸€ä¸ªåŽŸåæ“ä½œçš„ã€‚ç”¨JTAçš„è¯åQŒç”±App Serveræ¥å®ŒæˆæŽ§åˆ¶ã€?/SPAN>
  在å¦ä¹?/SPAN>EJB之å‰è¦å¦ä¹ 对象åºåˆ—化å’?/SPAN>RMIåQ?/SPAN>RMIæ˜?/SPAN>EJB的基¼‹€ã€‚接ç€å¦ä¹ JMSå’?/SPAN>EJBåQŒå¯¹äº?/SPAN>EJBæ¥è¯´åQŒæœ€å…³é”®æ˜¯è¦ç†è§£EJB是如何通过RMIæ¥å®žçް坹˜qœç«¯å¯¹è±¡çš„调用的åQŒä»¥åŠåœ¨ä»€ä¹ˆæƒ…况下è¦ç”¨åˆ?/SPAN>EJBã€?/SPAN>
  在å¦ä¹ 完EJBåQ?/SPAN>JMS˜q™äº›ä¸œè¥¿ä¹‹åŽåQŒä½ å¯èƒ½ä¼šæ„è¯†åˆ°è¦æ€¥ä¸å¯å¾…å¦ä¹ 两个领域的知识,一个是UMLåQŒå¦ä¸€ä¸ªæ˜¯Design Patternã€?/SPAN>Javaä¼ä¸šè½¯äšg的设计éžå¸”R‡è§†æ¡†æž?/SPAN>(Framework)的设计,一个好的èÊY件框架是软äšg开呿ˆåŠŸçš„å¿…è¦æ¡äšg。在˜q™ä¸ªæ—¶å€™ï¼Œåº”该开始把å¦ä¹ çš„é‡ç‚ÒŽ”¾åœ¨è®¾è®¡æ¨¡å¼å’Œæ¡†æž¶çš„å¦ä¹ 上åQŒé€šè¿‡å¦ä¹ 和实际的¾~–程¾léªŒæ¥æŽŒæ?/SPAN>EJB的设计模å¼å’ŒJ2EEçš„æ ¸å¿ƒæ¨¡å¼ã€?/SPAN>
  J2EE规范里é¢åQŒé™¤äº?/SPAN>EJBåQ?/SPAN>JMSåQ?/SPAN>JTAåQ?/SPAN>Servlet/JSPåQ?/SPAN>JDBC之外˜q˜æœ‰å¾ˆå¤šå¾ˆå¤šçš„ä¼ä¸šæŠ€æœ¯ï¼Œ˜q™é‡Œä¸ä¸€ä¸€˜q›è¡Œä»‹ç»äº†ã€?/SPAN>
  å¦å¤–˜q˜æœ‰ä¸€ä¸ªæœ€æ–°é¢†åŸ?/SPAN>Web Servicesã€?/SPAN>Web Services也完全没有ä“Q何新东西åQŒå®ƒåƒæ˜¯ä¸€¿Ué»åˆå‰‚åQŒå¯ä»¥æŠŠä¸åŒçš„æœåŠ¡ç»Ÿä¸€èµäh¥æä¾›ä¸€ä¸ªç»Ÿä¸€çš„调用接å£ï¼Œä½œäؓ使用者æ¥è¯ß_¼Œæˆ‘åªè¦èŽ·å¾—æœåŠ¡æä¾›è€…给我的WSDLåQˆå¯¹æœåŠ¡çš„æ˜qŽÍ¼‰åQŒå°±å¤Ÿäº†åQŒæˆ‘完全ä¸çŸ¥é“æœåС噍æä¾›è€…æä¾›çš„æœåŠ¡½I¶ç«Ÿæ˜?/SPAN>EJB¾l„äšgåQŒè¿˜æ˜?/SPAN>.Net¾l„äšgåQŒè¿˜æ˜¯ä»€ä¹?/SPAN>CORBA¾l„äšgåQŒè¿˜æ˜¯å…¶ä»–的什么实玎ͼŒæˆ‘也ä¸éœ€è¦çŸ¥é“ã€?/SPAN>Web Services最伟大的地方就在于通过¾lŸä¸€çš„æœåŠ¡æä¾›æ–¹å¼å’Œè°ƒç”¨æ–¹å¼åQŒå®žçŽîCº†æ•´ä¸ªInternetæœåŠ¡çš„å…±äº«ï¼Œæ˜¯ä¸€ä¸ªéžå¸æ€×o人激动的技术领域ã€?/SPAN>Web Services好åƒç›®å‰˜q˜æ²¡æœ‰ä»€ä¹ˆå¾ˆå¥½çš„书ç±åQŒä½†æ˜¯å¯ä»¥é€šè¿‡åœ¨ç½‘¾lœä¸Šé¢æŸ¥èµ„æ–™çš„æ–¹å¼æ¥å¦ä¹ ã€?/SPAN>
Appfuseæ€È»“ |
使用AppFuse˜q›è¡Œå¼€å‘çš„æ€È»“ |
代ç : |
public interface IOrderService { public abstract Order saveNewOrder(Order order) throws OrderException, OrderMinimumAmountException; public abstract List findOrderByUser( String user) throws OrderException; public abstract Order findOrderById(int id) throws OrderException; public abstract void setOrderDAO( IOrderDAO orderDAO); } |
代ç : |
public interface IOrderDAO { public abstract Order findOrderById( final int id); public abstract List findOrdersPlaceByUser( final String placedBy); public abstract Order saveOrder( final Order order); } |
代ç : |
<bean id="mySessionFactory" class="org.springframework.orm.hibernate. LocalSessionFactoryBean"> <property name="mappingResources"> <list> <value> com/meagle/bo/Order.hbm.xml </value> <value> com/meagle/bo/OrderLineItem.hbm.xml </value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> net.sf.hibernate.dialect.MySQLDialect </prop> <prop key="hibernate.show_sql"> false </prop> <prop key="hibernate.proxool.xml"> C:/MyWebApps/.../WEB-INF/proxool.xml </prop> <prop key="hibernate.proxool.pool_alias"> spring </prop> </props> </property> </bean> <!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) --> <bean id="myTransactionManager" class="org. springframework. orm. hibernate. HibernateTransactionManager"> <property name="sessionFactory"> <ref local="mySessionFactory"/> </property> </bean> |
代ç : |
<!-- ORDER SERVICE --> <bean id="orderService" class="org. springframework. transaction. interceptor. TransactionProxyFactoryBean"> <property name="transactionManager"> <ref local="myTransactionManager"/> </property> <property name="target"> <ref local="orderTarget"/> </property> <property name="transactionAttributes"> <props> <prop key="find*"> PROPAGATION_REQUIRED,readOnly,-OrderException </prop> <prop key="save*"> PROPAGATION_REQUIRED,-OrderException </prop> </props> </property> </bean> <!-- ORDER TARGET PRIMARY BUSINESS OBJECT: Hibernate implementation --> <bean id="orderTarget" class="com. meagle. service. spring. OrderServiceSpringImpl"> <property name="orderDAO"> <ref local="orderDAO"/> </property> </bean> <!-- ORDER DAO OBJECT --> <bean id="orderDAO" class="com. meagle. service. dao. hibernate. OrderHibernateDAO"> <property name="sessionFactory"> <ref local="mySessionFactory"/> </property> </bean> |
代ç : |
public abstract class BaseAction extends Action { private IOrderService orderService; public void setServlet(ActionServlet actionServlet) { super.setServlet(actionServlet); ServletContext servletContext = actionServlet.getServletContext(); WebApplicationContext wac = WebApplicationContextUtils. getRequiredWebApplicationContext( servletContext); this.orderService = (IOrderService) wac.getBean("orderService"); } protected IOrderService getOrderService() { return orderService; } } |
代ç : |
struts-config.xml file. <action path="/SaveNewOrder" type="com.meagle.action.SaveOrderAction" name="OrderForm" scope="request" validate="true" input="/NewOrder.jsp"> <display-name>Save New Order</display-name> <exception key="error.order.save" path="/NewOrder.jsp" scope="request" type="com.meagle.exception.OrderException"/> <exception key="error.order.not.enough.money" path="/NewOrder.jsp" scope="request" type="com. meagle. exception. OrderMinimumAmountException"/> <forward name="success" path="/ViewOrder.jsp"/> <forward name="failure" path="/NewOrder.jsp"/> </action> |
代ç : |
public ActionForward execute( ActionMapping mapping, ActionForm form, javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws java.lang.Exception { OrderForm oForm = (OrderForm) form; // Use the form to build an Order object that // can be saved in the persistence layer. // See the full source code in the sample app. // Obtain the wired business service object // from the service locator configuration // in BaseAction. // Delegate the save to the service layer and // further upstream to save the Order object. getOrderService().saveNewOrder(order); oForm.setOrder(order); ActionMessages messages = new ActionMessages(); messages.add( ActionMessages.GLOBAL_MESSAGE, new ActionMessage( "message.order.saved.successfully")); saveMessages(request, messages); return mapping.findForward("success"); } |