2010年3月11日 星期四

Direct Web Remoting(DWR)简介

DWR可以在Web Application上直接处理XMLHttpRequest,因此你可以在 有的架构下利用DWR来产生Ajax的
效果。而且DWR非常简单,只要再web.xml加入DRW的Servlet并新增一个dwr.xml的设定档。就可以直接在Client端
利用Javascript直接唿叫Server端的Java方法。
以下建构一个简单的例子,在Client端输入一串字串,Servler端在收到这一个字串后,回传Client端输入的字串并回传
Server端目前系统时间。


1. 下载dwr.jar档。


2. 在web.xml加入DRW的Servlet。
<servlet>
    <servlet-name>dwr-invoker</servlet-name>
    <servlet-class>
            org.directwebremoting.servlet.DwrServlet
    </servlet-class>
    <init-param>
        <param-name>debug</param-name>
        <param-value>true</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>dwr-invoker</servlet-name>
    <url-pattern>/dwr/*</url-pattern>
</servlet-mapping>


3. 在WEB-INF下新增一个dwr.xml的设定档。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
"http://www.getahead.ltd.uk/dwr/dwr20.dtd">
<dwr>
    <allow>
        <create creator="new" javascript="AjFuns">
            <param name="class" value="tw.nicky.dwr.AjaxFunctions"/>
       </create>
    </allow>
</dwr>



4. 建立AjaxFunctions.class(此类别就是用户端要唿叫的类别)
package tw.nicky.dwr;
import java.util.Date;
public class AjaxFunctions {
    public String getEchoTime(String msg) {
        String result = "";
        result = result + "your input: "+msg+" ";
        result = result + "server time: "+new Date();
        return result;
    }
}




5.最后建立呈现在用户端的网页()
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>dwr_example</title>
        <script type='text/javascript' src='dwr/interface/AjFuns.js'></script>
        <script type='text/javascript' src='dwr/engine.js'></script>
        <script type='text/javascript'>
            function getEchoTime(){
                var msg = document.getElementById("msg").value;
                AjFuns.getEchoTime(msg,function(ret){
                    document.getElementById("results").innerHTML = ret;
                });

            }
        </script>
    </head>
    <body>
        <input type="text" id="msg">
        <input type="button" value="确定" onClick="getEchoTime()">
        <div id="results">
        </div>
    </body>
</html>


Java keytool 基本指令介绍

1. 匯入凭证到keystore
      keytool –import –alias xxx –file xxx.cer –keystore .keystore

2. 查询keystore的内容
      keytool –list –v –keystore .keystore

3. 删除keystore内的其中一个凭证
      keytool –delete –alias xxx –keystore .keystore

4. 产生金錀对(RSA为非对称加密的演算法)
      keytool -genkey -alias xxx -keyalg RSA -keystore .keystore

5. 产生凭证申请档
      keytool -certreq -alias xxx -file certreq.txt -keystore .keystore

6. 查询PKCS12类型keystore的内容
      keytool –list –v –keystore .keystore -storetype pkcs12

7. 建立一个含有私钥的keystore
      keytool -genkey -alias keyAlias -keyalg RSA -keystore keystore.jks

8. 修改keystore的密码
      keytool -storepasswd -new newPassword -keystore keystore.jks


Direct Web Remoting(DWR) - Reverse Ajax

1. 要使用DWR Reverse Ajax需先指定参数activeReverseAjaxEnabled为true。

<servlet>
   <servlet-name>dwr-invoker</servlet-name>
   <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
   <init-param>
     <param-name>debug</param-name>
     <param-value>true</param-value>
   </init-param>
   <init-param>
     <param-name>activeReverseAjaxEnabled</param-name>
     <param-value>true</param-value>
   </init-param>
   <load-on-startup>1</load-on-startup>
 </servlet>

2. 在要使用DWR Reverse Ajax的页面(reverseAjax.jsp)加入以下设定。

<!-- DWR相关的Javascript -->
<script type='text/javascript' src='dwr/engine.js'></script>
<script type='text/javascript' src='dwr/util.js'></script>
<!-- 页面载入时,即建立ReverseAjax连线 -->
<body onload="dwr.engine.setActiveReverseAjax(true);">
<!-- 从Server push回来的内容 -->
<span id="show"></span>


3. 触发要回传资料给Client端的Servlet。

ServerContext wctx = ServerContextFactory.get(this.getServletContext());
//取得要触发的页面
Collection sessions = wctx.getScriptSessionsByPage("/reverseAjax.jsp");
Util utilAll = new Util(sessions);
//设定回传的内容,并指定放到DOM的哪个id内
utilAll.setValue("show", "这是Server回传的资料");


Java Base64 Encode & Decode(编码和解码)

1. 下载所需的Jar档。(这里我们是使用Apache的commons-codec套件)

2. import org.apache.commons.codec.binary.Base64;

3. 使用Base64 Class进行编码与解码
Base64 base64 = new Base64();
//使用Base64进行字串编码
String encodeString = new String(base64.encode("This is source string.".getBytes()));
//输出结果将为"VGhpcyBpcyBzb3VyY2Ugc3RyaW5nLg=="
System.out.println(encodeString);
//使用Base64进行字串解码
String decodeString = new String(base64.decode(encodeString.getBytes()));
//输出结果将为"This is source string."
System.out.println(decodeString);


Java keytool 基本指令介绍

1. 匯入凭证到keystore
      keytool –import –alias xxx –file xxx.cer –keystore .keystore

2. 查询keystore的内容
      keytool –list –v –keystore .keystore

3. 删除keystore内的其中一个凭证
      keytool –delete –alias xxx –keystore .keystore

4. 产生金錀对(RSA为非对称加密的演算法)
      keytool -genkey -alias xxx -keyalg RSA -keystore .keystore

5. 产生凭证申请档
      keytool -certreq -alias xxx -file certreq.txt -keystore .keystore

6. 查询PKCS12类型keystore的内容
      keytool –list –v –keystore .keystore -storetype pkcs12

7. 建立一个含有私钥的keystore
      keytool -genkey -alias keyAlias -keyalg RSA -keystore keystore.jks

8. 修改keystore的密码
      keytool -storepasswd -new newPassword -keystore keystore.jks


Java - 使用iText输出pdf档(一) Hello world范例

1. 下载iText Jar档

2. Hello world范例。
FileOutputStream fos = new FileOutputStream(new File("C:/Hello world.pdf"));
//建立一个Document物件,并设定页面大小及左、右、上、下的边界
Document document = new Document(PageSize.A4, 10, 20, 30, 40);
//设定要输出的Stream
PdfWriter.getInstance(document, fos);
document.open();
//设定作者
document.addAuthor("Author");
//设定建立者
document.addCreator("createor");
//设定主题
document.addSubject("subject");
//设定标题
document.addTitle("title");
//设定建立时间(为当下时间)
document.addCreationDate();

document.add(new Phrase("Hello world\n"));

document.close();


Java - 使用iText输出pdf档(二) 中文字范例

1. 参考Java - 使用iText输出pdf档(一) Hello world范例

2. 设定中文字型。
//指定要使用的字型(KAIU.TTF为Windows内建的标楷体)
BaseFont bf = BaseFont.createFont("C:\\WINDOWS\\Fonts\\KAIU.TTF", BaseFont.IDENTITY_H,  BaseFont.NOT_EMBEDDED);
//设定中文字型(BaseFont、字型大小、字型型态)
Font chineseFont = new Font(bf, 12, Font.NORMAL);
//套用中文字型
document.add(new Phrase("这是中文",chineseFont));


Java - 使用iText输出pdf档(三) 表格(table)范例

1. 参考Java - 使用iText输出pdf档(一) Hello world范例

2. 表格(table)范例。
//建立PdfPTable物件并设定其栏位数
PdfPTable table = new PdfPTable(2);
//设定table的宽度
table.setWidthPercentage(100f);
//设定每个栏位的宽度
table.setWidths(new float[]{0.20f, 0.90f});

PdfPCell title = new PdfPCell();
//合併储存格
title.setColspan(2);
title.addElement(new Phrase("Table's Title"));
table.addCell(title);

//设定第一个栏位的内容
PdfPCell cell_1 = new PdfPCell();
cell_1.addElement(new Phrase("Column 1"));
table.addCell(cell_1);

//设定第二个栏位的内容
PdfPCell cell_2 = new PdfPCell();
cell_2.addElement(new Phrase("Column 2"));
table.addCell(cell_2);

document.add(table);


Java string to int(字串转整数)

1. int intValue = Integer.valueOf("12345");

2. int intValue = Integer.parseInt("12345");


Java int to String(整数转字串)

1. String stringValue = Integer.toString(12345);

2. String stringValue = String.valueOf(12345);

3. String stringValue = new String(""+12345);


Java string split(字串切割)

Java字串切割范例
//欲切割的字串
String splitString = "Bob:Stev:David:John";
//使用「:」进行切割
String[] names = splitString.split(":");
for(String name:names){
    System.out.println(name);
}

输出结果
Bob
Stev
David
John


Java string to date(字串转日期)

Java字串转日期范例
//欲转换的日期字串
String dateString = "20010-03-02 20:25:58";
//设定日期格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//进行转换
Date date = sdf.parse(dateString);
System.out.println(date);

输出结果
Tue Mar 02 20:25:58 CST 20010


Java date to string(日期转字串)

Java 日期转字串范列
//目前时间
Date date = new Date();
//设定日期格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//进行转换
String dateString = sdf.format(date);
System.out.println(dateString);


输出结果
2010-03-02 19:15:57


Java AES Encrypt & Decrypt Example(加解密)

范例程式
//欲加密的字串
String msg = "This is a message.";
System.out.println("原始字串:"+new String(msg));
//设定要使用的加密演算法
KeyGenerator keyG = KeyGenerator.getInstance("AES");
//设定key的长度
keyG.init(256);
//产生SecretKey
SecretKey secuK = keyG.generateKey();
//取得要用来加密的key(解密也需使用这把key)
byte[] key = secuK.getEncoded();
System.out.println("key:"+new String(key));
SecretKeySpec spec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES");
//设定为加密模式
cipher.init(Cipher.ENCRYPT_MODE, spec);
//将字串加密,并取得加密后的资料
byte[] encryptData = cipher.doFinal(msg.getBytes());
System.out.println("加密后字串:"+new String(encryptData));

//使用刚刚用来加密的key进行解密
spec = new SecretKeySpec(key, "AES");
cipher = Cipher.getInstance("AES");
//设定为解密模式
cipher.init(Cipher.DECRYPT_MODE, spec);
byte[] original = cipher.doFinal(encryptData);
System.out.println("解密后字串:"+new String(original));

输出结果
原始字串:This is a message.
key:�U{� jPk ���@7 .�A@��&]W LK���ݣ
加密后字串:��� � ����tl7Q U!���d�{4R) �� .
解密后字串:This is a message.


2010年3月2日 星期二

建立Facebook应用程式 Java API (7) - 使用XFBML建立邀请页面

1. 需先完成开始使用XFBML步骤。

2. 加入XFBML邀请页面程式码。
<fb:serverfbml>
    <script type="text/fbml">
      <fb:request-form action="http://apps.facebook.com/votequestionnaire/"
         target="_top" method="POST" invite="true" type="type"
         content="content <fb:req-choice url='http://apps.facebook.com/votequestionnaire/' label='label' />">

        <fb:multi-friend-selector showborder="false"
           actiontext="actiontext" exclude_ids="1111111,222222,333333"
           rows="5" cols="5" bypass="cancel" target="_top" max="25" email_invite="false" />
      </fb:request-form>
    </script>
</fb:serverfbml> 
3. 邀请页面结果如下。(actiontext对应到fb:multi-friend-selector的actiontext属性丶type则对应到fb:request-form的type属性)

4. 邀请函结果如下。(content对应到fb:request-form的content属性丶label对应到fb:req-choice的label属性)










建立Facebook应用程式 Java API (6) - 开始使用XFBML

1. 建立crossDomain.jsp。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
    <head> <title>Cross-Domain Receiver Page</title>
    </head>
    <body>
        <script src="http://static.ak.connect.facebook.com/js/api_lib/v0.4/XdCommReceiver.js?2" type="text/javascript">
        </script>
    </body>
</html>


2. 修改联外通网址(为放置crossDomain.jsp的同一个domain)。



3. 建立需要使用XFBML的网页。

   a. 需使用取代原有的<html xmlns="http://www.w3.org/1999/xhtml" xmlns:fb="http://www.facebook.com/2008/fbml">取代原有的<html>
   b. <body>在之後加入二个script
<script src="http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php/en_US" type="text/javascript"></script>
<script type="text/javascript">
FB_RequireFeatures(["XFBML"], function(){ FB.Facebook.init("你的apiKey", "crossDomain.jsp位置"); });
</script>


建立Facebook应用程式 Java API (5) - 取得朋友Profile内的资料

//设定要取得的栏位
 Set fields = new HashSet();
 fields.add(ProfileField.SEX.fieldName()); //性别
 fields.add(ProfileField.NAME.fieldName()); //姓名
 fields.add(ProfileField.BIRTHDAY.fieldName()); //生日
 fields.add(ProfileField.PIC_SMALL.fieldName()); //大头照

 //取得所有朋友的Uid
 List friendsUid = client.friends_get().getUid();

 //取得使用者资讯
 List users = client.users_getInfo(friendsUid, fields).getUser();
 for(User user:users) {
     user.getSex(); //男:male 女:female
     user.getName();
     user.getBirthday();
     user.getPicSmall(); //大头照图片网址
 }