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