??xml version="1.0" encoding="utf-8" standalone="yes"?>
<object id="video" width="400" height="200" border="0" classid="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA">
<param name="ShowDisplay" value="0">
<param name="ShowControls" value="1">
<param name="AutoStart" value="1">
<param name="AutoRewind" value="0">
<param name="PlayCount" value="0">
<param name="Appearance value="0 value=""">
<param name="BorderStyle value="0 value=""">
<param name="MovieWindowHeight" value="240">
<param name="MovieWindowWidth" value="320">
<param name="FileName" value="file:///D|/work/vod/Mbar.avi">
<embed width="400" height="200" border="0" showdisplay="0" showcontrols="1" autostart="1" autorewind="0" playcount="0" moviewindowheight="240" moviewindowwidth="320" filename="file:///D|/work/vod/Mbar.avi" src="Mbar.avi">
</embed>
</object>
2.mpg格式
<object classid="clsid:05589FA1-C356-11CE-BF01-00AA0055595A" id="ActiveMovie1" width="239" height="250">
<param name="Appearance" value="0">
<param name="AutoStart" value="-1">
<param name="AllowChangeDisplayMode" value="-1">
<param name="AllowHideDisplay" value="0">
<param name="AllowHideControls" value="-1">
<param name="AutoRewind" value="-1">
<param name="Balance" value="0">
<param name="CurrentPosition" value="0">
<param name="DisplayBackColor" value="0">
<param name="DisplayForeColor" value="16777215">
<param name="DisplayMode" value="0">
<param name="Enabled" value="-1">
<param name="EnableContextMenu" value="-1">
<param name="EnablePositionControls" value="-1">
<param name="EnableSelectionControls" value="0">
<param name="EnableTracker" value="-1">
<param name="Filename" value="../../../mpeg/halali.mpg" valuetype="ref">
<param name="FullScreenMode" value="0">
<param name="MovieWindowSize" value="0">
<param name="PlayCount" value="1">
<param name="Rate" value="1">
<param name="SelectionStart" value="-1">
<param name="SelectionEnd" value="-1">
<param name="ShowControls" value="-1">
<param name="ShowDisplay" value="-1">
<param name="ShowPositionControls" value="0">
<param name="ShowTracker" value="-1">
<param name="Volume" value="-480">
</object>
3.rm格式
<OBJECT ID=video1 CLASSID="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA" HEIGHT=288 WIDTH=352>
<param name="_ExtentX" value="9313">
<param name="_ExtentY" value="7620">
<param name="AUTOSTART" value="0">
<param name="SHUFFLE" value="0">
<param name="PREFETCH" value="0">
<param name="NOLABELS" value="0">
<param name="SRC" value="rtsp://203.207.131.35/vod/dawan-a.rm";>
<param name="CONTROLS" value="ImageWindow">
<param name="CONSOLE" value="Clip1">
<param name="LOOP" value="0">
<param name="NUMLOOP" value="0">
<param name="CENTER" value="0">
<param name="MAINTAINASPECT" value="0">
<param name="BACKGROUNDCOLOR" value="#000000"><embed SRC type="audio/x-pn-realaudio-plugin" CONSOLE="Clip1" CONTROLS="ImageWindow" HEIGHT="288" WIDTH="352" AUTOSTART="false">
</OBJECT>
4.wmv格式
<object id="NSPlay" width=200 height=180 classid="CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95" codebase="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=6,4,5,715" standby="Loading Microsoft Windows Media Player components..." type="application/x-oleobject" align="right" hspace="5">
<!-- ASX File Name -->
<param name="AutoRewind" value=1>
<param name="FileName" value="xxxxxx.wmv">
<!-- Display Controls -->
<param name="ShowControls" value="1">
<!-- Display Position Controls -->
<param name="ShowPositionControls" value="0">
<!-- Display Audio Controls -->
<param name="ShowAudioControls" value="1">
<!-- Display Tracker Controls -->
<param name="ShowTracker" value="0">
<!-- Show Display -->
<param name="ShowDisplay" value="0">
<!-- Display Status Bar -->
<param name="ShowStatusBar" value="0">
<!-- Diplay Go To Bar -->
<param name="ShowGotoBar" value="0">
<!-- Display Controls -->
<param name="ShowCaptioning" value="0">
<!-- Player Autostart -->
<param name="AutoStart" value=1>
<!-- Animation at Start -->
<param name="Volume" value="-2500">
<param name="AnimationAtStart" value="0">
<!-- Transparent at Start -->
<param name="TransparentAtStart" value="0">
<!-- Do not allow a change in display size -->
<param name="AllowChangeDisplaySize" value="0">
<!-- Do not allow scanning -->
<param name="AllowScan" value="0">
<!-- Do not show contect menu on right mouse click -->
<param name="EnableContextMenu" value="0">
<!-- Do not allow playback toggling on mouse click -->
<param name="ClickToPlay" value="0">
</object>
最单的播放代码
<embed src="http://wmt2.aboutmedia.com.tw/Aboutmedia/warner/mtv/naying-021011_01v_120k.wmv";;
autostart="true" loop="true" width="200" height="150" >
把这个网址http://wmt2.aboutmedia.com.tw/Aboutmedia/warner/mtv/naying-021011_01v_120k.wmv换成你要看的电媄p?/p>
有图像的rm格式Q?/strong>
<OBJECT classid=clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA height=288 id=video1 width=305 VIEWASTEXT>
<param name=_ExtentX value=5503>
<param name=_ExtentY value=1588>
<param name=AUTOSTART value=-1>
<param name=SHUFFLE value=0>
<param name=PREFETCH value=0>
<param name=NOLABELS value=0>
<param name=SRC value=http://media.cdut.edu.cn/ram/new/xiaoxin1.ram>
<param name=CONTROLS value=Imagewindow,StatusBar,ControlPanel>
<param name=CONSOLE value=RAPLAYER>
<param name=LOOP value=0>
<param name=NUMLOOP value=0>
<param name=CENTER value=0>
<param name=MAINTAINASPECT value=0>
<param name=BACKGROUNDCOLOR value=#000000>
</OBJECT>
无图像的rm格式Q如相声Q歌曌Ӏ。?/strong>
<object ID=video2 WIDTH=300 HEIGHT=62 CLASSID=CLSID:CFCDAA03-8BE4-11CF-B84B-0020AFBBCCFA>
<param name=_ExtentX value=9657>
<param name=_ExtentY value=847>
<param name=AUTOSTART value=-1>
<param name=SHUFFLE value=0>
<param name=PREFETCH value=0>
<param name=NOLABELS value=0>
<param name=SRC value=http://210.242.69.206/ramgen/broadcast/BCC/encoder/hipop.rm>
<param name=CONTROLS value=StatusBar,controlpanel>
<param name=CONSOLE value=Clip1>
<param name=LOOP value=0>
<param name=NUMLOOP value=0>
<param name=CENTER value=0>
<param name=MAINTAINASPECT value=0>
<param name=BACKGROUNDCOLOR value=#000000>
</object>
最单的media格式的播攑֙。。自动识别有无图像,但是版本是你机器的!
<embed src=mms://61.175.132.221/tv/mtv/f4/makeawish.wmv width=200 height=200 autostart=true loop=true></embed>
有图像的media播放器,自动调用|上的插件?/font>
<object id=nstv classid=CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6 width=280 height=265 codebase=http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701standby=Loading Microsoft? Windows Media? Player components... type=application/x-oleobject>
<param name=URL value=http://202.99.11.42/xiangsheng/ymjr.wma>
<PARAM NAME=UIMode value=full><PARAM NAME=AutoStart value=true>
<PARAM NAME=Enabled value=true>
<PARAM NAME=enableContextMenu value=false>
<param name=WindowlessVideo value=true></object>
无图像的media播放器。。。同上?/font>
<object id=nstv classid=CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6 width=280 height=60 codebase=http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701standby=Loading Microsoft? Windows Media? Player components... type=application/x-oleobject>
<param name=URL value=http://202.99.11.42/xiangsheng/ymjr.wma>
<PARAM NAME=UIMode value=full><PARAM NAME=AutoStart value=true>
<PARAM NAME=Enabled value=true>
<PARAM NAME=enableContextMenu value=false>
</object>
只是界面不同的media的调插g播放器。。徏议不用这个,Q你可以看!
<embed src=http://av.wanwa.com/fileroot/AV/Ramfiles/23809.ram type=audio/x-pn-realaudio-plugin console=Clip1 controls=ControlPanel,StatusBar height=60 width=275 autostart=true></embed>
在线播放r m格式视频代码Q?/font>
<object id="player" name="player" classid="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA" width="400" height="272">
<param name="_ExtentX" value="18415">
<param name="_ExtentY" value="9102">
<param name="AUTOSTART" value="-1">
<param name="SHUFFLE" value="0">
<param name="PREFETCH" value="0">
<param name="NOLABELS" value="-1">
<param name="SRC" value="http://www.xiaoqiong.com/ftp/up/bz.rm">
<param name="CONTROLS" value="Imagewindow">
<param name="CONSOLE" value="clip1">
<param name="LOOP" value="0">
<param name="NUMLOOP" value="0">
<param name="CENTER" value="0">
<param name="MAINTAINASPECT" value="0">
<param name="BACKGROUNDCOLOR" value="#000000">
</object><br>
<object ID="RP2" CLASSID="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA" WIDTH="400" HEIGHT="57">
<param name="_ExtentX" value="18415">
<param name="_ExtentY" value="1005">
<param name="AUTOSTART" value="-1">
<param name="SHUFFLE" value="0">
<param name="PREFETCH" value="0">
<param name="NOLABELS" value="-1">
<param name="SRC" value="http://www.xiaoqiong.com/ftp/up/bz.rm">
<PARAM NAME="CONTROLS" VALUE="ControlPanel,StatusBar">
<param name="CONSOLE" value="clip1">
<param name="LOOP" value="0">
<param name="NUMLOOP" value="0">
<param name="CENTER" value="0">
<param name="MAINTAINASPECT" value="0">
<param name="BACKGROUNDCOLOR" value="#000000">
</object>
1.J2EE性能试
本书的方法用于一下两U情况:
ü
性能试一个完整的应用E序
ü
性能设计----分析J2EE API不同斚w的性能代h,以及某中设计决策ҎM性能的媄响?
2.性能
开发的应用E序可以分ؓ两类Q?/span>
交互式的Q响应时间ؓ关键Q两个度量标准,同时发生的用h量和响应旉。可以用q样的语句来描述Q“该应用E序能够?000毫秒的最大响应时间处?50个同时发生的z跃用户Q峰值时L800用户Q响应时间下?%
?/span>
?/span>
批处理或后端应用E序:吞吐量来描述。事务定义要一_在研IservletӞ我们定义事务处理Z个请求,因此吞吐量是servlet在一个设定的旉周期内(1U)执行的同栯求的数量。当分析JMSӞ吞吐量就是message?/span>
3. 试ҎQ?o:p>
基准试QBenchmarkingQ?在各U不同的环境下和工作负蝲下记录应用程序性能的过E?/span>
轮廓QProfilingQ?q涉及到_地调查应用程序将大部分计周期花费在什么地方,以及应用E序效果和高效的使用pȝ资源。主要目标在与突出系l中的潜在的性能瓉?/span>
调整QTuningQ,试、基准测试和轮廓反馈l调整过E,然后优化应用E序?o:p>
另外Q我们测试J2EE应用E序Q可以从J2EE应用E序的各个组件开始,其各个组件包括数据库、JVM、操作系l、TCP/IP堆栈、web服务器、网l等{?/span>
W一章测试方?o:p>
1.Ҏ概述
a.定义性能标准
为具体应用程序定义相关的性能度量标准Q然后针对该度量标准讑֮一个现实的目标。徏议清晰ƈ没有歧义地定义性能度量标准Q按照明定义的要求试?/span>
b.模拟应用E序使用
q个步骤的关键在与测试脚本的定义?/span>
定义试脚本:关键在于怎么样去更好的编写测试脚本,q需要实늚l验?/span>
?/span>
成功的性能试关键在于理解应用E序如何被使用
”,所?/span>
试数据Q所提供的关键的用户数据必须动态生?/span>
实际的用模式:
思考时_休眠旉Q:指在执行试脚本中每个请求之间间隔的旉。思考时间的两种基本{略Q用真实的旉思考;使用零思考时间。用真实的旉思考,譬如用户输入要查询的电话?U种Q那么我们说真实旉?U,但时间上是有偏差的,不能通过q样来提高系l的用户的ƈ发数。这是Q时间偏差,考虑q些Q通过适当降低旉来,譬如5U,辑ֈ更加真实。当我们不清楚真实思考的旉的时候,我们可以采用零思考时间?o:p>
2.采样Ҏ
不同的工h不同的采h法,The Grinder采用两种Q?/span>
周期ҎQ周期定义ؓ一个模拟用户对一个测试脚本的完整执行。样本多才有意义?/span>
快照ҎQ快照方法代表一U基于时间的数据视图?/span>
数据排除Q排除一些明显不E_数据Q譬如初始请求的旉。排除这些,h的数据会更加准确?/span>
3.性能l计数字
响应旉,客户端从发送请求的那一刻v收到应用E序响应的最后一个字节时止而不得不{待的时间长度?/span>
?/span>
10U是让用L注意力集中在应用E序对话框的极限
?/span>
《Usablility Engneering?/span>
?/span>
用户在等?U就点到别的地方M
?/span>
《Worth the wait ??/span>
响应旉的组成:处理旉Q传输时_l制旉。我们在到响应旉的瓶劲的时候,可以从vl成来羃短响应时间?/span>
同时我们明白Q?/span>
我们在测试环境中几乎不可能模拟Internet的行为,所以只能最大可能接q的模拟?/span>
q_响应旉QARTQ,一个请求各个响应时间样本的q_倹{?/span>
Mq_响应旉QAggregate Average Response Time,AARTQ? 试脚本中每个单独测试的q_响应旉的和除以该测试脚本的h数?/span>
最大^均响应时_MARTQ,不同h的最大响应时间的q_倹{?/span>
吞吐量,用TPS描述?/span>
4.评h试l果的准?o:p>
h质量Q样本数据的准确性?o:p>
公式Q质?= 标准方差/术q_
Q?/span>
可以接受的质量数位于0.06?.2的范围内。当Ӟ标准可以自定义?/span>
5.性能试
试的过E步骤:
a.
预备试
预备试考虑基准情况Q测试环境的最佛_?/span>
b.正式试Q单实例试Q持久测试,体系l构试
单实例压力测试:应用E序q行在单一应用服务器实例,逐渐增加工作负蝲Q直到操作性能标准?/span>
持久试Q测试应用程序在较长旉内完成的性能情况?/span>
体系l构试Q用应用程序服务器部|该应用E序?br />
------------------------------------------------------
参考资料:
《J2EE性能试?/o:p>
J2ME
学习ȝQ一Q?/span>
本h学习 J2ME 的原因是毕业设计N的需要,要开发一个基?/span> J2ME 的移动设?/span> 3D 游戏Q需要从基础一步一步学习?/span>
前言
?span style="FONT: 7pt 'Times New Roman'"> 如果大家没有接触q无U移动开发,可能惛_要在手机q行自己写的E序或者游戏,一定很难;
?span style="FONT: 7pt 'Times New Roman'"> 不过可以攑ֿQ这些东西一旦跟 java 扯上关系Q那问题好像没有那么复杂了Q?/span>
?span style="FONT: 7pt 'Times New Roman'"> 今天q大家介绍 j2me 的一些基本知?/span>
J2ME
技术概q?/span>
?span style="FONT: 7pt 'Times New Roman'"> J2ME ?/span> SUN 公司针对嵌入式、消费类电子产品推出的开发^収ͼ?/span> J2SE ?/span> J2EE 共同l成 Java 技术的三个重要的分支?/span>
?span style="FONT: 7pt 'Times New Roman'"> J2ME q_是由配置Q?/span> Configuration Q和表( Profile Q构成的。配|是提供l最大范围设备用的最类库集合,譬如 IO Q支持的数据cd{等Q在配置中同时包?/span> Java 虚拟机。简表是针对一pd讑֤提供的开发包集合?/span>
?span style="FONT: 7pt 'Times New Roman'"> J2ME 中有两个最主要的配|,分别?/span> Connected Limited Devices Configuration Q?/span> CLDC Q和 Connected Devices Configuration Q?/span> CDC Q?/span> CLDC 主要针对那些资源非常受限的设备比如手机?/span> PDA 、双工寻呼机{。?/span> CDC 主要面对那些家电产品Q比如机盒、汽车导航系l等?/span>
?span style="FONT: 7pt 'Times New Roman'"> 表是以配|ؓ基础?/span>
?span style="FONT: 7pt 'Times New Roman'"> 例如 Mobile Information Devices Profile Q?/span> MIDP Q就?/span> CLDC 上层的重要简表?/span>
?span style="FONT: 7pt 'Times New Roman'"> ?/span> MIDP 中定义了一U新的应用程序模?/span> MIDlet Q它是被 Application Management Software Q?/span> AMS Q管理的?/span> AMS 负责 MIDlet 的安装、下载、运行和删除{操作?/span>
?span style="FONT: 7pt 'Times New Roman'"> 在被 AMS 理的同Ӟ MIDlet 可以和应用管理Y仉信通知应用理软g自己状态的变化Q通常是通过Ҏ notifyDestroyed() ?/span> notifyPaused() 实现?/span>
?span style="FONT: 7pt 'Times New Roman'"> MIDlet 有三个状态,分别?/span> pause ?/span> active ?/span> destroyed ?/span>
J2ME
的应?/span>
目前
J2ME
主要应用在移动电话上Q主要是游戏开发?/span>
事实上,
J2ME
能够做的内容有很多,l对不应该局限于游戏?/span>
SonyEricsson Q?/span> Nokia {厂商都把重点{向了企业和品应用层面,特别是与 J2EE ?/span>
l合Q将会一个完的亮点Q?/span>
另外 Mobile Java 3D 作ؓ一个独立的领域也正在受到大家的q泛Ƣ迎和关注?/span>
我现在的毕业设计是 Mobile Java 3D
开发环境搭?/span>
?span style="FONT: 7pt 'Times New Roman'"> 下蝲相关软g
J2SE
Q?/span>
JDK 1.4 or later
Q?/span>
http://java.sun.com
无线开发包
Q?/span>
WTK 2.2 or later
Q?/span>
http://java.sun.com
IDE
工具
Q?/span>
Eclipse 3.1
Q?/span>
http://www.eclipse.org
开发插Ӟ Eclipse Me 1.2
其他可选包Q?/span> Nokia SDK {?/span>
注意Q下载开发插件的时候选择?/span> Eclipse 匚w的版本,当前使用?/span>
版本?/span> 1.2 Q支?/span> Eclipse 3.x
?span style="FONT: 7pt 'Times New Roman'"> 搭徏q程
W一?/span> 安装 JDK
W二?/span> 安装 WTK Q双d装包Q下一步到?/span>
W三?/span> 安装 Eclipse
W四?/span> 安装 Eclipse Me 插g
安装 Eclipse 插g方式很多Q可以直接更新安装,也可以直?/span>
下蝲插g安装包安装,我们采用W二U方式:分别拯 features
?/span> plugins 的文件到 Eclipse 对应的目录下Q删?/span> Eclipse 安装目录
对应?/span> configuration 下的 org.eclipse.update 文g夹,然后再启?/span>
Eclipse 卛_
?span style="FONT: 7pt 'Times New Roman'"> 安装完成后,启动 Eclipse, 在菜单栏 window/preferences 可以看到Q?/span>
?span style="FONT: 7pt 'Times New Roman'"> 然后选择 platform Components Ҏ?/span> WTK
?span style="FONT: 7pt 'Times New Roman'"> 选择 WTK 安装目录
?span style="FONT: 7pt 'Times New Roman'"> 安装完毕Q新Z?/span> J2ME 目试一?/span>
?span style="FONT: 7pt 'Times New Roman'">
新徏一?/span>
Midlet
E序
?span style="FONT: 7pt 'Times New Roman'">
q行
?span style="FONT: 7pt 'Times New Roman'"> q行l果出现默认手机模样Q左图)
?span style="FONT: 7pt 'Times New Roman'"> 黑色部分?/span> Midlet 框架部分Q插件自动生成,我们只需要添加少量代?/span>
import javax.microedition.midlet.*;
public class HelloWorld extends MIDlet {
private Display dispaly = null;
public HelloWorld(){
display = Display.getDisplay(this);
}
protected void startApp() throws MIDletStateChangeException {
Form form = new Form(
?/span>
Hello world!
?/span>
) ;
display.setCurrent(form);
}
protected void pauseApp() {}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {}
}
MIDP2.0
常用
API
介绍
待箋......
衡量一?/SPAN>MVC框架模式Q主要通过三种web模式Q本?/SPAN>springMVC是一个很好的MVC
模式Q对模式的支持如下:
Q?/SPAN>1Q派遣器模式
Spring有一个统一集中的派遣器org.springFramework.Web.Servlet.DispatcherServlet,
一般在web.XML中把所有的面h都发送到该派遣器Q?/SPAN>
<servlet>
<servlet-name>countries</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>countries</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
Q?/SPAN>2Q控制器模式
zN器收到请求后,把不同的面zNC同的控制器进行处理:
<bean id="urlMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/home.htm">countriesController</prop>
<prop key="/notfound.htm">errorsController</prop>
</props>
</property>
</bean>
Spring有两U?/SPAN>MAPPING的机?/SPAN>,默认?/SPAN>BeanNameUrlHandlerMapping,我们q里采用的是
SimpleUrlHandlerMapping.
Q?/SPAN>3Q拦截器模式
在控制器处理?/SPAN>,我们可以其拦截,q行一些特D或通用处理;拦截器可以选用Spring已经实现的或我们自己实现的:
<bean id="urlMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="interceptors">
<list>
<ref local="localeChangeInterceptor"/>
<ref local="themeChangeInterceptor"/>
<ref local="copyInterceptor"/>
</list>
</property>
</bean>
详细介绍Q?/SPAN>
?/SPAN> 分发器:Dispatcherservlet
整个spring应用只需要一个分发器
<servlet>
<servlet-name>springapp</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 映射的类?/SPAN>-->
<servlet-mapping>
<servlet-name>springapp</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>springapp</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
处理器映?/SPAN>
一般对应文?/SPAN> servlet-name-servlet.xml,譬如 springapp-servlet.xml
BeanNameUrlHandlerMapping
一般?/SPAN>SimpleUrlHandlerMapping
<!--Request Mapping -->
<bean id="urlMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings">
<props>
<prop key="login.do">LoginController</prop>
<prop key="login.html">LoginController</prop>
</props>
</property>
</bean>
?/SPAN> 控制?/SPAN>
控制器的基础接口 Controller Q包含方?/SPAN>
ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse response)
throws Exception;
一般?/SPAN> return new ModelAndView(“?/SPAN>);也可以?/SPAN>response.sendRedirect(“?/SPAN>).;
AbstractController控制器?/SPAN>Controllerc,增加譬如~存?/SPAN>minetype{功能,处理多个动作Q可以?/SPAN>MultiActionController
但如果要表单和数据对象的交互Q我们就使用命o控制?/SPAN>
一般?/SPAN>AbstractCommandController带参的Ş式,把相关的功能攑֜一?/SPAN>controller
譬如用户的添加、修攏V删除,可以采?/SPAN> usemanage.do?msg=add/modify/delete的Ş?/SPAN>
SimpleFormController更ؓ具体Q但l承它实现的OnSubmit的方法,不好用,譬如不能后退或者用于超链接{方式的地址直接响应?/SPAN>
?/SPAN> 处理器映拦截器
拦截器接口定义了三个ҎQ一个在处理器执行前被调用,一个在处理器执行后被调用,q有一个在整个h完成后调用。譬如在在上?/SPAN>9点到下午6炚w定向某个面Q?/SPAN>
?/SPAN>handlerMapping那个bean里面加入
<property name=”interceptors?gt;
<list>
<ref bean=”officeHourIntercptor?gt;
</list>
</property>
然后一个处?/SPAN>Bean
<bean id=?officeHourIntercptor?SPAN style="mso-spacerun: yes"> class=?TimeBaseIntercptor?gt;
<property name=”openTime?gt; <value>9</value> </property>
<property name=”closeTime?gt; <value>18</value> </property>
</bean>
?/SPAN> 视图与解析器
Spring框架控制器返回的?/SPAN>ModelAndViewQ对于一般的JSP?/SPAN>Servlet,一般?/SPAN>InternalResourceViewResolverQ承于UrlBaseViewResovler
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass">
<value>org.springframework.web.servlet.view.JstlView</value>
</property>
</bean>
当一?/SPAN>web中用不同类型的视图技术,使用ResourceBandleViewResolver
?/SPAN> 使用本地化信?/SPAN>
Spring框架大部分支持国际化Q像web框架一P自动解析客户端信?/SPAN>
但我们可以自己手动获取客L信息Qƈ做需要的参数设计来改变属?/SPAN>
一般?/SPAN>LocalChangeInterceptor修改本地化信息,q个像拦截器一样?/SPAN>
<bean id="localeChangeInterceptor"
class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName"><value>siteLanguage</value></property>
</bean>
<bean id="localeResolver"
class="org.springframework.web.servlet.i18n.CookieLocaleResolver"/>
// 取得 session Q通常我们利用 hibernate.cfg.xml 的配|?
// 以用戯和部门ؓ?
Configuration config = new Configuration().configure();
SessionFactory sessionFactory =
config.buildSessionFactory();
Session session = sessionFactory.openSession();
Q?Q?查询数据
// 取所有记?
Criteria criteria = session.createCriteria(User.class);
Query query = session. createQuery ;
List resultList = criteria.list()/ query . list();
// 按条件查?
Query query = session .createQuery("from User where id between :ID1 and :ID2");
query.setInteger("ID1",0);
query.setInteger("ID2",2);
Criteria criteria = getSession().createCriteria(User.class);
criteria.add(Restrictions.eq("id",new Integer(1)));
// 更复查的查询?Criteria 详解
Q?Q?插入记录
// 不设兌的时候,可以直接 save 一个对?
User user = new User();
user.setUserName(“jiangliwen?;
user.setSex(???;
session.save(user);
Q?Q?删除记录
// 把一?POJO 变成 PO 后就可以删除Q不q有时候方法会在删除的时候自动变?PO
// 当你发现 User user = new User(New Integer(1)), 出错的时候,说明不行
User user = (User)session.load(User.class,new Integer(1));
session.delete(user);
Q?Q?更新记录
// q程为取出、修攏V保?
User user = (User)session.load(User.class,new Integer(1));
user.setRealName(?哈哈 ?;
session.update(user);
二、Criteria 查询ȝQ能完成一般查询、统计、分l、多表查?
填入M查询参数Q模p查?
Criteria criteria = getSession().createCriteria(User.class);
criteria.add(Restrictions.eq("id",new Integer(1)));
List list = criteria.list();
criteria.add(Restrictions. like("username",?jiang%?);
您可以?Criteria 進行查詢Q並使用 Order 結果進行排序Q例如?Oder.asc() 由小到大排序
Q反之則使用 desc() Q:
Criteria criteria = session.createCriteria(User.class);
criteria.addOrder(Order.asc("age"));
List users = criteria.list();
setMaxResults() Ҏ可以限定查詢回來的筆數,如果配合 setFirstResult() a定傛_查詢i果
W一{資料的位置Q就可以實現單 的分頁,例如傛_W?51 {之後的 50 {資料(如果有的話)Q?
Criteria criteria = session.createCriteria(User.class);
criteria.setFirstResult(51);
criteria.setMaxResult(50);
List users = criteria.list();
您可以對查詢i果進行ip動作Q?Projections ?avg() ?rowCount() ?count() ?max() ?min() ?BR>countDistinct() {方法,例如查詢結果的 "age" 作^均:
Criteria criteria = session.createCriteria(User.class);
criteria.setProjection(Projections.avg("age"));
List users = criteria.list();
Iterator iterator = users.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
還可以配?Projections ?groupProperty() 來對i果進行分組Q例如以 "age" 進行分組Q也是如果資料?"age"
如果?20 ?20 ?25 ?30 Q則以下會顯C?20 ?25 ?30 Q?
Criteria criteria = session.createCriteria(User.class);
criteria.setProjection(Projections.groupProperty("age"));
List users = criteria.list();
Iterator iterator = users.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
如果想結合箔a與分組功能Q則可以使用 ProjectionList Q例如下面的E式會計每個年齡各有多個hQ?
ProjectionList projectionList = Projections.projectionList();
projectionList.add(Projections.groupProperty("age"));
projectionList.add(Projections.rowCount());
Criteria criteria = session.createCriteria(User.class);
criteria.setProjection(projectionList);
List users = criteria.list();
Iterator iterator = users.iterator();
while(iterator.hasNext()) {
Object[] o = (Object[]) iterator.next();
System.out.println(o[0] + "\t" + o[1]);
}
如果有一個已知的物gQ則可以Ҏ這個物件作為查詢的依據Q看看是否有屬性與之類似的物gQ例如:
User user = new User();
user.setAge(new Integer(30));
Criteria criteria = session.createCriteria(User.class);
criteria.add(Example.create(user));
List users = criteria.list();
Iterator iterator = users.iterator();
System.out.println("id \t name/age");
while(iterator.hasNext()) {
User ur = (User) iterator.next();
System.out.println(ur.getId() +
" \t " + ur.getName() +
"/" + ur.getAge());
}
在這個例子中Q?user 物g中有已知的屬?"age" ?30 Q?Example 會自動過Ⱦ掉 user 的空屬性,
並以之作為查詢的依據Q也是扑և "age" 同為 30 的資料?
Criteria 可以進行複合查詢Q即在原有的查詢基礎上再進行查詢Q例如在 Room ?User 的一多關聯中,
在查詢出所有的 Room 資料之後Q希望再查詢 users ?"age" ?30 ?user 資料Q?
Criteria roomCriteria = session.createCriteria(Room.class);
Criteria userCriteria = roomCriteria.createCriteria("users");
userCriteria.add(Restrictions.eq("age", new Integer(30)));
List rooms = roomCriteria.list(); // 只列?users 屬性中?user ?"age" ?30 ?Room
Iterator iterator = rooms.iterator();
三、Hibernate 的事务管?
Hibernate ?JDBC 的轻量装Q本wƈ不具备事务管理能力。在事务理层,
Hibernate 其委托l底层的 JDBC 或?JTA Q以实现事务理和调度功能?
Hibernate 的默认事务处理机制基?JDBC Transaction 。我们也可以通过配置?
件设定采?JTA 作ؓ事务理实现Q?
< property name = "hibernate.transaction.factory_class" >
net.sf.hibernate.transaction.JTATransactionFactory
<!--net.sf.hibernate.transaction.JDBCTransactionFactory-->
</ property >
Z JDBC 的事务管?
session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
…?
tx.commit();
?JDBC 层面而言Q上面的代码实际上对应着Q?
Connection dbconn = getConnection();
dbconn.setAutoCommit( false );
…?
dbconn.commit();
Z JTA 的事务管?
JTA 提供了跨 Session 的事务管理能力。这一Ҏ?JDBC Transaction 最大的
差异?
JDBC 事务?Connnection 理Q也是_事务理实际上是?JDBC Connection
中实现。事务周期限?Connection 的生命周期之cR同P对于Z JDBC Transaction
?Hibernate 事务理机制而言Q事务管理在 Session 所依托?JDBC Connection
中实玎ͼ事务周期限于 Session 的生命周期?
JTA 事务理则由 JTA 容器实现Q?JTA 容器对当前加入事务的众多 Connection q?
行调度,实现其事务性要求?JTA 的事务周期可横跨多个 JDBC Connection 生命周期?
同样对于Z JTA 事务?Hibernate 而言Q?JTA 事务横跨可横跨多?Session ?
因此?open 多个 session 时候,?JTA 来管理事务?
?EJB 中?JTA Transaction 无疑最为简便,我们只需要将 save Ҏ配置?
JTA 事务支持卛_Q无需昑ּxM事务Q下面是一?Session Bean ?save ҎQ?
它的事务属性被x为?Required ”, EJB 容器自动维护此Ҏ执行q程中的事务Q?
Hibernate 支持两种锁机Ӟ即通常所说的“悲观锁Q?Pessimistic Locking Q?
和“乐观锁Q?Optimistic Locking Q?
悲观锁:保守态度Q一旦上锁,外界无法修改Q直到释?
乐观锁: Hibernate 在其数据讉K引擎中内|了乐观锁实现。如果不用考虑外部pȝҎ
据库的更新操作,利用 Hibernate 提供的透明化乐观锁实现Q将大大提升我们?
生力?
< class
name = "org.hibernate.sample.TUser"
table = "t_user"
dynamic-update = "true"
dynamic-insert = "true"
optimistic-lock = "version"
>
乐观锁,大多是基于数据版?
Q?Version Q记录机制实现?
Cache 理
使用 cache 的目的往往是ؓ了提高系l的性能Q?
引入 Cache 机制的难Ҏ如何保证内存中数据的有效性,否则脏数据的出现给pȝ
带来难以预知的严重后果?
Hibernate 中的 Cache 大致分ؓ两层Q第一?Cache ?Session 实现Q属于事?
U数据缓Ԍ一旦事务结束,q个 Cache 也就失效?
W二?Cache Q是 Hibernate 中对其实例范围内的数据进行缓存的理容器?
我们需要讨论的是第二层 Cache, 最单是Z HashTable ?cache 机制 .
使用?Cache 机制之后Q应当注意编码的l合Q特别在查询数据的时候用:
Query.list(); 取出所有的数据 Q?一?sql
Query.iterate(); 两次 sql, 一ơ去 ID Q?如果?cache 则优先查找,二次才取数据
Session 理
SessionFactory 负责创徏 Session Q?SessionFactory 是线E?
安全的,多个q发U程可以同时讉K一?SessionFactory q从中获?Session 实例。?
Session qU程安全Q也是_如果多个U程同时使用一?Session 实例q行数据存取Q?
则将会导?Session 数据存取逻辑混ؕ?
我们可以通过应用 ThreadLocal 机制 , 来维持一?session
public class HibernateUtil {
private static SessionFactory sessionFactory;
static {
try {
// Create the SessionFactory
sessionFactory = new
Configuration().configure().buildSessionFactory();
} catch (HibernateException ex) {
throw new RuntimeException(
"Configuration problem: " + ex.getMessage(),
ex
);
}
}
public static final ThreadLocal session = new ThreadLocal();
public static Session currentSession() throws HibernateException
{
Session s = (Session) session.get();
// Open a new Session, if this Thread has none yet
if (s == null ) {
s = sessionFactory.openSession();
session.set(s);
}
return s;
}
public static void closeSession() throws HibernateException {
Session s = (Session) session.get();
session.set( null );
if (s != null )
s.close();
}
}
对于 web E序而言
我们可以借助 Servlet2.3 规范中新引入?Filter 机制Q轻村֮现线E生命周期内?Session 理
四、再度思?/STRONG>
1 、对 ORM 的理?
ORM Q?Object Relational Mapping Q简单的_是对象与关pȝ映射Q对于实际应用来Ԍ
对象一般指面向对象中的对象Q关pL关系型数据库Q对于我们具体的目来说Q就是将 java 中的
对象与关pd数据库( oracle Q?mysql Q中的表联系h?
ORM 解决Ҏ有以下四部分l成Q?
?在持l类的对象上执行基本?CRUD 操作的一l?API ?
?用于指定查询的一U语a或一l?API Q这些查询会引用cdcd性?
?用于指定映射元数据的工具?
?实现 ORM 的一Ҏ术,用来与事务对象交互以完成脏检查、懒兌存取和其它优化功能?
ORM q种解决Ҏ的好处:
对底层的装Q因此,可移植性好Q厂商独立;
解决对象 - 关系不匹配问题;
在传l我们在持久层通常使用 SQL ?JDBC Q通常认ؓq样方式已经让大家感到厌倦了Q特别是烦琐的代码;
2 ?hibernate 可以认ؓ是最优秀?ORM 工具
Hibernate 是一个雄心勃勃的目Q它的目标是成ؓ Java 中管理持l性数据问题的一U完
整的解决Ҏ。它协调应用与关pL据库的交互,让开发者解攑և来专注于手中的业务问题?
Hibernate W合 java ~程习惯Q它把数据库与一?POJO Q简?Java 对象Q关联v来,
使得Ҏ据库q行 CRUD {操作时候,直接操作 Java 对象可以了。通过以前 Java Bean 一?,
使用 setter ?getter Ҏ?
五、辅助工?/STRONG>
(1)自动生成 hibernate 的映文?/STRONG>
一般考虑两个方向Q从数据库到映射文gQ从 java cd映射文g
数据库到映射文g可以采用 Middlegen-Hibernate Q这个能很直观的看到表之间的关系Qƈ且能适当的做修改Q?
?java cd映射文g的生成,可以?XDoclet Q不q需要在 java cM加上一些标?
从生成的映射文g自动生成 java c,可以用用一些工P?hbm2java
从这四种自动生成工具来看Q? mapping file, java file and DDL Q只要知道Q何一U文Ӟ都可以得到另外两U文Ӟ
如:
1. 只有 mapping file:
mapping file---hbm2java----java---SchemaExport----DDL
2. 只有 DDL
DDL---Middlegen---hbm----hbm2java----java
3. 只有 Java
java---XDoclet---hbm----SchemaExport----DDL
从这里,大家也可以体会到 , Hibernate 强大的灵zL?
不过我们通常习惯专门的工兯计数据库Q譬?power designer {工P会自动生?DDL Q?BR>所以我们更需要通过 DDL Q就自动生成 Mapping file ?java c?
(2)?Eclipse 开发工具中Q有一个比较好用的插g
Hibernate Synchronizer
?nbsp; 自动生成基本?Hibernate 配置文g
?nbsp; 自动pl构生成 POJO c, XML Mapping 和基本的 DAO cR?
?nbsp; _y的承结构将自动生成代码和用户定制的代码巧妙的分割开来?
?nbsp; 自动生成的代码攑֜基类Q?Base* Q中Q将用户定制的代码放在子cM。分割了自动生成的代码和用户定制的代码?
?nbsp; 当表l构发生了变化时Q插件只需要更改自q成的基类Q不用管用户定制的子cR用户定制的子类几乎不用改动Q?BR> 或只需要很的改动卛_适应新的表结构?/P>
另:?hibernate 使用一?sessionFactory 操作多个数据库时候,可以使用
public StatelessSession openStatelessSession(Connection connection); Ҏ
--------------------------------------------------------------------------------------
路O漫兮其修q兮Q吾上下而求索!
不过对于hibernate的学习暂且告一D落Q哈?