当前位置:  编程技术>移动开发
本页文章导读:
    ▪Bada学习-简况        Bada学习-概况 BADA概况                            三星BADA是一款具有良好用户交互性和服务导向的智能手机平台,它允许你使用C++,flash,web 编程技术为BADA设备创建具有丰富体验特性.........
    ▪ zxing条码扫描        zxing条形码扫描 参考http://blog.csdn.net/hellogv/article/details/6101663使用zxing的第三方包. http://code.google.com/p/zxing请引入一个core.jar和PlanarYUVLuminanceSource.java文件. 下载附件并打开代码如下:AndroidManifest.x.........
    ▪ Portlet学习分析札记       Portlet学习分析笔记 关于Portlet的一些概念性的文字网络上很多,谷歌或是百度一下可以很容易搜索到,下面我把自己觉得容易混淆和模糊的几个知识点做下简单介绍:1、Portlet Request & URL .........

[1]Bada学习-简况
    来源: 互联网  发布时间: 2014-02-18
Bada学习-概况

BADA概况                         

 

三星BADA是一款具有良好用户交互性和服务导向的智能手机平台,它允许你使用C++,flash,web 编程技术为BADA设备创建具有丰富体验特性的应用。BADA平台允许你为BADA设备创建各种各样的应用程序:

 

1.BADA的架构

主要介绍BADA不同部分的架构

 

2.应用开发模式

阐述应用的生命周期并描绘了BADA的多任务并发处理能力

 

3.BADA文件系统

阐述了BADA应用用于存储,共享,传输数据所使用的文件系统

 

4.API优先级

主要介绍了BADA不同的API优先级

 

5.不同BADA设备特性相关信息

描述了你在为不同BADA设备开发时需要考虑的一些问题

 

三星BADA可以提供网站服务,上面有一些有用的工具用于高效的创建,分发,维护/操作手机服务以及应用,通过以下网址可以访问本服务网站:Samsung account:

 

     bada Developers栏让你可以管理你的应用列表,包括关于你的应用的的一些必要信息,在此之后文中提到"bada Developers"时,所指的即是bada Developers网站

 

     Samsung Apps Seller Office栏则提供一个你可以销售你的应用以及应用服务的渠道

 

bada终端用户可以通过Samsung Apps购买应用

 

三星bada平台对于应用开发提供两种不同类型的框架:一种是C++框架,它可以用于开发C++或者flash应用;另外一种是web应用框架,可以用于开发web应用.无论你使用C++框架还是WEB框架

来创建应用,bada平台都将确保所有的bada应用拥有连贯一致的外观和体验

 

C++编程

 

你可以使用C++ APIS 来开发C++应用. 使用它提供的类跟方法,你可以创建拥有丰富特性的各种应用.你也可以利用不同的终端特性(如触屏,拨打电话操作等),来使用文本,图片等设计出各种有趣的应用以及丰富的用户交互界面.而且, 你还可以做很多别的事情,例如管理你的文档内容,多媒体资料,使用网络,社区,定位服务,提供消息/报文以及网页浏览功能等.

 

需要更多关于开发C++应用的信息的话,可以参考 bada c++应用开发一节

 

Flash编程

 

你可以开发flash应用,并通过使用Osp::Ui::Controls::Flash来管理你的应用,它可以让你播放flash文件.除此之外,Osp::Ui命名空间提供许多特性,让你可以与flash文件以及集成在其中的ActionScript经行交互.

 

需要更多关于开发FLASH应用的信息,可以参考 bada Flash应用开发一节

 

 

Web开发

 

你可以web API来开发web应用. HTML,CSS,Javascript,以及其他web标砖都可以用于开发你的web应用. 一个典型的web应用是使用XMLHttpRequest跟网络经行交互的一个客户端应用

 

需要更多关于开发web应用的信息,可以参考 bada web应用开发一节

 

英文原文地址:

http://developer.bada.com/library/help

 

上一篇:bada起航                    下一篇:bada架构

 

 


    
[2] zxing条码扫描
    来源: 互联网  发布时间: 2014-02-18
zxing条形码扫描
参考http://blog.csdn.net/hellogv/article/details/6101663
使用zxing的第三方包. http://code.google.com/p/zxing
请引入一个core.jar和PlanarYUVLuminanceSource.java文件. 下载附件并打开
代码如下:

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.camera"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="8" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".CameraActivity" android:screenOrientation="landscape"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
    <uses-permission android:name="android.permission.CAMERA"></uses-permission>    
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>    
    <uses-feature android:name="android.hardware.camera" />    
    <uses-feature android:name="android.hardware.camera.autofocus" />
</manifest>


/res/anim/alhp.xml
<?xml version="1.0" encoding="utf-8"?>  
<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator">  
    <alpha android:fromAlpha="1" android:toAlpha="0" android:duration="2000" android:repeatCount="-1"/>  
</set>


main.xml
<?xml version="1.0" encoding="utf-8"?>    
<FrameLayout android:id="@+id/FrameLayout01"    
    android:layout_width="fill_parent" android:layout_height="fill_parent"    
    xmlns:android="http://schemas.android.com/apk/res/android">    
    <SurfaceView android:layout_height="fill_parent"    
        android:id="@+id/sfvCamera" android:layout_width="fill_parent"></SurfaceView>    
    <RelativeLayout android:id="@+id/RelativeLayout01"    
        android:layout_height="fill_parent" android:layout_width="fill_parent">    
        <ImageView android:id="@+id/ImageView01"    
            android:layout_height="100dip" android:layout_width="160dip"></ImageView>    
        <View android:layout_centerVertical="true"    
            android:layout_centerHorizontal="true" android:layout_width="300dip"    
            android:background="#55FF6666" android:id="@+id/centerView"    
            android:layout_height="180dip"></View>    
        <TextView android:layout_centerHorizontal="true"    
            android:layout_width="wrap_content" android:layout_below="@+id/centerView"    
            android:layout_height="wrap_content" android:text="Scanning..."    
            android:id="@+id/txtScanResult" android:textColor="#FF000000"></TextView>    
    </RelativeLayout>   
    <View android:id="@+id/animationLine" android:layout_width="fill_parent" android:layout_height="2px" android:background="#FF9790" android:layout_gravity="center_vertical"></View>  
</FrameLayout> 


主Activity文件:
package com.camera;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Hashtable;
import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.graphics.Bitmap;
import android.hardware.Camera;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.TextView;

import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.Result;
import com.google.zxing.common.HybridBinarizer;
import com.util.PlanarYUVLuminanceSource;
import com.util.SFHCamera;
public class CameraActivity extends Activity {    
    /** Called when the activity is first created. */    
    private SurfaceView sfvCamera;    
    private SFHCamera sfhCamera;    
    private ImageView imgView;    
    private View centerView;    
    private TextView txtScanResult;    
    private Timer mTimer;    
    private MyTimerTask mTimerTask;    
    // 按照标准HVGA    
    final static int width = 480;    
    final static int height = 320;    
    int dstLeft, dstTop, dstWidth, dstHeight;    
    @Override    
    public void onCreate(Bundle savedInstanceState) {    
        super.onCreate(savedInstanceState);    
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        setContentView(R.layout.main);    
        this.setTitle("Android条码/二维码识别Demo-----hellogv");    
        imgView = (ImageView) this.findViewById(R.id.ImageView01);    
        centerView = (View) this.findViewById(R.id.centerView);    
        sfvCamera = (SurfaceView) this.findViewById(R.id.sfvCamera);    
        sfhCamera = new SFHCamera(sfvCamera.getHolder(), width, height,    
                previewCallback);    
        txtScanResult=(TextView)this.findViewById(R.id.txtScanResult);    
        // 初始化定时器    
        mTimer = new Timer();    
        mTimerTask = new MyTimerTask();    
        mTimer.schedule(mTimerTask, 0, 2000);    
        Animation animation = AnimationUtils.loadAnimation(this, R.anim.alph);  
        ((View)findViewById(R.id.animationLine)).startAnimation(animation);
    }    
        
    class MyTimerTask extends TimerTask {    
        @Override    
        public void run() {    
            if (dstLeft == 0) {//只赋值一次    
                dstLeft = centerView.getLeft() * width    
                        / getWindowManager().getDefaultDisplay().getWidth();    
                dstTop = centerView.getTop() * height    
                        / getWindowManager().getDefaultDisplay().getHeight();    
                dstWidth = ((centerView.getRight() - centerView.getLeft())* width    
                        / getWindowManager().getDefaultDisplay().getWidth());    
                dstHeight = (centerView.getBottom() - centerView.getTop())* height    
                        / getWindowManager().getDefaultDisplay().getHeight();    
                System.out.println("dstLeft:"+dstLeft+"   dstTop:"+dstTop+"   dstWidth:"+dstWidth+"   dstHeight:"+dstHeight);
                sfhCamera.AutoFocusAndPreviewCallback();
            }    
            
        }    
    }    
    /**  
     *  自动对焦后输出图片  
     */    
    private Camera.PreviewCallback previewCallback = new Camera.PreviewCallback() {    
        @Override    
        public void onPreviewFrame(byte[] data, Camera camera) {   
            //取得指定范围的帧的数据    
            PlanarYUVLuminanceSource source = new PlanarYUVLuminanceSource(data, width, height, dstLeft, dstTop, dstWidth, dstHeight,false);    
            //取得灰度图    
            Bitmap mBitmap = source.renderCroppedGreyscaleBitmap();    
            //显示灰度图    
            imgView.setImageBitmap(mBitmap);    
            BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));    
            MultiFormatReader reader = new MultiFormatReader();    
            try {    
            	saveImage(mBitmap);
            	Hashtable hints = new Hashtable();  
                hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");  
                Result result = reader.decode(bitmap,hints);    
                String strResult = "BarcodeFormat:"    
                        + result.getBarcodeFormat().toString() + "  text:"    
                        + result.getText();    
                txtScanResult.setText(strResult);    
            } catch (Exception e) {    
                txtScanResult.setText("Scanning");   
                sfhCamera.AutoFocusAndPreviewCallback();
            }    
        }    
    };   
    @Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
    	if(keyCode==KeyEvent.KEYCODE_BACK&&event.getRepeatCount()==0){  
    		sfhCamera.closeCamera();
    	}
		return super.onKeyDown(keyCode, event);
	}
	@Override
	protected void onResume() {
		if (getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
			setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
		}
		super.onResume();
	}
	
	private void saveImage(Bitmap mBitmap){
		File file=new File("/sdcard/feng.png"); 
        try { 
            FileOutputStream out=new FileOutputStream(file); 
            if(mBitmap.compress(Bitmap.CompressFormat.PNG, 50, out)){ 
                out.flush(); 
                out.close(); 
            } 
        } catch (FileNotFoundException e) { 
            e.printStackTrace(); 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
	}
}  


SFHCamera.java
package com.util;
import java.io.IOException;    
import android.graphics.PixelFormat;    
import android.hardware.Camera;    
import android.util.Log;    
import android.view.SurfaceHolder;    
public class SFHCamera implements SurfaceHolder.Callback{    
    private SurfaceHolder holder = null;    
    private Camera mCamera;    
    private int width,height;    
    private Camera.PreviewCallback previewCallback;    
        
    public SFHCamera(SurfaceHolder holder,int w,int h,Camera.PreviewCallback previewCallback) {    
        this.holder = holder;      
        this.holder.addCallback(this);      
        this.holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);    
        width=w;    
        height=h;    
        this.previewCallback=previewCallback;    
    }    
        
    @Override    
    public void surfaceChanged(SurfaceHolder arg0, int format, int w, int h) {    
        Camera.Parameters parameters = mCamera.getParameters();    
        parameters.setPreviewSize(width, height);//设置尺寸      
        parameters.setPictureFormat(PixelFormat.JPEG);    
//        parameters.set("orientation", "portrait");
        mCamera.setParameters(parameters);    
        
        mCamera.startPreview();//开始预览    
        Log.e("Camera","surfaceChanged");    
    }    
    @Override    
    public void surfaceCreated(SurfaceHolder arg0) {    
        mCamera = Camera.open();//启动服务      
//        mCamera.setDisplayOrientation(90);
        try {      
            mCamera.setPreviewDisplay(holder);//设置预览     
            Log.e("Camera","surfaceCreated");    
        } catch (IOException e) {      
            mCamera.release();//释放      
            mCamera = null;      
        }    
            
    }    
    @Override    
    public void surfaceDestroyed(SurfaceHolder arg0) {    
/*        mCamera.setPreviewCallback(null);    
        mCamera.stopPreview();//停止预览      
        mCamera = null;    */
        Log.e("Camera","surfaceDestroyed");    
    }    
    /**  
     * 自动对焦并回调Camera.PreviewCallback  
     */    
    public void AutoFocusAndPreviewCallback()    
    {    
        if(mCamera!=null)    
            mCamera.autoFocus(mAutoFocusCallBack);    
    }    
        
    /**  
     * 自动对焦  
     */    
    private Camera.AutoFocusCallback mAutoFocusCallBack = new Camera.AutoFocusCallback() {      
              
        @Override      
        public void onAutoFocus(boolean success, Camera camera) {   
        	mCamera.setOneShotPreviewCallback(previewCallback);       
        }      
    };    
     public void closeCamera(){
    	 mCamera.stopPreview();
    	 mCamera.release();
    	 mCamera = null;
     }
    
}
1 楼 web8610 2011-11-15  
兄弟 这个代码缺文件 R.anim.alph R.id.animationLine 能不能发给我啊 77892906@qq.com 万分感谢
2 楼 rayln 2011-11-15  
web8610 写道
兄弟 这个代码缺文件 R.anim.alph R.id.animationLine 能不能发给我啊 77892906@qq.com 万分感谢


兄弟, 不好意思哈, 更新了部分,没更新全. 横线动画部分没更新. 你看看代码我更新了, 加了alph.xml动画效果, 还有就是main.xml中加入了一个View显示一条横线!

    
[3] Portlet学习分析札记
    来源: 互联网  发布时间: 2014-02-18
Portlet学习分析笔记
关于Portlet的一些概念性的文字网络上很多,谷歌或是百度一下可以很容易搜索到,下面我把自己觉得容易混淆和模糊的几个知识点做下简单介绍:
1、Portlet Request & URL

      在一个 Portal 页面中,通常都包含了多个 Portlet ,在一个时刻用户只能与一个 Portlet 交互,当用户向一个 Portlet 发出请求(例如点击了“ submit ”按钮),整个 Portlet 页面将会重新构成。在这个过程中,是否有与用户交互的 Portlet 处理方式显然是不同的,而且用户没有与之交互的 Portlet 显然不应该接收到用户的请求参数。
   因此 JSR168 规范中将对 Portlet 的请求分为 Action 和 Render 两种。 Portlet 在收到 Action 请求,获取用户所提交的信息,进行相应的处理;受到 Render 请求后,则生成页面代码。当用户向一个 Portlet 发出请求,该请求被 Portlet 容器接受, Portlet 容器再调用相应 Portlet 的 processAction() 方法;等到 processAction() 方法执行完毕后, Portlet 容器再调用所有 Portlet 的 render() 方法,并将这些方法所返回的内容组合形成一个页面返回给客户端。在上述过程中,所有 Portlet 的 render() 方法的调用次序在规范中没有规定,既可能是有顺序的串行调用,也可能是多线程的同步调用,依赖于厂商的具体实现。

       为了接受用户请求,一个 Portlet 需要有一个指向其自身的 URL ,例如用在 HTTP FORM 的 ACTION 字段。但是与 Servlet 不同的是, Portlet 不是一个完整的页面而只是页面的一部分,一个 Portlet 可以出现在多个页面中,所以 Portlet 无法绑定具体的 URL 。在 JSR168 规范中定义了 PortletURL 接口,通过该接口可以得到指向 Portlet 自身的 URL ,对应两种用户请求有两种产生 URL 的方法: q?4k2@*v_rk*l
一、for render():
PortletURL url = response.createRenderURL(); www.portalfan.com&S        A(`L v(s
url.setParameter(“customer”,”foo.com”);
url.setParameter(“show”,”summary”); !g{f#vk^
writer.print(“<A href=/”” url.toString()+”\”>Summary</A>”);

4x_kUS/^![
二、for processAction():
`kTi3O
PortletURL url = response.createActionURL();
url.setParameter(“paymentMethod”,”creditCardInProfile”);
url.setWindowState(WindowState.MAXIMIZED); www.portalfan.com1x"p VfH
writer.print(“<FORM METHOD=\”POST\” ACTION=\””+ url.toString()+”\”>”);
(r/aI iI(v/i
  上面的代码我们可以看到,除了得到 URL 外,还可以在其中加入参数。另外由于 Portal 服务器厂商通常都会利用 URL 增加一些产品相关的参数,因此强烈建议在 Portlet 中提交用户请求采用 POST 方式。

2、 Portlet Modes & Window States
在 Portal 应用中,用户通常需要设置、调整 Portlet 的显示方式,对此 JSR168 同样做出了规定。分别有 Portlet Modes 和 Window States 。
Portlet Modes 说明 Portlet 目前所执行的功能模式,规范要求 Portal 服务器必须支持以下三种模式: www.portalfan.com\        k6k7cWk
)e-[_lj rq&sI
q
VIEW ——内容显示,通常为缺省模式 
EDIT ——编辑相关的设置
HELP ——显示帮助信息
除此之外可以Portal服务器可以实现自定义的模式。portal爱好者0XLqXP5iv J

每个 Portlet 在 Portal 页面中就是一个“窗口”,类似于 MS Windows 、 XWindo 等窗口系统 Portlet 也有自己的窗口状态( Window States ),规范要求 Portal 服务器必须支持以下三种窗口状态 :
NORMAL ——普通 portlet 窗口,在这个状态下通常是与其它 Portlet 共享 Portal 页面; portal爱好者t8u/O/F;F
MAXIMIZED ——最大化 portlet 窗口,独占 Portal 页面;
J&?'X$az9u_eJ
MINMIZED ——最小化 portlet 窗口 #la|M@!YP?2N g
除此之外可以Portal服务器可以实现自定义的窗口状态         
在规范中对这些特性进行定义,使得 Portlet 开发者无需关心这方面实现细节,另外在 processAction() 和 render() 方法中开发者都可以通过 getPortletMode() 和 getWindowState() 等方法获得当前 Portlet 的情况从而决定相关操作。

3、Preferences & User Information say?d
  Portal 应用一个重要功能就是“个性化”,一方面 Portal 服务器需要根据用户的不同显示不同的 Portlet ,另一方面同一个 Portlet 也会根据用户的偏好显示不同的内容。这就要求 Portlet 需要保存一些用户的相关信息,例如一个股票实时信息的 Portlet 会根据用户所关注的股票显示相应的信息。
  每个 Portlet 都可能有自己相应的个性化信息, JSR168 规范提供了 PortletPreferences 接口来操纵这些信息。   
PortletPreferences 接口提供读取、设置属性的方法,如下:
PortletPreferences prefs = req.getPreferences();
String[] symbols = prefs.getValues(”preferredStockSymbols”, l&Fnew String[]{”ACME”,”FOO”}); www.portalfan.com*J4WF2WI qg
#f_,[$j({6M

d,NG1r(`*NUp
  在 JSR168 规范中 PortletPreferences 是用户相关的,也就是通过 getPreferences() 获得的对象是与当前登录用户绑定的, PortletPreferences 不会在用户之间共享属性。 lg4a {^a2zb q        ]
        PortletPreferences 提供了一个基本的读取、设置个性化属性的途径,使得 Portlet 无需依赖具体的数据储存环境(例如数据库联接、表结构等等)就可以实现个性化并能够在不同的 Portal 服务器之间移植。但是不应该使用 PortletPreferences 来替代一般的数据库功能。
       在实现个性化功能中经常需要获取各种用户信息,例如用户姓名、地址等等。因此 JSR168 也提供了一个获取用户信息的途径,如下:SK2B7KK
~}
n%R3I
Map userInfo = (Map) request.getAttribute(PortletRequest.USER_INFO);
String givenName = (userInfo!=null) ? (String) userInfo.get(“user.name.given”) : “”;
String lastName = (userInfo!=null) ? (String) userInfo.get(“user.name.family”) : “”; 
  所获得的 Map 对象是一个只读对象,不能更改。但是用户信息应该包含什么内容不在 JSR168 规范的范围,事实上目前还没有关于访问用户信息的 Java 标准, JSR168 提到在以后形成访问用户信息的 Java 标准时,当前的机制就会被取代。

4、Sessions K5u{g|)Q
w
portal爱好者SS"uu+~`
  作为一个 Web 应用组件, Portlet 同样有 Session 这个机制用于跟踪用户操作,而与一般的 Web 应用所不同的是 Portlet 的 Session 属性有两种作用域:fi
PORTLET_SCOPE:属性只能被设置它的Portlet访问
APPLICATION_SCOPE:属性可以被同一个Portal应用中的所有Portlet访问 4VgU\;F

PortletSession session = request.getSession(true);
URL url = new URL(/blog_article/“http_/www.foo.com”);
session.setAttribute(“home.url”,url,PortletSession.APPLICATION_SCOPE);
session.setAttribute(“bkg.color”,”RED”,PortletSession.PORTLET_SCOPE);  

5、Request Dispatch & Portlet Tag
  在实现 Portlet 应用时,开发者往往会利用 Servlet 、 JSP 等资源,起码会有两个目的会这样做: 为了利用现有的资源,简单地将已经写好的 Servlet 、 JSP 应用转换成 Portlet ;  方便 Portlet 的表现层开发。 Portlet 规范类似于 Servlet 规范,在表现层开发上远远不如 JSP ,因此需要利用 JSP 来开发界面。JSR168 提供了类似 Servlet RequestDispatcher 的接口来实现利用 Servlet 、 JSP 等资源的功能。
例子如下: portal爱好者.c
oJ#m|7SJ,M2vh
String path = "/raisons.jsp?orderno=5"; portal爱好者'J0q|lh:Vu&[']
PortletRequestDispatcher rd = context.getRequestDispatcher(path); rd.include(renderRequest, renderResponse);  
当一个 JSP 页面需要作为 Portlet 应用的一部分, JSP 开发者需要获得相关的 Portlet 信息,为此 JSR168 提供了相应的 JSP Tag 来实现相关的功能。通过相应的 Portlet Tag , JSP 开发者可以获得相应的 Portlet Request/Response 对象,产生 ActionURL 或者 RenderURL 等等。

5、缓存qB&gWN(N_
www.portalfan.com/yza"x1g-PB1C
  在前面中我们知道,用户每次向Portal 应用发送一个请求,该页面中所有的 Portlet 都会被 Portlet 容器调用 render() 方法来产生相应内容。但是只有一个 Portlet 才会处理用户请求,其它不处理用户请求的 Portlet 可能每次的显示内容都是不变的。
因此 JSR168 定义了缓存机制来提供 Portal 应用的效率。在 portlet.xml 中可以定义缓存的失效时间,如下:
portal爱好者)y2C$\7m.E
<portlet> R`Xh M5co i
...
<expiration-cache>300</expiration-cache>
...
</portlet> 
这样 Portlet 容器在调用 Portlet 的 render() 方法之前就会检查有缓存是否已经有效,如果有效的话就直接使用缓存内容。 Portlet 缓存是跟客户端相关的,不同的客户端访问同一个 Portlet 分别有自己的缓存而不会混淆。JSR168 对缓存机制的实现不是强制性的, Portal 服务器厂商可以自行决定是否实现这个特性。

6、CSS Style Definition
  在一个 Portlet 应用中,所有 Portlet 应该具有显示上的一致性,例如使用相同的字体等等。为了到达这一点, JSR168 定义了一套 CSS 元素名称, Portlet 开发者都应该采用这套 CSS 来产生显示内容。这套 CSS 定义主要包含了 Fonts 、 Message (例如告警、通知等等)、 Sections 、 Forms 。

7、Portlet VS Servlet
  Portlet 和 Servlet 是十分类似的,只是由于 Servlet 无法达到 Portal 应用的要求 JCP 才定义了新的 Portlet 规范,为了尽可能与现有的 Servlet 结合达到重复使用的目的, portlet 的规范利用了 Servlet 的规范,许多观念都很相似的。在讲述了 Portlet 的特性后,我们再来看看他们直接的异同。相似之处:]3b        AC|Z2g
Portlet 也是 Java 技术的 web 组件 z&MBh[]        T6sEy
Portlet 也是有特定的 container 在管理
Portlet 可以动态产生各种内容 &X3Z$r0]W9J)_
Portlet 的生命周期由 container 所管理 bf;YKx
Portlet 和客户端的互动是通过 request/response 的机制wZ

不同之处: portal爱好者 D(e9g$MA2W{L
Portlet 只产生 markup 信息片段,不是完整的网页文件
Portlet 不会和 URL 有直接的关系
客户端必须通过 Portal 系统才能和 Portlet 互动
Portlet 有一些定义好的 request 处理, action request 以及 render request
Portlet 默认定义 portlet modes 及窗口状态
Portlet 可以在同一个 portal 网页之中存在多个

Portlet有的功能而Servlet没有:
Portlet 能够存取及储存永久配置文件及定制资料
Portlet 可以存取使用者数据
Portlet 具有 URL 的重写功能够在它的内容中动态建立连结
Portlet Session 的属性拥有两个不同的范围: application-scope 及 portlet-scope

Portlet不具备而Servlet提供的功能
Servlet 具有设置输出的文字编码 ( character set encoding) 方式
Servlet 可以设置 HTTP 输出的 header
Servlet 才能够接收客户对 portal 发出的 URL 请求

<!-- 日志内容 结束 --><!-- 日志来源 开始 --><!-- 日志来源 结束 --><!-- 日志信息 开始 -->

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android中通过view方式获取当前Activity的屏幕截... iis7站长之家
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3