??xml version="1.0" encoding="utf-8" standalone="yes"?> 我不?x)给你钱Q因为我没有? l你生活的忠?
]]>
]]>
多吃些粗_?
l别人比他们自己期许的更多,q且用心(j)d
熟记你喜Ƣ的诗歌
不要M你听到的每g事,不要花光你的所有,不要想睡多久q多久?br>无论何时?#8220;我爱?#8221;Q请真心(j)实意?br>无论何时?#8220;对不?#8221;Q请看着Ҏ(gu)的眼睛?br>怿一见钟情?br>永远不要忽视别h的梦惟?br>深情热烈地爱Q也怽?x)受伤,但这是人生完整的唯一Ҏ(gu)?br>用一U明的Ҏ(gu)解决争议Q不要冒犯?br>永远不要以貌取h。慢慢地_(d)但要q速地惟?br>当别人问你不惛_{的问题ӞW着?#8220;你ؓ(f)什么想知道Q?#8221;
C那些敢于承担最大风险的人才能得到最q爱和最大的成就?br>l妈妈打?sh)话。如果不行,臛_在心(j)里想着奏V?br>当别人打喷嚏Ӟ说一?#8220;菩萨保佑”?br>如果你失败了(jin)Q千万不要忘记݅取教训?br>C三个“?#8221;Q尊重你自己Q尊重别人;保持严Q对自己的行责?br>不要让小的争端损毁?jin)一D伟大的友谊?br>无论何时你发现自己做错了(jin)Q竭所能去弥补。动作要快!
无论什么时候打?sh)话Q摘赯{的时候请微笑Q因为对方能感觉刎ͼ
找一个你p的hl婚 Q?因ؓ(f)当年龄大?jin)以后,你?x)发觉喜欢聊天是一个h最大的优点?br>扄旉Q单独呆?x)儿?br>ƣ然接收改变Q但是不要摒弃你的个人理c(din)?br>CQ沉默是金?br>多看点书Q少看点?sh)视?br>q一U高而诚实的生活。当你年老时回想赯去,你就能再一ơn受h生?br>怿上帝Q但是别忘(sh)(jin)锁门?br>家庭的融z氛围是难能可贵的?br>你的全力让家^和谐?br>当你和你亲近的h吵嘴的时候,试着׃ZQ不要扯出那些陈芝麻Q烂谷子的事?br>不要摆脱不了(jin)昨天?br>多注意言下之意?br>和别人分享你的知识,那才是永恒之道!
善待我们的地球?br>不要愚弄自然母亲?br>忙自p做的事?br>不要怿接吻时从不闭眼的伴G?br>每年臛_M个你从没去过的地斏V?br>如果你赚?jin)很多钱Q在zȝ的时候多行善事。这是你能得到的最好回报?br>C有时候,不是最好的收获也是一U好q?br>深刻理解所有的规则Q合理地更新他们?br>CQ最好的关系存在于对别h的爱胜于对别人的索求之上?br>回头看看你发誓取得的目标Q然后评判你到底有多成功?br>无论是烹调还是爱情,都用癑ֈ之百的负责态度对待Q但是不要期求太多的回报?/p>
(tng) (tng) (tng) 对于刚进入嵌入式pȝ的学?fn)首先是象学J2EE那样看不懂且不知所云的名字Q所以先要搞定这些名词:(x)
嵌入式Y件系l的几种模式Q?br />
一 (tng) (tng) 单嵌入式pȝQ包含简单的g初始化以?qing)应用代码?br /> 二?tng)?单嵌入式pȝQ包含bootloader以及(qing)应用代码Qbootloader与应用紧密集成在一P构成一个嵌
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 入式pȝ?br /> 三?tng)?复杂嵌入式系l,包含bootloader、操作系l、应用Y件?br />
开发编l环?/strong>Q?br />
(tng) (tng) (tng) (tng) (tng) ads1.2 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) arm的编译器arm公司开发的
(tng) (tng) (tng) (tng) arm-elf-gcc (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) Liunx环境下的arm~绎?br /> (tng) (tng) (tng) (tng) (tng) cygwin+armtools (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) windows下模拟linux的程序和q行在cygwin下的arm的编译器
(tng) (tng) (tng) (tng) (tng) ARM_SDT_2.51 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) arm比较早版本的~译?br />q么多开发编l环境选择适合的就行如果你用操作系l是Linux~辑工具是vi之类一般是arm-elf-gcc (tng)如果操作pȝ是windows见意ads1.2 (tng)?br />
嵌入式操作系l:(x)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) VxWorks (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 实时性最好,要付费,一般用在高端实旉域,好像国的飞船上q它?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) uc/os-II (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 单适合入门Q好多书都讲q个操作pȝQ其代码量也不大如果要看它的源码的话?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) winCE (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 微Y的东四,收费一般小应用׃用它的,高端手机比如多普达上用的是它?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) uclinux (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 是ؓ(f)适应没有MMCg的CPUQarm7TDMIQ开发的liunx的版本,开源、免费,怿
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 是今天后的趋势,学习(fn)有一定的隑ֺQ网上资料还是很多的?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) liunx (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 开源、免?ARM9上就可以?br />
其它名词Q?/strong>
(tng) (tng) (tng) (tng) (tng) (tng) (tng)SkyEye (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 是开源Y件?tng)的一个项目,SkyEye的目标是在Linux和W(xu)indows操作pȝ里提供一个完全的
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 仿真环境。SkyEye仿真环境相当于一个嵌入式计算机系l,你可以在SkyEye里运行一?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)嵌入式Linux操作pȝQ如ARMLinuxQuClinuxQuc/OSII(ucos-ii){,q能分析和调试它?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 的源代码?br />Boot Loader (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 是在操作系l内核运行之前运行的一D小E序。通过q段程序,我们可以初始?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 件设备、徏立内存空间的映射图,从而将pȝ的Yg环境带到一个合适的状态,以便
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 为最l调用操作系l内核准备好正确的环境。相当于PCZ的BIOS?br />
Blob、Bootldr、Redboot、U-Boot、ABLE
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) Boot Loader 是严重地依赖于硬件而实现的Q除?jin)依赖于CPU 的体pȝ构外QBoot Loader实际上也依赖于具体的嵌入式板U设备的配置。这也就是说Q对于两块不同的嵌入式板而言Q即使它们是Z同一UCPU 而构建的Q要惌q行在一块板子上的Boot Loader E序也能q行在另一块板子上Q通常也都需要修改BootLoader 的源E序。Blob、Bootldr、Redboot、U-Boot、ABLE都是Z对于CPU 的体pȝ构外开发的通用的BootLoaderE序Q你只需对这些程序进行移植就行了(jin)?br />
嵌入式处理器的启动过E:(x)
(tng) (tng) (tng) (tng)
通常pȝ上电(sh)Q或者复位)(j)以后Q程序从地址I间?x0开始 即PCQ程序计数器Q指针,指向0x0。从q个地址开始读取指令ƈq行。通常q个地址对应的是Bank0。因为系l是从bank0上引导的Q所以,在Bank0上连接保存有启动代码的FlashROMQ这是我们常说的Boot ROM即BootloaderE序?br /> (tng) (tng) (tng) (tng)
Bootloader要实玎ͼ(x)
gpȝ自检?br />
配置其他Bank或者端口、外讄工作模式?br />
处理中系l的中断?在不支持remap的处理器中,中断必然要经qBoot ROM的空_(d)q时QBoot ROM
(tng) (tng) (tng) (tng) (tng) (tng)需要处理的d是把固定的中断向量映射C个可~程的中断处理子E序的地址?br />
(tng) (tng) (tng) (tng) 引导操作pȝ
?pȝ配置完成以后Q?Bootloader需要把操作pȝQ或者其他程序)(j)装蝲到SDRAMQ就是系l的RAM区)(j)Q然后,把PC指针指向E序的RAMI间Q操作pȝ启动Q这是引导?br />
(tng) (tng) (tng) (tng) FlashQBoot ROMQ编E?br />?对引导FlashQ或者其他的非易失性存储器Q编E,通过串口或者以太网口下载编译成功的操作pȝ或者应用程序,甚至Boot ROM本n。?要想实现Boot ROM的自~程Q必让BootE序是在RAM中运?img src ="http://www.aygfsteel.com/linansengling/aggbug/79394.html" width = "1" height = "1" />
]]>
(tng) (tng) (tng)
(tng) (tng) 源程序下?/a>
(tng) (tng) 至于Hibernate, Structs, MySQL的具体用法我׃说了(jin),你可以看源程序来查看详细内容.我们来看看分应用的相关内容.
(tng)架构上和Spring JPetStore没多区? 只是没用Spring框架所以Structs中的UserdisplayAction中必new出各个对象ƈ完成它们之间的关? q就是Spring IOC可自动完成的功能. 它也是三?表现?Structs), (tng)业务?POJO), 数据?Hibernate讉KMySQL). (tng)同样业务层通过DAO接口(UserDAO)来访问数据库, 讉K数据库的通过Hibernate(在UserDAOImpl中实?. (tng)q一ơ分要在业务层中来实现, 业务层同样向表现层提供一个Facada(门面, (tng) UserManager接口), 来访问业? 在UserManagerImpl中通过调用UserDAO来访问数? 调用POJO来实现分功? 看以下关键代?
先看POJO的分布类?
Page.java
package org.flyware.util.page;
public class Page { (tng)
(tng) (tng) (tng) (tng)
(tng) (tng) (tng) private boolean hasPrePage; (tng)
(tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) private boolean hasNextPage; (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) private int everyPage; (tng)
(tng) (tng) (tng) (tng)
(tng) (tng) (tng) private int totalPage; (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) private int currentPage; (tng)
(tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) private int beginIndex; (tng)
(tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) public Page(){
(tng) (tng) (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) } (tng)
(tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) public Page(int everyPage){
(tng) (tng) (tng) (tng) (tng) (tng) (tng) this.everyPage = everyPage;
(tng) (tng) (tng) }
(tng) (tng) (tng)
(tng) (tng) (tng) /** The whole constructor */
(tng) (tng) (tng) public Page(boolean hasPrePage, boolean hasNextPage, (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) int everyPage, int totalPage,
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) int currentPage, int beginIndex) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) this.hasPrePage = hasPrePage;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) this.hasNextPage = hasNextPage;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) this.everyPage = everyPage;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) this.totalPage = totalPage;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) this.currentPage = currentPage;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) this.beginIndex = beginIndex;
(tng) (tng) (tng) }
(tng) (tng) (tng) (tng) (tng) (tng)...... (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng)
(tng) (tng) public int getTotalPage() {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) return totalPage;
(tng) (tng) (tng) } (tng)
(tng) (tng) (tng)
(tng) (tng) (tng) public void setTotalPage(int totalPage) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) this.totalPage = totalPage;
(tng) (tng) (tng) }
(tng) (tng) (tng)
}
PageUtil.java(用来构造Page实例 相当于page工厂)
package org.flyware.util.page;
public class PageUtil {
(tng) (tng) (tng)
(tng) (tng) (tng) private static final Log logger = LogFactory.getLog(PageUtil.class); (tng)
(tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) public static Page createPage(Page page, int totalRecords){ (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) return createPage(page.getEveryPage(), page.getCurrentPage(), totalRecords);
(tng) (tng) (tng) } (tng)
(tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) public static Page createPage(int everyPage, int currentPage, int totalRecords){
(tng) (tng) (tng) (tng) (tng) (tng) (tng) everyPage = getEveryPage(everyPage); (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) currentPage = getCurrentPage(currentPage); (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) int beginIndex = getBeginIndex(everyPage, currentPage); (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) int totalPage = getTotalPage(everyPage, totalRecords); (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) boolean hasNextPage = hasNextPage(currentPage, totalPage); (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) boolean hasPrePage = hasPrePage(currentPage);
(tng) (tng) (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) return new Page(hasPrePage, hasNextPage, (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) everyPage, totalPage,
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) currentPage, beginIndex);
(tng) (tng) (tng) }
(tng) (tng) (tng)
(tng) (tng) (tng) private static int getEveryPage(int everyPage){
(tng) (tng) (tng) (tng) (tng) (tng) (tng) return everyPage == 0 ? 10 : everyPage;
(tng) (tng) (tng) }
(tng) (tng) (tng)
(tng) (tng) (tng) private static int getCurrentPage(int currentPage){
(tng) (tng) (tng) (tng) (tng) (tng) (tng) return currentPage == 0 ? 1 : currentPage;
(tng) (tng) (tng) }
(tng) (tng) (tng)
(tng) (tng) (tng) private static int getBeginIndex(int everyPage, int currentPage){
(tng) (tng) (tng) (tng) (tng) (tng) (tng) return (currentPage - 1) * everyPage;
(tng) (tng) (tng) }
(tng) (tng) (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) private static int getTotalPage(int everyPage, int totalRecords){
(tng) (tng) (tng) (tng) (tng) (tng) (tng) int totalPage = 0;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) if(totalRecords % everyPage == 0)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) totalPage = totalRecords / everyPage;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) else
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) totalPage = totalRecords / everyPage + 1 ;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) return totalPage;
(tng) (tng) (tng) }
(tng) (tng) (tng)
(tng) (tng) (tng) private static boolean hasPrePage(int currentPage){
(tng) (tng) (tng) (tng) (tng) (tng) (tng) return currentPage == 1 ? false : true;
(tng) (tng) (tng) }
(tng) (tng) (tng)
(tng) (tng) (tng) private static boolean hasNextPage(int currentPage, int totalPage){
(tng) (tng) (tng) (tng) (tng) (tng) (tng) return currentPage == totalPage || totalPage == 0 ? false : true;
(tng) (tng) (tng) }
(tng) (tng) (tng)
}
业务实现c?UserManaerImpl.java
package com.linan.service.impl;
public class UserManagerImpl implements UserManager {
(tng) (tng) (tng)
(tng) (tng) (tng) private UserDAO userDAO;
(tng) (tng) (tng) (tng) (tng) (tng) public void setUserDAO(UserDAO userDAO) { (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) this.userDAO = userDAO; (tng)
(tng) (tng) (tng) } (tng)
(tng) (tng)
//提供业务Ҏ(gu)
public Result listUser(Page page) throws HibernateException,
ObjectNotFoundException { (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) int totalRecords = userDAO.getUserCount(); (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) if(totalRecords == 0) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) throw new ObjectNotFoundException("userNotExist", null);
(tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) page = PageUtil.createPage(page, totalRecords); (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) List users = userDAO.getUserByPage(page); (tng) (tng) (tng)
(tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) return new Result(page, users); (tng)
(tng) (tng) (tng) }
}
DAO数据讉K实现c?UserDAOImpl.java
package com.linan.dao.impl;
public class UserDAOImpl (tng) implements UserDAO {
(tng) (tng)...........
(tng) (tng) (tng) (tng) (tng) public List getUserByPage(Page page) throws HibernateException { (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) String querySentence = "FROM user in class com.linan.bo.Userlist"; (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) Query query = getSession().createQuery(querySentence); (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) //实现分页功能
(tng) (tng) (tng) (tng) (tng) (tng) (tng) query.setFirstResult(page.getBeginIndex()) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) .setMaxResults(page.getEveryPage()); (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) return query.list(); (tng)
(tng) (tng) (tng) }
}
表现层Structs中的Action UserdisplayAction.java
package com.linan.struts.action;
public class UserdisplayAction extends Action {
(tng)
(tng)public ActionForward execute(
(tng) (tng)ActionMapping mapping,
(tng) (tng)ActionForm form,
(tng) (tng)HttpServletRequest request,
(tng) (tng)HttpServletResponse response) {
(tng) (tng) (tng)Page page=new Page(); (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) UserManagerImpl userManager=new UserManagerImpl();
(tng) (tng) (tng) (tng) (tng) (tng) (tng) UserDAOImpl userDAO=new UserDAOImpl();
(tng) (tng) (tng) (tng) (tng) (tng) (tng) userManager.setUserDAO(userDAO);
(tng) (tng) (tng) (tng) (tng) (tng) //掉用业务代理完成分页
(tng) (tng) (tng) (tng) (tng) (tng) (tng) Result result=userManager.listUser(page);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) List list=result.getContent();
(tng) (tng) (tng) (tng) (tng) (tng) (tng) HttpSession session=request.getSession();
(tng) (tng) (tng) (tng) (tng) (tng) (tng) session.setAttribute("list",list);
(tng) (tng)return mapping.findForward("displayGo");
(tng)}
}
(tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
(tng) (tng)
先从数据讉K层说起吧, 他用iBATIS框架来访问数据库,?.\spring-jpetstore\samples\jpetstore\db目录下有它的各种数据库的schema有hsql, mysql, oracle, postges你用拿一U数据库是通过..\spring-jpetstore\samples\jpetstore\war\WEB-INF下的jdbc.properties来配|的.默认的是hsql数据?
# Properties file with JDBC-related settings.
# Applied by PropertyPlaceholderConfigurer from "dataAccessContext-local.xml".
# Targeted at system administrators, to avoid touching the context XML files.
jdbc.driverClassName=org.hsqldb.jdbcDriver
jdbc.url=jdbc:hsqldb:hsql://localhost:9002
jdbc.username=sa
jdbc.password=
要改为用mysql只要改ؓ(f):
#jdbc.driverClassName=org.hsqldb.jdbcDriver
#jdbc.url=jdbc:hsqldb:hsql://localhost:9002
#jdbc.username=sa
#jdbc.password=
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/jpetstore
jdbc.username=root
jdbc.password=
卛_.业务层能q?..jpetstore.dao包下的接口来讉K....jpetstore.dao.ibatis包从而通过iBATIS框架讉K数据库中的数据的部䆾代码如下:
package org.springframework.samples.jpetstore.dao;
public interface AccountDao {
(tng) Account getAccount(String username, String password) throws DataAccessException;
(tng) ...........
}
package org.springframework.samples.jpetstore.dao.ibatis;
public class SqlMapAccountDao extends SqlMapDaoSupport implements AccountDao {
(tng) (tng) (tng) public Account getAccount(String username, String password) throws DataAccessException {
(tng) (tng) (tng) Account account = new Account();
(tng) (tng) (tng) account.setUsername(username);
(tng) (tng) (tng) account.setPassword(password);
(tng) (tng) (tng) return (Account) getSqlMapTemplate().executeQueryForObject("getAccountByUsernameAndPassword", account);
(tng) }
..............
}
Account.xml
<mapped-statement name="getAccountByUsernameAndPassword" result-map="result">
(tng) (tng) (tng) select
(tng) (tng) (tng) (tng) (tng) SIGNON.USERNAME as USERID,
(tng) (tng) (tng) (tng) (tng) ACCOUNT.EMAIL,
(tng) (tng) (tng) (tng) (tng) ACCOUNT.FIRSTNAME,
(tng) (tng) (tng) (tng) (tng) ACCOUNT.LASTNAME,
(tng) (tng) (tng) (tng) (tng) ACCOUNT.STATUS,
(tng) (tng) (tng) (tng) (tng) ACCOUNT.ADDR1,
(tng) (tng) (tng) (tng) (tng) ACCOUNT.ADDR2,
(tng) (tng) (tng) (tng) (tng) ACCOUNT.CITY,
(tng) (tng) (tng) (tng) (tng) (tng).. (tng) (tng) (tng)
(tng) (tng) (tng) from ACCOUNT, PROFILE, SIGNON, BANNERDATA
(tng) (tng) (tng) where ACCOUNT.USERID = #username#
(tng) (tng) (tng) (tng) (tng) and SIGNON.PASSWORD = #password#
(tng) (tng) (tng) (tng) (tng) and SIGNON.USERNAME = ACCOUNT.USERID
(tng) (tng) (tng) (tng) (tng) and PROFILE.USERID = ACCOUNT.USERID
(tng) (tng) (tng) (tng) (tng) and PROFILE.FAVCATEGORY = BANNERDATA.FAVCATEGORY
(tng) </mapped-statement>
然后C(jin)业务? 业务层ؓ(f)表达层提供服?操纵数据层来完成业务逻辑比如从数据库中读出客启信息传l表辑ֱ 向数据库中插入订单等.业务层还要完成对数据库操作的完整?正确性即事务理. 此应用是通过Spring的AOP来完成无需~程实现如下:
dataAccessContex-local.xml
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
(tng) (tng)<property name="driverClassName"><value>${jdbc.driverClassName}</value></property>
(tng) (tng)<property name="url"><value>${jdbc.url}</value></property>
(tng) (tng)<property name="username"><value>${jdbc.username}</value></property>
(tng) (tng)<property name="password"><value>${jdbc.password}</value></property>
(tng)</bean>
(tng)<!-- Transaction manager for a single JDBC DataSource -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
(tng) <property name="dataSource">
(tng) (tng) <ref local="dataSource" />
(tng) </property>
(tng) <property name="mappingResources">
(tng) (tng) <list>
(tng) (tng) (tng) <value>org/springframework/samples/jpetstore/Hibernate/Account.hbm.xml</value>
(tng) (tng) </list>
(tng) </property>
(tng) <property name="hibernateProperties">
(tng) (tng) <props>
(tng) (tng) (tng) <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
(tng) (tng) (tng) <prop key="hibernate.show_sql">true</prop>
(tng) (tng) </props>
(tng) </property>
(tng)</bean>
(tng)
(tng)<!-- (see dataAccessContext-jta.xml for an alternative) -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
(tng) <property name="sessionFactory">
(tng) (tng) <ref local="sessionFactory" />
(tng) </property>
(tng)</bean>
(tng)<!-- SqlMap setup for iBATIS Database Layer -->
(tng)<bean id="sqlMap" class="org.springframework.orm.ibatis.SqlMapFactoryBean">
(tng) (tng)<property name="configLocation"><value>WEB-INF/sql-map-config.xml</value></property>
(tng)</bean>
(tng)<!-- ========================= DAO DEFINITIONS: IBATIS IMPLEMENTATIONS ========================= -->
(tng)<bean id="accountDao" class="org.springframework.samples.jpetstore.dao.hibdaoimp.AccountDaoImp">
(tng) <property name="sessionFactory">
(tng) (tng) <ref local="sessionFactory" />
(tng) </property>
(tng) (tng)
(tng)</bean>
................
</beans>
applicationContex.xml
<bean id="petStoreTarget" class="org.springframework.samples.jpetstore.domain.logic.PetStoreImpl">
(tng) (tng)<property name="accountDao"><ref bean="accountDao"/></property>
(tng) (tng)<property name="categoryDao"><ref bean="categoryDao"/></property>
(tng) (tng)<property name="productDao"><ref bean="productDao"/></property>
(tng) (tng)<property name="itemDao"><ref bean="itemDao"/></property>
(tng) (tng)<property name="orderDao"><ref bean="orderDao"/></property>
(tng)</bean>
(tng)<!-- Transactional proxy for the JPetStore primary business object -->
(tng)<bean id="petStore" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
(tng) (tng)<property name="transactionManager"><ref bean="transactionManager"/></property>
(tng) (tng)<property name="target"><ref local="petStoreTarget"/></property>
(tng) (tng)<property name="transactionAttributes">
(tng) (tng) (tng)<props>
(tng) (tng) (tng) (tng)<prop key="insert*">PROPAGATION_REQUIRED</prop>
(tng) (tng) (tng) (tng)<prop key="update*">PROPAGATION_REQUIRED</prop>
(tng) (tng) (tng) (tng)<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
(tng) (tng) (tng)</props>
(tng) (tng)</property>
(tng)
从上面的配置代码我们可看到通过Spring的IOC完成?font color="#ff0033">org.springframework.samples.jpetstore.domain.logic.PetStoreImpl{类的注? 通过AOP?/font>org.springframework.transaction.interceptor.TransactionProxyFactoryBean来完成事务代?br />业务层通过一个门?facada)PetStoreFacade.java接口来ؓ(f)表达层提供服?
package org.springframework.samples.jpetstore.domain.logic;
public interface PetStoreFacade {
(tng)Account getAccount(String username);
(tng)Account getAccount(String username, String password);
(tng)void insertAccount(Account account);
(tng)void updateAccount(Account account);
..........
}
用PetStoreImp.java来实?
package org.springframework.samples.jpetstore.domain.logic;
public class PetStoreImpl implements PetStoreFacade, OrderService {
(tng) private AccountDao accountDao;
(tng).........
(tng)public void setAccountDao(AccountDao accountDao) {
(tng) (tng)this.accountDao = accountDao;
(tng)}
(tng)public Account getAccount(String username) {
(tng) (tng) (tng) return this.accountDao.getAccount(username);
(tng) }
(tng) public Account getAccount(String username, String password) {
(tng) (tng)return this.accountDao.getAccount(username, password);
(tng) }
(tng) public void insertAccount(Account account) {
(tng) (tng)this.accountDao.insertAccount(account);
(tng) }
(tng) .......
}
表达层这里介lStructs,Structs中通过PetStoreFacade接口来访问业务层:
package org.springframework.samples.jpetstore.web.struts;
public abstract class BaseAction extends Action {
(tng) private PetStoreFacade petStore;
(tng)public void setServlet(ActionServlet actionServlet) {
(tng) (tng)super.setServlet(actionServlet);
(tng) (tng)ServletContext servletContext = actionServlet.getServletContext();
(tng) (tng)WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
(tng) (tng)this.petStore = (PetStoreFacade) wac.getBean("petStore");
(tng)}
(tng)protected PetStoreFacade getPetStore() {
(tng) (tng)return petStore;
(tng)}
}
public class SignonAction extends BaseAction {
(tng) public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
(tng) (tng) (tng) (tng) (tng) (tng) (tng)AccountActionForm acctForm = (AccountActionForm) form;
(tng) (tng) (tng) (tng) (tng) String username = acctForm.getUsername();
(tng) (tng) (tng) (tng) (tng) String password = acctForm.getPassword();
(tng) (tng) (tng) (tng) (tng) Account account = getPetStore().getAccount(username, password);
.....
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) return mapping.findForward("success");
(tng) (tng) (tng) (tng)}
Structs框架通过struct-config.xml文来控制相关映射转发? (tng) (tng) (tng) (tng)
struct-config.xml (tng) (tng) (tng) (tng) (tng) (tng) (tng)
<action path="/signon" type="org.springframework.samples.jpetstore.web.struts.SignonAction"
(tng) (tng) (tng)name="accountForm" scope="request"
(tng) (tng) (tng)validate="false">
(tng) (tng) (tng)<forward name="success" path="/index.jsp"/>
(tng) (tng)</action>
关于jsp׃在多说了(jin)下面再来看一下它的web.xml文g:
(tng) (tng)<context-param>
(tng) (tng)<param-name>contextConfigLocation</param-name>
(tng) (tng)<param-value>
(tng) (tng) (tng)/WEB-INF/dataAccessContext-local.xml (tng) /WEB-INF/applicationContext.xml
(tng) (tng)</param-value>
(tng) (tng) (tng)</context-param>
<servlet>
(tng) (tng)<servlet-name>context</servlet-name>
(tng) (tng)<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
(tng) (tng)<load-on-startup>1</load-on-startup>
(tng)</servlet>
(tng)<servlet>
(tng) (tng)<servlet-name>action</servlet-name>
(tng) (tng)<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
(tng) (tng)<load-on-startup>3</load-on-startup>
(tng)</servlet>
(tng) (tng)
(tng) (tng)<servlet-mapping>
(tng) (tng) (tng)<servlet-name>action</servlet-name>
(tng) (tng)
(tng) (tng)<url-pattern>*.do</url-pattern>
(tng)</servlet-mapping>
(tng)
q有关于q程机制有Caucho的Hessian(一个借助HTTP的二q制协议) Burlap(一个基于XML的借助HTTP的传输协?, Apache Axis提供的JAX-RPC(ZSOAP的借助HTTP传输的web serverice), q有ZRMI的远E调?
想了(jin)解更多还是自已细看里面的代码?
L(fng)l关注Spring JPetStore(? 在其上实现自已的Sunlight Netstore
(tng)
借助?..\spring-jpetstore\samples\jpetstore\db\hsqldb\manager.bat)看到的hsql数据库中的数?br />
发布搞定下面对它做一些简要的分析!
L(fng)Spring JPetStore(? (tng) (tng) JPetStore的分?/a>