第1章 AutoCAD 2004与工程设计

Size: px
Start display at page:

Download "第1章 AutoCAD 2004与工程设计"

Transcription

1 第 15 章 移动电子相册 : 捕捉精彩瞬间 移动电子相册是移动开心网中最吸引人的功能之一 将电子相册放在手机上, 可以随时随 地捕捉精彩瞬间 在移动电子相册中使用了大量的 Android 组件以外, 还涉及网络与拍照功能 本章将详细介绍这些技术的使用方法 本章的主要知识点如下 : Button 组件 EditText 组件 Spinner 组件 TabHost 组件 TextView 组件 ImageView 组件 Gallery 组件 HttpGet 类和 HttpPost 类 HttpURLConnection 类 15.1 先睹为快 : 移动电子相册 移动电子相册是移动开心网中的重要组成部分 通过移动电子相册, 可以随时随地拍摄照片, 而且在有信号的情况下就可以上传到网络上与他人共享 在本节先看一下移动电子相册的效果图 本章后面的部分将详细介绍移动电子相册中涉及的组件及网络技术, 并介绍如何利用这些技术实现移动电子相册 图 15.1 和图 15.2 分别显示了在手机上浏览照片和上传照片的主界面 图 15.1 浏览相册中的照片 图 15.2 上传照片

2 第 15 章移动电子相册 : 捕捉精彩瞬间 15.2 移动电子相册中使用的组件 在移动电子相册中主要使用了 Button EditText TextView ImageView Spinner Gallery 和 TabHost 等组件, 在本节将详细介绍这些组件的用法 Button 组件 Button 是 Android 中最常用的组件之一 Button 组件在 XML 布局文件中需要使用 <Button> 标签表示, 下面是一段标准的 Button 组件定义代码 <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=" 我的按钮 1" /> 最常用的按钮事件是单击事件, 可以通过 Button 类的 setonclicklistener 方法设置处理单 击事件的对象实例, 如果当前的类实现了 android.view.view.onclicklistener 接口, 那么可以直 接由 this 传入 setonclicklistener 方法, 代码如下 : Button button1 = (Button) findviewbyid(r.id.button1); button1.setonclicklistener(this); 下面的代码中包含了两个按钮, 并在单击事件中通过 value 变量来控制按钮放大或缩小 (value=1 表示放大,value= 1 表示缩小 ), 代码如下 : private int value = public void onclick(view view) Button button = (Button) view; // 如果按钮宽度等于屏幕宽度, 按钮开始缩小 if (value == 1 && button.getwidth() == getwindowmanager().getdefaultdisplay(). getwidth()) value = -1; // 如果按钮宽度小于 100, 按钮开始放大 else if(value == -1 && button.getwidth() < 100) value = 1; // 以按钮宽度和高度的 10% 放大或缩小按钮 button.setwidth(button.getwidth() + (int) (button.getwidth() * 0.1)* value); button.setheight(button.getheight() + (int) (button.getheight() * 0.1)* value); TextView 组件在前面介绍的移动开心网的登录界面已经使用过 TextView 组件, 但只涉及了 TextView 组件非常初级的用法 TextView 组件的功能远不止显示文本这么简单, 在本节将更进一步介绍 TextView 组件的功能 TextView 组件的基本用法在前面已经多次接触到了, 下面再来回顾一下 TextView 组件 449

3 人人都玩开心网 :Ext JS + Android + SSH 整合开发 Web 与移动 SNS 使用 <TextView> 标签定义, 下面的代码是 TextView 组件最基本的用法 <TextView android:id="@+id/textview1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text=" 可以在这里设置 TextView 组件的文本 " /> 上面的代码表示 TextView 的宽度应尽可能充满 TextView 组件所在的容器 将高度设为 wrap_content, 表示 TextView 组件的高度需要根据组件中文本的行数 字体大小等因素决定 当然, 还可以对 TextView 组件进行更复杂的设置, 例如, 设置 TextView 组件的文字字体 大小 文字颜色 背景颜色 文本距 TextView 组件边缘的距离 TextView 组件距其他组件的 距离等 下面的代码包含了 3 个 <TextView> 标签, 这 3 个标签设置了上述的 TextView 组件的 相应属性 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/textview1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textcolor="#0000ff" android:background="#ffffff" android:text=" 可以在这里设置 TextView 组件的文本 " /> <TextView android:id="@+id/textview2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text=" 更复杂的设置 " android:textsize="20dp" android:textcolor="#ff00ff" android:background="#ffffff" android:padding="30dp" android:layout_margin ="30dp"/> <TextView android:id="@+id/textview3" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textcolor="#ff0000" android:background="#ffffff" android:text=" 可以在这里设置 TextView 组件的文本 " /> </LinearLayout> 上面代码中大多数属性的含义从字面上就可以猜出来, 但要注意两个属性 :android: padding 和 android:layout_margin, 其中 android:padding 属性用于设置文字距 TextView 组件边 缘的距离,android:layout_margin 属性用于设置 TextView 组件距离相邻其他组件的距离 这两 个属性设置的都是四个方向的距离, 也就是上 下 左 右的距离 如果要单独设置这四个方 向的距离, 可以使用其他的属性, 这些属性名字的规则是在这两个属性后面添加 Left Right Top 和 Bottom, 例如, 设置 TextView 组件距离左侧的组件的距离, 可以使用 android: layout_marginleft 属性 要注意的是, 由于第 2 个 <TextView> 标签的 android:layout_width 属性值是 fill_parent, 因 此, 文字距 TextView 组件右侧的距离并不是 android:padding 属性的值 系统会优先使用 android:layout_width 属性的值来设置 TextView 组件到右侧组件 ( 这里是屏幕的右边缘 ) 的距离 除了可以在 XML 布局文件中设置 TextView 组件的属性外, 还可以在代码中设置 TextView 组件的属性 ( 实际上, 所有的组件都可以采用这两种方式设置它们的属性 ) 例如, 下面的代 码设置了文本的颜色 450

4 第 15 章移动电子相册 : 捕捉精彩瞬间 TextView textview = (TextView) findviewbyid(r.id.textview4); textview.settextcolor(android.graphics.color.red); // 使用实际的颜色值设置字体颜色 设置 TextView 组件背景色的方法有 3 个, 这些方法如下 setbackgroundresource: 通过颜色资源 ID 设置背景色 setbackgroundcolor: 通过颜色值设置背景色 setbackgrounddrawable: 通过 Drawable 对象设置背景色 下面的代码分别演示了如何用这 3 个方法来设置 TextView 组件的背景色 使用 setbackgroundresource 方法设置背景色 : textview.setbackgroundresource(r.color.background); 使用 setbackgroundcolor 方法设置背景色 : textview.setbackgroundcolor(android.graphics.color.red); 使用 setbackgrounddrawable 方法设置背景色 : Resources resources=getbasecontext().getresources(); Drawable drawable=resources.getdrawable(r.color.background); textview.setbackgrounddrawable(drawable); EditText 组件 EditText 是 TextView 的子类, 因此,EditText 组件具有 TextView 组件的一切 XML 属性及方法 EditText 与 TextView 的区别是 EditText 组件可以输入文本, 而 TextView 只能显示文本 虽然 TextView 通过设置某些属性也可以输入文本, 但 TextView 组件的文本输入功能 并不完善, 需要进行扩展 ( 例如,EditText 就是 TextView 的扩展组件 ) 才可以正常输入 文本 在登录界面已经使用了 EditText 组件, 读者也已经了解了 EditText 组件的基本使用方法, 现在让我们再回顾一下 EditText 组件在 XML 布局文本中的使用方法, 代码如下 : <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=" 输入文本的组件 " android:textcolor="#000000" android:background="#ffffff" android:padding="20dp" android:layout_margin="10dp" /> 从上面的代码可以看出,EditText 和 TextView 组件的使用方法完全一样, 只需要将 <TextView> 标签换成 <EditText> 标签即可, 几乎不需要做任何修改 451

5 人人都玩开心网 :Ext JS + Android + SSH 整合开发 Web 与移动 SNS ImageView 组件 ImageView 组件可用于显示 Android 系统支持的图像 ( 例如,GIF JPG PNG BMP 等 ) 在 XML 布局文件中使用 <ImageView> 标签来定义一个 ImageView 组件, 代码如下 : <ImageView android:id="@+id/imageview" android:layout_width="wrap_content" android:background="#f00" android:layout_height="wrap_content" android:src="@drawable/icon" android:scaletype="center" /> 在上面的代码中通过 android:src 属性指定了一个 drawable 资源的 ID, 并使用 android:scaletype 属性指定 ImageView 组件显示图像的方式 例如,center 表示将图像以不缩 放的方式显示在 ImageView 组件的中心 如果将 android:scaletype 属性设为 fitcenter, 表示将 图像按比例缩放至合适的位置, 并显示在 ImageView 组件的中心 通常在设计相框时将 android:scaletype 属性设为 fitcenter, 这样可以使照片按比例显示在相框的中心 <ImageView android:layout_width="200dp" android:layout_height="100dp" android:background="#f00" android:src="@drawable/background" android:scaletype="fitcenter" android:padding="10dp" /> 上面的代码直接设置了 ImageView 组件的宽度和高度, 也可以在代码中设置和获取 ImageView 组件的宽度和高度 ImageView imageview = (ImageView) findviewbyid(r.id.imageview); // 设置 ImageView 组件的宽度和高度 imageview.setlayoutparams(new LinearLayout.LayoutParams(200, 100)); // 获取 ImageView 组件的宽度和高度, 并将获取的值显示在 Activity 的标题栏上 settitle("height:" + imageview.getlayoutparams().width + " height:" + imageview.getlayoutparams().height); 执行上面的代码后, 将显示如图 15.3 所示的效果 图 15.3 ImageView 组件的显示效果 Spinner 组件 Spinner 组件用于显示一个下拉列表 在装载数据时也需要创建一个 Adapter 对象, 并在 创建 Adapter 对象的过程中指定要装载的数据 ( 数组或 List 对象 ) 例如, 下面的代码分别使 452

6 第 15 章移动电子相册 : 捕捉精彩瞬间 用 ArrayAdapter 和 SimpleAdapter 对象向两个 Spinner 组件添加数据 public void oncreate(bundle savedinstancestate) super.oncreate(savedinstancestate); setcontentview(r.layout.main); // 处理第 1 个 Spinner 组件 Spinner spinner1 = (Spinner) findviewbyid(r.id.spinner1); String[] applicationnames = new String[] " 多功能日历 ", " 乐博 Android 客户端 ", " 白社会 ", " 程序终结者 " ; ArrayAdapter<String> aaadapter = new ArrayAdapter<String>(this, android.r.layout.simple_spinner_item, applicationnames); // 将 ArrayAdapter 对象与第 1 个 Spinner 组件绑定 spinner1.setadapter(aaadapter); // 处理第 2 个 Spinner 组件 Spinner spinner2 = (Spinner) findviewbyid(r.id.spinner2); final List<Map<String, Object>> items = new ArrayList<Map<String, Object>>(); Map<String, Object> item1 = new HashMap<String, Object>(); item1.put("ivlogo", R.drawable.calendar); item1.put("tvapplicationname", " 多功能日历 "); Map<String, Object> item2 = new HashMap<String, Object>(); item2.put("ivlogo", R.drawable.eoemarket); item2.put("tvapplicationname", "eoemarket 客户端 "); items.add(item1); items.add(item2); SimpleAdapter simpleadapter = new SimpleAdapter(this, items, R.layout.item, new String[] "ivlogo", "tvapplicationname", new int[] R.id.ivLogo, R.id.tvApplicationName ); // 将 SimpleAdapter 对象与第 2 个 Spinner 组件绑定 spinner2.setadapter(simpleadapter); // 为第 2 个 Spinner 组件设置 ItemSelected 事件 spinner2.setonitemselectedlistener(new public void onitemselected(adapterview<?> parent, View view, int position, long id) // 当选中某一个列表项时, 弹出一个对话框, 并显示相应的 Logo 图像和应用程序名 new AlertDialog.Builder(view.getContext()).setTitle( items.get(position).get("tvapplicationname").tostring()). seticon( Integer.parseInt(items.get(position).get("ivLogo"). public void onnothingselected(adapterview<?> parent) ); 453

7 人人都玩开心网 :Ext JS + Android + SSH 整合开发 Web 与移动 SNS 运行本节的例子后, 单击第 1 个和第 2 个 Spinner 组件右侧的下拉按钮, 将显示如图 15.4 和图 15.5 所示的效果 454

8 第 15 章移动电子相册 : 捕捉精彩瞬间 图 15.4 只显示文本的下拉列表框 图 15.5 带文本和图像的下拉列表框 使用 Gallery 组件循环显示图像 Gallery 组件一般用于显示图像列表, 因此, 也可称为相册组件 单击 选中或拖动 Gallery 中的图像,Gallery 中的图像列表会根据用户的操作向左或向右移动, 直到显示到最后一个图 像为止 Gallery 本身并不支持循环显示图像, 也就是说, 当显示到最后一个图像时, 图像列表就 不再向左移动了 而我们要达到的循环显示的效果是当显示到最后一个图像时, 下一个图像是 图像列表中的第 1 个图像 实现这个效果也并不困难, 只需要 欺骗 一下 ImageView 对象 和 Adapter 对象即可 从前面章节的内容可以知道,BaseAdapter 类中的 getview 方法的调用与 getcount 方法返 回的值有关 如果 getcount 方法返回 n, 那么 getview 方法中的 position 参数值是绝不会大于 n 1 的 因此, 我们可以使 getcount 方法返回一个很大的数, 例如,Integer.MAX_VALUE 这样系统就会认为 ImageAdapter 对象中有非常多 (Integer.MAX_VALUE 的值超过 20 亿, 可 以认为是接近无穷大 ) 的 View 对象 这样做还会带来另外一个问题 如果 getcount 方法返回了一个很大的数, 那么 position 参数的值也会很大, 在这种情况下, 我们如何根据这个 position 参数值获得相应的图像 ID 资 源呢? 不会有人去创建 Integer.MAX_VALUE 大小的数组吧? 当然, 解决的方法也很简单 假 设有一个 resids 数组 ( 长度为 15) 保存了 15 个图像资源 ID 现在要使 Gallery 循环显示这 15 个图像 如果 position 的值超过了 14 可以使用取余的方法来循环取这个数组的值, 代码如下 : int imageresid = resids[position % resids.length]; 下面还有一件重要事情要做, 就是设置 Gallery 中每个图像的显示风格 首先需要获得图 像背景的资源 ID 在 ImageAdapter 类的构造方法中编写如下的代码 : TypedArray typedarray = obtainstyledattributes(r.styleable.gallery); mgalleryitembackground = typedarray.getresourceid( R.styleable.Gallery_android_galleryItemBackgrounds, 0); 455

9 人人都玩开心网 :Ext JS + Android + SSH 整合开发 Web 与移动 SNS 其中 R.styleable.Gallery 是 res\values\attrs.xml 文件中一个属性的资源 ID, 代码如下 : <declare-styleable name="gallery"> <attr name="android:galleryitembackground" /> </declare-styleable> 在 getview 方法中需要设置 ImageView 组件的显示风格和图像资源, 代码如下 : public View getview(int position, View convertview, ViewGroup parent) ImageView imageview = new ImageView(mContext); // 通过取余的方式获得图像的资源 ID imageview.setimageresource(resids[position % resids.length]); imageview.setscaletype(imageview.scaletype.fit_xy); imageview.setlayoutparams(new Gallery.LayoutParams(136, 88)); imageview.setbackgroundresource(mgalleryitembackground); return imageview; 运行本节的例子后, 会看到如图 15.6 所示的效果 图 15.6 循环显示图像的 Gallery TabHost 组件 如果屏幕上需要放置很多组件, 可能一屏放不下, 除了使用滚动视图的方式外, 还可以使 用标签组件对屏幕进行分页 也许很多读者在其他的编程语言中见过标签组件, 当单击标签组 件的不同标签时, 会显示当前标签的内容 在 Android 系统中每一个标签可以显示一个 View 或一个 Activity TabHost 是标签组件的核心类, 也是标签的集合 每一个标签是一个 TabHost.TabSpec 类 的对象实例 通过 TabHost 类的 addtab 方法可以添加多个 TabHost.TabSpec 类的对象实例 ( 多 个标签 ) 如果从 XML 布局文件中添加 View, 首先需要建立一个布局文件, 并且根结点要使 用 <FrameLayout> 或 <TabHost> 标签 在本例中建立了 3 个标签 在第 1 个标签中显示了一个 View, 在 View 中有两个组件 : Button 和 ImageView 另两个标签分别显示其他的 Activity XML 布局文件的内容如下 : <?xml version="1.0" encoding="utf-8"?> <TabHost xmlns:android=" android:layout_width="fill_parent" android:layout_height="fill_parent"> <!-- 定义在第 1 个标签中显示的视图 --> <LinearLayout android:id="@+id/tab1" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <Button android:id="@+id/button" android:layout_width="fill_parent" 456

10 第 15 章移动电子相册 : 捕捉精彩瞬间 android:layout_height="wrap_content" android:text=" 切换到第 3 个标签 " /> <ImageView android:layout_width="fill_parent" android:layout_height="wrap_content" android:src="@drawable/background" android:layout_margintop="30dp"/> </LinearLayout> </TabHost> 在创建 TabHost 对象时一般使用从 TabActivity 继承的类, 在该类的 oncreate 方法中添加 3 个标签, 代码如下 : // 通过 TabActivity 类的 gettabhost 方法获取 TabHost 对象 TabHost tabhost = gettabhost(); // 装载 main.xml 布局文件, 也就是上面给出的 XML 布局文件 LayoutInflater.from(this).inflate(R.layout.main,tabHost.getTabContentView(), true); // 添加第 1 个标签, 显示视图 ( 按钮和 ImageView) tabhost.addtab(tabhost.newtabspec("tab1").setindicator(" 切换标签 ").setcontent (R.id.tab1)); // 添加第 2 个标签, 在标签页上显示一个图像, 并在该页中显示 GalleryActivity tabhost.addtab(tabhost.newtabspec("tab2").setindicator(" 相册 ", getresources().getdrawable(r.drawable.icon1)).setcontent(new Intent(this, GalleryActivity.class))); // 添加第 3 个标签, 在该标签中显示 RatingListView tabhost.addtab(tabhost.newtabspec("tab3").setindicator(" 评分 ").setcontent(new Intent(this, RatingListView.class))); 在上面的代码中通过 TabHost 类的 newtabspec 方法创建了 TabSpec 对象 newtabspec 方 法的参数表示标签的字符串标识 也就是说, 通过该标识可以获得相应的标签 在单击第 1 个标签中的按钮后, 可以切换到第 3 个标签 要完成这个功能可以使用标签的索引, 也可以使 用通过 newtabspec 方法设置的标识 切换到第 3 个标签的代码如下 : // 标签索引从 0 开始 gettabhost().setcurrenttab(2); // 或采用如下的代码 // gettabhost().setcurrenttabbytag("tab3"); 运行本节的例子后, 第 2 个标签和第 3 个标签的效果如图 15.7 和图 15.8 所示 图 15.7 第 2 个标签页的显示效果 图 15.8 第 3 个标签页的显示效果 457

11 人人都玩开心网 :Ext JS + Android + SSH 整合开发 Web 与移动 SNS 15.3 访问网络 虽然在登录系统中使用了 Web Service 与服务端进行交互 但是在传递大量的数量时,Web Service 显得有些笨拙 在本节将介绍移动电子相册中使用的另外一种与数据库交互的方法 直接发送 HTTP GET 或 POST 请求 这就要用到 HttpGet HttpPost 以及 HttpURLConnection 这些类 HttpGet 类和 HttpPost 类 本节将介绍 Android SDK 集成的 Apache HttpClient 模块 要注意的是, 这里的 Apache HttpClient 模块是 HttpClient 4.0(org.apache.http.*), 而不是 Jakarta Commons HttpClient 3.x (org.apache.commons.httpclient.*) 在 HttpClient 模块中用到了两个重要的类 :HttpGet 和 HttpPost 这两个类分别用来提交 HTTP GET 和 HTTP POST 请求 为了测试本节的例子, 需要先编写一个 Servlet 程序, 用来接 收 HTTP GET 和 HTTP POST 请求 读者也可以使用其他服务端的资源来测试本节的例子 假设 是本机的 IP, 客户端可以通过如下的 URL 来访问服务端的资源 : 开发 在这里 bookname 是 QueryServlet 的请求参数, 表示图书名, 通过该参数来查询图书信息 现在我们要通过 HttpGet 和 HttpPost 类向 QueryServlet 提交请求信息, 并将返回结果显示 在 TextView 组件中 无论是使用 HttpGet, 还是使用 HttpPost, 都必须通过如下 3 步来访问 HTTP 资源 对象 创建 HttpGet 或 HttpPost 对象, 将要请求的 URL 通过构造方法传入 HttpGet 或 HttpPost 使用 DefaultHttpClient 类的 execute 方法发送 HTTP GET 或 HTTP POST 请求, 并返回 HttpResponse 对象 通过 HttpResponse 接口的 getentity 方法返回响应信息, 并进行相应的处理 如果使用 HttpPost 方法提交 HTTP POST 请求, 还需要使用 HttpPost 类的 setentity 方法设 置请求参数 本例使用了两个按钮来分别提交 HTTP GET 和 HTTP POST 请求, 并从 EditText 组件中获 得请求参数 (bookname) 值, 最后将返回结果显示在 TextView 组件中 两个按钮共用一个 onclick 事件方法, 代码如下 : public void onclick(view view) // 读者需要将本例中的 IP 换成自己机器的 IP String url = " TextView tvqueryresult = (TextView) findviewbyid(r.id.tvqueryresult); EditText etbookname = (EditText) findviewbyid(r.id.etbookname); HttpResponse httpresponse = null; 458

12 第 15 章移动电子相册 : 捕捉精彩瞬间 try switch (view.getid()) // 提交 HTTP GET 请求 case R.id.btnGetQuery: // 向 url 添加请求参数 url += "?bookname=" + etbookname.gettext().tostring(); // 第 1 步 : 创建 HttpGet 对象 HttpGet httpget = new HttpGet(url); // 第 2 步 : 使用 execute 方法发送 HTTP GET 请求, 并返回 HttpResponse 对象 httpresponse = new DefaultHttpClient().execute(httpGet); // 判断请求响应状态码, 状态码为 200 表示服务端成功响应了客户端的请求 if (httpresponse.getstatusline().getstatuscode() == 200) // 第 3 步 : 使用 getentity 方法获得返回结果 String result = EntityUtils.toString(httpResponse.getEntity()); // 去掉返回结果中的 \r 字符, 否则会在结果字符串后面显示一个小方格 tvqueryresult.settext(result.replaceall("\r", "")); break; // 提交 HTTP POST 请求 case R.id.btnPostQuery: // 第 1 步 : 创建 HttpPost 对象 HttpPost httppost = new HttpPost(url); // 设置 HTTP POST 请求参数必须用 NameValuePair 对象 List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("bookname", etbookname.gettext(). tostring())); // 设置 HTTP POST 请求参数 httppost.setentity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); // 第 2 步 : 使用 execute 方法发送 HTTP POST 请求, 并返回 HttpResponse 对象 httpresponse = new DefaultHttpClient().execute(httpPost); if (httpresponse.getstatusline().getstatuscode() == 200) // 第 3 步 : 使用 getentity 方法获得返回结果 String result = EntityUtils.toString(httpResponse.getEntity()); // 去掉返回结果中的 \r 字符, 否则会在结果字符串后面显示一个小方格 tvqueryresult.settext(result.replaceall("\r", "")); break; catch (Exception e) tvqueryresult.settext(e.getmessage()); HttpURLConnection 类 在移动电子相册上传图像时使用了 HttpURLConnection 类 java.net.httpurlconnection 459

13 人人都玩开心网 :Ext JS + Android + SSH 整合开发 Web 与移动 SNS 类是另外一种访问 HTTP 资源的方式 HttpURLConnection 类具有完全的访问能力, 可以取代 HttpGet 和 HttpPost 类 使用 HttpURLConnection 访问 HTTP 资源可以使用如下几步 使用 java.net.url 封装 HTTP 资源的 URL, 并使用 openconnection 方法获得 HttpUrlConnection 对象, 代码如下 : URL url = new URL(" HttpURLConnection httpurlconnection = (HttpURLConnection) url.openconnection(); 设置请求方法, 例如,GET POST 等, 代码如下 : httpurlconnection.setrequestmethod("post"); 要注意的是,setRequestMethod 方法的参数值必须大写, 例如,GET POST 等 设置输入 输出及其他权限 如果要下载 HTTP 资源或向服务端上传数据, 需要使用 如下的代码进行设置 : // 下载 HTTP 资源, 需要将 setdoinput 方法的参数值设为 true httpurlconnection.setdoinput(true); // 上传数据, 需要将 setdooutput 方法的参数值设为 true httpurlconnection.setdooutput(true); HttpURLConnection 类还包含了更多的选项, 例如, 使用下面的代码可以禁止 HttpURL Connection 使用缓存 httpurlconnection.setusecaches(false); 设置 HTTP 请求头 在很多情况下, 要根据实际情况设置一些 HTTP 请求头, 例如, 下面的代码设置了 Charset 请求头的值为 UTF-8 httpurlconnection.setrequestproperty("charset", "UTF-8"); 输入和输出数据 这一步是对 HTTP 资源的读写操作 也就是通过 InputStream 和 OutputStream 读取和写入数据 下面的代码获得了 InputStream 对象和 OutputStream 对象 InputStream is = httpurlconnection.getinputstream(); OutputStream os = httpurlconnection.getoutputstream(); 至于是先读取还是先写入数据, 需要根据具体情况而定 关闭输入 / 输出流 虽然关闭输入 / 输出流并不是必须的, 在应用程序结束后, 输入 / 输出流会自动关闭 但显式关闭输入 / 输出流是一个好习惯 关闭输入 / 输出流的代码如下 : is.close(); os.close(); 15.4 项目实战 : 浏览照片 浏览照片的基本功能包括显示当前用户的所有相册, 当用户选择某个相册后, 会显示当前 相册中所有照片的缩略图 如果相册中的照片很多, 会分页显示 当长按某个照片的缩略图时 460

14 第 15 章移动电子相册 : 捕捉精彩瞬间 会放大显示该照片的图像 编写 CommonServlet 类从本节开始, 所有的服务端程序都使用 Servlet 实现 开心网的所有服务端功能除了登录之外, 在访问之前都需要进行身份验证, 也就是验证用户名和密码 除此之外, 所有的 Servlet 都需要连接数据库, 因此, 这就需要编写一个通用的 CommonServlet 类, 该类是 HttpServlet 的子类, 负责打开数据库, 并进行身份验证 CommonServlet 类的代码如下 : package service.servlet; import java.awt.image; import java.awt.image.bufferedimage; import java.io.file; import java.io.fileinputstream; import java.io.ioexception; import java.io.inputstream; import java.io.objectoutputstream; import java.io.outputstream; import java.sql.connection; import java.sql.drivermanager; import java.sql.preparedstatement; import java.sql.resultset; import java.util.random; import javax.servlet.servletexception; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import com.sun.image.codec.jpeg.jpegcodec; import com.sun.image.codec.jpeg.jpegimageencoder; public abstract class CommonServlet extends HttpServlet protected Connection mconnection; protected String musername; protected String mpassword; protected String mphotorootpath; protected abstract void execute(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException; protected void service(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException try a mphotorootpath = getservletcontext().getinitparameter("photorootpath"); Class.forName("com.mysql.jdbc.Driver"); // 打开数据库, 并获取 Connection 对象 461

15 人人都玩开心网 :Ext JS + Android + SSH 整合开发 Web 与移动 SNS mconnection = DriverManager.getConnection( "jdbc:mysql://localhost/kxw?characterencoding=utf-8", "root", "1234"); // 定义查询 t_kx_users 表的 SQL 语句 String sql = "select * from t_kx_users where =? and password=?"; PreparedStatement pstmt = mconnection.preparestatement(sql); musername = request.getparameter("username"); mpassword = request.getparameter("password"); pstmt.setstring(1, musername); pstmt.setstring(2, mpassword); // 进行用户验证 ResultSet rs = pstmt.executequery(); if (rs.next()) // 如果验证通过, 执行 execute 方法 execute(request, response); else response.getwriter().println("unauthorized Access."); catch (Exception e) response.getwriter().println(e.getmessage()); CommonServlet 类覆盖了 service 方法, 并在该方法中打开数据库, 并进行用户验证 如 果验证通过, 则调用抽象方法 execute 因此, 在 CommonServlet 的子类中实现 execute 方法即 可 如果 execute 方法被调用, 则说明已通过了用户验证 由于手机内存要比 PC 的内存小得多, 因此, 在手机客户端浏览图像时不能显示太大的图 像, 否则会抛出内容溢出的错误 因此, 服务端在发送给客户端图像时应将当前图像按一定比 例缩小, 为此, 可以在 CommonServlet 类中再加一个用于缩小图像的方法, 代码如下 : public void scaleimage(inputstream imginputstream, OutputStream imgoutputstream, int scale) try Image src = javax.imageio.imageio.read(imginputstream); int width = (int) (src.getwidth(null) * scale / 100.0); int height = (int) (src.getheight(null) * scale / 100.0); BufferedImage bufferedimage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); bufferedimage.getgraphics().drawimage( src.getscaledinstance(width, height, Image.SCALE_SMOOTH), 0, 0, null); JPEGImageEncoder encoder = JPEGCodec 462

16 第 15 章移动电子相册 : 捕捉精彩瞬间.createJPEGEncoder(imgOutputStream); encoder.encode(bufferedimage); catch (IOException e) 其中 scaleimage 方法的 imginputstream 参数表示源图像的输入流 ; imgoutputstream 参数 表示图像缩小后的目标图像的输入流 ;scale 参数表示缩放因子, 在 1 至 100 之间, 如果为 100, 表示不缩放 服务端和客户端的交互采用了直接传输二进制数据的形式, 也就是服务端和客户端传递可 序列化的对象 因此, 在 CommonServlet 类中加一个 sendobject 方法, 以便将服务端的对象 发送到客户端 protected void sendobject(object obj, HttpServletResponse response) try OutputStream os = response.getoutputstream(); ObjectOutputStream oos = new ObjectOutputStream(os); oos.writeobject(obj); catch (Exception e) e.printstacktrace(); 获取当前用户的所有相册 用 AlbumServlet 类可以获取指定用户的所有相册名称 ID 等信息 这些信息通过 List<Album> 对象进行封装,Album 类封装了一个相册的信息, 代码如下 : package service; import java.io.serializable; public class Album implements Serializable private int id; private String name; private String ; private String description; // 此处省略了属性的 getter 和 setter 方法 AlbumServlet 类的代码如下 : package service.servlet; import java.io.ioexception; 463

17 人人都玩开心网 :Ext JS + Android + SSH 整合开发 Web 与移动 SNS import java.sql.preparedstatement; import java.sql.resultset; import java.util.arraylist; import java.util.list; import javax.servlet.servletexception; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import service.album; public class AlbumServlet extends protected void execute(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException try String sql = "select * from t_kx_albums where =?"; PreparedStatement preparedstatement = mconnection.preparestatement(sql); preparedstatement.setstring(1, musername); List<Album> albums = new ArrayList<Album>(); ResultSet rs = preparedstatement.executequery(); // 开始为每一个相册创建单独的 Album 对象, 并将该对象添加到 List 对象中 while (rs.next()) Album album = new Album(); album.setid(rs.getint("id")); album.setname(rs.getstring("album_name")); album.set (rs.getstring(" ")); album.setdescription(rs.getstring("description")); albums.add(album); // 将 Album 对象发送到客户端 sendobject(albums, response); catch (Exception e) e.printstacktrace(); AlbumServlet 类的配置代码如下 : <servlet> <servlet-name>albumservlet</servlet-name> <servlet-class>service.servlet.albumservlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>albumservlet</servlet-name> <url-pattern>/albumservlet</url-pattern> </servlet-mapping> 464

18 第 15 章移动电子相册 : 捕捉精彩瞬间 设置移动电子相册的主界面 移动电子相册的主界面由一个 TabHost 组件构成 这个 TabHost 组件包含了 浏览照片 建立相册 和 上传图像 三个页面 一般带 TabHost 的 Activity 类需要从 TabActivity 类继 承 在 oncreate 方法中加载 TabHost 中的页面, 代码如下 : TabHost tabhost = gettabhost(); mtabview1 = LayoutInflater.from(this).inflate(R.layout.album_tab1, tabhost.gettabcontentview(), true); // 添加第一个页面 tabhost.addtab(tabhost.newtabspec("tab1").setindicator(" 浏览照片 ", getresources().getdrawable(r.drawable.browseimage)).setcontent(r.id.albumtab1)); mtabview2 = LayoutInflater.from(this).inflate(R.layout.album_tab2, tabhost.gettabcontentview(), true); // 添加第二个页面 tabhost.addtab(tabhost.newtabspec("tab2").setindicator(" 建立相册 ", getresources().getdrawable(r.drawable.createalbum)).setcontent(r.id.album Tab2)); mtabview3 = LayoutInflater.from(this).inflate(R.layout.album_tab3, tabhost.gettabcontentview(), true); // 添加第三个页面 tabhost.addtab(tabhost.newtabspec("tab3").setindicator(" 上传图像 ", getresources().getdrawable(r.drawable.uploadimage)).setcontent(r.id.album Tab3)); 在客户端显示相册列表 当单击如图 15.1 所示的 Spinner 组件, 会显示如图 15.9 所示的相册列表 图 15.9 显示当前用户的相册列表 Spinner 类需要一个 Adapter 类来提供对象, 代码如下 : class AlbumAdapter extends BaseAdapter private LayoutInflater mlayoutinflater; 465

19 人人都玩开心网 :Ext JS + Android + SSH 整合开发 Web 与移动 SNS public AlbumAdapter(Context context) mlayoutinflater = (LayoutInflater) public int getcount() return public Object getitem(int position) return public long getitemid(int position) return public View getview(int position, View convertview, ViewGroup parent) View view = mlayoutinflater.inflate(r.layout.album_item, null); TextView tvalbumitem = (TextView) view.findviewbyid(r.id.tvalbumitem); tvalbumitem.settext(malbums.get(position).getname()); return view; 其中 malbums 是一个 List<Album> 类型的变量, 用于保存从服务端获得的当前用户相册 列表 所以访问服务端资源的代码都在 CallService 类中 CallService 类有一个通用的 getobject 方法, 该方法向服务端发送请求, 并返回一个 Object 对象 getobject 方法的代码如下 : private static Object getobject(string url, String[] paramnames, String[] paramvalues, boolean original) try HttpPost httppost = new HttpPost(url);aa List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("username", username)); params.add(new BasicNameValuePair("password", passwordmd5)); // 不管是什么样的请求, 都需要用户名和密码两个参数, 因此, 在这里首先要发送这两个参数 for (int i = 0; i < paramnames.length; i++) params.add(new BasicNameValuePair(paramNames[i], paramvalues[i])); httppost.setentity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); 466

20 第 15 章移动电子相册 : 捕捉精彩瞬间 // 向服务端发送请求 HttpResponse httpresponse = new DefaultHttpClient().execute(httpPost); // 判断请求响应状态码, 状态码为 200 表示服务端成功响应了客户端的请求 if (httpresponse.getstatusline().getstatuscode() == 200) InputStream is = httpresponse.getentity().getcontent(); if (original) // 直接返回服务端的 InputStream 对象 return is; else // 将服务端返回的数据转换成对象返回 ObjectInputStream ois = new ObjectInputStream(is); Object obj = ois.readobject(); return obj; catch (Exception e) return null; 其中 url 参数表示访问服务端的 URL;paramNames 参数表示请求参数名 ;paramvalues 参 数表示请求参数值 ;original 参数表示返回的对象类型, 如果该参数值为 true, 直接返回服务 端的 InputStream 对象, 以便更灵活地获得服务端的数据, 如果该参数值为 false, 表示将服务 端返回的数据转换成 Object 对象后再返回 如果某个请求除了用户名和密码外, 不向服务端发送其他的请求参数, 在这种情况下就不 需要 paramnames 和 paramvalues 参数了, 因此, 我们来重载一次 getobject 方法, 代码如下 : private static Object getobject(string url, boolean original) return getobject(url, new String[], new String[], original); 下面来看一下获得当前用户相册列表的 getalbums 方法, 代码如下 : public static List<Album> getalbums() String url = " Object obj = getobject(url, false); return (List<Album>) obj; 467

21 人人都玩开心网 :Ext JS + Android + SSH 整合开发 Web 与移动 SNS 现在就可以使用如下的代码获得当前用户的相册列表了 malbums = CallService.getAlbums(); 获取指定相册的照片路径 在显示指定相册中的照片之前, 需要获取这些照片的在服务端的路径 ( 在这里是随机生成 的文件名 ) PhotoUrlServlet 类通过 List<String> 对象返回指定相册的路径, 代码如下 : package service.servlet; import java.io.ioexception; import java.sql.preparedstatement; import java.sql.resultset; import java.util.arraylist; import java.util.list; import javax.servlet.servletexception; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; public class PhotoUrlServlet extends protected void execute(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException try // 获取显示的页码, 从 1 开始, 每页显示 10 个图像缩略图 int page = Integer.parseInt(request.getParameter("page")); // 获取指定的相册 ID int albumid = Integer.parseInt(request.getParameter("albumId")); 计算开始的记录数 int start = (page - 1) * 10; String sql = "select * from t_kx_photos where album_id =? limit " + start + ",10"; PreparedStatement preparedstatement = mconnection.preparestatement(sql); preparedstatement.setint(1, albumid); List<String> filenames = new ArrayList<String>(); // 开始查询当前页的图像信息 ResultSet rs = preparedstatement.executequery(); while (rs.next()) filenames.add(rs.getstring("photo_filename")); // 将查询到的图像信息发送到客户端 sendobject(filenames, response); catch (Exception e) e.printstacktrace(); 468

22 第 15 章移动电子相册 : 捕捉精彩瞬间 PhotoUrlServlet 通过页码和相册 ID 获得相应的图像路径列表 页码从 1 开始, 每次返回 10 个图像路径, 如果不足 10 个图像路径, 则返回全部的图像路径列表 PhotoUrlServlet 类的配置代码如下 : <servlet> <servlet-name>photourlservlet</servlet-name> <servlet-class>service.servlet.photourlservlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>photourlservlet</servlet-name> <url-pattern>/photourlservlet</url-pattern> </servlet-mapping> 获取指定的照片数据 每一个照片图像都需要从 Servlet 中获取 为了在手机中显示图像, 需要将图像按一定比 例缩小, 否则大多数手机的内存无法显示尺寸很大的图像 在本例中将图像按 1/5 缩小, 读者 也可以根据图像的实际大小缩放图像 获取照片图像数据由 PhotoServlet 类完成, 代码如下 : package service.servlet; import java.io.file; import java.io.fileinputstream; import java.io.ioexception; import java.io.outputstream; import javax.servlet.servletexception; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; public class PhotoServlet extends protected void execute(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException try // 获取指定图像的文件名 String filename = request.getparameter("filename"); // 获取指定的相册 ID int albumid = Integer.parseInt(request.getParameter("albumId")); // 如果 orginal 为 true, 表示图像不缩小, 如果为 false, 表示按原图的 1/5 缩图 boolean original = Boolean.parseBoolean(request.getParameter("original")); // 生成图像的本地路径 String photopath = mphotorootpath + musername.hashcode() + File.separator + albumid + File.separator + filename; OutputStream os = response.getoutputstream(); FileInputStream fis = new FileInputStream(photoPath); 469

23 人人都玩开心网 :Ext JS + Android + SSH 整合开发 Web 与移动 SNS if (original) // 按源图像实际大小返回图像数据 byte[] buffer = new byte[8192]; int n = 0; while ((n = fis.read(buffer)) > 0) os.write(buffer, 0, n); else // 按 1/5 比例缩小图像 scaleimage(fis, os, 20); fis.close(); catch (Exception e) e.printstacktrace(); PhotoServlet 会根据指定的图像文件名和相册的 ID 返回缩小或原始的图像数据 ( 由 orginal 请求参数值确定 ) PhotoServlet 类的配置代码如下 : <servlet> <servlet-name>photoservlet</servlet-name> <servlet-class>service.servlet.photoservlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>photoservlet</servlet-name> <url-pattern>/photoservlet</url-pattern> </servlet-mapping> 在客户端分页显示照片缩略图 要从服务端获取当前页的图像路径, 需要在 CallService 类中加一个 getalbums 方法, 代 码如下 : publicc static List<String> getphotourl(int page, int albumid) String url = " // 向服务端发送 page 和 albumid 请求参数 Object obj = getobject(url, new String[] "page", "albumid", new String[] 470

24 第 15 章移动电子相册 : 捕捉精彩瞬间 String.valueOf(page), String.valueOf(albumId), false); return (List<String>) obj; 当选择某个相册时, 会创建一个 Adapter 对象, 并设置 Gallery 组件的值, 代码如下 : public void onitemselected(adapterview<?> adapterview, View view, int position, long id) mcurrentalbumposition = position; mcurrentpage = 1; mphotourls = CallService.getPhotoUrl(mCurrentPage, malbums.get(position).getid()); mgallery.setadapter(new GalleryAdapter(this)); 其中 GalleryAdapter 类封装了相册缩略图数据, 代码如下 : class GalleryAdapter extends BaseAdapter private LayoutInflater mlayoutinflater; private int mresourceid; // 保存显示图像的 View 对象 private Map<String, View> mviewmap = new HashMap<String, View>(); public GalleryAdapter(Context context) mlayoutinflater = (LayoutInflater) context.getsystemservice(context.layout_inflater_service); TypedArray typedarray = obtainstyledattributes(r.styleable.gallery); mresourceid = typedarray.getresourceid(r.styleable.gallery_android_ galleryitembackground, public int getcount() return public Object getitem(int position) return public long getitemid(int position) return public View getview(int position, View convertview, ViewGroup parent) View view = null; try 471

25 人人都玩开心网 :Ext JS + Android + SSH 整合开发 Web 与移动 SNS view = mviewmap.get(mphotourls.get(position)); if (view == null) view = mlayoutinflater.inflate(r.layout.gallery_item, null); ImageView ivphoto = (ImageView) view. findviewbyid(r.id.ivphoto); // 从服务端获取图像的缩略图 Bitmap bitmap = CallService.getPhoto(mAlbums.get( mcurrentalbumposition).getid(), mphotourls.get(position), false); // 设置图像的缩略图 ivphoto.setimagebitmap(bitmap); ivphoto.setbackgroundresource(mresourceid); // 将显示图像的 View 对象保存在 Map 对象中 mviewmap.put(mphotourls.get(position), view); catch (Exception e) return view; 其中 getphoto 方法用于获取图像数据, 代码如下 : public static Bitmap getphoto(int albumid, String filename, boolean original) String url = " // 直接获得 InputStream 对象, 并从 InputStream 对象中获取图像装饰, 最后返回表示图像的 // Bitmap 对象 InputStream is = (InputStream) getobject(url, new String[] "albumid", "filename", "original", new String[] String.valueOf(albumId), filename, String.valueOf(original), true); Bitmap bitmap = BitmapFactory.decodeStream(is); return bitmap; 选择一个相册后, 缩略图的显示效果如图 15.1 所示 显示照片大图 当长按图像的缩略图后, 会显示该图像的大图, 代码如下 : public boolean onitemlongclick(adapterview<?> adapterview, View view, int position, long id) Intent intent = new Intent(this, BigPicture.class); intent.putextra("albumid", malbums.get(mcurrentalbumposition).getid()); intent.putextra("filename", mphotourls.get(position)); 472

26 第 15 章移动电子相册 : 捕捉精彩瞬间 startactivity(intent); return false; 其中 BigPicture 是显示大图的 Activity, 需要两个参数 :albumid 和 filename 在 BigPicture 类中需要通过如下的代码来显示图像的大图 : ImageView ivbigpicture = (ImageView)findViewById(R.id.ivBigPicture); String filename = getintent().getextras().getstring("filename"); int albumid = getintent().getextras().getint("albumid"); Bitmap bitmap = CallService.getPhoto(albumId, filename, true); ivbigpicture.setimagebitmap(bitmap); 显示大图的效果如图 所示 图 显示大图 15.5 项目实战 : 建立相册 移动电子相册还需要一个建立相册的功能 用户在手机客户端只需输入相册名称和相册描 述就可以创建一个相册, 其他信息 ( 如用户名 等 ) 在登录时已经确定 本节将详细介 绍如何实现建立相册的功能 编写建立相册的服务 相册需要 ( 也就是用户账号 ) 相册名称和相册描述这三个信息 通过 CreateAlbum Servlet 类可以从客户端获得相应的请求参数值, 然后将这些值保存到数据库中, 代码如下 : package service.servlet; import java.io.ioexception; import java.sql.preparedstatement; import javax.servlet.servletexception; import javax.servlet.http.httpservletrequest; 473

27 人人都玩开心网 :Ext JS + Android + SSH 整合开发 Web 与移动 SNS import javax.servlet.http.httpservletresponse; public class CreateAlbumServlet extends protected void execute(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException try String sql = "insert into t_kx_albums( , album_name, description) values(?,?,?)"; PreparedStatement preparedstatement = mconnection.preparestatement(sql); String albumname = request.getparameter("albumname"); String description = request.getparameter("description"); // 设置 SQL 的参数值 preparedstatement.setstring(1, musername); preparedstatement.setstring(2, albumname); preparedstatement.setstring(3, description); // 执行 insert 语句将数据插入到数据库中 preparedstatement.execute(); // 如果插入成功 ( 成功建立相册 ), 返回 ok response.getwriter().println("ok"); catch (Exception e) // 插入失败, 返回错误信息 response.getwriter().println(e.getmessage()); CreateAlbumServlet 类的配置代码如下 : <servlet> <servlet-name>createalbumservlet</servlet-name> <servlet-class>service.servlet.createalbumservlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>createalbumservlet</servlet-name> <url-pattern>/createalbumservlet</url-pattern> </servlet-mapping> 在客户端提交相册信息手机客户端建立相册的界面如图 所示 在输入完图 所示的内容后, 单击 建立相册 按钮, 会将相册信息保存到服务端 然后在 浏览照片 页面就可以查看相册信息了 474

28 第 15 章移动电子相册 : 捕捉精彩瞬间 图 建立相册 图 输入相册信息 createalbum 方法可以向服务端发送相册信息, 代码如下 : public static String createalbum(string albumname, String description) String url = " InputStream is = (InputStream) getobject(url, new String[] "albumname", "description", new String[] albumname, description, true); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String result = ""; try result = br.readline(); catch (Exception e) return result; 单击 建立相册 按钮后, 会执行下面的代码来建立相册 String albumname = metalbumname.gettext().tostring(); if ("".equals(albumname)) return; // 建立相册 result = CallService.createAlbum(albumName, metdescription.gettext().tostring()); if ("ok".equals(result)) Message.showMsg(this, " 成功建立相册."); else Message.showMsg(this, result); 15.6 项目实战 : 上传图像 上传图像是移动电子相册中最吸引人的功能, 因为 Android 手机都会至少带一个摄像头, 475

29 人人都玩开心网 :Ext JS + Android + SSH 整合开发 Web 与移动 SNS 这样可以随时随地将拍摄的照片发到开心网上与好友分享 除了直接将拍摄的照片发到网上, 还可以选择手机上已经存在的图像文件, 并将其发到网上 服务端接收客户端上传的图像 上传到服务端的图像需要如下的信息 : username( 也就是 ) passwordmd5( 用 MD5 加密的密码 ) userid( 用户 ID) albumid( 相册 ID) photodata( 照片的数据, 以 byte[] 形式保存 ) 客户端在上传这些数据时, 将它们封装在了 UploadPhotoData 对象中 UploadPhotoData 类的代码如下 : package service; import java.io.serializable; public class UploadPhotoData implements Serializable private String username; private String passwordmd5; private int userid; private int albumid; private byte[] photodata; // 此处省略了属性的 getter 和 setter 方法 UploadPhotoServlet 类用于接收客户端发送的图像数据 在该类中从 HTTP 请求获取 InputStream 对象, 并将数据流转换成 UploadPhotoData 对象, 代码如下 : package service.servlet; import java.io.file; import java.io.fileoutputstream; import java.io.ioexception; import java.io.inputstream; import java.io.objectinputstream; import java.sql.connection; import java.sql.drivermanager; import java.sql.preparedstatement; import java.sql.resultset; import javax.servlet.servletexception; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import service.uploadphotodata; public class UploadPhotoServlet extends HttpServlet protected void service(httpservletrequest request, 476

30 第 15 章移动电子相册 : 捕捉精彩瞬间 HttpServletResponse response) throws ServletException, IOException try String photorootpath = getservletcontext().getinitparameter( "photorootpath"); Class.forName("com.mysql.jdbc.Driver"); // 获取 Connection 对象 Connection connection = DriverManager.getConnection( "jdbc:mysql://localhost/kxw?characterencoding=utf-8", "root", "1234"); InputStream is = request.getinputstream(); ObjectInputStream ois = new ObjectInputStream(is); Object obj = ois.readobject(); // 从客户端获取 UploadPhotoData 对象 UploadPhotoData uploadphotodata = (UploadPhotoData) obj; String sql = "select * from t_kx_users where =? and password=?"; PreparedStatement preparedstatement = connection.preparestatement(sql); preparedstatement.setstring(1, uploadphotodata.getusername()); preparedstatement.setstring(2, uploadphotodata.getpasswordmd5()); ResultSet rs = preparedstatement.executequery(); // 进行用户身份验证 if (rs.next()) sql = "insert into t_kx_photos(user_id,album_id,photo_filename, content_type) values(?,?,?,?)"; preparedstatement = connection.preparestatement(sql); String filename = CommonServlet.getRandomFileName(); String photopath = photorootpath + uploadphotodata.getusername().hashcode() + File.separator + uploadphotodata.getalbumid(); File file = new File(photoPath); if (!file.exists()) // 建立保存上传照片的目录 file.mkdirs(); photopath += File.separator + filename; FileOutputStream fos = new FileOutputStream(photoPath); // 在服务端保存图像文件 fos.write(uploadphotodata.getphotodata()); fos.close(); preparedstatement.setint(1, uploadphotodata.getuserid()); preparedstatement.setint(2, uploadphotodata.getalbumid()); preparedstatement.setstring(3, filename); preparedstatement.setstring(4, "image/pjpeg"); // 向数据库中插入照片信息记录 477

31 人人都玩开心网 :Ext JS + Android + SSH 整合开发 Web 与移动 SNS preparedstatement.execute(); response.getwriter().println("ok"); catch (Exception e) e.printstacktrace(); response.getwriter().println(e.getmessage()); 由于 UploadPhotoServlet 类需要直接使用 InputStream 对象, 因此, 该类需要直接从 HttpServlet 类继承 ( 不能同时使用 InputStream 和 getparameter 方法从客户端获得数据 ) UploadPhotoServlet 类的配置代码如下 : <servlet> <servlet-name>uploadphotoservlet</servlet-name> <servlet-class>service.servlet.uploadphotoservlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>uploadphotoservlet</servlet-name> <url-pattern>/uploadphotoservlet</url-pattern> </servlet-mapping> 拍摄照片 移动电子相册可以直接调用 Android 系统本身的拍照功能, 代码如下 : Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startactivityforresult(intent, 1); 当成功拍照后, 系统会调用 onactivityresult 方法来接收图像数据, 代码如下 : protected void onactivityresult(int requestcode, int resultcode, Intent data) super.onactivityresult(requestcode, resultcode, data); if (resultcode == Activity.RESULT_OK) switch (requestcode) case 1: mbitmap = (Bitmap) data.getextras().get("data"); try // 将拍摄的照片显示在 ImageView 组件中 mivphoto.setimagebitmap(mbitmap); catch (Exception e) 478

32 第 15 章移动电子相册 : 捕捉精彩瞬间 break; 单击 拍摄照片 按钮开始拍摄照片, 拍摄效果如图 15.2 所示 从本地选择图像 通过如下的代码可以直接浏览手机中所有包含图像的目录 : Intent intent = new Intent(); intent.settype("image/*"); intent.setaction(intent.action_get_content); startactivityforresult(intent, 2); 下面的代码在 onactivityresult 方法中接收用户选择的图像数据, 并将该数据显示在 ImageView 组件中 protected void onactivityresult(int requestcode, int resultcode, Intent data) super.onactivityresult(requestcode, resultcode, data); if (resultcode == Activity.RESULT_OK) switch (requestcode) case 2: Uri uri = data.getdata(); try Cursor cursor = getcontentresolver().query(uri, null, null, null, null); cursor.movetofirst(); String imagefilepath = cursor.getstring(1); cursor.close(); Options options = new Options(); // 根据图像实际的大小获取缩放比例 options.insamplesize = getsamplesize(imagefilepath); if (options.insamplesize > 0) mbitmap = BitmapFactory.decodeFile(imageFilePath, options); else mbitmap = BitmapFactory.decodeFile(imageFilePath); mivphoto.setimagebitmap(mbitmap); catch (Exception e) break; 479

33 人人都玩开心网 :Ext JS + Android + SSH 整合开发 Web 与移动 SNS 在编写上面的代码时要注意, 不要显示完全尺寸的图像, 否则如果图像过大, 系统会抛出 内存溢出错误 为了使图像可以正常显示, 需要通过 decodefile 方法的第二个参数进行设置 其中 Options 类有一个 insamplesize 字段, 表示图像缩放比例 如果该字段为 n, 则 decodefile 会按原图的 1/n 创建 Bitmap 对象 向服务端上传图像 由于上传图像需要直接向服务端发送 UploadPhotoData 对象, 因此, 需要使用 HttpURL Connection 直接操作 OutputStream, 代码如下 : public static String uploadimage(int albumid, byte[] data) String result = ""; try URL url = new URL( " HttpURLConnection httpurlconnection = (HttpURLConnection) url.openconnection(); httpurlconnection.setrequestmethod("post"); httpurlconnection.setdoinput(true); httpurlconnection.setdooutput(true); httpurlconnection.setusecaches(false); httpurlconnection.setrequestproperty("charset", "UTF-8"); // 获取向服务端发送数据的 OutputStream 对象 OutputStream os = httpurlconnection.getoutputstream(); // 创建 UploadPhotoData 对象 UploadPhotoData uploadphotodata = new UploadPhotoData(); // 开始为 UploadPhotoData 对象的字段赋值 uploadphotodata.setuserid(login.muser.getid()); uploadphotodata.setusername(username); uploadphotodata.setpasswordmd5(passwordmd5); uploadphotodata.setalbumid(albumid); uploadphotodata.setphotodata(data); ObjectOutputStream oos = new ObjectOutputStream(os); // 向服务端发送 UploadPhotoData 对象 oos.writeobject(uploadphotodata); oos.close(); InputStream is = httpurlconnection.getinputstream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); // 从服务端获取返回结果 result = br.readline(); is.close(); httpurlconnection.disconnect(); return result; catch (Exception e) 480

34 第 15 章移动电子相册 : 捕捉精彩瞬间 单击 上传图像 按钮, 会调用如下的代码上传 ImageView 组件中显示的图像 if (mbitmap == null) return; ByteArrayOutputStream baos = new ByteArrayOutputStream(); mbitmap.compress(compressformat.jpeg, 100, baos); // 调用 uploadimage 方法上传图像 result = CallService.uploadImage(mAlbums.get( mcurrentalbumposition).getid(), baos.tobytearray()); if (!"ok".equals(result)) Message.showMsg(this, result); else Message.showMsg(this, " 成功上传图像 "); 15.7 本章小结 本章主要介绍了移动电子相册中用到的 Android 组件和网络功能 其中的组件包括 Button TextView EditText ImageView Spinner Gallery 和 TabHost 为了演示 Android 访问网络的能力, 在移动电子相册中同时使用了 HttpClient 和 HttpURLConnection 来访问网络, 在本章的最后详细介绍了移动电子相册的实现过程 481

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new ListView 自訂排版 主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new int[]{r.drawable.dog1, R.drawable.dog2,

More information

res/layout 目录下的 main.xml 源码 : <?xml version="1.0" encoding="utf 8"?> <TabHost android:layout_height="fill_parent" xml

res/layout 目录下的 main.xml 源码 : <?xml version=1.0 encoding=utf 8?> <TabHost android:layout_height=fill_parent xml 拓展训练 1- 界面布局 1. 界面布局的重要性做应用程序, 界面是最基本的 Andorid 的界面, 需要写在 res/layout 的 xml 里面, 一般情况下一个 xml 对应一个界面 Android 界面布局有点像写 html( 连注释代码的方式都一样 ), 要先给 Android 定框架, 然后再在框架里面放控件,Android 提供了几种框架,AbsoluteLayout,LinearLayout,

More information

用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應

用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應 專題進度 老師 : 趙啟時老師 學生 : 陳建廷 2013/10/13 用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應 程式碼 : package com.example.phone; import java.util.arraylist;

More information

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit Tomcat Web JUnit Cactus JUnit Java Cactus JUnit 26.1 JUnit Java JUnit JUnit Java JSP Servlet JUnit Java Erich Gamma Kent Beck xunit JUnit boolean JUnit Java JUnit Java JUnit Java 26.1.1 JUnit JUnit How

More information

1.JasperReport ireport JasperReport ireport JDK JDK JDK JDK ant ant...6

1.JasperReport ireport JasperReport ireport JDK JDK JDK JDK ant ant...6 www.brainysoft.net 1.JasperReport ireport...4 1.1 JasperReport...4 1.2 ireport...4 2....4 2.1 JDK...4 2.1.1 JDK...4 2.1.2 JDK...5 2.1.3 JDK...5 2.2 ant...6 2.2.1 ant...6 2.2.2 ant...6 2.3 JasperReport...7

More information

预览图 : (2) 在 SelectCity.java 中增加控件, 用于绑定 select_city 文件的 ListView, TextView,EditTest 等控件 代码和注释如下 :

预览图 : (2) 在 SelectCity.java 中增加控件, 用于绑定 select_city 文件的 ListView, TextView,EditTest 等控件 代码和注释如下 : EditText 实现城市搜索 1801210778 邹宇航 摘要 : 使用 EditText 实现搜索城市的功能, 以此为依据更新 ListView 1. 效果图 : 2. 主要步骤 (1) 在 select-city.xml 布局文件中中添加 EditText 控件用作搜索框, 然后添加 ListView 控件用来显示城市名字内容 代码如下 : 预览图 : (2) 在 SelectCity.java

More information

Guava学习之Resources

Guava学习之Resources Resources 提供提供操作 classpath 路径下所有资源的方法 除非另有说明, 否则类中所有方法的参数都不能为 null 虽然有些方法的参数是 URL 类型的, 但是这些方法实现通常不是以 HTTP 完成的 ; 同时这些资源也非 classpath 路径下的 下面两个函数都是根据资源的名称得到其绝对路径, 从函数里面可以看出,Resources 类中的 getresource 函数都是基于

More information

untitled

untitled JavaEE+Android - 6 1.5-2 JavaEE web MIS OA ERP BOSS Android Android Google Map office HTML CSS,java Android + SQL Sever JavaWeb JavaScript/AJAX jquery Java Oracle SSH SSH EJB+JBOSS Android + 1. 2. IDE

More information

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 odps-sdk 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基 开放数据处理服务 ODPS SDK SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基础功能的主体接口, 搜索关键词 "odpssdk-core" 一些

More information

Android Service

Android Service Android Service- 播放音樂 建國科技大學資管系 饒瑞佶 2013/7 V1 Android Service Service 是跟 Activity 並行 一個音樂播放程式若沒使用 Service, 即使按 home 鍵畫面離開之後, 音樂還是照播 如果再執行一次程式, 新撥放的音樂會跟先前撥放的一起撥, 最後程式就會出錯 執行中的程式完全看不到! 但是, 寫成 Service 就不同了

More information

Microsoft Word - 01.DOC

Microsoft Word - 01.DOC 第 1 章 JavaScript 简 介 JavaScript 是 NetScape 公 司 为 Navigator 浏 览 器 开 发 的, 是 写 在 HTML 文 件 中 的 一 种 脚 本 语 言, 能 实 现 网 页 内 容 的 交 互 显 示 当 用 户 在 客 户 端 显 示 该 网 页 时, 浏 览 器 就 会 执 行 JavaScript 程 序, 用 户 通 过 交 互 式 的

More information

Android Fragment

Android Fragment Android Fragment 建國科技大學資管系饒瑞佶 2017/10 V1 Android 3.0 後才支援 Fragment 解決部分 App 適應螢幕大小的問題 它類似於 Activity, 可以像 Activity 可以擁有自己的版面設計, 也和 Activity 一樣有自己的生命週期 ( 具備 oncreate() oncreateview() 與 onpause() 方法 ) LifeCycle

More information

本章学习目标 小风 Java 实战系列教程 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc

本章学习目标 小风 Java 实战系列教程 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc 本章学习目标 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 配置视图解析器 @RequestMapping 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc 和 Struts2 都属于表现层的框架, 它是 Spring 框架的一部分, 我们可 以从 Spring 的整体结构中看得出来 :

More information

建立Android新專案

建立Android新專案 Android 智 慧 型 手 機 程 式 設 計 Android WebService 建 國 科 技 大 學 資 管 系 饒 瑞 佶 2012/4 V1 2012/8 V2 2013/5 V3 2014/10 v4 提 醒 這 節 的 內 容 針 對 的 是 MS 的 Web Service 或 是 使 用 SOAP(Simple Object Access Protocol) 標 準 建 立

More information

D getinitparameternames() 9 下 列 选 项 中, 属 于 Servlet API 中 提 供 的 request 对 象 的 包 装 类 的 是 ( ) A HttpServletRequestWrapper B HttpServletRequest C HttpServ

D getinitparameternames() 9 下 列 选 项 中, 属 于 Servlet API 中 提 供 的 request 对 象 的 包 装 类 的 是 ( ) A HttpServletRequestWrapper B HttpServletRequest C HttpServ 第 四 章 Filter( 过 滤 器 ) 样 题 A 卷 一 选 择 题 ( 每 小 题 2 分, 共 20 分 ) 1 下 面 选 项 中, 用 于 实 现 初 始 化 过 滤 器 的 方 法 是 ( ) A init(filterconfig filterconfig) B dofilter(servletrequest req,servletresponse resp,filterchain

More information

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 -> 目录 1 大概思路... 1 2 创建 WebAPI... 1 3 创建 CrossMainController 并编写... 1 4 Nuget 安装 microsoft.aspnet.webapi.cors... 4 5 跨域设置路由... 4 6 编写 Jquery EasyUI 界面... 5 7 运行效果... 7 8 总结... 7 1 1 大概思路 创建 WebAPI 创建 CrossMainController

More information

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例 帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例 这篇文章主要介绍了帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例, 本文还详细介绍了帝国 CMS 数据库类中的一些常用方法, 需要的朋友可以参考下 例 1: 连接 MYSQL 数据库例子 (a.php)

More information

單步除錯 (1/10) 打開 Android Studio, 點選 Start a new Android Studio project 建立專案 Application name 輸入 BMI 點下 Next 2 P a g e

單步除錯 (1/10) 打開 Android Studio, 點選 Start a new Android Studio project 建立專案 Application name 輸入 BMI 點下 Next 2 P a g e Android Studio Debugging 本篇教學除了最基本的中斷點教學之外, 還有條件式中斷的教學 條件式中斷是進階的除錯技巧, 在某些特定情況中, 我們有一個函數可能會被呼叫數次, 但是我們只希望在某種條件成立時才進行中斷, 進而觀察變數的狀態 而條件式中斷這項技巧正是符合這項需求 本教學分兩部分 單步除錯 (Page2~11, 共 10) 條件式中斷點 (Page12~17, 共 6)

More information

untitled

untitled 1 Outline 數 料 數 數 列 亂數 練 數 數 數 來 數 數 來 數 料 利 料 來 數 A-Z a-z _ () 不 數 0-9 數 不 數 SCHOOL School school 數 讀 school_name schoolname 易 不 C# my name 7_eleven B&Q new C# (1) public protected private params override

More information

Android 开发教程

Android 开发教程 封面 1 文件存取编程基础 文件 文件可以用来存储比使用引用更大数量的数据 Android 提供方法来读 写文件 只有本地文件可以被访问 优点 : 可以存储大容量的数据 缺点 : 文件更新或是格式改变可能会导致巨大的编程工作 文件操作 读文件 Context.openFileInput(String name) 打开一个与应用程序联系的私有文件输入流 当文件不存在时抛出 FileNotFoundException

More information

建模与图形思考

建模与图形思考 F06_c 观摩 :ContentProvider 基於軟硬整合觀點 架构與 DB 引擎移植方法 ( c) By 高煥堂 4 通用性基类 ContentProvider 基於軟硬整合觀點 的使用范例 刚才的范例里, 我们直接使用 DataPersist 类的接口来与 SQLite 沟通 本节将替 DataPersist 配上 ContentProvider 基类, 让 Client 能透过 ContentProvider

More information

EJB-Programming-4-cn.doc

EJB-Programming-4-cn.doc EJB (4) : (Entity Bean Value Object ) JBuilder EJB 2.x CMP EJB Relationships JBuilder EJB Test Client EJB EJB Seminar CMP Entity Beans Session Bean J2EE Session Façade Design Pattern Session Bean Session

More information

使用Cassandra和Spark 2.0实现Rest API服务

使用Cassandra和Spark 2.0实现Rest API服务 使用 Cassandra 和 Spark 2.0 实现 Rest API 服务 在这篇文章中, 我将介绍如何在 Spark 中使用 Akkahttp 并结合 Cassandra 实现 REST 服务, 在这个系统中 Cassandra 用于数据的存储 我们已经见识到 Spark 的威力, 如果和 Cassandra 正确地结合可以实现更强大的系统 我们先创建一个 build.sbt 文件, 内容如下

More information

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入 100 年 特 種 考 試 地 方 政 府 公 務 人 員 考 試 試 題 等 別 : 三 等 考 試 類 科 : 資 訊 處 理 科 目 : 系 統 分 析 與 設 計 一 請 參 考 下 列 旅 館 管 理 系 統 的 使 用 案 例 圖 (Use Case Diagram) 撰 寫 預 約 房 間 的 使 用 案 例 規 格 書 (Use Case Specification), 繪 出 入

More information

Dynamic Layout in Android

Dynamic Layout in Android Dynamic Layout in Android 建國科技大學資管系 饒瑞佶 2013/5 V1 Layout 多半都透過 res/layout/xml 格式設定來達成 Android 是 OOP, 所以可以動態產生 Layout 重點是 Layout 的階層關係 (Hierarchy) 需要處理對應事件 最後一樣用 setcontentview 加入 Layout 一 加入現有 Layout 中

More information

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0,

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0, http://debut.cis.nctu.edu.tw/~chi Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0, : POSITIVE_INFINITY NEGATIVE_INFINITY

More information

Microsoft PowerPoint - 05-Status-Codes-Chinese.ppt

Microsoft PowerPoint - 05-Status-Codes-Chinese.ppt 2004 Marty Hall 服务器响应的生成 : HTTP 状态代码 JSP, Servlet, & Struts Training Courses: http://courses.coreservlets.com Available in US, China, Taiwan, HK, and Worldwide 2 JSP and Servlet Books from Sun Press: http://www.coreservlets.com

More information

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d

More information

RecyclerView and CardVew

RecyclerView and CardVew RecyclerView and CardView 建國科技大學資管系饒瑞佶 2017/10 V1 CardView CardView A CardView is a ViewGroup. Like any other ViewGroup, it can be added to youractivity or Fragment using a layout XML file. To create an

More information

设计模式 Design Patterns

设计模式 Design Patterns 丁勇 Email:18442056@QQ.com 学习目标 掌握 Model I 体系结构 掌握 Model II 体系结构 掌握 MVC 应用程序 Model I 体系结构 6 1 Model I 体系结构结合使用 JSP 页面和 Bean 来开发 Web 应用程序 应用服务器 请求 JSP 页面 响应 Bean 数据库服务器 Model I 体系结构 6 2 Model I 体系结构用于开发简单的应用程序

More information

EJB-Programming-3.PDF

EJB-Programming-3.PDF :, JBuilder EJB 2.x CMP EJB Relationships JBuilder EJB Test Client EJB EJB Seminar CMP Entity Beans Value Object Design Pattern J2EE Design Patterns Value Object Value Object Factory J2EE EJB Test Client

More information

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6:

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6: Chapter 15. Suppressed Exception CH14 Finally Block Java SE 7 try-with-resources JVM cleanup try-with-resources JVM cleanup cleanup Java SE 7 Throwable getsuppressed Throwable[] getsuppressed() Suppressed

More information

人民邮电

人民邮电 第 2 章 布 局 布 局 是 所 有 带 界 面 的 Android 程 序 的 开 端 布 局 应 用 得 好 坏 直 接 决 定 了 程 序 的 用 户 体 验 虽 然 布 局 看 似 没 有 组 件 复 杂, 但 也 涉 及 到 了 很 多 技 巧 在 各 大 公 司 的 面 试 题 中 也 会 经 常 遇 到 关 于 布 局 的 一 些 问 题 通 过 这 些 问 题 可 以 考 查 应

More information

Microsoft Word - Broker.doc

Microsoft Word - Broker.doc Broker 模式 采用 broker 模式对分布式计算进行简单模拟 系统在一个进程内模拟分布式环境, 因此不涉及网络编程和进程间通信,Broker 通过本地函数调用的方式实现 request 和 response 的转发 采用 broker 模式对分布式计算进行简单的模拟, 要求如下 : 设计四个 server, 一个 server 接收两个整数, 求和并返回结果, 一个 server 接收两个整数,

More information

使用MapReduce读取XML文件

使用MapReduce读取XML文件 使用 MapReduce 读取 XML 文件 XML( 可扩展标记语言, 英语 :extensible Markup Language, 简称 : XML) 是一种标记语言, 也是行业标准数据交换交换格式, 它很适合在系统之间进行数据存储和交换 ( 话说 Hadoop H ive 等的配置文件就是 XML 格式的 ) 本文将介绍如何使用 MapReduce 来读取 XML 文件 但是 Had oop

More information

中 文 摘 要 智 慧 型 手 機 由 於 有 強 大 的 功 能, 以 及 優 渥 的 便 利 性, 還 能 與 網 路 保 持 隨 時 的 鏈 結 與 同 步 更 新, 因 此 深 受 廣 大 消 費 者 喜 愛, 當 然, 手 機 遊 戲 也 成 為 現 代 人 不 可 或 缺 的 娛 樂 之

中 文 摘 要 智 慧 型 手 機 由 於 有 強 大 的 功 能, 以 及 優 渥 的 便 利 性, 還 能 與 網 路 保 持 隨 時 的 鏈 結 與 同 步 更 新, 因 此 深 受 廣 大 消 費 者 喜 愛, 當 然, 手 機 遊 戲 也 成 為 現 代 人 不 可 或 缺 的 娛 樂 之 臺 北 市 大 安 高 級 工 業 職 業 學 校 資 訊 科 一 百 零 一 學 年 度 專 題 製 作 報 告 ------ 以 Android 製 作 ------ ----- 連 線 塔 防 遊 戲 ------ Tower defense game using Internet technology 班 級 : 資 訊 三 甲 組 別 : A9 組 組 員 : 葉 冠 麟 (9906129)

More information

Microsoft Word - json入门.doc

Microsoft Word - json入门.doc Json 入门 送给亲爱的女朋友, 祝她天天快乐 作者 :hlz QQ:81452743 MSN/Email:hulizhong2008@163.com json 入门 (1) json 是 JavaScript Object Notation 的简称 ; 在 web 系统开发中与 AJAX 相结合用的比较多 在 ajax 中数据传输有 2 中方式 : 文本类型, 常用 responsetext 属性类获取

More information

Microsoft Word - 第4章 3D相册.doc

Microsoft Word - 第4章 3D相册.doc 第 4 章 3D 相册 学习目标 u 掌握相册界面的开发, 实现相册的立体与倒影效果 在现实生活中, 我们浏览照片时, 不同的相册软件有不同的浏览效果 本章主要实现了一个 3D 效果的相册, 该相册中的图片可以循环滑动展示 4.1 3D 相册 任务综述 相册界面主要是展示一组图片的立体效果, 并显示每个图片的倒影, 左右滑动可以切换不同的图片到 界面的中间位置, 同时在图片下方显示当前图片的标题,

More information

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

KillTest 质量更高 服务更好 学习资料   半年免费更新服务 KillTest 质量更高 服务更好 学习资料 http://www.killtest.cn 半年免费更新服务 Exam : 1Z0-854 Title : Java Standard Edition 5 Programmer Certified Professional Upgrade Exam Version : Demo 1 / 12 1.Given: 20. public class CreditCard

More information

软件工程文档编制

软件工程文档编制 实训抽象类 一 实训目标 掌握抽象类的定义 使用 掌握运行时多态 二 知识点 抽象类的语法格式如下 : public abstract class ClassName abstract void 方法名称 ( 参数 ); // 非抽象方法的实现代码 在使用抽象类时需要注意如下几点 : 1 抽象类不能被实例化, 实例化的工作应该交由它的子类来完成 2 抽象方法必须由子类来进行重写 3 只要包含一个抽象方法的抽象类,

More information

1. 2. Flex Adobe 3.

1. 2. Flex Adobe 3. 1. 2. Flex Adobe 3. Flex Adobe Flex Flex Web Flex Flex Flex Adobe Flash Player 9 /rich Internet applications/ria Flex 1. 2. 3. 4. 5. 6. SWF Flash Player Flex 1. Flex framework Adobe Flex 2 framework RIA

More information

基于ECO的UML模型驱动的数据库应用开发1.doc

基于ECO的UML模型驱动的数据库应用开发1.doc ECO UML () Object RDBMS Mapping.Net Framework Java C# RAD DataSetOleDbConnection DataGrod RAD Client/Server RAD RAD DataReader["Spell"].ToString() AObj.XXX bug sql UML OR Mapping RAD Lazy load round trip

More information

《大话设计模式》第一章

《大话设计模式》第一章 第 1 章 代 码 无 错 就 是 优? 简 单 工 厂 模 式 1.1 面 试 受 挫 小 菜 今 年 计 算 机 专 业 大 四 了, 学 了 不 少 软 件 开 发 方 面 的 东 西, 也 学 着 编 了 些 小 程 序, 踌 躇 满 志, 一 心 要 找 一 个 好 单 位 当 投 递 了 无 数 份 简 历 后, 终 于 收 到 了 一 个 单 位 的 面 试 通 知, 小 菜 欣 喜

More information

untitled

untitled 1 行 行 行 行.NET 行 行 類 來 行 行 Thread 類 行 System.Threading 來 類 Thread 類 (1) public Thread(ThreadStart start ); Name 行 IsAlive 行 行狀 Start 行 行 Suspend 行 Resume 行 行 Thread 類 (2) Sleep 行 CurrentThread 行 ThreadStart

More information

untitled

untitled ArcGIS Server Web services Web services Application Web services Web Catalog ArcGIS Server Web services 6-2 Web services? Internet (SOAP) :, : Credit card authentication, shopping carts GIS:, locator services,

More information

1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10

1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10 Java V1.0.1 2007 4 10 1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10 6.2.10 6.3..10 6.4 11 7.12 7.1

More information

<C8EBC3C5C6AAA3A8B5DA31D5C2A3A92E696E6464>

<C8EBC3C5C6AAA3A8B5DA31D5C2A3A92E696E6464> 第 1 章 进入 Photoshop 的全新世界 本章导读 Photoshop 1 1.1 Photoshop CS6 Photoshop Photoshop 1.1.1 Photoshop POP 1-1 图 1-1 平面广告效果 1.1.2 Photoshop 1-2 Photoshop CS6 Photoshop CS6 Photoshop CS6 Extended 3D 3 Photoshop

More information

untitled

untitled 1 .NET 利 [] [] 來 說 切 切 理 [] [ ] 來 說 拉 類 類 [] [ ] 列 連 Web 行流 來 了 不 不 不 流 立 行 Page 類 Load 理 Response 類 Write 料 Redirect URL Response.Write("!! ives!!"); Response.Redirect("WebForm2.aspx"); (1) (2) Web Form

More information

Flume-ng与Mysql整合开发

Flume-ng与Mysql整合开发 Flume-ng 与 Mysql 整合开发 我们知道,Flume 可以和许多的系统进行整合, 包括了 Hadoop Spark Kafka Hbase 等等 ; 当然, 强悍的 Flume 也是可以和 Mysql 进行整合, 将分析好的日志存储到 Mysql( 当然, 你也可以存放到 pg oracle 等等关系型数据库 ) 不过我这里想多说一些 :Flume 是分布式收集日志的系统 ; 既然都分布式了,

More information

while ((ch = fr.read())!= -1) { System.out.print((char) ch); fr.close(); 例 3: 用 BufferedReader 读 TXT 文件 public class FileReaderDemo3 { public static v

while ((ch = fr.read())!= -1) { System.out.print((char) ch); fr.close(); 例 3: 用 BufferedReader 读 TXT 文件 public class FileReaderDemo3 { public static v 第九章 Java I/O 流操作 实验目的 (1) 掌握文本文件的读写方法 (2) 掌握 InputStream OutputStream 的使用方法 (3) 熟悉 FileReader,BufferedReader,InputStreamReader 和 FileWriter, BufferedWriter, PrintWriter 的使用方法 ; 理解使用过滤流实现数据项的读写 :DataOutputStream,

More information

拦截器(Interceptor)的学习

拦截器(Interceptor)的学习 二 拦截器 (Interceptor) 的学习 拦截器可以监听程序的一个或所有方法 拦截器对方法调用流提供了细粒度控制 可以在无状态会话 bean 有状态会话 bean 和消息驱动 bean 上使用它们 拦截器可以是同一 bean 类中的方法或是一个外部类 下面介绍如何在 Session Bean 类中使用外部拦截器类 @Interceptors 注释指定一个或多个在外部类中定义的拦截器 下面拦截器

More information

Java Access 5-1 Server Client Client Server Server Client 5-2 DataInputStream Class java.io.datainptstream (extends) FilterInputStream InputStream Obj

Java Access 5-1 Server Client Client Server Server Client 5-2 DataInputStream Class java.io.datainptstream (extends) FilterInputStream InputStream Obj Message Transition 5-1 5-2 DataInputStream Class 5-3 DataOutputStream Class 5-4 PrintStream Class 5-5 (Message Transition) (Exercises) Java Access 5-1 Server Client Client Server Server Client 5-2 DataInputStream

More information

Android 编程基础 Android 开发教程 & 笔记 1

Android 编程基础 Android 开发教程 & 笔记 1 Android 开发教程 & 笔记 1 多式样 ProgressBar 撰写 : 地狱怒兽 联系 :zyf19870302@126.com 普通圆形 ProgressBar 该类型进度条也就是一个表示运转的过程, 例如发送短信, 连接网络等等, 表示一个过程正 在执行中 一般只要在 XML 布局中定义就可以了

More information

resp.getwriter().print(j + "*" + i + "=" + j * i+" "); resp.getwriter().print("<br/>"); protected void dopost(httpservletrequest req, HttpServletRespo

resp.getwriter().print(j + * + i + = + j * i+ ); resp.getwriter().print(<br/>); protected void dopost(httpservletrequest req, HttpServletRespo 第三章补充案例 案例 3-1 HttpServlet 一 案例描述 1 考核知识点名称 :HttpServlet 编号 : 2 练习目标 掌握 HttpServlet 的 doget() 方法和 dopost() 方法 3 需求分析由于大多数 Web 应用都是通过 HTTP 协议和客户端进行交互, 因此, 在 Servlet 接口中, 提供了 一个抽象类 javax.servlet.http.httpservlet,

More information

JavaIO.PDF

JavaIO.PDF O u t p u t S t ream j a v a. i o. O u t p u t S t r e a m w r i t e () f l u s h () c l o s e () public abstract void write(int b) throws IOException public void write(byte[] data) throws IOException

More information

Database_001

Database_001 作者 : 林致宇日期 :2011/10/26 主要參考來源 : http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applicat ions/ 問題 : 如在存取一個已經建立好的資料庫? 解答 : 有一些應用程式會需要讀取已經建立好的資料庫, 例如一個試題測驗應用程式, 裡面的試題可能已經於電腦上, 使用任何的

More information

FileMaker 15 ODBC 和 JDBC 指南

FileMaker 15 ODBC 和 JDBC 指南 FileMaker 15 ODBC JDBC 2004-2016 FileMaker, Inc. FileMaker, Inc. 5201 Patrick Henry Drive Santa Clara, California 95054 FileMaker FileMaker Go FileMaker, Inc. / FileMaker WebDirect FileMaker, Inc. FileMaker

More information

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课 复习 Java 包 创建包 : package 语句, 包结构与目录结构一致 使用包 : import restaurant/ - people/ - Cook.class - Waiter.class - tools/ - Fork.class

More information

Microsoft Word - 第1章 Android基本概念.docx

Microsoft Word - 第1章 Android基本概念.docx Android 系 统 下 Java 编 程 详 解 作 者 : 华 清 远 见 第 1 章 Android 基 本 概 念 本 章 简 介 本 章 主 要 介 绍 Android 基 本 概 念 方 面 的 内 容, 包 括 Android 平 台 特 性 Android 系 统 架 构 Android 开 发 框 架 和 Android 开 发 环 境 搭 建 1.1 Android 简 介 Android

More information

基于CDIO一体化理念的课程教学大纲设计

基于CDIO一体化理念的课程教学大纲设计 Java 语 言 程 序 设 计 课 程 教 学 大 纲 Java 语 言 程 序 设 计 课 程 教 学 大 纲 一 课 程 基 本 信 息 1. 课 程 代 码 :52001CC022 2. 课 程 名 称 :Java 语 言 程 序 设 计 3. 课 程 英 文 名 称 :Java Programming 4. 课 程 类 别 : 理 论 课 ( 含 实 验 上 机 或 实 践 ) 5. 授

More information

雲端 Cloud Computing 技術指南 運算 應用 平台與架構 10/04/15 11:55:46 INFO 10/04/15 11:55:53 INFO 10/04/15 11:55:56 INFO 10/04/15 11:56:05 INFO 10/04/15 11:56:07 INFO

雲端 Cloud Computing 技術指南 運算 應用 平台與架構 10/04/15 11:55:46 INFO 10/04/15 11:55:53 INFO 10/04/15 11:55:56 INFO 10/04/15 11:56:05 INFO 10/04/15 11:56:07 INFO CHAPTER 使用 Hadoop 打造自己的雲 8 8.3 測試 Hadoop 雲端系統 4 Nodes Hadoop Map Reduce Hadoop WordCount 4 Nodes Hadoop Map/Reduce $HADOOP_HOME /home/ hadoop/hadoop-0.20.2 wordcount echo $ mkdir wordcount $ cd wordcount

More information

标题

标题 江 苏 农 业 学 报 (Jiangsu J. of Agr. Sci. ),2014,30(1):205 ~ 211 h ttp: / / www. jsn y x b. com 205 毛 摇 林, 程 摇 涛, 成 维 莉, 等. 农 产 品 质 量 安 全 追 溯 智 能 终 端 系 统 构 建 与 应 用 [J]. 江 苏 农 业 学 报,2014,30(1):205 鄄 211. doi:10.

More information

// HDevelopTemplateWPF projects located under %HALCONEXAMPLES%\c# using System; using HalconDotNet; public partial class HDevelopExport public HTuple

// HDevelopTemplateWPF projects located under %HALCONEXAMPLES%\c# using System; using HalconDotNet; public partial class HDevelopExport public HTuple halcon 与 C# 混合编程之 Halcon 代码调用 写在前面 完成 halcon 与 C# 混合编程的环境配置后, 进行界面布局设计构思每一个按钮所需要实现 的功能, 将 Halcon 导出的代码复制至相应的 C# 模块下即可 halcon 源程序 : dev_open_window(0, 0, 512, 512, 'black', WindowHandle) read_image (Image,

More information

第一章 章标题-F2 上空24,下空24

第一章 章标题-F2 上空24,下空24 Web 9 XML.NET Web Web Service Web Service Web Service Web Service Web Service ASP.NET Session Application SOAP Web Service 9.1 Web Web.NET Web Service Web SOAP Simple Object Access Protocol 9.1.1 Web Web

More information

无类继承.key

无类继承.key 无类继承 JavaScript 面向对象的根基 周爱 民 / aimingoo aiming@gmail.com https://aimingoo.github.io https://github.com/aimingoo rand = new Person("Rand McKinnon",... https://docs.oracle.com/cd/e19957-01/816-6408-10/object.htm#1193255

More information

FileMaker 16 ODBC 和 JDBC 指南

FileMaker 16 ODBC 和 JDBC 指南 FileMaker 16 ODBC JDBC 2004-2017 FileMaker, Inc. FileMaker, Inc. 5201 Patrick Henry Drive Santa Clara, California 95054 FileMaker FileMaker Go FileMaker, Inc. FileMaker WebDirect FileMaker Cloud FileMaker,

More information

<4D6963726F736F667420576F7264202D20BBF9D3DA416E64726F6964C6BDCCA8B5C4B5E7D7D3C5C4C2F4CFB5CDB32E646F63>

<4D6963726F736F667420576F7264202D20BBF9D3DA416E64726F6964C6BDCCA8B5C4B5E7D7D3C5C4C2F4CFB5CDB32E646F63> 基 于 Android 平 台 的 电 子 拍 卖 系 统 摘 要 本 电 子 拍 卖 系 统 其 实 就 是 一 个 电 子 商 务 平 台, 只 要 将 该 系 统 部 署 到 互 联 网 上, 客 户 都 可 以 在 该 系 统 上 发 布 想 出 售 的 商 品, 也 可 以 对 拍 卖 中 的 商 品 参 与 竞 价 整 个 过 程 无 须 人 工 干 预, 由 系 统 自 动 完 成 本

More information

Microsoft Word - weather12 刷新按钮动画+搜索框+bug处理.docx

Microsoft Word - weather12 刷新按钮动画+搜索框+bug处理.docx 一 刷新按钮的动画效果 : 在刷新按钮的位置做两个按钮的布局, 一个是原来的静态图片, 一个是旋转的动画, 然 后控制这两个效果的显示和隐藏 ( 一 ) 刷新按钮的 style: 1. 在 app/src/main/res/values/ styles.xml 文件里添加一个 style: 2. 在 drawable 文件夹下新建一个 title_update_anim.xml, 添加如下内容 注

More information

单击以编辑母片 Content 标题样式 LinearLayout 排版模式 TableLayout 排版模式 RelativeLayout 排版模式 AbsoluteLayout 排版模式 FrameLayout 排版模式 GridLayout 排版模式 TabWidget 切換卡 Lab 5 2

单击以编辑母片 Content 标题样式 LinearLayout 排版模式 TableLayout 排版模式 RelativeLayout 排版模式 AbsoluteLayout 排版模式 FrameLayout 排版模式 GridLayout 排版模式 TabWidget 切換卡 Lab 5 2 单击以编辑母片标题样式 安卓系统 Android 的排版 授课老师 : 谢兆贤 2016/4/18 1 单击以编辑母片 Content 标题样式 LinearLayout 排版模式 TableLayout 排版模式 RelativeLayout 排版模式 AbsoluteLayout 排版模式 FrameLayout 排版模式 GridLayout 排版模式 TabWidget 切換卡 Lab 5

More information

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 第 1 页共 32 页 crm Mobile V1.0 for IOS 用户手册 一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 二 crm Mobile 界面介绍 : 第 3 页共 32 页 三 新建 (New) 功能使用说明 1 选择产品 第 4 页共 32 页 2 填写问题的简要描述和详细描述 第 5 页共

More information

内文-2.indd

内文-2.indd 客户端服务端音乐资源信息 : 1. 项目需求从本项目开始, 我们一起开发一个简单的在线音乐播放器, 它具有以下功能 (1) 程序启动时显示一个启动画面, 如图 1-1 所示 (2) 在程序主页面显示服务器上的歌曲列表, 包括歌手名与歌曲名, 单击列表条目可实现在线音乐播放, 单击 播放 暂停 上一曲 下一曲 按钮可实现对应的功能, 进度条可以显示歌曲播放进度, 如图 1-2 所示 图 1-1 程序启动画面

More information

2 WF 1 T I P WF WF WF WF WF WF WF WF 2.1 WF WF WF WF WF WF

2 WF 1 T I P WF WF WF WF WF WF WF WF 2.1 WF WF WF WF WF WF Chapter 2 WF 2.1 WF 2.2 2. XAML 2. 2 WF 1 T I P WF WF WF WF WF WF WF WF 2.1 WF WF WF WF WF WF WF WF WF WF EDI API WF Visual Studio Designer 1 2.1 WF Windows Workflow Foundation 2 WF 1 WF Domain-Specific

More information

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d =

More information

在Spring中使用Kafka:Producer篇

在Spring中使用Kafka:Producer篇 在某些情况下, 我们可能会在 Spring 中将一些 WEB 上的信息发送到 Kafka 中, 这时候我们就需要在 Spring 中编写 Producer 相关的代码了 ; 不过高兴的是,Spring 本身提供了操作 Kafka 的相关类库, 我们可以直接通过 xml 文件配置然后直接在后端的代码中使用 Kafka, 非常地方便 本文将介绍如果在 Spring 中将消息发送到 Kafka 在这之前,

More information

x MapReduce A Italic URL Constant width Constant width bold Constant width italic 這個圖示代表提示或建議 這個圖示代表一般註解

x MapReduce A Italic URL Constant width Constant width bold Constant width italic 這個圖示代表提示或建議 這個圖示代表一般註解 Java R Python Java Java Java x MapReduce A Italic URL Constant width Constant width bold Constant width italic 這個圖示代表提示或建議 這個圖示代表一般註解 第一章 I/O double[][] int[] String[] List 2 Map JavaScript Object Notation

More information

没 有 多 余 的 Contruol 或 Action 了 原 来 Domain 层 被 服 务 层 Service layer 遮 挡, 在 右 边 图 中, 则 Domain 层 直 接 暴 露 给 前 台 了, 没 有 被 遮 挡, 裸 露 了 这 样 一 步 到 位 实 现 领 域 模 型

没 有 多 余 的 Contruol 或 Action 了 原 来 Domain 层 被 服 务 层 Service layer 遮 挡, 在 右 边 图 中, 则 Domain 层 直 接 暴 露 给 前 台 了, 没 有 被 遮 挡, 裸 露 了 这 样 一 步 到 位 实 现 领 域 模 型 文 章 编 号 :1007-757X(2012)1-0036-04 领 域 驱 动 模 型 的 WEB 软 件 系 统 设 计 研 究 摘 要 : J2EE 3 JDK1.7 Tomcat WEB 关 键 词 : 中 图 分 类 号 :TP311 文 献 标 志 码 :A 0 引 言 Web 软 件 系 统 的 分 层 结 构 典 型 的 J2EE 软 件 系 统 开 发 方 法 分 为 三 层 结

More information

JBuilder Weblogic

JBuilder Weblogic JUnit ( bliu76@yeah.net) < >6 JUnit Java Erich Gamma Kent Beck JUnit JUnit 1 JUnit 1.1 JUnit JUnit java XUnit JUnit 1.2 JUnit JUnit Erich Gamma Kent Beck Erich Gamma Kent Beck XP Extreme Programming CRC

More information

untitled

untitled 1 Outline 料 類 說 Tang, Shih-Hsuan 2006/07/26 ~ 2006/09/02 六 PM 7:00 ~ 9:30 聯 ives.net@gmail.com www.csie.ntu.edu.tw/~r93057/aspnet134 度 C# 力 度 C# Web SQL 料 DataGrid DataList 參 ASP.NET 1.0 C# 例 ASP.NET 立

More information

TopTest_Adminstrator.doc

TopTest_Adminstrator.doc 壹 前 言... 3 貳 系 統 簡 介... 4 一 TKB multimedia Top-Test 系 統 架 構...4 1. 使 用 者 介 面 層 (Presentation tier)...5 2. 商 業 邏 輯 層 (business logic tier)...5 3. 資 料 服 務 層 (data services tier)...5 二 TKB Multimedia Top-Test

More information

Microsoft Word - Hibernate与Struts2和Spring组合指导.doc

Microsoft Word - Hibernate与Struts2和Spring组合指导.doc 1.1 组合 Hibernate 与 Spring 1. 在 Eclipse 中, 新建一个 Web project 2. 给该项目增加 Hibernate 开发能力, 增加 Hibernate 相关类库到当前项目的 Build Path, 同时也提供了 hibernate.cfg.xml 这个配置文件 3. 给该项目增加 Spring 开发能力, 增加 spring 相关类库到当前项目的 Build

More information

Android Android Android SDK iv

Android Android Android SDK iv Android Market Google Android SDK Apple Google Microsoft b2c b 2010 Internet Android how why iii Android 240... Android Android SDK iv Android Market Google Android SDK Visual C++ Java N-tier J2EE Unix/Linux

More information

untitled

untitled 1 .NET sln csproj dll cs aspx 說 料 料 利 來 料 ( 來 ) 利 [] [] 來 說 切 切 理 [] [ ] 來 說 拉 類 類 [] [ ] 列 連 Web 行流 來 了 不 不 不 流 立 行 Page 類 Load 理 Click 滑 料 Response 列 料 Response HttpResponse 類 Write 料 Redirect URL Response.Write("!!

More information

概述

概述 OPC Version 1.6 build 0910 KOSRDK Knight OPC Server Rapid Development Toolkits Knight Workgroup, eehoo Technology 2002-9 OPC 1...4 2 API...5 2.1...5 2.2...5 2.2.1 KOS_Init...5 2.2.2 KOS_InitB...5 2.2.3

More information

Lecture01_Android介绍

Lecture01_Android介绍 移动平台应用软件开发 Android 介绍 主讲 : 张齐勋 zhangqx@ss.pku.edu.cn 移动平台应用软件开发 课程建设小组 北京大学 二零一七年秋北京 Android是什么 Android不仅仅是一个操作系统 它更是一个完整的软件框 架 Android基于Linux内核 2005年Google公司收购了Android公司 Google公司选择使用Apache许可证开放Android源码

More information

建模与图形思考

建模与图形思考 C03_c 基 於 軟 硬 整 合 觀 點 JNI: 从 C 调 用 Java 函 数 ( c) By 高 煥 堂 3 How-to: 基 於 軟 硬 整 合 觀 點 从 C 调 用 Java 函 数 如 果 控 制 点 摆 在 本 地 C 层, 就 会 常 常 1. 从 本 地 C 函 数 去 调 用 Java 函 数 ; 2. 从 本 地 C 函 数 去 存 取 Java 层 对 象 的 属 性

More information

目 录 / CATALOG 一 桌 面 网 站 接 入 1. JAVASCRIPT 网 页 插 件 接 入 2. JS 代 码 操 作 指 引 3. 网 页 链 接 独 立 页 面 接 入 4. 网 页 链 接 接 入 操 作 指 引 5. 自 定 义 桌 面 网 站 接 入 图 标 颜 色 等 0

目 录 / CATALOG 一 桌 面 网 站 接 入 1. JAVASCRIPT 网 页 插 件 接 入 2. JS 代 码 操 作 指 引 3. 网 页 链 接 独 立 页 面 接 入 4. 网 页 链 接 接 入 操 作 指 引 5. 自 定 义 桌 面 网 站 接 入 图 标 颜 色 等 0 爱 客 服 快 速 接 入 指 南 400 005 0025 / aikf@huilan.com 目 录 / CATALOG 一 桌 面 网 站 接 入 1. JAVASCRIPT 网 页 插 件 接 入 2. JS 代 码 操 作 指 引 3. 网 页 链 接 独 立 页 面 接 入 4. 网 页 链 接 接 入 操 作 指 引 5. 自 定 义 桌 面 网 站 接 入 图 标 颜 色 等 01

More information

Android + NFC

Android + NFC Android + NFC 建國科技大學資管系饒瑞佶 2017/3 v1 讀取 Tag UUID Android 2.3.3 (API Level 10) 才有支援完整的 NFC 功能 只要 NFC 相容都讀的到 (NFC 或 Mifare) 建立新專案修改 AndroidManifest.xml 加入 , 如果有 NFC Tag 進入感測範圍, 本 App 也會變成可處理的

More information

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

KillTest 质量更高 服务更好 学习资料   半年免费更新服务 KillTest 质量更高 服务更好 学习资料 http://www.killtest.cn 半年免费更新服务 Exam : 310-055Big5 Title : Sun Certified Programmer for the Java 2 Platform.SE 5.0 Version : Demo 1 / 22 1. 11. public static void parse(string str)

More information

图 6-1 主界面 MainActivity 界面对应的布局文件 (activity_main.xml) 如下所示 : <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="

图 6-1 主界面 MainActivity 界面对应的布局文件 (activity_main.xml) 如下所示 : <?xml version=1.0 encoding=utf-8?> <RelativeLayout xmlns:android= 第 6 章广播接收者 应用案例 案例 6-1 CallRecord( 通话记录 ) 一 案例描述 1 考核知识点 030006001: 广播接收者简介 030006002: 广播接收者的创建 2 练习目标 广播的静态注册和使用 使用广播处理处理事件 3 需求分析手机最重要的功能就是通话功能, 同样储存通话记录也是必不可少的 该案例使用广 播接收者自己实现通话记录的功能 包括呼出电话 已接来电 未接来电以及通话产生的

More information

Microsoft Word - Learn Objective-C.doc

Microsoft Word - Learn Objective-C.doc Learn Objective C http://cocoadevcentral.com/d/learn_objectivec/ Objective C Objective C Mac C Objective CC C Scott Stevenson [object method]; [object methodwithinput:input]; output = [object methodwithoutput];

More information

chp6.ppt

chp6.ppt Java 软 件 设 计 基 础 6. 异 常 处 理 编 程 时 会 遇 到 如 下 三 种 错 误 : 语 法 错 误 (syntax error) 没 有 遵 循 语 言 的 规 则, 出 现 语 法 格 式 上 的 错 误, 可 被 编 译 器 发 现 并 易 于 纠 正 ; 逻 辑 错 误 (logic error) 即 我 们 常 说 的 bug, 意 指 编 写 的 代 码 在 执 行

More information

untitled

untitled 1 LinkButton LinkButton 連 Button Text Visible Click HyperLink HyperLink 來 立 連 Text ImageUrl ( ) NavigateUrl 連 Target 連 _blank _parent frameset _search _self 連 _top 例 sample2-a1 易 連 private void Page_Load(object

More information

通过Hive将数据写入到ElasticSearch

通过Hive将数据写入到ElasticSearch 我在 使用 Hive 读取 ElasticSearch 中的数据 文章中介绍了如何使用 Hive 读取 ElasticSearch 中的数据, 本文将接着上文继续介绍如何使用 Hive 将数据写入到 ElasticSearch 中 在使用前同样需要加入 elasticsearch-hadoop-2.3.4.jar 依赖, 具体请参见前文介绍 我们先在 Hive 里面建个名为 iteblog 的表,

More information

在所有的项目开发中, 一定是多人协作的团队开发, 但是使用框架就会出现一个问题, 我们所 有的 Action 以及相关的路径都要求在我们的 struts.xml 文件中配置, 如果所有的人去修改一个 文件, 那么就会变得混乱, 而且有可能出现冲突, 那么在 struts.xml 文件中为了解决这个问

在所有的项目开发中, 一定是多人协作的团队开发, 但是使用框架就会出现一个问题, 我们所 有的 Action 以及相关的路径都要求在我们的 struts.xml 文件中配置, 如果所有的人去修改一个 文件, 那么就会变得混乱, 而且有可能出现冲突, 那么在 struts.xml 文件中为了解决这个问 内置对象的取得和多人开发 一 内置对象的取得 在使用的 servlet 的时候可以通过 HttpServletResquest 获取到一些内置对象, 但是在 struts2 中为了方便取得内置对象, 专门提供了一个 ServletActionContext 这个类取得取得内置对象, 观察如下方法 public static javax.servlet.jsp.pagecontext() 取得 pagecontext

More information

untitled

untitled 1 Access 料 (1) 立 料 [] [] [ 料 ] 立 料 Access 料 (2) 料 [ 立 料 ] Access 料 (3) 料 料 料 料 料 料 欄 ADO.NET ADO.NET.NET Framework 類 來 料 料 料 料 料 Ex MSSQL Access Excel XML ADO.NET 連 .NET 料.NET 料 料來 類.NET Data Provider

More information

java2d-4.PDF

java2d-4.PDF 75 7 6 G r a d i e n t P a i n t B a s i c S t r o k e s e t P a i n t ( ) s e t S t o r k e ( ) import java.awt.*; import java.awt.geom.*; public class PaintingAndStroking extends ApplicationFrame { public

More information

Servlet

Servlet Servlet Allen Long Email: allen@huihoo.com http://www.huihoo.com 2004-04 Huihoo - Enterprise Open Source http://www.huihoo.com 1 Huihoo - Enterprise Open Source http://www.huihoo.com 2 GET POST Huihoo

More information