📄 jaxb.htm
字号:
<P> ·还有更多的选项,请参考JAXB的相关文档。</P>
<P>
如果运行成功的话,就会在你"-d"选项指定的目录下产生一些java代码。如果感兴趣的话,大家可以查看这些代码进行详细的研究。如果你就想知道怎样使用它们的话,那么只需要简单的了解就行了。</P>
<P>·在应用程序中使用这些代码</P>
<P>
下面我们分析一下如何在我们的应用程序中使用JAXB工具包替我们生成的代码。在我们的实例中,主要有两个Java源文件:JaxbDemoFrame.java和MyCanvas.java。当然,大家也可以从此处下载所有的源代码。</P>
<P>JaxbDemoFrame.java</P>
<P><BR> JaxbDemoFrame.java中大部分都是处理Frame中<A
href="http://www.itisedu.com/phrase/200603302222545.html"
target=_new>组件</A>的代码。包括画布、菜单的初始化,以及各种事件的处理代码。其中和JAXB有关的有JAXB初始化代码:</P>
<P> 126 //init
jaxb<BR> 127 try
{<BR> 128
JAXBContext jc = JAXBContext.newInstance( "epri.jaxb"
);<BR> 129
<BR> 130
ObjectFactory objFactory = new
ObjectFactory();<BR> 131
myContainer =
objFactory.createShapeContainer();<BR>
......<BR> 134
m =
jc.createMarshaller();<BR> 135
u =
jc.createUnmarshaller();<BR> 136
m.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE
);<BR> 137
<BR> 138
<BR> 139 } catch( JAXBException je )
{<BR> 140
je.printStackTrace();<BR> 141 } </P>
<P> JAXBContext 提供了一个入口,通过这个入口可以管理必要的XML/Java绑定信息。<A
href="http://www.itisedu.com/phrase/200603082208195.html"
target=_new>客户端</A>应用程序通过newInstance(contextPath)方法得到该类的新实例。contextPath
参数包含一个或多个Java包名,这些Java包就是了JAXB编译器所产生的接口代码所在的Java包。该参数值初始化JAXBContext
对象,使得它能够管理JAXB编译器产生的接口;而通过ObjectFactory,可以直接生成根节点java对象ShapeContainer;对于Marshaller和Unmarshaller,这两个对象主要是用于Java对象和XML文档互相转换的主要接口(Marshaller负责从Java对象到XML文档的转换,Unmarshaller负责从XML文档到Java对象的转换)。</P>
<P> 在打开文件的操作代码中,也有对JAXB的操作:</P>
<P>150 private void openFile()
{<BR>151 FileDialog open = new
FileDialog(this,"open file..",FileDialog.LOAD);
<BR>152
open.setVisible(true);<BR>153 filename
= open.getDirectory()+open.getFile();<BR>154 try
{<BR>155 myContainer
=(ShapeContainer)u.unmarshal( new
FileInputStream(filename));<BR>156
this.canvas.setShapeContainer(myContainer);<BR>157
this.canvas.repaint();<BR>158 } catch(
JAXBException je )
{<BR>159
je.printStackTrace();<BR>160 } catch
(FileNotFoundException fe)
{<BR>161
System.out.println("file not found!");<BR>162
}<BR>163 }</P>
<P> Unmarshaller.unmarshal()
的方法可以直接将一个XML文件里的数据转换成Java对象。此对象应该是整个java对象树中最靠近根的对象(在本例中为ShapeContainer)。其他的对象都可以通过这个根对象的其他方法进一步获得,下面的章节会介绍到。</P>
<P> 在文件保存的操作代码中,也有对JAXB的操作:</P>
<P>182 private void saveAsFile()
{<BR>
......<BR>187
m.marshal(myContainer, new
FileOutputStream(filename));<BR>
......<BR>193 }</P>
<P>Marshaller.marshal()的方法是将一个根节点的Java对象,连同这个对象内部所包含的其他所有对象,都按照Schema的要求将对象中的内容输出到XML文档中去。</P>
<P>MyCanvas.java</P>
<P>MyCanvas.java主要是画布的绘图操作,包含了鼠标事件的响应和绘制屏幕的方法中。在MyCanvas.java也有一些代码使用了JAXB生成的class。</P>
<P>53 public void mousePressed(MouseEvent e)
{<BR> .......</P>
<P>65 java.util.List shapeList =
myContainer.getShape();<BR>66 try
{<BR>67
ShapeType newType =
this.objectFactory.createShapeType();<BR>68
newType.setShapecolor(this.currentColor);<BR>69
newType.setShapename(this.currentgraph);<BR>70
newType.setXposition(this.currentX);<BR>71
newType.setYposition(this.currentY);<BR>72
shapeList.add(newType);<BR>73 } catch(
JAXBException je )
{<BR>74
je.printStackTrace();<BR>75
}<BR>76
repaint();<BR>77 }</P>
<P><BR>90 public void paint(Graphics g)
{<BR>91 if (myContainer
!=null){<BR>92
java.util.List shapeList =
myContainer.getShape();<BR>
......
<BR>
<BR>95 for(
Iterator iter = shapeList.iterator(); iter.hasNext(); )
{<BR>96
ShapeType myshape =
(ShapeType)iter.next();<BR>97
String shapename =
myshape.getShapename();<BR>98
String shapeColor =
myshape.getShapecolor();<BR>99
int xposition =
myshape.getXposition();<BR>100
int yposition =
myshape.getYposition();<BR>101
if (shapeColor.equals("red"))
g.setColor(Color.red);<BR>102
if (shapeColor.equals("green"))
g.setColor(Color.green);<BR>103
if(shapename.equals("circle"))
g.drawOval(xposition-25,yposition-25,50,50);<BR>104
if(shapename.equals("rect"))
g.drawRect(xposition-25,yposition-25,50,50);<BR>105
this.setForeground(currentcolor);<BR>106
}<BR>107 }<BR>108
}</P>
<P>
在鼠标点击事件的处理中和屏幕绘制的方法中有大量使用JAXB所生成的类的代码(黑体字所表示的)。这些代码比较清楚的表现了怎样使用JAXB所生成的类。鼠标点击事件的处理中,根据程序的逻辑,每次鼠标的点击都应该根据鼠标当前的位置,画笔的当前颜色和当前的形状,来创建一个图形,并将此图形添加到整个对象树中去;而在屏幕绘制的paint()方法中,应用程序遍历整个对象树,找到每个图形的属性,并将它们绘制在屏幕上。</P>
<P>
JAXB所生成的代码都有一定的规律(遵循JAXB标准),这些规律非常简单易用。例如,在Schema中我们规定了,在ShapeContainer中允许有一个或多个shap节点,那么在生成的ShapeContainer这个类中就getShape()方法来返回一个shape的集合。又比如,在Schema中我们规定了每个shape都有一些属性(shapename,
shapecolor, xposition,
yposition)。那么在相应的ShapeType的类中,我们就会看到get和set的一些方法去设置和获得这些属性的值。</P>
<P></FONT><FONT face=Verdana><STRONG>六. 参考资料</STRONG></FONT></P>
<P><FONT face=Verdana>1. JAXB开发包下载
http://java.sun.com/webservices/downloads/webservicespack.html</FONT></P>
<P><FONT face=Verdana>2. AXB学习文档
http://java.sun.com/webservices/docs.html</FONT></P>
<P><FONT face=Verdana>3. XML Schema资料 http://www.w3.org/XML/Schema</FONT></P>
<P><FONT face=Verdana>4. Java对象序列化文档
http://java.sun.com/j2se/1.4.1/docs/guide/serialization/index.html</FONT></P>
<P>(来源<FONT face=Verdana><SPAN lang=EN-US style="FONT-SIZE: 9pt">SUN中国<A
href="http://www.itisedu.com/phrase/200604232134205.html"
target=_new>软件</A>技术中心</SPAN>)</FONT></P>
<P><FONT face=Verdana></FONT> </P></FONT>
<P><BR></FONT> </P>
<P><BR> </P></FONT></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -