[转]mybatis下的分页,支持所有的数据库

大 家都知道,mybatis的自带分页方法只是逻辑分 页,如果数据量很大,内存一定会溢出,不知道为什么开源组织不在里面集成hibernate的物理分页处理方法!在不修改mybatis源代码的情况下, 应该怎么使mybatis支持物理分页呢?参考了网上的一些信息,有了下面的解决方法:以oracle为例子

 

1.把hibernate下的dialect包全部拷贝到mybatis包的jdbc目录下,如下图所示:

[转]mybatis下的分页,支持所有的数据库

 

2.定义一个ResultSetHandler  Interceptor

package cn.machi.utils;

import java.sql.Statement;
import java.util.Properties;

import org.apache.ibatis.executor.resultset.FastResultSetHandler;
import org.apache.ibatis.executor.resultset.ResultSetHandler;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.session.RowBounds;

@Intercepts( {@Signature(type = ResultSetHandler.class, method = “handleResultSets”, args = {Statement.class})})
public class DiclectResultSetHandlerInterceptor implements Interceptor
{
   
    public Object intercept(Invocation invocation) throws Throwable
    {
        FastResultSetHandler resultSet = (FastResultSetHandler)invocation.getTarget();
       
        RowBounds rowBounds = (RowBounds)ReflectUtil.getFieldValue(resultSet,
                “rowBounds”);
       
        if (rowBounds.getLimit() > 0
                && rowBounds.getLimit() < RowBounds.NO_ROW_LIMIT)
        {
            ReflectUtil.setFieldValue(resultSet, “rowBounds”, new RowBounds());
        }
        return invocation.proceed();
    }
   
    public Object plugin(Object target)
    {
        return Plugin.wrap(target, this);
    }
   
    public void setProperties(Properties properties)
    {
    }
}

 

3.定义一个StatementHandler的Interceptor

package cn.machi.utils;

import java.sql.Connection;
import java.util.Properties;

import org.apache.ibatis.executor.statement.PreparedStatementHandler;
import org.apache.ibatis.executor.statement.RoutingStatementHandler;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.jdbc.dialect.OracleDialect;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.session.RowBounds;

@Intercepts( {@Signature(type = StatementHandler.class, method = “prepare”, args = {Connection.class})})
public class DiclectStatementHandlerInterceptor implements Interceptor
{
   
    private static final String DIALECT = “org.apache.ibatis.jdbc.dialect.OracleDialect”;
   
    public Object intercept(Invocation invocation) throws Throwable
    {
        RoutingStatementHandler statement = (RoutingStatementHandler)invocation.getTarget();
        PreparedStatementHandler handler = (PreparedStatementHandler)ReflectUtil.getFieldValue(statement,
                “delegate”);
        RowBounds rowBounds = (RowBounds)ReflectUtil.getFieldValue(handler,
                “rowBounds”);
       
        if (rowBounds.getLimit() > 0
                && rowBounds.getLimit() < RowBounds.NO_ROW_LIMIT)
        {
            BoundSql boundSql = statement.getBoundSql();
            String sql = boundSql.getSql();
           
            OracleDialect dialect = (OracleDialect)Class.forName(DIALECT)
                    .newInstance();
            sql = dialect.getLimitString(sql,
                    rowBounds.getOffset(),
                    rowBounds.getLimit());
           
            ReflectUtil.setFieldValue(boundSql, “sql”, sql);
        }
        return invocation.proceed();
    }
   
    public Object plugin(Object target)
    {
        return Plugin.wrap(target, this);
    }
   
    public void setProperties(Properties properties)
    {
    }
}

4.定义工具类ReflectUtil

package cn.machi.utils;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

import org.apache.log4j.Logger;


public class ReflectUtil
{
    private static Logger log = Logger.getLogger(ReflectUtil.class);
   
    private static Object operate(Object obj, String fieldName,
            Object fieldVal, String type)
    {
        Object ret = null;
        try
        {
            // 获得对象类型 
            Class<? extends Object> classType = obj.getClass();
            // 获得对象的所有属性 
            Field fields[] = classType.getDeclaredFields();
            for (int i = 0; i < fields.length; i++)
            {
                Field field = fields[i];
                if (field.getName().equals(fieldName))
                {
                   
                    String firstLetter = fieldName.substring(0, 1)
                            .toUpperCase(); // 获得和属性对应的getXXX()方法的名字 
                    if (“set”.equals(type))
                    {
                        String setMethodName = “set” + firstLetter
                                + fieldName.substring(1); // 获得和属性对应的getXXX()方法 
                        Method setMethod = classType.getMethod(setMethodName,
                                new Class[] {field.getType()}); // 调用原对象的getXXX()方法 
                        ret = setMethod.invoke(obj, new Object[] {fieldVal});
                    }
                    if (“get”.equals(type))
                    {
                        String getMethodName = “get” + firstLetter
                                + fieldName.substring(1); // 获得和属性对应的setXXX()方法的名字 
                        Method getMethod = classType.getMethod(getMethodName,
                                new Class[] {});
                        ret = getMethod.invoke(obj, new Object[] {});
                    }
                    return ret;
                }
            }
        }
        catch (Exception e)
        {
            log.warn(“reflect error:” + fieldName, e);
        }
        return ret;
    }
   
    public static Object getVal(Object obj, String fieldName)
    {
        return operate(obj, fieldName, null, “get”);
    }
   
    public static void setVal(Object obj, String fieldName, Object fieldVal)
    {
        operate(obj, fieldName, fieldVal, “set”);
    }
   
   
    private static Method getDeclaredMethod(Object object, String methodName,
            Class<?>[] parameterTypes)
    {
        for (Class<?> superClass = object.getClass(); superClass != Object.class; superClass = superClass.getSuperclass())
        {
            try
            {
                //superClass.getMethod(methodName, parameterTypes);
                return superClass.getDeclaredMethod(methodName, parameterTypes);
            }
            catch (NoSuchMethodException e)
            {
                //Method 不在当前类定义, 继续向上转型
            }
        }
       
        return null;
    }
   
   
    private static void makeAccessible(Field field)
    {
        if (!Modifier.isPublic(field.getModifiers()))
        {
            field.setAccessible(true);
        }
    }
   
   
    private static Field getDeclaredField(Object object, String filedName)
    {
        for (Class<?> superClass = object.getClass(); superClass != Object.class; superClass = superClass.getSuperclass())
        {
            try
            {
                return superClass.getDeclaredField(filedName);
            }
            catch (NoSuchFieldException e)
            {
                //Field 不在当前类定义, 继续向上转型
            }
        }
        return null;
    }
   
   
    public static Object invokeMethod(Object object, String methodName,
            Class<?>[] parameterTypes, Object[] parameters)
            throws InvocationTargetException
    {
        Method method = getDeclaredMethod(object, methodName, parameterTypes);
       
        if (method == null)
        {
            throw new IllegalArgumentException(“Could not find method [“
                    + methodName + “] on target [” + object + “]”);
        }
       
        method.setAccessible(true);
       
        try
        {
            return method.invoke(object, parameters);
        }
        catch (IllegalAccessException e)
        {
           
        }
       
        return null;
    }
   
   
    public static void setFieldValue(Object object, String fieldName,
            Object value)
    {
        Field field = getDeclaredField(object, fieldName);
       
        if (field == null)
            throw new IllegalArgumentException(“Could not find field [“
                    + fieldName + “] on target [” + object + “]”);
       
        makeAccessible(field);
       
        try
        {
            field.set(object, value);
        }
        catch (IllegalAccessException e)
        {
            e.printStackTrace();
        }
    }
   
   
    public static Object getFieldValue(Object object, String fieldName)
    {
        Field field = getDeclaredField(object, fieldName);
        if (field == null)
            throw new IllegalArgumentException(“Could not find field [“
                    + fieldName + “] on target [” + object + “]”);
       
        makeAccessible(field);
       
        Object result = null;
        try
        {
            result = field.get(object);
        }
        catch (IllegalAccessException e)
        {
            e.printStackTrace();
        }
       
        return result;
    }
   
}

5.更新mapper configuration文件,添加如下几条,注意plugins在整个configuration文件中的顺序

<plugins>
<plugin interceptor=”functionPoint.db.DiclectStatementHandlerInterceptor”/>
<plugin interceptor=”functionPoint.db.DiclectResultSetHandlerInterceptor”/>
</plugins>

6.使用方法同mybatis逻辑分页,拦截器会自动拦截执行SQL的地方,加上分页代码:

getSqlSession().selectList(mapId, queryKey,new RowBounds(pageId, pageSize));

 

好了,大功告成!

LINUX下用HP的IML工具查看服务器的日志信息

LINUX下用HP的IML工具查看服务器的日志信息

    打开“控制终端”,在里面输入: cd /media/cdrom/Compaq/csp/linux/install740.sh 会直接进行安装。

1.PSP 安装完成后,打开浏览器。输入: https://127.0.0.1:2381

2. 输入完用户名和密码后登录到 System Management Homepage 的画面。点击 LOGS

3. 可以在 LOGS 下,看到 IML 的有关硬件的日志及报错信息

4. 也可以在 “控制终端”中进到 cd /usr/sbin 的目录下。键入 hpimlview 来查看 IML 的日志。

5. 打开 IML 后可以用 TAB 键进行切换。按 ENTER 键,就能查看到每一条日志信息的详细内容。 ( 但在此次实验中这个 IML 的日志无法保存出来。 )

6. 在 “控制终端”中进到 cd /usr/sbin 的目录下。键入 hplog 可以查看当前 CPU 温度、系统风扇、电源情况、 PCI route 表 及 ASR 的一些数据。 ( 见下图 )

7. 在 “控制终端”中进到 cd /usr/sbin 的目录下。键入 hpuid 可以控制和查看 UID 灯的状态。

8. 在 “控制终端”中进到 cd /usr/sbin 的目录下。键入 hpasmcli 。然后再键入 Help 之后,有 CLEAR 、 DISABLE 、 ENABLE 、 EXIT 、 HELP 、 QUIT 、 SET 、 SHOW 的选项。(如 : 在 disable 下 关闭 HT . )

9. 运行 SHOW 可以查看列表中列出的信息

10. 键入 show server 后可以看到:机器的型号、机器的序列号、 BIOS 的版本、 ILO 、集成网卡的 MAC 地址、 CPU 的信息、内存的信息。

11. 键入 SHOW BOOT 可以看启动顺序。键入 SHOW FANS 可以查看风扇的状态。键入 SHOW HT 可以查看超线程是否开启。键入 SHOW IML 可以看 IML 的日志及信息。

 

 

HP ProLiant DL380 G6 服务器系列 – 自动重启的故障排查

1. 首先查看服务器是否有诊断灯报警。如果有则对应insight display 诊断版灯来确认是何种硬件故障。

 LINUX下用HP的IML工具查看服务器的日志信息

2. 检测DL380 G6服务器的firmware版本, proliant support pack包是否是最新。如果不是最新的hp 建议您更新到最新。

需要点击开始–程序–HP System Tools–hp insight diagnostic online edition之后里面可以查看firmware版本和proliant support pack 版本。

3. 检测服务器兼容性列表, 确认该系统是否能在DL380G6上兼容。

查看方法 :点击 此处 查看操作系统兼容性列表。

4. 收集日志,收集IML日志, 系统日志,survey 报告查看报错。

收集IML日志方法 :点击开始–程序–HP System Tools–HP Proliant Integrated Management Log Viewer 收集IML 日志

收集survey日志方法 :需要点击开始–程序–HP System Tools–hp insight diagnostic online edition 收集survey 报告

收集系统日志 :windows 在运行里面输入eventvwr之后可以保存系统日志和应用程序日志。

linux 中/var/logs

collectd

collectd是一个守护(daemon)进程,用来收集系统性能和提供各种存储方式来存储不同值的机制。比如以RRD 文件形式。

当系统运行和存储信息的时候,Collectd会周期性统计系统的相关统计信息。那些信息可以用来找到当前系统性能瓶颈。(如作为性能分析 performance analysis)和预测系统未来的load(如能力部署capacity planning).如果你需要美观的图形来显示您的数据,并且已经厌烦了内部解决方案,恭喜您,你找到了正确的地方。

一般来说,一图胜过千言,所以这里显示了某个系统在过去60分钟内的CPU利用率图形。

collectd

在互联网上还有其他的免费,开源的项目类似于collectd的项目。为什么你要选择collectd呢?和其他项目相比,我们觉得collectd有一些主要的特点:第一,它完全是由C语言编写,故性能很高,可移植性好,它允许运行在系统没有脚本语言支持或者cron daemon的系统上,比如嵌入式系统。同时,它包含优化以及处理成百上千种数据集的新特性。collectd包含有超过70多种插件,其中有标准的case到非常特殊和高级的专题。同时,collectd提供强大的网络联网特性,它能以多种方式来扩充。最后,collectd开发及时同时文档支持也是非常好的。

虽然collectd能够很大程度满足您的管理需求,但是它还是存在一些不足:
-它本身不能生成图形。虽然它能写RRD文件,但是它不能从这些文件生成图形。在contrib/ 目录下包含简单的脚本,可以看看kcollectd,一个X window前端和drraw,一个非常通用的解决方案。
-监控功能已经被添加到了4.3版本,但是至今它只能进行简单门阀检测。

如何将GlassFish作为Windows服务运行

    本文档来自GlassFish官方网站,详细介绍了将 GlassFish 作为 Windows 服务运行设置方法。

Glassfish 附带一个名为 appservService.exe 的 Windows 可执行文件,它可与 Windows 服务控制器通信。其工作方式类似于 Java Service Wrapper 等程序。您为 Glassfish 创建的 Windows 服务使用几个参数来启动 appservService.exe,这些参数告知它在启动和停止时要执行哪些 asadmin 命令。

Glassfish 并未附带可为 appservService.exe 轻松创建 Windows 服务的工具,但是 Sun Java Application Server 9.x 的安装程序有一个 “Install as a Windows service” 复选框。如果您要为 Glassfish 创建 Windows 服务,则该说明中给出了可从命令提示符运行的一个相当大的命令。如果 Glassfish 安装路径包含空格,例如 C:/Program Files/Sun/GlassfishV2
uff0c那么查找正确方法对转义字符进行转义就变得复杂而不是快速了。

GlassfishSvc.jar

Ryan de Laplante 提供了一个简单的命令行工具,通过它可以轻而易举地创建 Windows 服务。下载 GlassfishSvc.jar(源代码),并将其复制到 Glassfish 安装路径(例如 C:/Program Files/Sun/GlassfishV2
uff09,然后从命令行运行以下命令:

C:/Program Files/Sun/GlassfishV2>java -jar GlassfishSvc.jar -i 

glassfishsvc v1.0 (Aug 19 2007)

Service name : GlassfishAppServer Glassfish installation path : C:/Program Files/Sun/GlassfishV2 Glassfish domain : domain1 Glassfish admin username : admin

Installing service… Done.-i 参数将使用默认选项安装服务。命令行参数的完整列表如下:

glassfishsvc v1.0 (Aug 19 2007)

DESCRIPTION: Installs and uninstalls a Windows service for Glassfish

USAGE: java -jar glassfishsvc.jar [-i | -u] [OPTIONS]

-i        Installs a Windows service for Glassfish. -u        Uninstalls a Windows service for Glassfish. -n name   Name for the Windows service. Use double quotes around names that contain spaces.  Defaults to GlassfishAppServer. -d path   Directory where Glassfish is installed. Use double quotes around paths with spaces, and escape back slashes. Defaults to current directory. -m domain Name of the Glassfish domain to start and stop. Defaults to domain1. -a user   Glassfish admin user name.  Defaults to admin. -p pwd    Glassfish admin password.  A password.txt file will be created in the Glassfish install directory containing the password in plain text, and the Windows service will be configured to read from it. This is usually not necessary. If no password is passed in, the password.txt file will not be created.

EXAMPLES: java -jar glassfishsvc.jar -i java -jar glassfishsvc.jar -i -p adminadmin java -jar glassfishsvc.jar -i -n MyServiceName -d "C://Program Files//Sun//Glassfish" -m myDomain -a admin5 -p secretpwd java -jar glassfishsvc.jar -u java -jar glassfishsvc.jar -u -n MyServiceName

AUTHOR: Ryan de Laplante ﹤ryan at ijws dot com>

群集配置文件

如果您安装了 Glassfish 群集配置文件,则 Glassfish 会在服务启动时询问管理员密码。要避免询问此问题,请在安装服务时使用 -p 选项。在 Glassfish 根目录中将创建 password.txt 文件,其中包含纯文本形式的密码。Windows 服务将配置为使用此文件,以便它可以在无人参与的情况下启动。您应该确保在此文件创建后对其配置相应的 NTFS 安全性,以便未授权用户对它没有读取或写入访问权限。

Windows 用户注销

默认情况下,JVM 可以捕获来自 Windows 的指示 OS 正在关闭或用户正在注销的信号,并正常地自行关闭。这意味着,一旦用户从 Windows 中注销,Glassfish 服务便会关闭。这有违于使用 Windows 服务的初衷,因此需要使用 -Xrs JVM 选项关闭此 JVM 功能。

打开 ﹤GF_HOME>/domains/domain1/config/domain.xml 文件,并查找含有大量 ﹤jvm-options>某个 JVM 选项﹤/jvm-options> 行的部分。在该部分中添加以下行:

﹤jvm-options>-Xrs﹤/jvm-options>

保存并关闭 domain.xml。如果 Glassfish 服务已在运行,请重新启动它以使更改生效。

注意:有报告指出,在某些 Windows 2003 Server 安装中将 -Xrs jvm-option 添加到 domain.xml 无法解决此问题。所报告的解决方案是将 jvm 选项添加到 ﹤GF_HOME>/lib/processLauncher.xml:

﹤process name=”as9-server”>

﹤sysproperty key=”-Xrs”/>

堆栈Stack介绍

堆栈(Stack)代表了一个后进先出的对象集合。当您需要对各项进行后进先出的访问时,则使用堆栈。当您在列表中添加一项,称为推入元素,当您从列表中移除一项时,称为弹出元素。

Stack 类的方法和属性

下表列出了 Stack 类的一些常用的 属性

属性 描述
Count 获取 Stack 中包含的元素个数。

下表列出了 Stack 类的一些常用的 方法

序号 方法名 & 描述
1 public virtual void Clear(); 
从 Stack 中移除所有的元素。
2 public virtual bool Contains( object obj ); 
判断某个元素是否在 Stack 中。
3 public virtual object Peek();
返回在 Stack 的顶部的对象,但不移除它。
4 public virtual object Pop();
移除并返回在 Stack 的顶部的对象。
5 public virtual void Push( object obj );
向 Stack 的顶部添加一个对象。
6 public virtual object[] ToArray();
复制 Stack 到一个新的数组中。

 

实例

下面的实例演示了堆栈(Stack)的使用:

using System; using System.Collections;  namespace CollectionsApplication {     class Program     {         static void Main(string[] args)         {             Stack st = new Stack();              st.Push('A');             st.Push('M');             st.Push('G');             st.Push('W');                          Console.WriteLine("Current stack: ");             foreach (char c in st)             {                 Console.Write(c + " ");             }             Console.WriteLine();                          st.Push('V');             st.Push('H');             Console.WriteLine("The next poppable value in stack: {0}",              st.Peek());             Console.WriteLine("Current stack: ");                        foreach (char c in st)             {                Console.Write(c + " ");             }             Console.WriteLine();              Console.WriteLine("Removing values ");             st.Pop();             st.Pop();             st.Pop();                          Console.WriteLine("Current stack: ");             foreach (char c in st)             {                Console.Write(c + " ");              }         }     } }

当上面的代码被编译和执行时,它会产生下列结果:

Current stack:  W G M A The next poppable value in stack: H Current stack:  H V W G M A Removing values Current stack:  G M A

MySQL触发器实现表数据同步

其中old表示tab2(被动触发),new表示tab1(主动触发,外部应用程序在此表里执行insert语句)

1、插入:在一个表里添加一条记录,另一个表也添加一条记录
DROP TABLE IF EXISTS tab1;
CREATE TABLE tab1(
tab1_id varchar(11)
);

DROP TABLE IF EXISTS tab2;
CREATE TABLE tab2(
tab2_id varchar(11)
);

创建触发器:t_afterinsert_on_tab1
作用:增加tab1表记录后自动将记录增加到tab2表中
delimiter || 
DROP TRIGGER IF EXISTS t_afterinsert_on_tab1 ||
CREATE TRIGGER t_afterinsert_on_tab1 
AFTER INSERT ON tab1
FOR EACH ROW
BEGIN
insert into tab2(tab2_id) values(new.tab1_id);
END||
delimiter ;

测试:
INSERT INTO tab1(tab1_id) values(‘0001′);

查看结果:
SELECT * FROM tab1;
SELECT * FROM tab2;

2、删除:在一个表里删除一条记录,另一个表也删除一条记录
delimiter || 
DROP TRIGGER IF EXISTS t_afterdelete_on_tab1||
CREATE TRIGGER t_afterdelete_on_tab1
AFTER DELETE ON tab1
FOR EACH ROW
BEGIN
delete from tab2 where tab2_id=old.tab1_id;
END||

测试:
DELETE FROM tab1 WHERE tab1_id=’0001′;

看看结果
SELECT * FROM tab1;
SELECT * FROM tab2;

java application中内嵌ActiveX控件

我这里用的是SWT/JFace开发application,SWT自带的org.eclipse.swt.ole.win32 包可以支

持内嵌OLE和ActiveX。

具体用法如下:

//创建一个OleFrame做为OLE(或ActiveX)的框架

OleFrame oleFrame = new OleFrame(this, SWT.NONE);

//创建ActiveX的容器,其中的classID是ActiveX的claid,在注册表中可以找到

OleControlSite oleControl = new OleControlSite(oleFrame, SWT.NONE, “classID”);

//OleAutomation类用来执行ActiveX中的方法

OleAutomation oleAutomation = new OleAutomation(oleControl);

//将ActiveX显示在application中

oleControl.doVerb(OLE.OLEIVERB_SHOW);

调用AcitveX中方法的具体过程:

1、不带参数的方法调用

//获取Method Name的ID,Method Name为ActiveX中具体的方法名

int[] regspid = oleAutomation.getIDsOfNames(new String[] { “Method Name” });

int dispIdMember = regspid[0];

//方法调用

oleAutomation.invoke(dispIdMember);

2、带参数的方法调用

//获取Method Name的ID,Method Name为ActiveX中具体的方法名

int[] regspid = oleAutomation.getIDsOfNames(new String[] { “Method Name” });

int dispIdMember = regspid[0];

//设置方法的具体参数。Variant数组的长度为Method Name方法参数的个数

//假设有四个参数

Variant[] rgvarg = new Variant[4];

rgvarg[0] = new Variant(fileID);

rgvarg[1] = new Variant(itdsURL);

rgvarg[2] = new Variant(idType);

rgvarg[3] = new Variant(reportURL);

//方法调用

oleAutomation.invoke(dispIdMember, rgvarg);

调用OLE Exemple:Java程序内嵌Word应用程序

package geftest.swt;

import java.io.File;

import org.eclipse.swt.SWT;

import org.eclipse.swt.graphics.Point;

import org.eclipse.swt.layout.GridData;

import org.eclipse.swt.layout.GridLayout;

import org.eclipse.swt.ole.win32.OLE;

import org.eclipse.swt.ole.win32.OleClientSite;

import org.eclipse.swt.ole.win32.OleFrame;

import org.eclipse.swt.widgets.Button;

import org.eclipse.swt.widgets.Display;

import org.eclipse.swt.widgets.Shell;

import org.eclipse.swt.widgets.Composite;

public class ActiveXTest

{

private Shell sShell = null;

private Button button = null;

private OleClientSite clientSite;

public static void main(String[] args)

{

Display display = Display.getDefault();

ActiveXTest thisClass = new ActiveXTest();

thisClass.createSShell();

thisClass.sShell.open();

while (!thisClass.sShell.isDisposed())

{

   if (!display.readAndDispatch())

    display.sleep();

}

display.dispose();

}

/**

* This method initializes sShell

*/

private void createSShell()

{

GridData gridData = new GridData();

gridData.horizontalSpan = 2;

GridLayout gridLayout = new GridLayout();

gridLayout.numColumns = 3;

sShell = new Shell();

sShell.setText(“Shell”);

sShell.setLayout(gridLayout);

sShell.setSize(new Point(800, 600));

OleFrame frame = new OleFrame(sShell, SWT.NONE);

button = new Button(sShell, SWT.NONE);

button.setLayoutData(gridData);

button.setText(“Save”);

button.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {

   public void widgetSelected(org.eclipse.swt.events.SelectionEvent e)

   {

    clientSite.save(new File(“d:/test.docx”),true);

   }

});

frame.setSize(800,600);

clientSite = new OleClientSite(frame, SWT.NONE,”Word.Document.8″);

clientSite.setSize(400,400);

clientSite.doVerb(OLE.OLEIVERB_SHOW);

}

}

分享到:

input lable水平对齐

1、CSS

<style type=”text/css”>
      input,label { vertical-align:middle;}
</style>

2、html

<label><input name=”chkGD” id=”chkGD” type=”checkbox” value=”” style=”border:none; background-color:#F4F4F4″ />加载供电方案</label>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<label><input name=”chkYS” id=”chkYS” type=”checkbox” value=”” style=”border:none; background-color:#F4F4F4″/>加载预算方案</label>

 

 

MINGW GCC 4.3.0 安装与配置(解决CREATEPROCESS问题)

首先,下载Mingw TDM 4.3.0版本
http://www.tdragon.net/recentgcc/

有两种选择
GCC 4.3.0-tdm-2 (Default SJLJ exceptions) 和 GCC 4.3.0-tdm-2 With DW2 Exceptions
可以根据SJLJ or DW2 (Dwarf-2) 异常模型来选择需要下载的版本,通常情况下win32平台下选择SJLJ(set jump long jump)模型

然后还需要去Mingw官网下载
binutils
http://downloads.sourceforge.net/mingw/binutils-2.18.50-20080109-2.tar.gz
mingw-runtime (mingw-runtime-3.14.tar.gz, 494KB) 
http://downloads.sourceforge.net/mingw/mingw-runtime-3.14.tar.gz
w32api (w32api-3.11.tar.gz, 1.55MB) 
http://downloads.sourceforge.net/mingw/w32api-3.11.tar.gz

也可以选择安装以下组件
mingw-utils
http://downloads.sourceforge.net/mingw/mingw-utils-0.3.tar.gz
mingw32-make(可以选择最新的mingw32-make-3.81-20080326-2)
http://downloads.sourceforge.net/mingw/mingw32-make-3.81-2.tar.gz
gdb(可以选择最新的6.8试验版)
http://downloads.sourceforge.net/mingw/gdb-6.6.tar.bz2

把这些东西都下载下来,然后解压到不同的目录,每个目录里面大概都会有bin,include,lib,man这样的目录,要做的就是合并它们,也就是拷贝到同一个目录里面,注意可能有些文件会重复,一般来说GCC 4.3.0 TDM包里面的文件比较重要,不要用其他的包里面的文件覆盖了它

然后就可以得到一个完整包含gcc,g++,binutils,gdb,make等的目录了,此时,在windows环境变量中的path变量里面添加该目录的bin子目录,就可以在cmd窗口中调用gcc和g++进行编译了。如果你不想污染了环境变量,也可以写个bat:(假设你的mingw目录是C:/mingw/bin)
set path=C:/mingw/bin;%path%”

现在还没有结束,需要进行两个地方的设置
1 make
mingw官方提供的make工具,名称不是简单的make,而是mingw32-make.exe,把它改名成make.exe或者复制一份为make.exe都可以

2 gcc: CreateProcess: No such file or Directory 错误
这个问题在google里面很多人发问,但是没有一个完整的解答,下面给出一个完整的解答
产生这个错误有两个原因:
第一是gcc无法找到安装目录里面的libexec目录里面的工具,通常这些工具包括cc1.exe,cc1plus.exe,collect2.exe,它们通常存放在:
安装目录/libexec/gcc/mingw32/4.3.0
第二是gcc无法找到mingw目录里面binutils的工具,它们通常存放在
安装目录/mingw32/bin
这两个目录的名字并不完全固定,根据不同组织编译的gcc各有不同,比如mingw官方编译的gcc4.3.0 alpha,上述目录就是
安装目录/gcc/i386-pc-mingw32/4.3.0
而官方提供的binutils包里面是
安装目录/i686-pc-mingw32/bin

只要这两个地方没有设置好,就可能导致CreateProcess错误,那么,有没有什么好办法能够确定这里应该怎样命名呢?办法是用16进制编辑器打开gcc.exe,搜索GCC_EXEC_PREFIX,当搜索到该字符串(不止一个)时,观察后面是否出现版本号4.3.0,如果出现,后面紧接着的就是路径,如果是mingw32那么上面的命名就应该是
安装目录/libexec/gcc/mingw32/4.3.0
安装目录/mingw32/bin

如果是其他的例如i686-pc-mingw32,那么名称相应的变为
安装目录/libexec/gcc/i686-pc-mingw32/4.3.0
安装目录/i686-pc-mingw32/bin

好了,可以测试一下你的hallo world程序了^_^