ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲成人av在线,久久美女艺术照精彩视频福利播放,国内在线观看一区二区三区http://www.aygfsteel.com/lgplhk/zh-cnMon, 28 Jul 2025 17:16:02 GMTMon, 28 Jul 2025 17:16:02 GMT60怎样搞活BBShttp://www.aygfsteel.com/lgplhk/archive/2006/08/10/62760.html我的JAVA我的JAVAThu, 10 Aug 2006 03:46:00 GMThttp://www.aygfsteel.com/lgplhk/archive/2006/08/10/62760.htmlhttp://www.aygfsteel.com/lgplhk/comments/62760.htmlhttp://www.aygfsteel.com/lgplhk/archive/2006/08/10/62760.html#Feedback0http://www.aygfsteel.com/lgplhk/comments/commentRss/62760.htmlhttp://www.aygfsteel.com/lgplhk/services/trackbacks/62760.html 提高¾|‘络新闻竞争力七个基本原åˆ?/b>

ã€€ã€€åœ¨æ—§çš„â€œä»¥ä¼ æ’­è€…äØ“ä¸­å¿ƒâ€çš„æ¨¡å¼é€æ­¥è¢«â€œä»¥å—ä¼—ä¸ÞZ¸­å¿ƒâ€çš„æ–°æ¨¡å¼æ‰€ä»£æ›¿çš„今天,¾|‘络媒体¾l™å—众提供了更多的选择信息的自由和方便åQŒè¿™ä¹ŸäØ“¾|‘络¾~–辑工作提出了挑战。因此,对网¾lœæ–°é—ȝ¼–辑而言提供信息òq¶ä¸æ˜¯æœ€é‡è¦çš„,对信息做出有效的处理åQŒæé«˜ä¿¡æ¯çš„æœåŠ¡è´¨é‡æ‰æ˜¯ç«žäº‰æœ€æœ‰åŠ›çš„æ­¦å™¨ã€?br />
  互联¾|‘的不断普及åQŒç½‘民开始更多地å…Ïx³¨ä¸€äº›æ·±å±‚次的新闅R€‚在¾|‘络新闻大战中,竞争的焦ç‚ÒŽ­£åœ¨æ‚„然地发生转移åQŒâ€œçœ¼çƒä¿¡æ¯â€çš„初步阶段开始演¾lŽåˆ°â€œå¤´è„‘信息”的深层‹Æ¡è¾ƒé‡ã€‚提高网¾lœæ–°é—ȝ«žäº‰åŠ›çš„ä¸»è¦éƒ¨åˆ†ä½“çŽ°åœ¨æ—¥å¸¸æ–°é—»è´¨é‡ã€çªå‘è˜ªåŠ¨äº‹ä»¶ä»¥åŠç½‘ç«™æ–°é—ÀLœç´¢ï¼Œ˜q™æ˜¯ä¸€ä¸ªæ½œ¿U»é»˜åŒ–çš„¾l¼åˆå› ç´ ä½œç”¨çš„结果ã€?br />
规范¾~–辑工作‹¹ç¨‹(每天都要排专人发å¸?

  制定¾~–辑工作守则和编辑操作手册,让编辑以及相兛_‘˜å·¥æœ‰è§„可依、有法可循。手册应该适应不断变化的竞争环境,应该对稿仉™‡‡é›†çš„æ¥æºåQŒæ–°é—ȝ¨¿ä»¶ç¼–辑的具体事项åQŒä¸€å¤©çš„工作‹¹ç¨‹ä»¥åŠäº¤æŽ¥ç­æ—¶æ³¨æ„çš„事™å¹ç­‰½{‰åšå‡ºç›¸åº”的规范。应该包括新é—Õd¤„理的最基本和最新要求,对于各种情åŞ的处理办法固定,各类基本规范和通报½{‰ç­‰ã€?br />
  建立å¯ÒŽ–°é—ÖMº‹å®žæ ¸å‡†åˆ¶åº¦ï¼Œåœ¨å„个栏目徏立è“v对各自领域内对合作媒体群的评ä¼îC½“¾p»ï¼Œ¼‹®å®šæ–°é—»ä»·å€¼çš„判断原则以及实现æ–ÒŽ³•。还要不断查扑֏‘现自å·Þqš„短处òq¶ä¸”及时对症下药åQŒè¿›è¡Œæœ‰é’ˆå¯¹æ€§çš„æŒ‡å¯¼å’ŒåŸ¹è®­ï¼Œå¢žå¼º¾|‘络新闻的整体竞争力ã€?br />
  建立½Hå‘事äšg预案(òq›_¸¸è€å‡ºäº‹çš„公司和äh物都要盯紧点å„?,比如癑ֺ¦å’ŒDELL)

  长期以来åQŒçªå‘性新é—ÖMº‹ä»¶ä»¥å…¶è•´å«çš„å·¨å¤§æ–°é—»ä»·å€ÆD€Œæˆä¸ºæ–°é—ÀLŠ¥é“ä¸­çš„ä¸€å¤§é‡ç‚V€‚æ–°é—ȝ½‘站在短时间内提升人气或者改善品牌的最好机会,当在重大½Hå‘事äšg的报道ã€?br />
  在突发事件报道过½E‹ä¸­åQŒéœ€è¦åœ¨çŸ­æ—¶é—´å†…调动大量人力åQŒéœ€è¦åŸ¹å…ÖM¸€æ”¯ä¸“门应急的“特¿Uå…µâ€å°åˆ†é˜Ÿã€‚网¾lœæ–°é—Õdª’体应该徏立突发事仉™¢„案,建立高效率的快速反应机制。利用新é—ÖM¼ æ’­é€Ÿåº¦ã€æ–¹å¼ã€å¹¿æ³›ç¨‹åº¦ç­‰æ–šw¢çš„优势一展èín手ã€?br />
  建立½Hå‘事äšg预案åQŒé…¾|®èƒö够的资源支持。按照紧急处理流½E‹ï¼Œç”µè¯é€šçŸ¥å€¼ç­æ€È¼–åQŒåƈ˜q…速发布快讯;应制定固定专题模版,在短旉™—´å†…迅速做å‡ÞZ¸“é¢˜æŠ¥é“ã€‚äØ“å—ä¼—å…¨é¢æ·±å…¥äº†è§£½Hå‘性新é—ÖMº‹ä»¶æä¾›äº†ä¸€ä¸ªå¼€æ”¾æ€§å’Œå¤šæ ·æ€§çš„途径ã€?br />
抢抓新闻刉™«˜ç‚?什么倒闭啊亏损啊风投啊模式啊热门词都用上)

  ¾|‘络新闻表现出来的娱乐化、åã^民化、媚俗化为现阶段消费时代的自然表现。“媚俗美学成为后传播时代的审¾ŸŽé£Žž®šï¼Œå³ç¾Žå­¦å·²æ¸—透到了经‹¹Žã€æ”¿æ²…R€æ–‡åŒ–以及日常生‹zÖM¸­åQŒå› è€Œä“áå¤×ƒº†å…¶è‡ªä¸ÀL€§å’Œç‰Òޮп€§â€ã€?br />
  鉴于受众在网¾lœæ–°é—Õd†…定w€‰æ‹©ä¸Šå¯¹äºŽåªšä¿—与å¨×ƒ¹å…ƒç´ çš„偏好,˜q½æ±‚‹¹è§ˆçŽ‡çš„¾|‘ç«™åQŒéœ€è¦ä¸€å®šæ¯”例的“èÊY新闻”。实际上åQŒå¯¹äºŽæˆç†Ÿçš„品牌¾|‘站来说åQŒæ²¡æœ‰å¿…要一呌™¿Žåˆå—ä¼—çš„˜q™ç§â€œæ±‚软”心理。“硬新闻”永˜qœæ˜¯ä¸ÀLµåª’体的标志性核心äñ”å“ï¼Œåº”è¯¥ä»¥â€œç¡¬â€äØ“ä¸»ï¼Œâ€œèÊY”只是一¿Uä½æ–™ï¼Œåªæ˜¯æ°”氛上的调剂ã€?br />
  ¾|‘络新闻¾~–辑在“把关”过½E‹ä¸­è¦é˜²æ­¢æ–°é—ȝ…½æƒ…化。心理学家研½I¶æˆæžœè¡¨æ˜Žï¼Œå—众的本我是­‘‹å‘“äín乐”与“刺‹È€â€çš„åQŒä»–们喜好“新奇”“娱乐”的传播内容。网¾lœä¼ åª’äØ“äº†åœ¨ä¼—å¤šçš„åª’ä½“ä¸­è„±é¢–è€Œå‡ºåQŒå°±å¿…需要注意受众的˜q™ä¸€å†…在需求,通过满èƒö¾|‘民的阅è¯Õd–œå¥½ï¼Œæ¥èŽ·å¾—æ”¯æŒã€?br />
技术创æ–?扄¡¨‹åºå‘˜åšå‡ ä¸ªæœºå™¨äh,æ™ø™ƒ½å›žå¸–,™å?ç‹‚é¡¶)

  好的发布¾pȝ»Ÿå¯ä»¥å½¢æˆæ›´å¿«çš„发布速度、更丰富的表现åŞ式,更快æïLš„专题¾l„织以及更多的内容关联,而这些都是提升网站访问量的关键因素。同æ—Óž¼Œåˆ©ç”¨å¥½æœç´¢å¼•擎也是重要的一部分ã€?br />
  新闻¾|‘站吸引受众åQŒæé«˜ç½‘¾lœæ–°é—ȝš„点击率,一是要依靠口碑½{‰ähé™…å…³¾pȝš„ä¼ æ’­åQŒäºŒæ˜¯è¦ä¾é ¾|‘站搜烦的链接来实现。与搜烦引擎相结合后åQŒæ¯ä¸€æ¡æ–°é—»éƒ½å¯ä»¥çœ‹æˆæ˜¯ç½‘站、频道的品牌营销通èµ\。因为网友通过一个主题词的搜索,都可能进入网站的一条新闅R€ä¸€ä¸ªä¸“题、一个栏目、一个频道。从˜q™ä¸ªæ„ä¹‰ä¸Šè®²åQŒç½‘¾lœæ–°é—ȝš„生äñ”˜q‡ç¨‹æœ¬èínž®±æ˜¯æž„成自èín品牌的营销˜q‡ç¨‹ã€?br />
加大专稿写作力度(该造谣的时候下手一定要�

  在众多的新闻¾|‘站中,真正吸引受众åQŒæœ‰é•¿èƒö的发展,做出特色新闻是新é—ȝ½‘站很重要的一个问题ã€?br />
  ¾|‘络新闻媒体å…ähœ‰ä¸¤ä¸ª½Hå‡ºçš„特点:原创性与整合性。原创性的独家新闻报道是网¾lœæ–°é—ȝš„特色。在现有资源情况下,要提升新é—ȝ½‘站的知名度,原创的新é—ÀL˜¯å¿…不可少的。典型报道在我国一直是ä¸ÀLµåª’媒体的优势和强™åV€‚作为新é—ȝš„重要¾l„成部分åQŒå…¸åž‹å®£ä¼ åœ¨å”±å“ä¸ÀL—‹å¾‹ã€å¼•领积极健åºïLš„ä¸ÀLµèˆ†è®ºæ–šw¢å‘挥着重要的作用。要深入学习理解åQŒä‹É先进典型宣传主题紧扣党的路线斚w’ˆæ”¿ç­–。更要精心细致采访,寻觅独家视角åQŒä‹É典型宣传主题增强个性特艌Ӏ?br />
  同时åQŒè¿˜åº”做一些解释性报道、客观性报道等深度报道。保持新é—ȝ‰¹ç‚¹çš„同时注意受众的现实情况,行文多考虑时新性、趣å‘Ïx€§ã€å¯è¯ÀL€§ã€æ€æƒ³æ€§ã€äh情味。这æ ïL½‘¾lœæ‰èƒ½æœ‰æ–°çš„生命力和‹zÕdŠ›ã€?br />
研究受众需求增å¼ÞZº’动æ€?要让别äh发点ž®å¹¿å‘?灌些MMå›?

  互联¾|‘带来的不仅是一¿Uæ–°çš„传播方式,同时也对大众的生‹zÖM¹ æƒ¯ã€å·¥ä½œæ–¹å¼ã€ä­h倯D§‚念以及思维方式产生了重大媄响。从传播学的发展历史来看åQŒå—众与传播者的角色¾låŽ†äº†å¤š‹Æ¡çš„转变ã€?br />
  作好¾|‘络新闻åQŒè¦åˆ†æžå—众的微观和宏观需求,åQ›ç†è§£ç½‘¾lœæ–°é—ȝš„受众åQŒæ»¡­‘›_—ä¼—çš„å¿ƒç†è¦æ±‚ã€‚åœ¨å®è§‚ä¸Šï¼Œä»¥ä¼ æ’­è€…äØ“ä¸­å¿ƒåQŒç¼–辑考虑的是战略目的——提高新é—ȝ‚¹å‡ÈŽ‡½{‰ï¼Œ¾|‘络¾~–辑有新é—ȝš„选择权,传播者是ä¸ÕdŠ¨çš„ã€‚åœ¨å¾®è§‚ä¸Šï¼Œ¾|‘络新闻的选择是以受众ä¸ÞZ¸­å¿ƒï¼Œéœ€è¦äº†è§£å—众需要的信息和传播的方式ã€?br />
  æ ÒŽ®å—众心理特征åQŒç½‘¾lœç¼–辑需要处理好¾|‘络新闻“èÊY”与“硬”,“新”与“旧”,“真”与“假”,“深”与“浅”,“长”与“短”的关系ã€?br />
  ç”׃ºŽ¾|‘络的开放性和跨空间性,使得受众¾Ÿ¤ä½“有一定的发言权。新é—ÖMº‹ä»¶å‘生之后,现场目击者、当事äh可以通过论坛发布信息。广泛的信息来源使得受众在全面了解信息之后就能发表自å·Þqš„看法、就不同观点˜q›è¡Œäº‰è®ºã€‚交互功能可以通过嘉宾聊天、新é—ȝ•™­a€ã€ç½‘上新闻调查、主题论坛等方式来实现ã€?br />
™åµé¢ã€æ ç›®è®¾è®?一定要方便匿名发帖!!˜q™æœ€æœ€é‡è¦äº?)

  æ ÒŽ®¾|‘络受众å¯ÒŽ–°é—Õd†…定w˜…è¯Èš„è·Œ™·ƒæ€§ä»¥åŠæ£€ç´¢æ€§ï¼Œå»ºç«‹åˆç†çš„链接系¾lŸã€æ–¹ä¾¿å—众搜索。应该遵循视觉接触中心的原则åQŒæ³¨é‡ç‰ˆé¢â€œå’Œè°ã€åã^衡、活泹{€å¯Œæœ‰è¡¨çŽ°åŠ›â€çš„è‰²å½©˜q›è¡Œè®¾è®¡ã€?br />
  ¾|‘络新闻媒体的版面语­a€ä¸»è¦ä½“现在新é—Õdœ¨¾|‘页的“空间位¾|®â€œä¸Šã€‚一般说来,处于¾|‘页左方和上方的信息强势较大åQŒå› ä¸ø™¿™éƒ¨åˆ†ä¿¡æ¯å¾€å¾€æœ€å…ˆäº‰å¾—è¯»è€…çš„â€œçœ¼çƒâ€ã€‚è¿™æ øP¼Œå—众能从阅读的顺序中体会到稿仉™‡è¦ä¸Žå¦ã€‚标题的字体大小、排列方式、色彩等手段也在¾|‘络新闻的表çŽîC¸­å¾—到应用ã€?br />
ã€€ã€€åœ¨æ—§çš„â€œä»¥ä¼ æ’­è€…äØ“ä¸­å¿ƒâ€çš„æ¨¡å¼é€æ­¥è¢«â€œä»¥å—ä¼—ä¸ÞZ¸­å¿ƒâ€çš„æ–°æ¨¡å¼æ‰€ä»£æ›¿çš„今天,¾|‘络媒体¾l™å—众提供了更多的选择信息的自由和方便åQŒè¿™ä¹ŸäØ“¾|‘络¾~–辑工作提出了挑战。因此,对网¾lœæ–°é—ȝ¼–辑而言提供信息òq¶ä¸æ˜¯æœ€é‡è¦çš„,对信息做出有效的处理åQŒæé«˜ä¿¡æ¯çš„æœåŠ¡è´¨é‡æ‰æ˜¯ç«žäº‰æœ€æœ‰åŠ›çš„æ­¦å™¨ã€?/span>

]]>
最后一‹Æ? ¾l“网http://www.aygfsteel.com/lgplhk/archive/2006/06/21/54377.html我的JAVA我的JAVAWed, 21 Jun 2006 15:32:00 GMThttp://www.aygfsteel.com/lgplhk/archive/2006/06/21/54377.htmlhttp://www.aygfsteel.com/lgplhk/comments/54377.htmlhttp://www.aygfsteel.com/lgplhk/archive/2006/06/21/54377.html#Feedback0http://www.aygfsteel.com/lgplhk/comments/commentRss/54377.htmlhttp://www.aygfsteel.com/lgplhk/services/trackbacks/54377.htmlwww.cnmb.cnwww.cnmb.cnwww.cnmb.cnwww.cnmb.cnwww.cnmb.cnwww.cnmb.cnwww.cnmb.cnwww.cnmb.cnwww.cnmb.cnwww.cnmb.cnwww.cnmb.cnwww.cnmb.cnwww.cnmb.cnwww.cnmb.cn

]]>
Webwork2+Spring+Hibernate体验http://www.aygfsteel.com/lgplhk/archive/2005/08/29/11416.html我的JAVA我的JAVAMon, 29 Aug 2005 03:03:00 GMThttp://www.aygfsteel.com/lgplhk/archive/2005/08/29/11416.htmlhttp://www.aygfsteel.com/lgplhk/comments/11416.htmlhttp://www.aygfsteel.com/lgplhk/archive/2005/08/29/11416.html#Feedback2http://www.aygfsteel.com/lgplhk/comments/commentRss/11416.htmlhttp://www.aygfsteel.com/lgplhk/services/trackbacks/11416.html嘿嘿åQŒå¶æ¥ä»‹¾lä¸‹Webwork2¾l“合Spring, HibernateåQŒDefaultè®¤äØ“å¯¹Spring,Hibernate有一定了解ã€?
从User说è“våQŒåŒ…括创å»?修改/删除UseråQŒä»¥åŠå¯¹User的列表,先看Webwork2çš„Action代码
为简单说明问题,不考虑什么Interceptor, Duplicated Submit, Validation,½{‰é—®é¢?

创徏/修改/删除User:UserAction.java相关代码

java代码: 

UserManager userManager;

public void setUserManager(UserManager) {
    this.userManager = userManager;
}

public String create() {
    userManager.create(getUser());
}

public String modify() {
    userManager.modify(modifyUser())
    return "success";
}

public String remove() {
    userManager.remove(getUser())
    return "success";
}



xwork.xml相关代码
java代码: 

<action name="user" class="com.caryo.user.actions.UserAction">
    <external-ref name="userManager">userManager</external-ref>
    <result name="success" type="dispatcher">user.jsp</result>
</action>



webwork action会自动接受页面上传过来的信息åQŒè€Œä¸”˜q˜æ”¯æŒJavaBeançš„BeanInfoåQˆBeanInfo没用˜q‡ï¼Œå?
都是直接在action中完成获取属性,以及¾cÕdž‹è½¬æ¢ä¸Žæ ¡éªŒçš„工作的)
Webwork2很方便的支持了Command模式åQŒå…è®æ€¸€ä¸ªAction拥有多个CommandåQŒå¯¹åº”çš„url调用
user!create.action, user!modify.action, user!remove.actionåQŒä¼šå¯¹åº”的调用UserAction中的æ–ÒŽ³•åQ?
然后æ ÒŽ®æ–ÒŽ³•˜q”回值去å¯ÀL‰¾å¯¹åº”çš„ViewåQŒreturn "sucess" ž®×ƒ¼šforward到user.jspã€?
其中的userManager是Spring中applicationContext中定义的bean

java代码: 

<bean id="userManager" class="com.caryo.user.DefaultUserManager">
    <property name="userDAO"><ref local="userDAO"/></property>
</bean>



对User的列�ListUserAction.java相关片断

java代码: 

UserManager userManager;

public void setUserManager(UserManager) {
    this.userManager = userManager;
}
// userManager的获取可攑֜¨ä¸€ä¸ªUser的根¾cÕd£°æ˜Žï¼Œå¦‚AbstractUserActionåQŒè¿™é‡Œé‡å¤äؓ了看得清楚些

public List getAllUsers() {
    userManager.getAllUsers();
}

public List getOnlineUsers() {
    userManager.getOnlineUsers();
}



xwork.xml相关代码
java代码: 

<action name="listuser" class="com.caryo.user.actions.ListUserAction">
    <external-ref name="userManager">userManager</external-ref>
    <result name="success" type="dispatcher">listuser.jsp</result>
</action>



˜q™æ ·å¯¹åº”çš„urlž®±æ˜¯listuser.actionåQŒæ— command模式下会自动执行public String execute()˜q™ä¸€æ–ÒŽ³•åQ?
Default是一个返å›?success"的空æ–ÒŽ³•åQŒå½“然你也可以重写此æ–ÒŽ³•åQŒä¾‹å¦‚做校验½{‰ç­‰ã€?

listuser.jsp中ä‹É用webwork taglib打出User列表的片æ–?
java代码: 

<ww:iteraor value="allUsers">
userId: <ww:property value="id" />
userName: <ww:property value="name" />
</ww:iterator>

<ww:iteraor value="onlineUsers">
userId: <ww:property value="id" />
userName: <ww:property value="name" />
</ww:iterator>



webwork taglib功能比较强大åQŒå…¶ä¸­è¿˜å¯ä‹É用带参数的方法调用,而且在逻辑控制½{‰æ–¹é¢éƒ½è€ƒè™‘的比较完å–?
详细参见 http://wiki.opensymphony.com/pages/viewpage.action?pageId=1876
只要设计合理åQŒåŸºæœ¬ä¸Šä½¿ç”¨å…¶taglibž®±å¯ä»¥æŽ§åˆ¶æ•´ä¸ªviewåQŒåŒ…括复杂的™åµé¢ã€‚å°½½Ž¡ä¹Ÿæ”¯æŒVelocity, Freemarker½{?
不过考虑到性能åQŒæŽ¨èè¿˜æ˜¯ä‹É用jsp viewã€?
大型¾|‘站的UI层应该尽可能的薄åQŒJSP不易¾l´æŠ¤åQŒæˆ‘觉得taglib是可接受的厚度的上限了ã€?

Spring+hibernate的部分跟dhj1版主的相˜q‘,http://forum.javaeye.com/viewtopic.php?t=7925
偶就不重复了。只说一些不同的地方
1. web.xml 可以使用listener来初始化基本信息而不是用servlet
2. 在Session in DAO中,用iterator˜q”回数据应该是不行的åQŒé‚£ä¹ˆè¦èŽ·å–countåQŒä¸æ˜¯iterator.next()
也不是获取整个liståQŒç„¶åŽlist.size()åQŒè€Œåº”是一个list.get(0);
3. 可将HQL攑ֈ°å¯¹åº”çš„hbm.xmlä¸?
java代码: 

public class HibernateVehicleDAO extends CaryoHibernateObjectDAO implements VehicleDAO {
   
        Class vehicleClass;

        public Class getPersistentClass() {
                return vehicleClass != null ? vehicleClass : (vehicleClass = Vehicle.class);
        }
       
        public Vehicle getById(final long id) {
        return (Vehicle) getByClassId(id);
        }

        public List findAllGlobalVehicles() {
                return findNamedQuery("caryo.vehicle_findAllGlobalVehicles");
        }
}



vehicle.hbm.xml相关代码
java代码: 

<query name="caryo.vehicle_findAllGlobalVehicles"><![CDATA[
    from Vehicle vehicle
]]></query>


]]>
hibernate+spring http://www.aygfsteel.com/lgplhk/archive/2005/08/26/11210.html我的JAVA我的JAVAFri, 26 Aug 2005 07:58:00 GMThttp://www.aygfsteel.com/lgplhk/archive/2005/08/26/11210.htmlhttp://www.aygfsteel.com/lgplhk/comments/11210.htmlhttp://www.aygfsteel.com/lgplhk/archive/2005/08/26/11210.html#Feedback1http://www.aygfsteel.com/lgplhk/comments/commentRss/11210.htmlhttp://www.aygfsteel.com/lgplhk/services/trackbacks/11210.html本文是开发基于springçš„web应用的入门文章,前端采用Struts MVC框架åQŒä¸­é—´å±‚采用springåQŒåŽå°é‡‡ç”¨Hibernateã€?

  本文包含以下内容åQ?BR>
   ·配置Hibernate和事�BR>
   ·装蝲Springçš„applicationContext.xmlæ–‡äšg

   ·建立业务层和DAO之间的依赖关¾p?BR>
   ·ž®†Spring应用到Strutsä¸?BR>
  ½Ž€ä»?/B>

  ˜q™ä¸ªä¾‹å­æ˜¯å¾ç«‹ä¸€ä¸ªç®€å•çš„web应用åQŒå«MyUsers,完成用户½Ž¡ç†æ“ä½œåQŒåŒ…含简单的数据库增åQŒåˆ åQŒæŸ¥åQŒè¯¥å³CRUDåQˆæ–°å»ºï¼Œè®‰K—®åQŒæ›´æ–ŽÍ¼Œåˆ é™¤åQ‰æ“ä½œã€‚这是一个三层的web应用åQŒé€šè¿‡ActionåQˆStrutsåQ‰è®¿é—®ä¸šåС层åQŒä¸šåŠ¡å±‚è®‰K—®DAO。图一½Ž€è¦è¯´æ˜Žäº†è¯¥åº”用的æ€ÖM½“¾l“构。图上的数字说明了流½E‹é¡ºåºï¼ä»ŽwebåQˆUserActionåQ‰åˆ°ä¸­é—´å±‚(UserManageråQ‰ï¼Œå†åˆ°æ•°æ®è®‰K—®å±‚(UserDAOåQ‰ï¼Œç„¶åŽž®†ç»“果返回ã€?BR>
  Spring层的真正强大在于它的声明型事务处理,帮定和对持久层支持(例如Hiberateå’ŒiBATISåQ?BR>
  以下下是完成˜q™ä¸ªä¾‹å­çš„æ­¥éª¤ï¼š

  1åQ?安装Eclipse插äšg

  2åQ?数据库徏è¡?BR>
  3åQ?配置Hibernateå’ŒSpring

  4åQ?建立Hibernate DAO接口的实现类

  5åQ?˜qè¡Œ‹¹‹è¯•¾c»ï¼Œ‹¹‹è¯•DAOçš„CRUD操作

  6åQ?创徏一个处理类åQŒå£°æ˜Žäº‹åŠ?BR>
  7åQ?创徏web层的Actionå’Œmodel

  8åQ?˜qè¡ŒAction的测试类‹¹‹è¯•CRUD操作

  9åQ?创徏jspæ–‡äšg通过‹¹è§ˆå™¨è¿›è¡ŒCRUD操作

  10åQ?通过‹¹è§ˆå™¨æ ¡éªŒjsp

  安装eclipse插äšg

  1åQ?Hibernate插äšghttp://www.binamics.com/hibernatesync

  2åQ?Spring插äšghttp://springframework.sourceforge.net/spring-ide/eclipse/updatesite/

  3åQ?MyEclipse插äšg(ç ´è§£ç‰?

  4åQ?Tomcat插äšg. tanghan

  5åQ?其他插äšg包括xmlåQŒjspåQ?BR>
  数据库徏�/FONT>


create table app_user(id number not null primary,firstname vchar(32),lastname vchar(32));

  新徏™å¹ç›®

  新徏一个web projectåQŒæ–°å»ºåŽçš„目录结构同时包含了新徏文äšg夹page用于放jspæ–‡äšgåQŒå’Œæºæ–‡ä»¶å¤¹test用于放junit‹¹‹è¯•æ–‡äšg。同时将用到的包åQŒåŒ…括strutsåQŒhibernateåQŒspring都导入到lib目录下ã€?BR>
  创徏持久层O/R mapping

  1åQ?在src/com.jandar.model下用hibernate插äšg从数据库导出app_userçš?hbm.xmlæ–‡äšg改名为User.hbm.xml

åQ?xml version="1.0"?åQ?BR>åQ?DOCTYPE hibernate-mapping PUBLIC
   "-//Hibernate/Hibernate Mapping DTD//EN"
   "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" åQ?BR>åQœhibernate-mapping package="com.jandar.model"åQ?BR>åQœclass name="User" table="APP_USER"åQ?BR> åQœid
  column="ID"
  name="id"
  type="integer"
 åQ?BR>
  åQœgenerator class="assigned" /åQ?BR>
 åQ?idåQ?BR>
 åQœproperty
   column="LASTNAME"
   length="10"
   name="lastname"
   not-null="false"
   type="string"
 /åQ?BR>
 åQœproperty
   column="FIRSTNAME"
   length="10"
   name="firstname"
   not-null="true"
   type="string"
 /åQ?BR>
åQ?classåQ?BR>åQ?hibernate-mappingåQ?

  2åQ?通过hibernate synchronizer-åQžsynchronizer file生成User.javaæ–‡äšg,User对象对应于数据库中的app_userè¡?BR>
  注:在eclipse下自动生成的对象文äšg不完全相同,相同的是每个对象文äšg必须实现Serializable接口åQŒå¿…需又toStringå’ŒhashCodeæ–ÒŽ³•åQ?BR>
import java.io.Serializable;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;

public class BaseObject implements Serializable {
 public String toString() {
  return ToStringBuilder.reflectionToString(this,
  ToStringStyle.MULTI_LINE_STYLE);
 }

 public boolean equals(Object o) {
  return EqualsBuilder.reflectionEquals(this, o);
 }

 public int hashCode() {
  return HashCodeBuilder.reflectionHashCode(this);
 }
}

public class User extends BaseObject {
 private Long id;
 private String firstName;
 private String lastName;

 /**
 * @return Returns the id.
 */

 public Long getId() {
  return id;
 }

 /**
  * @param id The id to set.
 */

 public void setId(Long id) {
  this.id = id;
 }

 /**
 * @return Returns the firstName.
 */

 public String getFirstName() {
  return firstName;
 }

 /**
  * @param firstName The firstName to set.
 */

 public void setFirstName(String firstName) {
  this.firstName = firstName;
 }

 /**
 * @return Returns the lastName.
 */

 public String getLastName() {
  return lastName;
 }

 /**
 * @param lastName The lastName to set.
 */

 public void setLastName(String lastName) {
  this.lastName = lastName;
 }
}
创徏DAO讉K—®å¯¹è±¡

  1åQ?在src/com.jandar.service.dao新徏IDAO.java接口åQŒæ‰€æœ‰çš„DAO都ç‘ô承该接口

package com.jandar.services.dao;

public interface IDAO {

}

  2åQ?在src/com.jandar.service.dao下新建IUserDAO.java接口

public interface IUserDAO extends DAO {
 List getUsers();
 User getUser(Integer userid);
 void saveUser(User user);
 void removeUser(Integer id);
}

  该接口提供了讉K—®å¯¹è±¡çš„æ–¹æ³•,

  3åQ?在src/com.jandar.service.dao.hibernate下新建UserDAOHiberante.java

import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.orm.hibernate.support.HibernateDaoSupport;
import com.jandar.model.User;
import com.jandar.service.dao.IUserDAO;

public class UserDaoHibernate extends HibernateDaoSupport implements IUserDAO {

 private Log log=LogFactory.getLog(UserDaoHibernate.class);
 /* åQˆéž JavadocåQ?BR> * @see com.jandar.dao.IUserDAO#getUsers()
 */

 public List getUsers() {
  return getHibernateTemplate().find("from User");
 }

 /* åQˆéž JavadocåQ?BR> * @see com.jandar.dao.IUserDAO#getUser(java.lang.Long)
 */

 public User getUser(Integer id) {
  // TODO 自动生成æ–ÒŽ³•存根
  return (User) getHibernateTemplate().get(User.class,id);
 }

 /* åQˆéž JavadocåQ?BR> * @see com.jandar.dao.IUserDAO#saveUser(com.jandar.model.User)
 */

 public void saveUser(User user) {
  log.debug("xxxxxxx");
  System.out.println("yyyy");
  getHibernateTemplate().saveOrUpdate(user);
  if(log.isDebugEnabled())
  {
   log.debug("userId set to "+user.getId());
  }
 }

 /* åQˆéž JavadocåQ?BR> * @see com.jandar.dao.IUserDAO#removeUser(java.lang.Long)
 */

 public void removeUser(Integer id) {
  Object user=getHibernateTemplate().load(User.class,id);
  getHibernateTemplate().delete(user);
  if(log.isDebugEnabled()){
   log.debug("del user "+id);
  }
 }
}

  在这个类中实çŽîCº†IUserDAO接口的方法,òq¶ä¸”¾l§æ‰¿äº†HibernateDAOSupport¾c…R€‚这个类的作用是通过hibernate讉K—®ã€æ“ä½œå¯¹è±¡ï¼Œ˜q›è€Œå®žçŽ°å¯¹æ•°æ®åº“çš„æ“ä½œã€?BR>

]]>
spring+hibernate开发网ç«?/title><link>http://www.aygfsteel.com/lgplhk/archive/2005/08/25/10966.html</link><dc:creator>我的JAVA</dc:creator><author>我的JAVA</author><pubDate>Wed, 24 Aug 2005 17:28:00 GMT</pubDate><guid>http://www.aygfsteel.com/lgplhk/archive/2005/08/25/10966.html</guid><wfw:comment>http://www.aygfsteel.com/lgplhk/comments/10966.html</wfw:comment><comments>http://www.aygfsteel.com/lgplhk/archive/2005/08/25/10966.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.aygfsteel.com/lgplhk/comments/commentRss/10966.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/lgplhk/services/trackbacks/10966.html</trackback:ping><description><![CDATA[<SPAN id=ArticleContent1_ArticleContent1_lblContent><span id="wmqeeuq" class=javascript id=text108445>spring+hibernate开发网ç«?BR><BR><A class=ilink target=_blank><FONT color=#004080>http://www.xyzp.net</FONT></A> <A class=ilink target=_blank><FONT color=#004080>校园招聘一¾|‘打ž®?/FONT></A><BR><BR>springåQŒä¸€ä¸ªè½»é‡çñ”çš„j2ee框架åQŒè½»é‡çñ”的,˜q™å‡ ä¸ªå­—ž®±æ·±æ·Þqš„æŠŠæˆ‘吸引住了。抱着《spring in action》啃了一个星期,ž®äº†è§£ä¹‹åŽï¼ŒæŠŠè‡ªå·±æ‰€å­¦çš„东西几乎通通用在了xyzp.net˜q™ä¸ª¾|‘站上,下面介绍一下:<BR><BR><A class=ilink target=_blank><FONT color=#004080>校园招聘一¾|‘打ž®?/FONT></A> 提供专业的校园招聘信息。系¾lŸè‡ªåŠ¨é‡‡é›†å…¨å›½å„å¤§é«˜æ ¡BBS和就业中心的招聘信息åQŒæŒ‰ç…§åœ°åŒºã€å­¦æ ¡è¿›è¡Œç»„¾l‡åˆ†¾c…R€?BR><BR><A class=ilink target=_blank><FONT color=#004080>http://www.xyzp.net</FONT></A>¾|‘ç«™åˆ†äØ“ä¸¤ä¸ªéƒ¨åˆ†åQšåŽå°æ•°æ®é‡‡é›†ä¸Žå‰å°å±•示ã€?BR>1.后台数据采集åQŒåˆ©ç”¨htmlparser分析¾|‘页åQŒæŠ½å–我们所需的数据,以rss的结构进行存储ã€?BR>2.前台展示åQŒåˆ©ç”¨springåQ‹hibernate开发。hibernate处理数据库逻辑åQŒé€»è¾‘层ä‹É用springåQŒè¡¨½Cºå±‚应用spring本èínçš„mvc。应用spring开发确实很方便åQŒé€Ÿåº¦å¿«ï¼Œæ•ˆçŽ‡é«˜ï¼›åQ‰ï¼Œæ•´ä¸ª¾|‘ç«™2周就搞完了。而且åQŒæˆ‘不得不说åQŒspring太美了ã€?BR><BR>hibernate处理数据库逻辑真是没的è¯ß_¼Œæ•´ä¸ª¾|‘站一共就4张表åQŒå¤§é‡ä¸€å¯¹å¤šå’Œå¤šå¯¹å¤šçš„逻辑åQŒhibernate处理的很好,主要是编½E‹æ–¹é¢è¦å¤„理的逻辑½Ž€å•了很多åQŒä½†æ˜¯æ•ˆçŽ‡æ–¹é¢æœ‰ä¸€ç‚ÒŽ¬ ¾~ºï¼›åQ?BR><BR>spring本èín提供一套完整的mvcåQŒåº”用è“v来很方便åQŒåŠŸèƒ½ä¹Ÿå¾ˆå¼ºå¤§ï¼Œå‡ ä¹Žç”¨çš„åˆ°çš„™åµé¢é€»è¾‘它都惛_ˆ°äº†ã€‚推荐ä‹É用ã€?BR><BR>应用了xmlhttprequestæŠ€æœ¯ï¼Œå› äØ“é¦–é¡µè°ƒç”¨æ•°æ®åº“çš„‹Æ¡æ•°å¤ªå¤šåQŒæ‰€ä»¥æ¯ä¸ªæ ç›®éƒ½ç”¨ä¸€ä¸ªè¿œ½E‹è°ƒç”¨æ¥è§£å†³çš„,速度很快åQŒä¸˜q‡æœ‰çš„ie昄¡¤º˜q˜æœ‰ä¸€äº›é—®é¢˜ï¼›åQ?BR><BR>虽然xmlhttprequest提升速度比较明显åQŒä½†å¯ÒŽ•°æ®åº“æ“ä½œçš„æ¬¡æ•°åÆˆæ²¡æœ‰å‡å°‘åQŒå¼•入缓存机制才能从æ ÒŽœ¬ä¸Šè§£å†»I¼Œoscache是opensymphony的出品,它的™åµé¢¾U§ç¼“存把整个¾|‘页¾~“存下来åQŒé€Ÿåº¦æå‡è‡ªç„¶å¾ˆæ˜Žæ˜¾ã€?BR><BR>整个¾|‘站没有使用tableåQŒå…¨éƒ¨ä‹É用css搞定åQŒå¤§å®¶å¯ä»¥çœ‹ä¸€ä¸‹ã€?BR><BR>整个¾|‘站全部采用开源èÊY件构建,包括spring,hibernate,oscache,tomcat,mysql,eclipse,java commons.lucene½{‰ç­‰ã€?BR><BR>在开发中¼„°åˆ°ä¸å°‘问题åQŒå­—½W¦é›†ã€é“¾æŽ¥æ± åQŒspring与hibernate集成½{‰ç­‰åQŒå¯¹æ­¤æœ‰å…´è¶£å¯ä»¥å’Œæˆ‘联系åQŒQQåQ?1231398<BR><BR>如果大家觉得˜q™ä¸ª¾|‘ç«™˜q˜ä¸é”™ï¼Œè¯ähŽ¨èä¸€ä¸‹ï¼Œè°¢è°¢åQ›ï¼‰</SPAN></SPAN><img src ="http://www.aygfsteel.com/lgplhk/aggbug/10966.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/lgplhk/" target="_blank">我的JAVA</a> 2005-08-25 01:28 <a href="http://www.aygfsteel.com/lgplhk/archive/2005/08/25/10966.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>史上最½Ž€å•çš„Hibernate入门½Ž€ä»?http://www.aygfsteel.com/lgplhk/archive/2005/08/24/10852.html我的JAVA我的JAVATue, 23 Aug 2005 17:58:00 GMThttp://www.aygfsteel.com/lgplhk/archive/2005/08/24/10852.htmlhttp://www.aygfsteel.com/lgplhk/comments/10852.htmlhttp://www.aygfsteel.com/lgplhk/archive/2005/08/24/10852.html#Feedback0http://www.aygfsteel.com/lgplhk/comments/commentRss/10852.htmlhttp://www.aygfsteel.com/lgplhk/services/trackbacks/10852.html
在这½‹‡æ–‡ç« å°†ä¸æ¶‰åŠEclipse, log4j, Struts, Tomcat, XDocletåQŒå’ŒJBoss。本文的目的是演½CÞZ¸€ä¸‹Hibernate的安装过½E‹ä»¥åŠæœ€åŸºæœ¬çš„功能,从而给初学者一个低得不能再低的入门门槛ã€?BR>

下蝲文äšg

你需要Java SDK�Hibernate包、Ant包、和JDBC Driver�BR>
1、Hibernate包下载地址:
http://prdownloads.sourceforge.net/hibernate/?sort_by=date&sort=desc

2、Ant包下载地址:
http://apache.130th.net/ant/binaries/apache-ant-1.6.1-bin.zip

3、JDBC Driver要根据你用的database来定åQŒä¸€èˆ¬database官方¾|‘站上都会有。Hibernate支持常用的databaseåQŒæ¯”å¦?MySQL, Oracle, PostgreSQL, å’ŒMS-SQL Server。这些数据库都有JDBC Driver:

Oracle JDBC Driver下蝲地址(下蝲前必™åÕdŒæ„Oracle协议ä¹?
http://otn.oracle.com/software/htdocs/distlic.html?/software/tech/java/sqlj_jdbc/htdocs/jdbc9201.html

MySQL JDBC Driver下蝲地址
http://dev.mysql.com/downloads/connector/j/3.0.html

PostgreSQL JDBC Driver下蝲地址
http://jdbc.postgresql.org/download.html

MS-SQL Server JDBC Driver下蝲地址
http://www.microsoft.com/downloads/details.aspx?FamilyID=9f1874b6-f8e1-4bd6-947c-0fc5bf05bf71&displaylang=en

4、将Hibernate包和Ant包分别解压至c:\dev\ä¸?此目录不重要åQŒä½ å¯ä»¥æ¢å…¶å®ƒä“Q何目å½?ã€?BR>

配置环境

1、你需要添加一个新的环境变é‡? ANT_HOMEåQŒè®©å®ƒæŒ‡å‘c:\dev\<ä½ çš„ANT包所在目å½?gt;ã€‚åÆˆåœ¨PATH环境变量里添åŠ?ANT_HOME%\binã€?BR>
2、你需要添加一个新的环境变é‡? JAVA_HOMEåQŒè®©å®ƒæŒ‡å‘ä½ çš„j2sdkæ ¹ç›®å½•ã€‚åÆˆåœ¨PATH环境变量里添åŠ?JAVA_HOME%\binã€?BR>
3、创å»ÞZ¸€ä¸ªé¡¹ç›®ç›®å½•,比如c:\workspace\My1stHibernateã€?BR>
在项目目录下åQŒå¦å¤–创å»ÞZ¸‰ä¸ªç›®å½? src, classes, libã€?BR>
在lib目录下,创徏两个目录: hibernate和db�BR>
˜q™æ ·ä½ æœ‰äº†å¦‚下的文äšg¾l“æž„:

c:\workspace\My1stHibernate\
c:\workspace\My1stHibernate\src
c:\workspace\My1stHibernate\classes
c:\workspace\My1stHibernate\lib
c:\workspace\My1stHibernate\lib\hibernate
c:\workspace\My1stHibernate\lib\db

4、将c:\dev\<ä½ çš„Hibernate包所在目å½?gt;\hibernate2.jaræ–‡äšgcopy到c:\workspace\My1stHibernate\lib\hibernate下ã€?BR>
ž®†c:\dev\<ä½ çš„Hibernate包所在目å½?gt;\lib\下的所有文件同样copy到c:\workspace\My1stHibernate\lib\hibernate下ã€?BR>
ž®†ä½ çš„JDBC Driveræ–‡äšg(一般是一个jaræ–‡äšg)copy到c:\workspace\My1stHibernate\lib\db下ã€?BR>

创徏数据�/B>

1、用你最喜爱的database软äšgåQŒåˆ›å»ÞZ¸€ä¸ªhibernate_test的数据库ã€?BR>
2、在此数据库下,新徏一个tableåäØ“CUSTOMER

CREATE TABLE CUSTOMER
(
    CID INTEGER NOT NULL PRIMARY KEY,
    USERNAME VARCHAR(12) NOT NULL,
    PASSWORD VARCHAR(12)
);


¾~–写Javaæ–‡äšg

public class Customer {
   
    private int id;
    private String username;
    private String password;


    public int getId() {
        return id;
    }

    public String getPassword() {
        return password;
    }

    public String getUsername() {
        return username;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void setUsername(String username) {
        this.username = username;
    }

}

ž®†æ­¤¾cÕd­˜ä¸ºc:\workspace\My1stHibernate\src\Customer.javaæ–‡äšgã€?BR>
¾~–写Test¾c?BR>
import net.sf.hibernate.*;
import net.sf.hibernate.cfg.*;

public class Test {

    public static void main(String[] args) {

        try {
            SessionFactory sf =
                new Configuration().configure().buildSessionFactory();
            Session session = sf.openSession();
            Transaction tx = session.beginTransaction();

            for (int i = 0; i < 200; i++) {
                Customer customer = new Customer();
                customer.setUsername("customer" + i);
                customer.setPassword("customer");
                session.save(customer);
            }

            tx.commit();
            session.close();

        } catch (HibernateException e) {
            e.printStackTrace();
        }
    }
}

ž®†æ­¤¾cÕd­˜ä¸ºc:\workspace\My1stHibernate\src\Test.javaæ–‡äšgã€?BR>

创徏Hibernate映射文äšg

因䨓˜q™é‡Œåªæœ‰ä¸€ä¸ªClass --- Customer 和一个Table --- CUSTOMERåQŒä½ åªéœ€è¦å¾ç«‹ä¸€ä¸ªæ˜ ž®„æ–‡ä»?-- Customer.hbm.xmlåQŒæ¥å¯¹åº”Customer¾cÕd’ŒCUSTOMER表之间的关系ã€?BR>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping>
    <class name="Customer" table="CUSTOMER">
        <id name="id" column="CID">
            <generator class="increment" />
        </id>
        <property name="username" column="USERNAME" />
        <property name="password" column="PASSWORD" />
    </class>
</hibernate-mapping>

把此文äšgå­˜äØ“c:\workspace\My1stHibernate\src\Customer.hbm.xmlåQŒå’ŒCustomer.java攑֜¨åŒä¸€ç›®å½•下ã€?BR>

¾~–写Ant build.xmlæ–‡äšg


你不一定要知道˜q™ä¸ªbuild.xml的细节,其实Ant也不是Hibernate所必须的。这里用Antæ˜¯äØ“äº†ç®€åŒ–ä¸€äº›ä“Q务,比如: ¾~–译、copy、运行,½{‰ã€?BR>
<?xml version="1.0" ?>

<project name="My1stHibernate" default="build" basedir=".">

    <property name="base.dir" value="." />
    <property name="src.dir" value="src" />
    <property name="lib.dir" value="lib" />
    <property name="build.dir" value="classes" />

    <path id="myclasspath">
        <fileset dir="${lib.dir}">
            <include name="**/*.jar" />
        </fileset>
        <pathelement location="${build.dir}" />
    </path>

    <target name="init">
        <mkdir dir="${build.dir}" />
    </target>
   
    <target name="build" depends="init" description="compile the source files">
        <javac classpathref="myclasspath" srcdir="${src.dir}" destdir="${build.dir}" />
        <copy todir="${build.dir}" >
            <fileset dir="${src.dir}" >
                <exclude name="**/*.java"/>
            </fileset>
        </copy>
    </target>

    <target name="run" depends="build">
        <java classpathref="myclasspath" classname="Test" fork="true" />
    </target>

    <target name="clean">
        <delete includeEmptyDirs="true">
            <fileset dir="${build.dir}" />
        </delete>
    </target>

</project>


配置Hibernate描述文äšg

Hibernate描述文äšg可以是一个properties或xml æ–‡äšgåQŒå…¶ä¸­æœ€é‡è¦çš„æ˜¯å®šä¹‰æ•°æ®åº“çš„˜qžæŽ¥ã€‚我˜q™é‡Œåˆ—出的是一个XML格式的hibernate.cfg.xml描述文äšgã€?BR>
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE hibernate-configuration
    PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">

<hibernate-configuration>
   
    <session-factory name="java:/hibernate/HibernateFactory">
       
        <property name="show_sql">true</property>
        <property name="connection.driver_class">
            oracle.jdbc.driver.OracleDriver <!-- ˜q™é‡Œæ˜¯Oracle 9içš„JDBC driver classå?-->
        </property>
        <property name="connection.url">
            jdbc:oracle:oci8:@hibernate_test <!-- ˜q™é‡Œæ˜¯Oracleçš„hibernate_test数据库URL -->
        </property>
        <property name="connection.username">
            你的数据库用户名
        </property>
        <property name="connection.password">
            你的数据库密ç ?BR>        </property>
        <property name="dialect">
            net.sf.hibernate.dialect.Oracle9Dialect <!-- ˜q™é‡Œæ˜¯Oracle 9içš„Dialect -->
        </property>
       
        <mapping resource="Customer.hbm.xml" /> <!-- 指定Customer的映ž®„æ–‡ä»?-->
       
    </session-factory>
   
</hibernate-configuration>

如果你用的不是Oracle 9iåQŒå¯åˆ°C:\dev\<ä½ çš„Hibernate包所在目å½?gt;\src\hibernate.propertiesæ–‡äšg里找åˆîC½ çš„æ•°æ®åº“åQŒç„¶åŽæ›¿æ¢ä»¥ä¸Šç›¸å¯¹åº”的倹{€?BR>

开始运�/B>

到c:\workspace\My1stHibernate下,˜qè¡Œant run。如果你严格依照以上步骤åQŒåº”该看åˆ?BR>
run:
        [java] log4j:WARN No appenders could be found for logger (net.sf.hibernate.cfg.Environment).
        [java] log4j:WARN Please initialize the log4j system properly.
        [java] Hibernate: insert into CUSTOMER (USERNAME, PASSWORD, CID) values (?, ?, ?)
BUILD SUCCESSFUL

åˆîC½ çš„hibernate_test数据库看一下,在CUSTMOR表里新添äº?00条记录,但你没有写ä“Q何JDBC codeã€?BR>以后如果你要更换数据库,只需要改变hibernate.cfg.xml描述文äšg里相应的值即可ã€?BR>

¾l“论

此文是一½‹‡é—¨æ§›æžä½Žçš„入门介绍。我¾l™ä¸€ä¸ªå®Œå…¨ä¸æ‡‚Hibernate的朋友看åQŒä»–用了不到30分钟ž®Þp¿è¡Œäº†ä»–çš„½W¬ä¸€ä¸ªHibernate½E‹åºåQŒä»Žæ­¤å¼•起了 他对Hibernate的兴­‘£ã€‚但读者必™å»è®¤è¯†åˆ°˜q™åªæ˜¯ä¸€ä¸ªå¼€å§‹ï¼Œæ­¤æ–‡å®žä¹ƒ½H¥Hibernate冰山一角上的一颗小冰晶。千里之行始于èƒö下,你可以把此文 当作˜qˆå‘Hibernate大道的一个è“v炏V€?BR>

]]>
Hibernate快速入�http://www.aygfsteel.com/lgplhk/archive/2005/08/24/10851.html我的JAVA我的JAVATue, 23 Aug 2005 17:56:00 GMThttp://www.aygfsteel.com/lgplhk/archive/2005/08/24/10851.htmlhttp://www.aygfsteel.com/lgplhk/comments/10851.htmlhttp://www.aygfsteel.com/lgplhk/archive/2005/08/24/10851.html#Feedback0http://www.aygfsteel.com/lgplhk/comments/commentRss/10851.htmlhttp://www.aygfsteel.com/lgplhk/services/trackbacks/10851.html  介绍

  面向对象的开发方法是当今的主‹¹ï¼Œä½†æ˜¯åŒæ—¶æˆ‘们不得不ä‹É用关¾pÕdž‹æ•°æ®åº“,所以在企业¾U§åº”用开发的环境中,对象、关¾pÈš„æ˜ å°„åQˆORMåQ‰æ˜¯ä¸€¿Uè€—时的工作。围¾l•对象关¾pÈš„æ˜ å°„和持久数据的讉K—®åQŒåœ¨Java领域中发展è“v来了一些API和框æžÓž¼Œä¸‹é¢åˆ†åˆ«½Ž€å•介¾lã€?

  JDBC可以说是讉K—®æŒä¹…数据层最原始、最直接的方法。在企业¾U§åº”用开发中åQŒæˆ‘们可能ä‹É用DAOåQˆData Access ObjectåQ‰æ¨¡å¼æ¥æŠŠæ•°æ®è®¿é—®å°è£…è“v来,然后在其它的层中同一调用。这¿Uæ–¹å¼çš„优点是运行效率最高,¾~ºç‚¹æ˜¯æŠŠDAO对象和SQL语言紧密耦合在一起ä‹É得在大项目中难以¾l´æŠ¤ã€‚但是不½Ž¡æ€Žä¹ˆè¯ß_¼Œä½¿ç”¨JDBC来直接访问持久数据层是当今企业çñ”应用开发中使用最òq¿æ³›çš„ã€?

  实体Bean是J2EEòq›_°ä¸­ç”¨æ¥è¡¨½Cºå’Œè®‰K—®æŒä¹…数据的方式。虽然实体Bean是一¿Uæ–¹ä¾¿å¿«æïLš„æ–ÒŽ³•åQŒä½†æ˜¯åœ¨˜qè¡Œæ—¶æˆ‘们需要额外购买EJB容器åQˆå½“ç„Óž¼Œå¦‚今也有免费的EJB容器åQŒå¦‚JBOSSåQ‰ï¼Œòq¶ä¸”使用不同的应用服务器åQŒéœ€è¦é‡æ–îC¹¦å†™ä¸åŒçš„部çÖv描述åQŒä‹É得在不同应用服务器下¿UÀL¤ä¼ä¸š¾U§åº”用会带来一些困难ã€?

  另外åQŒåœ¨Java领域中,˜q˜æœ‰ä¸€äº›è¡¨½CºæŒä¹…数据的框架åQŒæ¯”如JDOå’ŒOJBåQŒåœ¨˜q™é‡Œž®×ƒ¸è¯¦ç»†ä»‹ç»äº†ã€?

  Hibernate是一¿Uæ–°çš„ORM映射工具åQŒå®ƒä¸ä»…提供了从Java¾cÕdˆ°æ•°æ®è¡¨ä¹‹é—´çš„æ˜ å°„åQŒä¹Ÿæä¾›äº†æ•°æ®æŸ¥è¯¢å’Œæ¢å¤æœºåˆ¶ã€‚相对于使用JDBCå’ŒSQL来手工操作数据库åQŒä‹É用HibernateåQŒå¯ä»¥å¤§å¤§å‡ž®‘操作数据库的工作量ã€?

  Hibernate可以和多¿UWeb服务器或者应用服务器良好集成åQŒå¦‚今已¾læ”¯æŒå‡ ä¹Žæ‰€æœ‰çš„‹¹è¡Œçš„æ•°æ®åº“服务器(è¾?6¿Uï¼‰ã€?

  下面我们来介¾læ€Žä¹ˆ¾l“合Hibernate2.0å’ŒApache Tomcat5.0在Web应用中ä‹É用Hibernateã€?/P>

  配置

  1、下载安装TomcatåQŒåƈ且下载Hibernate的运行环境(主要包含一些JAR包)ã€?
  2、把要ä‹É用的数据库的JDBC驱动½E‹åºæ‹¯‚´åˆ?TOMCAT_HOME%\common\lib目录下。笔者ä‹É用的是MYSQLåQŒå¯¹åº”的驱动½E‹åºçš„JARåŒ…äØ“mm.mysql-2.0.4-bin.jarã€?
  3、在Tomcatçš„Webapps目录下新å»ÞZ¸€ä¸ªWeb应用åQŒåå­—䨓hibernateã€?
  4、把Hibernate提供的hibernate2.jar和一些第三方的运行库拯‚´åˆ°hibernate\WEB\INF\lib目录下。(˜q™äº›½W¬ä¸‰æ–¹çš„˜qè¡Œåº“包含在下蝲的Hibernate lib目录下)
  5、在%TOMCAT_HOME%\conf\server.xml中Web应用和数据源。在server.xml中加入以下的配置描述�/P>

  例程1 配置web应用

 <Context path="/hibernate" docBase="hibernate" debug="0"   reloadable="true" crossContext="true">
  <Resource name="jdbc/hibernate" auth="Container" type="javax.sql.DataSource"/>  
     <ResourceParams name="jdbc/hibernate"> 
      <parameter>  
          <name>factory</name>  
       <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>  
      </parameter>
      <parameter>  
         <name>driverClassName</name>  
            <value>org.gjt.mm.mysql.Driver</value>  
       </parameter> 
        <parameter> 
              <name>url</name>  
              <value>jdbc:mysql:///test</value>  
         </parameter>  
       <parameter> 
            <name>username</name> 
           <value>root</value> 
       </parameter>  
      <parameter> 
         <name>password</name>  
         <value></value> 
          </parameter>  
      <parameter> 
      <name>maxActive</name> 
      <value>20</value> 
    </parameter>
         <parameter>  
        <name>maxIdle</name>  
           <value>10</value>
    </parameter> 
    <parameter> 
          <name>maxWait</name> 
      <value>-1</value> 
    </parameter>  
  </ResourceParams>  
 </Context>

  在这里,配置了一个名为hibernateçš„Web应用åQŒåƈ且配¾|®äº†ä¸€ä¸ªæ•°æ®æºåQŒæ•°æ®æºçš„JNDI名称为jdbc/hibernate。您需要根据情况修æ”ÒŽ•°æ®æºçš„链接属性ã€?

  6、下一步就是书写Hibernate的配¾|®æ˜q°ç¬¦ã€‚可以ä‹É用XML的配¾|®æ˜qŽÍ¼Œä¹Ÿå¯ä»¥ä‹É用基于属性的配置描述。在˜q™é‡Œä½¿ç”¨åŸÞZºŽXML的配¾|®æ˜q°ã€‚在hibernate\WEB-INF\classes目录下新å»ÞZ¸€ä¸ªhibernate.cfg.xmlæ–‡äšg。然后加入例½E?所½Cºçš„内容ã€?

<!DOCTYPE hibernate-configuration
    PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">

<hibernate-configuration>
    <session-factory>
        <property name="connection.datasource">java:comp/env/jdbc/hibernate</property>
        <property name="show_sql">false</property>
        <property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
        <!-- Mapping files -->
    </session-factory>
</hibernate-configuration>

  注意connection.datasource属性必™åÕd’Œserver.xml中配¾|®çš„æ•°æ®æºçš„属性一栗÷€‚如果不是ä‹É用MYSQLåQŒé‚£ä¹ˆéœ€è¦æ›´æ”¹dialect属性ã€?

  到现在,配置基本完成åQŒä¸‹é¢æˆ‘们来开发一个最½Ž€å•的应用ã€?

  开发持久对象、编写映ž®„描˜q?/STRONG>

  我们使用hibernateæ¥å°è£…ä¸€ä¸ªç®€å•çš„æ•°æ®è¡¨ã€‚è¿™ä¸ªè¡¨çš„åå­—äØ“CoursesåQŒå®ƒæœ‰ä¸¤ä¸ªå­—ŒDµï¼Œä¸€ä¸ªæ˜¯IDåQŒå®ƒæ˜¯Courses表的主键åQ›å¦ä¸€ä¸ªæ˜¯nameåQŒè¡¨½CºCourses的名字。在数据库中使用以下的脚本来创徏˜q™ä¸ªè¡¨ï¼š

  create table Courses(CourseId varchar(32) not null, name varchar(32), constraint pk_Courses primary key (CourseId) );

  接下来的ä»ÕdŠ¡ž®±æ˜¯ä¸ºCourses表书写持久对象,如例½E?所½Cºã€?

  例程3 Courses的持久对象(Courses.javaåQ?/P>

package com.hellking.study.hibernate;

import java.util.Set;

/**
 *在hibernate中代表了Course表的¾c…R€?BR> */
public class Course
{
   /**每个属性和表的一个字ŒDµå¯¹åº?*/
   private String id;
   private String name;
  
   /**students表示course中的学生åQŒåœ¨åŽé¢æ‰ä¼šç”¨åˆ°åQŒæš‚时不½Ž?*/
   private Set students;
    
    /**属性的讉K—®æ–ÒŽ³•**/
 public void setId(String string) {
  id = string;
 }
 
 public String getId() {
  return id;
 }
 
 public void setName(String name)
 {
  this.name=name;
 }
 public String getName()
 {
  return this.name;
 }
 public void setStudents(Set stud)
 {
  this.students=stud;
 }
 public Set getStudents()
 {
  return this.students;
 }
}

  可以看出åQŒåœ¨Course¾cÖM¸­ä¹ŸåŒ…含了两个属性,idå’ŒnameåQŒå®ƒçš„属性和表Courses的字ŒD‰|˜¯ä¸€ä¸€å¯¹åº”的,òq¶ä¸”¾cÕdž‹ä¸€è‡´ã€?

  书写好了持久对象åQŒæŽ¥ä¸‹æ¥çš„ä“Q务就是书写对象、关¾pÀL˜ ž®„描˜q°ã€‚在hibernate\WEB-INF\classes目录下新å»ÞZ¸€ä¸ªCourse.hbm.xml描述文äšgåQŒå†…容如例程4所½Cºã€?

  例程4 Course.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping>
    <class
        name="com.hellking.study.hibernate.Course"
        table="Courses"
        dynamic-update="false"
    >

        <id
            name="id"
            column="CourseId"
            type="string"
            unsaved-value="any"
        >
            <generator class="assigned"/>
        </id>

        <property
            name="name"
            type="string"
            update="true"
            insert="true"
            column="Name"
        />     
    </class>
</hibernate-mapping>

  在Course.hbm.xml映射文äšg中,指定了要映射的类和映ž®„的表,òq¶ä¸”指定了表的各个字ŒDµå’ŒJava对象中各个字ŒD늚„映射关系åQŒæ¯”如Course对象中的id属性对应了Courses表的courseId字段ã€?

  接下来的ä»ÕdŠ¡ž®±æ˜¯åœ¨hibernate.cfg.xml中指定这个映ž®„å…³¾p…R€‚如下所½Cºï¼š

<session-factory>
â€?BR><!-- Mapping files --> 
 <mapping resource="Course.hbm.xml"/>
</session-factory>

  ¾~–写业务逻辑

  到此åQŒæˆ‘们已¾lå°è£…了一个名为Courses的表åQŒåƈ且配¾|®å®Œæˆã€‚接下来的ä“Q务就是在Web应用开发中使用它们åQŒäؓ了演½Cºåœ¨Hibernate中对数据库的不同¾cÕdž‹çš„æ“ä½œï¼Œæˆ‘们开发的Web应用有以下的功能åQ?
  增加一个CourseåQ?
  删除一个CourseåQ?
  按照Course的名字进行模¾pŠæœç´¢ï¼›
  查看¾pȝ»Ÿä¸­æ‰€æœ‰çš„Courseã€?

  虽然我们可以直接在JSP中ä‹É用hibernateåQŒä½†æ˜¯å¾€å¾€æˆ‘ä»¬ä¸è¿™æ øP¼Œè€Œæ˜¯æŠŠè¿™äº›ä¸šåŠ¡é€»è¾‘ž®è£…在JavaBean中,然后在JSP中通过调用JavaBean以访问Hibernatež®è£…的对象ã€?

  ç”׃ºŽè®‰K—®é€šè¿‡ä½¿ç”¨hibernate有一些共性的操作åQŒåœ¨˜q™é‡Œæˆ‘们把这些共性的操作ž®è£…在一个专门的¾cÖM¸­åQŒè¿™æ ·å…¶å®ƒçš„¾cÕd¯ä»¥ç‘ô承它åQŒå¦‚例程5所½Cºã€?

  例程5 HibernateBase.java

package com.hellking.study.hibernate;

import net.sf.hibernate.*;
import net.sf.hibernate.cfg.*;
import java.util.*;
import java.io.IOException;
import java.io.PrintWriter;

public abstract class HibernateBase
{
 protected SessionFactory sessionFactory;//会话工厂åQŒç”¨äºŽåˆ›å»ÞZ¼šè¯?BR>    protected Session session;//hibernate会话
    protected Transaction transaction; //hiberante事务
   
    public HibernateBase()throws HibernateException
    {
     this.initHibernate();
    }
    // 帮助æ–ÒŽ³•
    protected void initHibernate()
        throws HibernateException {

        // 装蝲配置åQŒæž„造SessionFactory对象
        sessionFactory = new Configuration().configure().buildSessionFactory();
    }
   
    /**
     *开始一个hibernate事务
     */
    protected void beginTransaction()
        throws HibernateException {

        session = sessionFactory.openSession();
        transaction = session.beginTransaction();
    }
   
    /**
     *¾l“束一个hibernate事务ã€?BR>     */
    protected void endTransaction(boolean commit)
        throws HibernateException {

        if (commit) {
            transaction.commit();
        } else {
           //如果是只è¯Èš„操作åQŒä¸éœ€è¦commit˜q™ä¸ªäº‹åŠ¡ã€?BR>            transaction.rollback();
        }
         session.close();
    }
}

  下面¾~–写业务逻辑¾c»ï¼Œæ–°å¾ä¸€ä¸ªåä¸ºCourseBeançš„JavaBeanåQŒåƈ且CourseBean¾l§æ‰¿HibernateBase¾c»ï¼Œä»£ç å¦‚例½E?所½Cºã€?

  例程6 CourseBean.java

package com.hellking.study.hibernate;

import net.sf.hibernate.*;
import net.sf.hibernate.cfg.*;
import java.util.*;

/**
 *å’Œcourse相关的业务逻辑
 */
public class CourseBean extends HibernateBase
{
 public CourseBean()throws HibernateException
 {
  super();
 }
 /**
  *增加一个Course
  */
 public void addCourse(Course st)throws HibernateException
 {
  beginTransaction();
         session.save(st);        
         endTransaction(true);
    }
   
    /**
     *查询¾pȝ»Ÿä¸­æ‰€æœ‰çš„CourseåQŒè¿”回的是包含有Course持久对象的Iteratorã€?BR>     */
    public Iterator getAllCourses()throws HibernateException
    {
      String queryString = "select courses from Course as courses";
        beginTransaction();
        Query query = session.createQuery(queryString);
        Iterator it= query.iterate();
        return it;
    }
   
    /**
     *删除¾l™å®šIDçš„course
     */
    public void deleteCourse(String id)throws HibernateException
    {
      beginTransaction();     
      Course course=(Course)session.load(Course.class,id);     
      session.delete(course);
      endTransaction(true);
     }
   
    /**
     *按course的名字进行模¾pŠæŸ¥æ‰¾ï¼Œ˜q”回的是包含有Course持久对象的Iteratorã€?BR>     */
    public Iterator getSomeCourse(String name)throws HibernateException
    {
       String queryString = "select c from Course as c where c.name like :name" ;
         beginTransaction();
         Query query = session.createQuery(queryString);
         query.setString("name", "%"+name+"%");
        Iterator it= query.iterate();
        return it;
    }     
}

  在CourseBeanž®è£…äº?个业务方法,你可以根据情况增加其它的业务æ–ÒŽ³•。在CourseBean中,通过Hibernate来操作潜在的数据库资源ã€?

  要保存Course数据到数据库åQŒå¯ä»¥é€šè¿‡åQ?/P>

  session.save(Course);

  æ–ÒŽ³•来保存,它相当于使用在JDBC中执行以下语句:

  Connection con=�BR>  Statement stmt=con.createStatement();
  stmt.executeUpdate("insert into courses values('"+course.getId(),+"','"+course.getName()+"')");
  con.close();

  可以看出åQŒé€šè¿‡ä½¿ç”¨HibernateåQŒå¯ä»¥å¤§å¤§å‡ž®‘数据访问的复杂度ã€?

  在JSP中调用业务逻辑

  æ·ÕdŠ æ•°æ®

  CourseBean˜q™ä¸ªä¸šåŠ¡å¯¹è±¡ž®è£…了和Hibernate的交互关¾p»ï¼Œä»Žè€Œä‹ÉJSPå’ŒHibernate关系的解藕。我们来看测试主™åµé¢çš„部分代码,如例½E?所½Cºã€?

  例程7 ‹¹‹è¯•Hibernate开发的应用åQˆcourse.jspåQ?/P>

<%@ page import="java.sql.*,java.util.*" errorPage="error.jsp"%>
<jsp:useBean id="course" class="com.hellking.study.hibernate.Course" scope="page">
<jsp:setProperty name="course" property="*"/>
</jsp:useBean>
<jsp:useBean id="courseBusiness" class="com.hellking.study.hibernate.CourseBean" scope="page"/>
<html><body><center>
<% 
  try
  {
  if(course.getId().equals(null)||course.getId().equals(""));
  else courseBusiness.addCourse(course);
 
  %>
成功æ·ÕdŠ äº†CourseåQ?lt;br>
nameåQ?lt;%=course.getName()%>
Id:<%=course.getId()%>
<%
}
  catch(Exception e)
  {
  } 
%>

<hr>
<br>::增加一个course::<br>
<form action="course.jsp" method="get" name="add">
id:<input type=text name="id"><br>
name:<input type=text name="name"><br>
<input type=submit value="submit"><br>
</form>
<hr>
::按名字模¾pŠæŸ¥æ‰?:<br>
<form action="queryCourse.jsp" method="get" name="queryByName">
name:<input type=text name="name"><br>
<input type=submit value="query"><br>
</form>
<hr>
::删除一个Course::<br>
<form action="deleteCourse.jsp" method="get" name="queryByName">
id:<input type=text name="id"><br>
<input type=submit value="delete"><br>
</form>
<hr>
<a href=viewAll.jsp>::查看所有Course::<a>
</body>
</html>

  首先通过一个值对象CourseåQˆè¿™ä¸ªç±»æ­£å¥½æ˜¯Hibernate使用的持久对象,˜q™é‡Œä½œäؓ值对象来传递数据)接收获得的参敎ͼŒç„¶åŽCourseBeançš„addCourse(Course)æ–ÒŽ³•把数据保存到数据库。可以看出,通过使用HibernateåQŒæŠŠæ•°æ®ä»Žè¡¨å•中æ·ÕdŠ åˆ°æ•°æ®åº“éžå¸¸½Ž€å•ã€?

  查询

  下面来看模糊查找的JSP代码åQŒå¦‚例程8所½Cºã€?/P>

  例程8 按名字模¾pŠæŸ¥æ‰¾Course

<%@ page import="java.sql.*,java.util.*,com.hellking.study.hibernate.Course" errorPage="error.jsp"%>
<jsp:useBean id="courseBusiness" class="com.hellking.study.hibernate.CourseBean" scope="page"/>
�BR><% try
{
   Iterator it=courseBusiness.getSomeCourse((String)request.getParameter("name"));
   while(it.hasNext())
   {
     Course temp=(Course)it.next();
     out.println("<tr><td>"+temp.getId()+"</td>");
     out.println("<td>"+temp.getName()+"</td></tr>");
   }
  }
  catch(Exception e)
  {
    out.println(e.getMessage());
   }
%>
�

  它实际上调用的是CourseBeançš„Iterator getSomeCourse(String name)æ–ÒŽ³•。我们来回顾一下这个方法中的代码:

  /**
     *按course的名字进行模¾pŠæŸ¥æ‰?BR>     */
    public Iterator getSomeCourse(String name)throws HibernateException
    {
       String queryString = "select c from Course as c where c.name like :name" ;
        beginTransaction();
        Query query = session.createQuery(queryString);
         query.setString("name", "%"+name+"%");
        Iterator it= query.iterate();
        return it;
    }

  在查询前åQŒé¦–先调用beginTransactionæ–ÒŽ³•启动新的Hibernate事务åQŒç„¶åŽåˆ›å»ÞZ¸€ä¸ªQuery对象åQŒåœ¨åˆ›å¾˜q™ä¸ªå¯¹è±¡æ—Óž¼ŒåŒæ—¶æŒ‡å®šæŸ¥è¯¢çš„语句ã€?

  注意åQŒåœ¨æŸ¥è¯¢è¯­å¥åQ?/P>

  select c from Course as c where c.name like :name"

  中,它虽然和普通的SQLè¯­å¥ç›æ€¼¼åQŒä½†æ˜¯ä¸åŒï¼Œåœ¨æ•°æ®åº“中,使用的表的名字是CoursesåQŒè€Œåœ¨˜q™ä¸ªæŸ¥è¯¢è¯­å¥ä¸­ä‹É用的是CourseåQŒå®ƒå’ŒæŒä¹…对象的名字一è‡ß_¼Œä¹Ÿå°±æ˜¯è¯´åQŒè¿™ä¸ªæŸ¥è¯¢çš„æ¦‚念是查询持久对象,而不是数据库的记录ã€?

  创徏了查询对象Query后,需要设¾|®æŸ¥è¯¢çš„参数åQŒå®ƒå’Œåœ¨JDBC中PreparedStatement对象中设¾|®å‚æ•°çš„æ–ÒŽ³•ç›æ€¼¼ã€‚通过"Iterator it= query.iterate()"语句来执行查询,òq¶ä¸”˜q”回一个Iterator对象。在˜q™é‡Œä½¿ç”¨äº†Hibernate提供的查询机åˆÓž¼Œä¸€èˆ¬çš„JDBC查询˜q”回的是ResultSet对象åQŒè€Œè¿™é‡Œè¿”回的是包含了CourseBean对象的Iteratorã€?

  要查询系¾lŸä¸­æ‰€æœ‰çš„CourseåQŒä¹ŸåŒæ ·éžå¸¸½Ž€å•,可以通过例程9所½Cºçš„代码实现ã€?

  例程9 查询数据库中所有的Course

�BR><jsp:useBean id="courseBusiness" class="com.hellking.study.hibernate.CourseBean" scope="page"/>
�BR><% try
{
   Iterator it=courseBusiness.getAllCourses();
   while(it.hasNext())
   {
     Course temp=(Course)it.next();
     out.println("<tr><td>"+temp.getId()+"</td>");
     out.println("<td>"+temp.getName()+"</td></tr>");
   }
  }
  catch(Exception e)
  {
    out.println(e.getMessage());
   }
%>
�/P>

  实际上调用的是CourseBeançš„getAllCoursesæ–ÒŽ³•åQŒå®ƒå’ŒgetSomeCourseæ–ÒŽ³•æœºåˆ¶ä¸€æ øP¼Œž®×ƒ¸å†ä»‹¾läº†ã€?

  删除数据

  在JSP中,使用以下的代码来执行删除操作�/P>

  例程10 删除数据库中Courses表的记录

<jsp:useBean id="courseBusiness" class="com.hellking.study.hibernate.CourseBean" scope="page"/>
â€?BR>删除id为:<%=request.getParameter("id")%>çš„courseåQ?::<br>

<% try
{
 courseBusiness.deleteCourse(request.getParameter("id"));
 out.println("删除成功");
}
  catch(Exception e)
  {
    out.println("不存在这个记å½?);
   }
%>

  我们来看CourseBean中执行删除操作的具体代码åQ?/P>

  /**
     *删除¾l™å®šIDçš„course
     */
    public void deleteCourse(String id)throws HibernateException
    {
     beginTransaction();     
     Course course=(Course)session.load(Course.class,id);     
     session.delete(course);
     endTransaction(true);
     }

  在这个方法中åQŒé¦–先开始一个事务,然后通过session.load(Course.class,id)æ–ÒŽ³•来装载指定ID的持久对象,接下来通过"session.delete(course)"来删除已¾lè£…载的courseåQŒåƈ且结束Hibernate事务ã€?

  æ€È»“

  下面æ€È»“一下ä‹É用Hibernate的开发过½E‹ï¼š

  1、配¾|®HibernateåQˆä¸€‹Æ¡å³å¯ï¼‰åQ?BR>  2、确定数据表åQ?
  3、创建持久对象;
  4、编写对象和数据表的映射描述åQ?
  5、编写和业务逻辑�

  实际上,上面的过½E‹å’Œä½¿ç”¨EJB没有什么区别:在ä‹É用EJBæ—Óž¼Œé¦–先当然也是配置环境åQŒåˆå§‹åŒ–数据表;然后创徏实体BeanåQˆå¯¹è±¡äºŽHibernate的持久对象)åQ›æŽ¥ä¸‹æ¥¾~–写部çÖv描述½W¦ï¼ˆejb-jar.xmlåQŒåŽ‚å•†ä¸“æœ‰çš„éƒ¨çÖv描述åQ‰ï¼Œåœ¨è¿™äº›éƒ¨¾|²æ˜q°ç¬¦é‡Œï¼ŒæŒ‡å®šäº†EJB和数据表的映ž®„å…³¾p»ï¼Œå¦‚果多个实体Bean存在兌™”关系åQŒéœ€è¦æ˜q°å®ƒä»¬ä¹‹é—´çš„关系åQŒè¿™äº›æ˜q°å¯¹åº”于Hibernate中持久对象的描述åQŒå¦‚Course.hbm.xmlåQ›å¾€å¾€æˆ‘们òq¶ä¸åœ¨åº”用程序中直接操作实体BeanåQŒè€Œæ˜¯é€šè¿‡ä¸šåŠ¡å¯¹è±¡åQˆå¦‚会话BeanåQ‰æ¥æ“ä½œåQŒè¿™é‡Œçš„会话Bean可以½Ž€å•的和Hibernate中执行业务逻辑的JavaBean对应。这里只是简单的¾cÀL¯”åQŒä¸æ˜¯ç»å¯¹çš„åQŒæ¯”如我们同样可以在会话Bean中访问Hibernate持久对象åQŒä¹Ÿž®±æ˜¯è¯´ä‹É用HibernateåQŒåŒæ ·å¯ä»¥æŠŠä¸šåŠ¡é€»è¾‘æ”‘Öœ¨ä¼šè¯Bean中ã€?

ã€€ã€€é€šè¿‡æœ¬æ–‡çš„å­¦ä¹ ï¼Œç›æ€¿¡è¯»è€…对Hibernate已经有了初步的认识,òq¶ä¸”能够使用Hibernate开发简单的应用。在下一½‹‡ä¸­åQŒæˆ‘们将学习怎么使用Hibernateæ¥äØ“å¤æ‚çš„æ•°æ®è¡¨˜q›è¡Œæ˜ å°„åQŒåƈ且维护它们之间的关系ã€?/P>

]]>
jsp+tomcat+mysql&sevlet&javabean配置全过½E? 选择è‡?xyw1026 çš?Blog http://www.aygfsteel.com/lgplhk/archive/2005/08/18/10388.html我的JAVA我的JAVAWed, 17 Aug 2005 17:29:00 GMThttp://www.aygfsteel.com/lgplhk/archive/2005/08/18/10388.htmlhttp://www.aygfsteel.com/lgplhk/comments/10388.htmlhttp://www.aygfsteel.com/lgplhk/archive/2005/08/18/10388.html#Feedback3http://www.aygfsteel.com/lgplhk/comments/commentRss/10388.htmlhttp://www.aygfsteel.com/lgplhk/services/trackbacks/10388.html 

在配¾|®jsp开发环境的˜q‡ç¨‹ä¸­ä¼š¼„°åˆ°ä¸å°‘问题åQŒæ„Ÿè°¢ç½‘上的许多前辈的经验æ€È»“åQŒä½œè€…cl41çš„JSP˜qžæŽ¥Mysql数据库攻略和作者Saulzyçš„MySQL学习½W”è®°½{‰æ–‡ç« å¯¹æˆ‘来说简直是雪中送碳åQŒäؓ了帮助象我一æ ïLš„初学者在此æ€È»“了不ž®‘作者的¾léªŒåQŒéžå¸¸æ„Ÿè°¢ä»–们的无私奉献¾_„¡¥žåQŒä¹Ÿå¸Œæœ›æ›´å¤šçš„äh把这¿Uç²¾¼œžå‘扬光大,呵呵åQŒå†‹Æ¡å¯¹æ‰€å‚考文章的作者表½Cºæœ€å´‡é«˜çš„æ•¬æ„ï¼
以下软äšg下蝲˜qžæŽ¥åœ°å€æ— æ³•昄¡¤ºçš„话åQŒè¯·ç›´æŽ¥åˆ°å®˜æ–¹ç½‘站下载即可!
 
软äšg下蝲
Mysql
下蝲版本åQšmysql-4.1.13-win32.zip(Windows downloads)
http://dev.mysql.com/downloads/mysql/4.1.html

JDBC驱动
下蝲版本åQšmysql-connector-java-3.1.10.zip
http://dev.mysql.com/downloads/connector/j/3.1.html

下蝲j2sdk
下蝲版本åQšjdk-1_5_0_04-windows-i586-p.exe
http://java.sun.com/j2se/1.5.0/download.jsp

下蝲tomcat
下蝲版本: jakarta-tomcat-5.5.9.exe
http://jakarta.apache.org/site/downloads/downloads_tomcat-5.cgi

安装,配置j2sdkåQ?/P>

执行j2sdk安装½E‹åºåQŒæŒ‰é»˜è®¤è®„¡½®˜q›è¡Œå®‰è£…åQŒä¹Ÿå¯è‡ªå®šä¹‰è·¯å¾„åQŒä½†éœ€ä¿®æ”¹ä¸‹é¢çš„配¾|?/P>

配置j2sdk:

配置环境变量:

我的电脑->属æ€?>高çñ”->环境变量->¾pȝ»Ÿå˜é‡ä¸­æ·»åŠ ä»¥ä¸‹çŽ¯å¢ƒå˜é‡ï¼š
JAVA_HOME=C:\Program Files\Java\jdk1.5.0_04
CLASSPATH=%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
path=%JAVA_HOME%\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem

写一个简单的java½E‹åºæ¥æµ‹è¯•J2SDK是否已安装成功:
public class hello
{
 public static void main(String args[])
 {
 System.out.println("Hello");
 }
}

ž®†ç¨‹åºä¿å­˜äؓ文äšgåäØ“hello.java的文件ã€?

打开命ä×o提示½W¦çª—口,˜q›å…¥åˆ°hello.java所在目录,键入下面的命ä»?
javac hello.java
java hello
此时若打印出来hello则安装成功,若没有打印出˜q™å¥è¯ï¼Œä»”细‹‚€æŸ¥ä»¥ä¸Šé…¾|®æ˜¯å¦æ­£¼‹®ã€?BR>注意¾pȝ»Ÿæ–‡äšg多w€‰é¡¹ä¸­åº”¼‹®å®šâ€œéšè—å·²çŸ¥æ–‡ä»¶ç±»åž‹çš„æ‰©å±•名”不å‹ùN€‰ï¼ˆæˆ‘的电脑—工具—查看)

安装,配置tomcat
执行tomcat安装½E‹åºåQŒæŒ‰é»˜è®¤è®„¡½®˜q›è¡Œå®‰è£…åQŒä¹Ÿå¯è‡ªå®šä¹‰è·¯å¾„åQŒä½†éœ€ä¿®æ”¹ä¸‹é¢çš„配¾|?/P>

我的电脑->属æ€?>高çñ”->环境变量->¾pȝ»Ÿå˜é‡ä¸­æ·»åŠ ä»¥ä¸‹çŽ¯å¢ƒå˜é‡?BR>CATALINA_HOME=C:\Program Files\Apache Software Foundation\Tomcat 5.5
CATALINA_BASE=C:\Program Files\Apache Software Foundation\Tomcat 5.5

修改环境变量中的classpathåQŒæŠŠtomat安装目录下的common\lib下的servlet-api.jaræ·ÕdŠ åˆ°classpath中去åQ?BR>修改后的classpath如下åQ?
classpath=%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;C:\Program Files\Apache Software Foundation\Tomcat 5.5\common\lib\servlet-api.jar;

启动tomcatåQŒåœ¨IE中访é—?A href="http://localhost:8080/">http://localhost:8080åQŒè‹¥çœ‹åˆ°tomcat的欢˜qŽé¡µé¢çš„话说明安装成功ã€?/P>

安装mysql
解压¾~©mysql-4.1.13-win32.zipåQŒè¿è¡Œsetup.exe
首先出现的是安装向导‹Æ¢è¿Žç•Œé¢,直接点击“Nextâ€?BR>¾l§ç®‹åQŒé€‰æ‹©å®‰è£…¾cÕdž‹,选择“自定义”custom安装åQŒç„¶åŽç‚¹â€œNext”下一步,出现自定义安装界é?BR>选择安装路径åQšC:\MySQL Server 4.1(可自定义)
点“OKâ€è¿”å›žåˆ°è‡ªå®šä¹‰å®‰è£…ç•Œé¢ï¼Œè·¯å¾„å·²æ”¹ä¸ø™®¾¾|®çš„路径
点“Next”,准备开始安è£?BR>点“Install”开始安è£?BR>完成后出现创建MySQL.com帐号的界é?BR>如果是首‹Æ¡ä‹É用MySQLåQŒé€‰â€œCreate anew free MySQL.com accoutâ€?BR>点“Next”,输入你的Email地址和自å·Þp®¾å®šçš„用于ç™Õd½•MySQL.com的密ç ?BR>填完后点“Next”进入第二步
填写姓名½{‰ç›¸å…³ä¿¡æ¯ï¼Œå¡«å®Œç‚¹â€œNext”,˜q›å…¥½W¬ä¸‰æ­?BR>填完电话åïL ã€å…¬å¸å¿U°ç­‰ä¿¡æ¯åŽï¼Œç‚¹â€œNext”,
然后出现预览你刚才填的信息的界面åQŒç‚¹â€œNext”出现安装完成界é?BR>注意åQŒè¿™é‡Œæœ‰ä¸ªé…¾|®å‘导的选项åQˆConfigure the MySQL Server nowåQ‰ï¼Œ
廸™®®å‹ùN€‰ç«‹å³é…¾|®ä½ çš„MySQL。许多说安装完MySQL后无法启动,原因ž®±åœ¨äºŽæ²¡æœ‰é…¾|®MySQLã€?BR>点击“Finish”完成安装,òq¶å¼€å§‹é…¾|®MySQL
点“Next”,˜q›å…¥é…ç½®¾cÕdž‹é€‰æ‹©™åµé¢ã€‚选“Detailed configurationâ€?详细配置)
点“Next”,˜q›å…¥æœåŠ¡¾cÕdž‹é€‰æ‹©™åµé¢ã€‚选“Developer Machine”(开发者机器)åQŒè¿™æ ·å ç”¨ç³»¾lŸçš„资源不会很多
点“Next”后åQŒè¿›å…¥æ•°æ®åº“用法选择™åµé¢ã€‚选择“Multifunctional Databaseâ€?BR>点“Next”,˜q›å…¥é€‰æ‹©InnoDB数据存放位置™åµé¢
不用更改讄¡½®åQŒç›´æŽ¥æ”¾åœ¨Installation Path安装目录里即可,然后点“Next”,选择MySQL的同时联接数
选择“Manual Setting”,讄¡½®ä¸?00(æ ÒŽ®è‡ªå·±éœ€è¦ï¼Œé…Œæƒ…讄¡½®)
点“Next”,配置MySQL在TCP/IP通讯环境中的端口选择默认çš?306端口卛_¯ã€?BR>点“Next”,选择MySQL中的字符讄¡½®
注意åQŒè¿™é‡Œçš„选择ž®†ä¼šå½±å“ä½ æ˜¯å¦èƒ½åœ¨MySQL中ä‹É用中文。选择gb2312字符集以便支持简体中æ–?BR>点“Next”,讄¡½®Windows服务选项
注意åQŒè¿™é‡Œçš„选择很关键ã€?BR>“Install As Windows Service”一定要å‹ùN€‰ï¼Œ˜q™æ˜¯ž®†MySQLä½œäØ“Windows的服务运行ã€?BR>“Service Name”就用默认的“MySQLâ€?BR>下面的“Launch the MySQL Server automatically”一定要å‹ùN€‰ï¼Œ˜q™æ ·Windows启动æ—Óž¼ŒMySQLž®×ƒ¼šè‡ªåŠ¨å¯åŠ¨æœåŠ¡åQŒè¦ä¸ç„¶ž®Þp¦æ‰‹å·¥å¯åЍMySQLã€?BR>è®¸å¤šäºø™¯´å®‰è£…MySQL后无法启动、无法连接、出çŽ?0061错误åQŒåŽŸå› å°±åœ¨è¿™é‡Œã€?BR>点“Next”,讄¡½®æ ¹å¸å·root的登录密ç ?BR>“Modify Security Settings”是讄¡½®æ ¹å¸åïLš„密码åQŒè¾“入你讑֮šçš„密码即可ã€?BR>“Create An Anonymous Accountâ€æ˜¯åˆ›å¾ä¸€ä¸ªåŒ¿åå¸åøP¼Œ˜q™æ ·ä¼šå¯¼è‡´æœª¾læŽˆæƒçš„用户非法讉K—®ä½ çš„æ•°æ®åº“ï¼Œæœ‰å®‰å…¨éšæ‚£ï¼Œå»ø™®®ä¸è¦å‹ùN€‰ã€?BR>点“Next”,MySQL配置向导ž®†ä¾æ®ä½ ä¸Šé¢çš„æ‰€æœ‰è®¾å®šé…¾|®MySQLåQŒä»¥ä¾¿MySQL的运行符合你的需è¦?BR>点“Execute”开始配¾|®ï¼Œå½“出现“Service started successfully”时åQŒè¯´æ˜Žä½ çš„配¾|®å®Œæˆï¼ŒMySQL服务启动成功
点“Finish”完成,整个MySQL的配¾|®å®Œæˆï¼Œå‰©ä¸‹çš„就是用MySQL客户端连接MySQL服务器,然后使用了ã€?/P>


安装JDBC驱动åQ?BR>解压¾~©mysql-connector-java-3.1.10.zip
ž®†è¦ä½¿ç”¨çš„æ˜¯mysql-connector-java-3.1.10-bin-g.jarå’Œmysql-connector-java-3.1.10-bin.jar

配置
在C:\Program Files\Java目录下徏立mysqlforjdbc子目录,˜q›å…¥è¯¥ç›®å½•å°†mysql-connector-java-3.1.10-bin.jar到该目录ä¸?BR>˜q›å…¥C:\Program Files\Java\jdk1.5.0_04\lib目录ž®†mysql-connector-java-3.1.10-bin-g.jar拯‚´åˆ°è¯¥ç›®å½•ä¸?BR>然后配置classpathåQŒè¿½åŠ?JAVA_HOME%\lib\mysql-connector-java-3.1.10-bin-g.jar;C:\Program Files\Java\mysqlforjdbc\mysql-connector-java-3.1.10-bin.jar;到该环境变量中去
˜q½åŠ ä»¥åŽçŽ¯å¢ƒå˜é‡å¦‚ä¸‹åQ?BR>CLASSPATH=%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;C:\Program Files\Apache Software Foundation\Tomcat5.5\common\lib\servlet-api.jar;%JAVA_HOME%\lib\mysql-connector-java-3.1.10-bin-g.jar;C:\Program Files\Java\mysqlforjdbc\mysql-connector-java-3.1.10-bin.jar;
配置˜q™ä¸ªçš„目的是让java应用½E‹åºæ‰‘Öˆ°˜qžæŽ¥mysql的驱动.


查看òq¶å¯åЍMySQL服务
在Windows XP下安装完MySQL后,它就已经自动启动服务了,òq¶ä¸”在开始菜单中有其客户端的快捷方式˜qžæŽ¥
可以通过Windows的服务管理器查看。“开始”-“运行”,输入“services.msc”,回èžRã€?BR>弹出Windows的服务管理器åQŒç„¶åŽå°±å¯ä»¥çœ‹è§æœåŠ¡åäØ“â€œmysql”的服务™å¹äº†åQŒå…¶åŒ™¾¹æ ‡æ˜Žâ€œå·²å¯åЍâ€?BR>在开始菜å?所有程åº?MySQL-MySQL Server 4.1-MySQL Command Line Client用客æˆïL«¯çš„å¿«æäh–¹å¼è¿žæŽ?BR>输入安装是设¾|®çš„密码卛_¯


数据库的使用

Mysql安装完毕以后åQŒåœ¨å¼€å§‹èœå?所有程åº?MySQL-MySQL Server 4.1-MySQL Command Line Client用客æˆïL«¯çš„å¿«æäh–¹å¼è¿žæŽ?BR>输入安装时设¾|®çš„密码

使用mysql的基本命ä»?在mysql命ä×o行编辑每输入完命令后最后一定要有分å?
昄¡¤ºæ•°æ®åº“:show databases;
使用数据库:use 数据库名åQ?/P>


建库
在mysql里徏一个数据库firståQŒä»¥åŠåœ¨æ•°æ®åº“里å»ÞZ¸€ä¸ªè¡¨about
命ä×oåQšcreate database first;

为数据库讄¡½®æƒé™åQˆç”¨æˆ·å’Œå¯†ç åQ?BR>命ä×oåQšgrant all privileges on first.* to test@localhost identified by  â€?23456â€?
当你执行完这个命令以后,只要你再以用户名åQštest,密码åQ?23456ç™Õd½•æ—¶ä½ ž®±åªå¯ä»¥å¯¹first˜q™ä¸ªæ•°æ®åº“操作,˜q™æ ·é¿å¼€ä½¿ç”¨root
输入命ä×oåQšuse first;
使用first数据库;

在firståº“ä¸­å»ø™¡¨
命ä×oåQšcreate table about(id int(8) primary key,name varchar(10));

在表中假如数据:
命ä×oåQšinsert into  about values('xyw1026','laojiang');

退å‡?BR>命ä×oåQšexit

JSP˜qžæŽ¥mysql
在C:\Program Files\Apache Software Foundation\Tomcat5.5\webapps目录下徏立子目录myapp
˜q›å…¥C:\Program Files\Apache Software Foundation\Tomcat5.5\webapps\myapp目录ä¸?BR>用记事本¾~–å†™ä¸€ä¸ªæ–‡ä»¶ä¿å­˜äØ“first.jsp
代码如下åQ?BR><%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.sql.*"%>
<html>
<body>
<%Class.forName("org.gjt.mm.mysql.Driver").newInstance();
String url ="jdbc:mysql://localhost/softforum?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1"
//firstä¸ÞZ½ çš„æ•°æ®åº“å?
Connection conn= DriverManager.getConnection(url);
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql="select * from first";
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()) {%>
您的½W¬ä¸€ä¸ªå­—ŒDµå†…容䨓åQ?lt;%=rs.getString(1)%>
您的½W¬äºŒä¸ªå­—ŒDµå†…容䨓åQ?lt;%=rs.getString(2)%>
<%}%>
<%out.print("数据库操作成功,恭喜�);%>
<%rs.close();
stmt.close();
conn.close();
%>
</body>
</html>

在浏览器中输入:
http://127.0.0.1:8080/myapp/first.jsp
若出玎ͼš
id|num
0 |laojiang

数据库操作成功,恭喜�/P>

表示配置成功


˜q›å…¥C:\Program Files\Apache Software Foundation\Tomcat5.5\webapps\myapp目录
在myapp目录下新å»ÞZ¸€ä¸ªç›®å½•WEB-INFåQŒæ³¨æ„ï¼Œç›®å½•名称是区分大ž®å†™çš„ï¼›
在WEB-INF下用è®îCº‹æœ¬æ–°å»ÞZ¸€ä¸ªæ–‡ä»Óž¼Œå‘½åä¸ºweb.xmlåQŒå†…容如下:

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"

<web-app>
<display-name>My Web Application</display-name>
<description>
A application for test.
</description>
</web-app>

在myapp下用è®îCº‹æœ¬æ–°å»ÞZ¸€ä¸ªæµ‹è¯•çš„jsp™åµé¢åQŒæ–‡ä»¶åä¸ºindex.jspåQŒæ–‡ä»¶å†…容如下:

<html><body><center>
Now time is: <%=new java.util.Date()%>
</center></body></html>


重启Tomcat
打开‹¹è§ˆå™¨ï¼Œè¾“å…¥
http://localhost:8080/myapp/index.jsp
看到当前旉™—´çš„话说明成功安装ã€?

建立自己的ServletåQ?
用记事本新徏一个servlet½E‹åºåQŒæ–‡ä»¶åä¸ºHelloWorld.javaåQŒæ–‡ä»¶å†…容如下:

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet
{
public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException
{

response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><head><title>");
out.println("This is my first Servlet");
out.println("</title></head><body>");
out.println("<h1>Hello,World!</h1>");
out.println("</body></html>");

}
}


¾~–译
ž®†HelloWorld.java剪切到C:\Program Files\Apache Software Foundation\Tomcat5.5\common\classes目录ä¸?BR>命ä×o行方式下输入åQ?
cd C:\Program Files\Apache Software Foundation\Tomcat5.5\common\classes
javac HelloWorld.java
用javac HelloWorld.java来编译这个文ä»Óž¼Œå¦‚果出现无法import javax.servlet.*
则将C:\Program Files\Apache Software Foundation\Tomcat5.5\common\lib目录下的servlet-api.jaræ–‡äšg拯‚´òq¶æ·»åŠ åˆ°
C:\Program Files\Java\jre1.5.0_04\lib\ext目录中去ž®±å¯ä»¥äº†

然后在C:\Program Files\Apache Software Foundation\Tomcat5.5\common\classes下会产生一个编译后的servletæ–‡äšgåQšHelloWorld.class
用记事本打开C:\Program Files\Apache Software Foundation\Tomcat5.5\webapps\ROOT\WEB-INF目录下的web.xml如下所½Cºï¼Œæ·ÕdŠ åŽçš„å†…å®¹å¦‚ä¸‹:
.
.
.
<!-- JSPC servlet mappings start -->

    <servlet>
        <servlet-name>org.apache.jsp.index_jsp</servlet-name>
        <servlet-class>org.apache.jsp.index_jsp</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>org.apache.jsp.index_jsp</servlet-name>
        <url-pattern>/index.jsp</url-pattern>
    </servlet-mapping>

   
    <servlet>
        <servlet-name>HelloWorld</servlet-name>
        <servlet-class>HelloWorld</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>HelloWorld</servlet-name>
        <url-pattern>/servlet/HelloWorld</url-pattern>
    </servlet-mapping>

<!-- JSPC servlet mappings end -->

</web-app>

˜q™æ®µè¯ä¸­çš„servlet˜q™ä¸€ŒDµå£°æ˜Žäº†ä½ è¦è°ƒç”¨çš„ServletåQŒè€Œservlet-mapping则是ž®†å£°æ˜Žçš„servlet“映ž®„”到/servlet/HelloWorld地址ä¸?

启动TomcatåQŒå¯åŠ¨æµè§ˆå™¨åQŒè¾“å…?A href="http://localhost:8080//servlet/HelloWorld">http://localhost:8080//servlet/HelloWorld 如果看到输出HelloWorldåQå°±è¯´æ˜Ž¾~–写的servlet成功了ã€?
注意åQšä¿®æ”¹äº†web.xml以及新加了classåQŒéƒ½è¦é‡å¯Tomcat


也可以在自己创徏的目录下‹¹‹è¯•如:
ž®†HelloWorld.class拯‚´åˆ°C:\Program Files\Apache Software Foundation\Tomcat5.5\webapps\myapp\WEB-INF\classes目录ä¸?BR>其中classes目录若没有就创徏一ä¸?BR>用记事本打开C:\Program Files\Apache Software Foundation\Tomcat5.5\webapps\myapp\WEB-INF目录下的web.xml如下所½Cºï¼Œä¿®æ”¹åŽçš„内容如下:
.
.
.
<!-- JSPC servlet mappings start -->
   
    <servlet>
        <servlet-name>HelloWorld</servlet-name>
        <servlet-class>HelloWorld</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>HelloWorld</servlet-name>
        <url-pattern>/servlet/HelloWorld</url-pattern>
    </servlet-mapping>

<!-- JSPC servlet mappings end -->

</web-app>


启动TomcatåQŒå¯åŠ¨æµè§ˆå™¨åQŒè¾“å…?A href="http://localhost:8080/myapp/servlet/HelloWorld">http://localhost:8080/myapp/servlet/HelloWorld 如果看到输出HelloWorldåQå°±è¯´æ˜Ž¾~–写的servlet成功了ã€?
注意åQšä¿®æ”¹äº†web.xml以及新加了classåQŒéƒ½è¦é‡å¯Tomcat


建立自己的javaBeanåQ?

用记事本新徏一个java½E‹åºåQŒæ–‡ä»¶åä¸ºTestBean.javaåQŒæ–‡ä»¶å†…容如下:
package test;
public class TestBean{
private String name = null;
public TestBean(String strName_p){
this.name=strName_p;
}
public void setName(String strName_p){
this.name=strName_p;
}
public String getName(){
return this.name;
}
}

¾~–译
ž®†TestBean.java攑֜¨c:\test下,使用如下命ä×o¾~–译åQ?
C:\test>javac TestBean.java
然后在c:\Test下会产生一个编译后的beanæ–‡äšgåQšTestBean.class
ž®†TestBean.classæ–‡äšg剪切到C:\Program Files\Apache Software Foundation\Tomcat5.5\webapps\myapp\WEB-INF\classes\test目录下,
若无某些子目录则创徏一�

新徏一个TestBean.jspæ–‡äšgåQŒæ–‡ä»¶å†…容䨓åQ?
<%@ page import="test.TestBean" %>
<html><body><center>
<%
TestBean testBean=new TestBean("This is a test java bean.");
%>
Java bean name is: <%=testBean.getName()%>
</center></body></html>

重启TomcatåQŒå¯åŠ¨æµè§ˆå™¨åQŒè¾“å…?A href="http://localhost:8080/myapp/TestBean.jsp">http://localhost:8080/myapp/TestBean.jsp 如果看到输出Java bean name is: This is a test java bean
ž®Þp¯´æ˜Žç¼–写的javaBean成功了ã€?


åQˆç‰¹åˆ«æ³¨æ˜Žï¼šæœ¬æ–‡å†…容均来自互联网åQ?/P>



]]>
webwork2+spring+hibernate入门完全配置指南(1)(原创) 选择è‡?tijichen çš?Blog http://www.aygfsteel.com/lgplhk/archive/2005/08/17/10291.html我的JAVA我的JAVATue, 16 Aug 2005 17:06:00 GMThttp://www.aygfsteel.com/lgplhk/archive/2005/08/17/10291.htmlhttp://www.aygfsteel.com/lgplhk/comments/10291.htmlhttp://www.aygfsteel.com/lgplhk/archive/2005/08/17/10291.html#Feedback0http://www.aygfsteel.com/lgplhk/comments/commentRss/10291.htmlhttp://www.aygfsteel.com/lgplhk/services/trackbacks/10291.html 

webwork是个优秀的开源框æžÓž¼Œç‰¹åˆ«æ˜¯å…¶æ‹¦æˆªå™¨æœºåˆÓž¼Œæˆ‘认为是整个¾pȝ»Ÿæœ€å¤§çš„亮点åQŒå¯åœ¨å…¶ä¸Šé¢åšå¤§é‡æ–‡ç«?BR>æˆ‘çš„å¼€å‘çŽ¯å¢ƒäØ“Eclipse3.0.1+lomozåQŒæ•°æ®åº“我用的是MySQL4.0.12,当然åQŒä¹Ÿç”¨åˆ°äº†mysqlcc,服务器我用的是tomcat4.0.3å’Œtomcat4.1
请先下蝲webwork.,spring.,hibernateåQŒåƈ把JARæ–‡äšg攑ֈ°web-infçš„lib目录里面。同æ—Óž¼Œè¯·ä¸‹è½?A >http://unc.dl.sourceforge.net/sourceforge/aopalliance/aopalliance.zip åQŒå°†aopalliance.jar攑ֈ°lib目录里面ã€?BR>˜q˜æœ‰webwork2-spring.jaråQŒä»¥åŠmysqlçš„é©±åŠ¨éƒ½è¦ä¸‹è½½åÆˆæ”‘Öˆ°lib里面åQŒç¼ºä¸€ä¸å¯
然后是配¾|®log4jåQŒå¦‚果没有正¼‹®é…¾|®logåQŒTOMCATž®†ä¸èƒ½æ­£å¸¸å‘布你的项目。配¾|®log4j很简单,
在web-inf/classes下徏立一个log4j.properties的文ä»Óž¼Œå†…容如下
    log4j.rootLogger=INFO, A1 , R
    log4j.appender.A1=org.apache.log4j.ConsoleAppender
    log4j.appender.A1.layout=org.apache.log4j.PatternLayout
    log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
    log4j.appender.R=org.apache.log4j.RollingFileAppender
    log4j.appender.R.File=d:/Tomcat 4.1/webapps/demo/logs/log4j.log
    log4j.appender.R.MaxFileSize=100KB
    log4j.appender.R.MaxBackupIndex=1
    log4j.appender.R.layout=org.apache.log4j.PatternLayout
    log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
其中log4j.appender.R.File˜q™ä¸€™å¹è¯·æŒ‰ç…§ä½ TOMCAT的安装位¾|®è¿›è¡Œä¿®æ”¹ï¼Œå…³äºŽlog4j的详¾l†å†…容,推荐大家看Hilton的学习笔è®îC»¥åŠIBM¾|‘站上的相关文章.
 å¥½äº†åQŒå¼€å§‹æˆ‘们的webwork之旅了。首先是配置web.xmlæ–‡äšg
<?xml version="1.0" ?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

<!-- Copyright (c) 2002 by ObjectLearn. All Rights Reserved. -->
<web-app>
       <listener>
              <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
       </listener>
       <listener>
              <listener-class>com.atlassian.xwork.ext.ResolverSetupServletContextListener</listener-class>
       </listener>
    <servlet>
        <servlet-name>webwork</servlet-name>
        <servlet-class>com.opensymphony.webwork.dispatcher.ServletDispatcher</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>webwork</servlet-name>
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>

     <taglib>
        <taglib-uri>webwork</taglib-uri>
        <taglib-location>/WEB-INF/webwork.tld</taglib-location>
    </taglib>

</web-app>

我们配置了两个监听器åQŒè¿˜æœ‰ä¸€ä¸ªservletåQŒè¿™ä¸ªservletè´Ÿè´£actionçš„è{发工作,关于action的详¾l†å·¥ä½œåŽŸç†ï¼Œå¤§å®¶å¯ä»¥å‚çœ‹xwork的源代码
在接下来配置之前åQŒæˆ‘惛_¤§æ¦‚说一下我惛_®žçŽ°çš„åŠŸèƒ½åQŒå°±æ˜¯ç®€å•的往mysql的一个表中插入一些数æ?BR>首先我用Middlegen-Hibernateå’Œhibernate-extensionsåQˆæˆ‘没用eclipseçš„hibernate插äšgåQŒæˆ‘喜欢用这两样工具来生æˆ?IMG src="http://blog.csdn.net/Emoticons/tongue_smile.gif">åQ‰ç”Ÿæˆäº†è¡¨å¯¹åº”çš„hbm.xmlæ–‡äšg和两个JAVA¾c»ï¼Œè¡¨çš„字段æ˜?tablename,fieldname,chinesename", 表名æ˜?BR>"systable",其中tablename,fieldname做双主键åQŒè¿™æ øP¼Œç”Ÿæˆå‡ºæ¥çš„类应该是两个,一个PK主键¾cÕd’Œä¸È±»æœ¬èínåQŒæˆ‘把他们加入到了我的项目中.
然后我做了一个接口类
 package com.cz.struct;

 /**
  * @author tijichen
  *
  * TODO To change the template for this generated type comment go to
  * Window - Preferences - Java - Code Style - Code Templates
  */
 public interface SystableDAO {
  public abstract void insert(Systable data);
 }
然后是实现类
 package com.cz.struct;
 import net.sf.*;
 import org.springframework.orm.hibernate.support.HibernateDaoSupport;
 /**
  * @author tijichen
  *
  * TODO To change the template for this generated type comment go to
  * Window - Preferences - Java - Code Style - Code Templates
  */
 public class SysTableDAOImp extends HibernateDaoSupport implements
 SystableDAO{
  public void insert(Systable data)
  {
   this.getHibernateTemplate().save(data);
  }
 }
ä¸ÞZ»€ä¹ˆè¦ç”¨æŽ¥å£ç±»åQŸå› ä¸ºspring会用到JAVA的动态代理,关于˜q™éƒ¨åˆ†ï¼Œå¤§å®¶å¯ä»¥çœ‹xiaxinçš„spring指南
在insert æ–ÒŽ³•中,我直接调用了spring提供的hibernate模板æ–ÒŽ³•åQŒçœŸæ˜¯æ–¹ä¾¿å‘€

然后æ˜?spring的配¾|®äº†åQŒè¯·åœ¨web-lib/下徏立applicationContext.xmlæ–‡äšgåQŒå†…容如ä¸?BR><?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.springframework.jdbc.datasource.DriverManagerDataSource"
   destroy-method="close">
   <property name="driverClassName">
    <value>org.gjt.mm.mysql.Driver</value>
   </property>
   <property name="url">
    <value>jdbc:mysql://localhost/mystructs</value>
   </property>
   <property name="username">
    <value>chenzhi</value>
   </property>
   <property name="password">
    <value>1</value>
   </property>
  </bean>
  <bean id="sessionFactory"
   class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
   <property name="dataSource">
    <ref local="dataSource" />
   </property>
   <property name="mappingResources">
    <list>
     <value>com\cz\struct\SysTable.hbm.xml</value>
    </list>
   </property>
   <property name="hibernateProperties">
    <props>
     <prop key="hibernate.dialect">
      net.sf.hibernate.dialect.MySQLDialect
     </prop>
     <prop key="hibernate.show_sql">
      true
     </prop>
    </props>
   </property>
  </bean>
  <bean id="transactionManager"
   class="org.springframework.orm.hibernate.HibernateTransactionManager">
   <property name="sessionFactory">
    <ref local="sessionFactory" />
   </property>
  </bean>
  <bean id="systableDAO" class="com.cz.struct.SysTableDAOImp">
   <property name="sessionFactory">
    <ref local="sessionFactory" />
   </property>
  </bean>
  <bean id="systableDAOProxy"
   class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
   <property name="transactionManager">
    <ref bean="transactionManager" />
   </property>
   <property name="target">
    <ref local="systableDAO" />
   </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>
</beans>

在这个配¾|®æ–‡ä»‰™‡Œé¢ï¼Œæˆ‘们讄¡½®äº†datasource\sessionfactory以及spring的动态代理,˜q˜æœ‰hibernate所需要的XML映射文äšg路径
然后是配¾|®xwork.xml
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "http://www.opensymphony.com/xwork/xwork-1.0.dtd">
<xwork>
 <include file="webwork-default.xml" />
  <package name="default" extends="webwork-default"
   externalReferenceResolver="com.atlassian.xwork.ext.SpringServletContextReferenceResolver">
  <interceptors>
  <interceptor name="reference-resolver"
  class="com.opensymphony.xwork.interceptor.ExternalReferencesInterceptor" />
  <interceptor-stack name="vxStack">
  <interceptor-ref name="params" />
  <interceptor-ref name="model-driven" />
  <interceptor-ref name="reference-resolver" />
  </interceptor-stack>
  </interceptors>
<action name="Test" class="com.cz.struct.TestAction">
 <external-ref name="systableDAO">systableDAOProxy</external-ref>
 <result name="success" type="dispatcher">
 <param name="location">/index.jsp</param>
 </result>

 <interceptor-ref name="vxStack" />
</action>
</package>
</xwork>

在配¾|®actionçš„external-ref的时候我遇到了一个不大不ž®çš„玩笑åQŒä¸€èˆ¬ç¼–辑XML的时候我都是在editplus里面¾~–辑çš?BR>åQŒæœ€å¼€å§‹æˆ‘写成
<external-ref name="systableDAO">
 systableDAOProxy
</external-ref>
¾l“æžœ¾pȝ»Ÿæç¤ºæ‰¾ä¸åˆ°å«systableDAOProxy˜q™ä¸ªåå­—çš„beanåQŒç»“果一查,发现旁边不能加上½Iºæ ¼å’ŒtabåQŒå“Žã€‚。肯定是˜q”回串的时候没加trim
的后æž?BR>好了åQŒæœ€åŽæ˜¯æˆ‘们的TestAction.java
package com.cz.struct;
import com.opensymphony.xwork.*;
import com.opensymphony.webwork.*;
import java.util.*;
/**
 * @author tijichen
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class TestAction extends ActionSupport
{
 private SystableDAO systabledao;
 
 String testname=null;
 public void setSystableDAO(SystableDAO dao)
 {
  this.systabledao=dao;
 }
 public SystableDAO getSystableDAO()
 {return this.systabledao;}
    public String execute() throws Exception {
     testname="executeing";
     SystablePK pk=new SystablePK();
     Systable newdata=new Systable();
     pk.setFieldName("test");
     pk.setTableName("test3");
     newdata.setComp_id(pk);
     newdata.setChineseName("tets");

     systabledao.insert(newdata);
        return Action.SUCCESS;
    }
 
}
ok,¾~–译打包åQŒç„¶åŽåœ¨‹¹è§ˆå™¨åœ°å€æ ä¸­è¾“å…¥http://localhost:8080/你的发布目录/Test.action
看看åQŒæ˜¯ä¸æ˜¯æ•°æ®åº“里面多å‡ÞZº†ä¸€æ¡æ•°æ®äº†åQ?BR>至于其他åQŒæ¯”如从™åµé¢æäº¤çš„值插入数据库½{‰ç­‰åQŒè¿™é‡Œéƒ½ä¸å¤šè¯´äº†åQŒwebwork自带的samplež®±æ˜¯æœ€å¥½çš„参考资æ–?/P>

]]>
JDBCä¹?MYSQL 选择è‡?mfc2003 çš?Blog http://www.aygfsteel.com/lgplhk/archive/2005/08/17/10290.html我的JAVA我的JAVATue, 16 Aug 2005 16:01:00 GMThttp://www.aygfsteel.com/lgplhk/archive/2005/08/17/10290.htmlhttp://www.aygfsteel.com/lgplhk/comments/10290.htmlhttp://www.aygfsteel.com/lgplhk/archive/2005/08/17/10290.html#Feedback0http://www.aygfsteel.com/lgplhk/comments/commentRss/10290.htmlhttp://www.aygfsteel.com/lgplhk/services/trackbacks/10290.html 

package zmsjdbc;
import java.sql.*;
public class mysql1
{

  private   String url="jdbc:mysql://localhost:3306/beyond";
            //先下载MYSQL 驱动  mm.mysql-2.0.4-bin.jar 攑֜¨D:\JBuilder9\jdk1.4\jre\lib\ext ä¸?/P>

 private   String user="root";
 private   String pwd="";
 public   Connection  getcon()
 {
   Connection con;
    try
    { //加蝲驱动½E‹åº
      Class.forName("org.gjt.mm.mysql.Driver").newInstance();
      //创徏˜qžæŽ¥
      con=DriverManager.getConnection(url,user,pwd);
      return con;
     }

     catch(ClassNotFoundException e)
     {
         System.out.println("加蝲驱动½E‹åºå‡ºé”™");
     }


     catch(Exception e)
     {
       System.out.println("出现了好大的错误");
     }

     return null;
 }
 public  ResultSet  executeSql(String sqlstr)
   {
     Connection conn;
     Statement stmt;

      try
      {
        conn=getcon();
        stmt=conn.createStatement();
        ResultSet  rs=stmt.executeQuery(sqlstr);

        return rs;
      }
      catch(SQLException e)
      {
        System.out.print("获取数据集时出现错误");
      }
      return null;
   }

  public static void main(String[] args)
  {
    mysql1 mysql11 = new mysql1();
    Connection conn;
    ResultSet  rs;
   rs= mysql11.executeSql("select * from zms1");
    try
    {
      while(rs.next())
      {
        System.out.println(rs.getString("name"));
      }
    }
    catch(Exception e)
    {
       System.out.println(e.getMessage());
    }


  }

}




]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º ãþÔ´ÏØ| ÁÙÎ÷ÏØ| ´ó·½ÏØ| ÏóÉ½ÏØ| ´óÐËÇø| ºÏɽÊÐ| Ó¢³¬| ÁÙÎäÏØ| ·ÖÒËÏØ| ÕѾõÏØ| ¿â¶ûÀÕÊÐ| ·ï»ËÏØ| °²ÔóÏØ| ÁúȪÊÐ| ÔÆ¸¡ÊÐ| »ÆÆ½ÏØ| Óå±±Çø| ÓªÉ½ÏØ| ´Ó½­ÏØ| µÂÇìÏØ| ãôË®ÏØ| ÉñÅ©¼ÜÁÖÇø| Æû³µ| Ò˱öÊÐ| Ô¶°²ÏØ| Ôæ×¯ÊÐ| ²ýÀèÏØ| Æ¤É½ÏØ| ÀϺӿÚÊÐ| äÀ´¨ÏØ| ¹ÛÌÁÇø| Ã×Ò×ÏØ| ÈÚË®| ¾²ÄþÏØ| ÒÁ½ð»ôÂåÆì| ÕòêãÏØ| ÓñÉ½ÏØ| ʯÆÁÏØ| ÊÖÓÎ| ²ªÀûÏØ| èϳÇÏØ|