精华内容
下载资源
问答
  • Java BeanUtils 组件 使用

    万次阅读 2017-08-12 13:35:40
    1. BeanUtils组件 1.1 简介 程序中对javabean操作很频繁, 所以apache提供了一套开源api,方便对javabean操作!即BeanUtils组件。 BeanUtils组件, 作用是简化javabean操作...使用BenUtils组件: 1. 引入com
    1. BeanUtils组件
    

    1.1 简介

    程序中对javabean的操作很频繁, 所以apache提供了一套开源的api,方便对javabean的操作!即BeanUtils组件。

    BeanUtils组件,  作用是简化javabean的操作!

     

    用户可以从www.apache.org下载BeanUtils组件,然后再在项目中引入jar文件!

     

     

    使用BenUtils组件:

    1. 引入commons-beanutils-1.8.3.jar核心包

    2. 引入日志支持包: commons-logging-1.1.3.jar

     

    如果缺少日志jar文件,报错:

    java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory

    at org.apache.commons.beanutils.ConvertUtilsBean.<init>(ConvertUtilsBean.java:157)

    at org.apache.commons.beanutils.BeanUtilsBean.<init>(BeanUtilsBean.java:117)

    at org.apache.commons.beanutils.BeanUtilsBean$1.initialValue(BeanUtilsBean.java:68)

    at

     

    1.2 实例, 基本用法

    方法1: 对象属性的拷贝

    BeanUtils.copyProperty(admin, "userName", "jack");

    BeanUtils.setProperty(admin, "age", 18);

    方法2: 对象的拷贝

    BeanUtils.copyProperties(newAdmin, admin);

    方法3map数据拷贝到javabean中  

    【注意:map中的key要与javabean的属性名称一致】

    BeanUtils.populate(adminMap, map);

     

    //1. javabean的基本操作

    @Test

    public void test1() throws Exception {

     

    // a. 基本操作

    Admin admin = new Admin();

    // admin.setUserName("Jack");

    // admin.setPwd("999");

     

    // b. BeanUtils组件实现对象属性的拷贝

    BeanUtils.copyProperty(admin, "userName", "jack");

    BeanUtils.setProperty(admin, "age", 18);

     

    // 总结1: 对于基本数据类型,会自动进行类型转换!

     

     

    // c. 对象的拷贝

    Admin newAdmin = new Admin();

    BeanUtils.copyProperties(newAdmin, admin);

     

    // d. map数据,拷贝到对象中

    Admin adminMap = new Admin();

    Map<String,Object> map = new HashMap<String,Object>();

    map.put("userName", "Jerry");

    map.put("age", 29);

    // 注意:map中的key要与javabean的属性名称一致

    BeanUtils.populate(adminMap, map);

     

    // 测试

    System.out.println(adminMap.getUserName());

    System.out.println(adminMap.getAge());

    }

     

     

     

    1.3 实例, 日期类型的拷贝

    需要注册日期类型转换器,2种方式参见下面代码:

     

    public class App {

     

    //1. javabean的基本操作

    @Test

    public void test1() throws Exception {

     

    // a. 基本操作

    Admin admin = new Admin();

    // admin.setUserName("Jack");

    // admin.setPwd("999");

     

    // b. BeanUtils组件实现对象属性的拷贝

    BeanUtils.copyProperty(admin, "userName", "jack");

    BeanUtils.setProperty(admin, "age", 18);

     

    // 总结1: 对于基本数据类型,会自动进行类型转换!

     

     

    // c. 对象的拷贝

    Admin newAdmin = new Admin();

    BeanUtils.copyProperties(newAdmin, admin);

     

    // d. map数据,拷贝到对象中

    Admin adminMap = new Admin();

    Map<String,Object> map = new HashMap<String,Object>();

    map.put("userName", "Jerry");

    map.put("age", 29);

    // 注意:map中的key要与javabean的属性名称一致

    BeanUtils.populate(adminMap, map);

     

    // 测试

    System.out.println(adminMap.getUserName());

    System.out.println(adminMap.getAge());

    }

     

     

    //2. 自定义日期类型转换器

    @Test

    public void test2() throws Exception {

    // 模拟表单数据

    String name = "jack";

    String age = "20";

    String birth = "   ";

     

    // 对象

    Admin admin = new Admin();

     

    // 注册日期类型转换器:1, 自定义的方式

    ConvertUtils.register(new Converter() {

    // 转换的内部实现方法,需要重写

    @Override

    public Object convert(Class type, Object value) {

     

    // 判断

    if (type != Date.class) {

    return null;

    }

    if (value == null || "".equals(value.toString().trim())) {

    return null;

    }

     

     

    try {

    // 字符串转换为日期

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

    return sdf.parse(value.toString());

    } catch (ParseException e) {

    throw new RuntimeException(e);

    }

    }

    },Date.class);

     

     

     

    // 把表单提交的数据,封装到对象中

    BeanUtils.copyProperty(admin, "userName", name);

    BeanUtils.copyProperty(admin, "age", age);

    BeanUtils.copyProperty(admin, "birth", birth);

     

    //------ 测试------

    System.out.println(admin);

    }

     

    //2. 使用提供的日期类型转换器工具类

    @Test

    public void test3() throws Exception {

    // 模拟表单数据

    String name = "jack";

    String age = "20";

    String birth = null;

     

    // 对象

    Admin admin = new Admin();

     

    // 注册日期类型转换器:2, 使用组件提供的转换器工具类

    ConvertUtils.register(new DateLocaleConverter(), Date.class);

     

    // 把表单提交的数据,封装到对象中

    BeanUtils.copyProperty(admin, "userName", name);

    BeanUtils.copyProperty(admin, "age", age);

    BeanUtils.copyProperty(admin, "birth", birth);

     

    //------ 测试------

    System.out.println(admin);

    }

    }

     

     

    1.4 应用

    public class WebUtils {

     

     

    @Deprecated

    public static <T> T copyToBean_old(HttpServletRequest request, Class<T> clazz) {

    try {

    // 创建对象

    T t = clazz.newInstance();

     

    // 获取所有的表单元素的名称

    Enumeration<String> enums = request.getParameterNames();

    // 遍历

    while (enums.hasMoreElements()) {

    // 获取表单元素的名称:<input type="password" name="pwd"/>

    String name = enums.nextElement();  // pwd

    // 获取名称对应的值

    String value = request.getParameter(name);

    // 把指定属性名称对应的值进行拷贝

    BeanUtils.copyProperty(t, name, value);

    }

     

    return t;

    } catch (Exception e) {

    throw new RuntimeException(e);

    }

    }

     

    /**

     * 处理请求数据的封装

     */

    public static <T> T copyToBean(HttpServletRequest request, Class<T> clazz) {

    try {

    // (注册日期类型转换器)

    // 创建对象

    T t = clazz.newInstance();

    BeanUtils.populate(t, request.getParameterMap());

    return t;

    } catch (Exception e) {

    throw new RuntimeException(e);

    }

    }

    }

     

    2. 元数据

    jdbc中获取数据库的定义,例如:数据库、表、列的定义信息。就用到元数据。

    jdbc中可以使用: 数据库元数据、参数元数据、结果集元数据

    l (元数据定义相关api,  ..MetaData)

     

     

    public class App {

     

    //1. 数据库元数据

    @Test

    public void testDB() throws Exception {

    // 获取连接

    Connection conn = JdbcUtil.getConnection();

    // 获取数据库元数据

    DatabaseMetaData metaData = conn.getMetaData();// alt + shift + L  快速获取方法返回值

     

    System.out.println(metaData.getUserName());

    System.out.println(metaData.getURL());

    System.out.println(metaData.getDatabaseProductName());

    }

     

    //2. 参数元数据

    @Test

    public void testParams() throws Exception {

    // 获取连接

    Connection conn = JdbcUtil.getConnection();

    // SQL

    String sql = "select * from dept where deptid=? and deptName=?";

    // Object[] values = {"tom","888"};

     

    PreparedStatement pstmt = conn.prepareStatement(sql);

    // 参数元数据

    ParameterMetaData p_metaDate = pstmt.getParameterMetaData();

    // 获取参数的个数

    int count = p_metaDate.getParameterCount();

     

     

    // 测试

    System.out.println(count);

    }

     

    // 3. 结果集元数据

    @Test

    public void testRs() throws Exception {

    String sql = "select * from dept ";

     

    // 获取连接

    Connection conn = JdbcUtil.getConnection();

    PreparedStatement pstmt = conn.prepareStatement(sql);

    ResultSet rs = pstmt.executeQuery();

    // 得到结果集元数据(目标:通过结果集元数据,得到列的名称)

    ResultSetMetaData rs_metaData = rs.getMetaData();

     

    // 迭代每一行结果

    while (rs.next()) {

    // 1. 获取列的个数

    int count = rs_metaData.getColumnCount();

    // 2. 遍历,获取每一列的列的名称

    for (int i=0; i<count; i++) {

    // 得到列的名称

    String columnName = rs_metaData.getColumnName(i + 1);

    // 获取每一行的每一列的值

    Object columnValue = rs.getObject(columnName);

    // 测试

    System.out.print(columnName + "=" + columnValue + ",");

    }

    System.out.println();

    }

     

    }

     

     

     

    }

     

     

    3. Dao操作的抽取,  BaseDao

    Dao操作通用的步骤:

    0. SQL语句

    1. 获取连接

    2. 创建stmt

    3. 执行sql

    a) 更新

    b) 查询

    4. 关闭/异常

     

    通过的dao,

    1. 更新

    String sql = “select * from admin”;

    String sql = “select * from admin  where  id=?  And pwd =?”;

    public void update(String sql, Object[]  paramValues);

     

    2. 查询

    String sql = “select * from admin”;

    String sql = “select * from admin  where  id=?  And pwd =?”;

    // 传入的什么类型的对象,就封装为什么类型

    // 要求: 列的名称,要与指定类型的对象的属性名称一样

    Public    List<T>    query  (String sql , Object[] paramValues ,  Class<T> clazz);

    T  t;  // 对象赋值

     

     

     

     

    /**

     * 通用的dao,自己写的所有的dao都继承此类;

     * 此类定义了2个通用的方法:

     * 1. 更新

     *  2. 查询

     * @author Jie.Yuan

     *

     */

    public class BaseDao {

     

    // 初始化参数

    private Connection con;

    private PreparedStatement pstmt;

    private ResultSet rs;

     

    /**

     * 更新的通用方法

     * @param sql   更新的sql语句(update/insert/delete)

     * @param paramsValue  sql语句中占位符对应的值(如果没有占位符,传入null)

     */

    public void update(String sql,Object[] paramsValue){

     

    try {

    // 获取连接

    con = JdbcUtil.getConnection();

    // 创建执行命令的stmt对象

    pstmt = con.prepareStatement(sql);

    // 参数元数据: 得到占位符参数的个数

    int count = pstmt.getParameterMetaData().getParameterCount();

     

    // 设置占位符参数的值

    if (paramsValue != null && paramsValue.length > 0) {

    // 循环给参数赋值

    for(int i=0;i<count;i++) {

    pstmt.setObject(i+1, paramsValue[i]);

    }

    }

    // 执行更新

    pstmt.executeUpdate();

     

    } catch (Exception e) {

    throw new RuntimeException(e);

    } finally {

    JdbcUtil.closeAll(con, pstmt, null);

    }

    }

     

    /**

     * 查询的通用方法

     * @param sql

     * @param paramsValue

     */

    public <T> List<T> query(String sql, Object[] paramsValue,Class<T> clazz){

     

    try {

    // 返回的集合

    List<T> list = new ArrayList<T>();

    // 对象

    T t = null;

     

    // 1. 获取连接

    con = JdbcUtil.getConnection();

    // 2. 创建stmt对象

    pstmt = con.prepareStatement(sql);

    // 3. 获取占位符参数的个数, 并设置每个参数的值

    int count = pstmt.getParameterMetaData().getParameterCount();

    if (paramsValue != null && paramsValue.length > 0) {

    for (int i=0; i<paramsValue.length; i++) {

    pstmt.setObject(i+1, paramsValue[i]);

    }

    }

    // 4. 执行查询

    rs = pstmt.executeQuery();

    // 5. 获取结果集元数据

    ResultSetMetaData rsmd = rs.getMetaData();

    // ---> 获取列的个数

    int columnCount = rsmd.getColumnCount();

     

    // 6. 遍历rs

    while (rs.next()) {

    // 要封装的对象

    t = clazz.newInstance();

     

    // 7. 遍历每一行的每一列, 封装数据

    for (int i=0; i<columnCount; i++) {

    // 获取每一列的列名称

    String columnName = rsmd.getColumnName(i + 1);

    // 获取每一列的列名称, 对应的值

    Object value = rs.getObject(columnName);

    // 封装: 设置到t对象的属性中  【BeanUtils组件】

    BeanUtils.copyProperty(t, columnName, value);

    }

     

    // 把封装完毕的对象,添加到list集合中

    list.add(t);

    }

     

    return list;

    } catch (Exception e) {

    throw new RuntimeException(e);

    } finally {

    JdbcUtil.closeAll(con, pstmt, rs);

    }

    }

    }

     

     

     

    public class AdminDao extends BaseDao {

     

    // 删除

    public void delete(int id) {

    String sql = "delete from admin where id=?";

    Object[] paramsValue = {id};

    super.update(sql, paramsValue);

    }

     

    // 插入

    public void save(Admin admin) {

    String sql = "insert into admin (userName,pwd) values (?,?)";

    Object[] paramsValue = {admin.getUserName(),admin.getPwd()};

    super.update(sql, paramsValue);

    }

     

    // 查询全部

    public List<Admin> getAll(){

    String sql = "select * from admin";

    List<Admin> list = super.query(sql, null, Admin.class);

    return list;

    }

     

    // 根据条件查询(主键)

    public Admin findById(int id){

    String sql = "select * from admin where id=?";

    List<Admin> list = super.query(sql, new Object[]{id}, Admin.class);

    return  (list!=null&&list.size()>0) ? list.get(0) : null;

    }

     

    }

     

     

    4. DbUtils组件

    l commons-dbutils Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首选。

     

    DbUtils组件,

    1. 简化jdbc操作

    2. 下载组件,引入jar文件 : commons-dbutils-1.6.jar

    展开全文
  • 文章目录java代码组件教学关于KETTLE 5.4版本java代码组件bug 其实我是很烦在kettle里边写...kettle中java代码基本上是用来处理普通组件无法完成一些操作,如果普通组件就能完成功能,那就没有必要去使用java代码

    在kettle里边写java代码感觉很不智能。比如TM的他不支持泛型。但是公司一直在用只能硬的头皮来。最近在使用过程中就碰到了一个版本bug。在此也记录一下

    java代码组件教学

    先介绍一下kettle里边java代码组件

    kettle中java代码基本上是用来处理普通组件无法完成的一些操作,如果普通组件就能完成功能,那就没有必要去使用java代码“炫技”,因为对后边维护人员很不友好

    在这里插入图片描述
    关于kettle里边java代码组件,一般用法是如上图,点击Main后会在右边自动填充这些代码。

    public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException
    {
    	if (first){
    	  first = false;
    
    	  /* TODO: Your code here. (Using info fields)
    
    	  FieldHelper infoField = get(Fields.Info, "info_field_name");
    
    	  RowSet infoStream = findInfoRowSet("info_stream_tag");
    
    	  Object[] infoRow = null;
    
    	  int infoRowCount = 0;
    
    	  // Read all rows from info step before calling getRow() method, which returns first row from any
    	  // input rowset. As rowMeta for info and input steps varies getRow() can lead to errors.
    	  while((infoRow = getRowFrom(infoStream)) != null){
    
    	    // do something with info data
    	    infoRowCount++;
    	  }
    	  */
    	}
    
    	Object[] r = getRow();
    
    	if (r == null) {
    	  setOutputDone();
    	  return false;
    	}
    
    	// It is always safest to call createOutputRow() to ensure that your output row's Object[] is large
        // enough to handle any new fields you are creating in this step.
        r = createOutputRow(r, data.outputRowMeta.size());
    	
        /* TODO: Your code here. (See Sample)
        
        // Get the value from an input field
        String foobar = get(Fields.In, "a_fieldname").getString(r);
    
        foobar += "bar";
        
        // Set a value in a new output field
        get(Fields.Out, "output_fieldname").setValue(r, foobar);
    
    	*/
    	// Send the row on to the next step.
        putRow(data.outputRowMeta, r);
    
    	return true;
    }
    

    先把注释一删,就剩这么点东西了。

    在这里插入图片描述

    我们要写代码的地方,我已经在图中标识出来

    1) 我们首先第一行代码需要写明白数据来源,就是java代码要处理的数据流,也就是上一个组件处理完之后的数据

    /**
    * 此行必须要写的
    */
                               //流中的字段名  名字是自己起的 来自前边的组件
    String str =get(Fields.In,"java_input").getString(r);
    

    在这里插入图片描述案例中代表的是一大段json

    2)然后的java代码就都是围绕着 将数据如何处理
    也就是核心逻辑代码(面向百度编程)

    3)最后就是处理完之后的结果输出

    /**
    * 也是必写
    */
                  //自己起的变量名对应下图输出字段      要输出的数据
    get(Fields.Out, "data_value").setValue(r,jsonList[1]);
    

    最后在java组件里配置一下要输出的字段名和类型
    在这里插入图片描述然后代码能跑通就大功告成

    关于KETTLE 5.4版本java代码组件bug

    在预览java代码组件运行完之后时 得到的数据是这样的
    在这里插入图片描述但是更新/插入数据库后 发现数据就成了这样,莫名其妙的就都一样的
    在这里插入图片描述
    解决方案:

    首先把java代码组件的下一跳设置为一个其他任何后续不需要的输出组件(此处为Excel输出),然后第二次复制设置下一跳为需要执行的步骤(此处为插入/更新)
    在这里插入图片描述

    然后好了 坑了我两天
    在这里插入图片描述

    展开全文
  • 在构建企业应用程序时经常出现一种情况是在一个过程成功后需要实现一系列业务流程,例如,如果您正在构建购物网站,则可能需要在产品付款成功后执行以下操作: 购买后减少商店中可用物品数量。 向商店老板发送...

    在构建企业应用程序时经常出现的一种情况是在一个过程成功后需要实现一系列业务流程,例如,如果您正在构建购物网站,则可能需要在产品付款成功后执行以下操作:

    1. 购买后减少商店中可用的物品数量。
    2. 向商店老板发送收据。
    3. 向买方发送收据。

    在某些情况下,您可能希望这些过程对于产品购买而言是原子性的,也就是说,在发生产品购买之后,必须减少项目数量,如果在减少可用项目数量方面存在问题,则还原产品购买。通常会在事务中执行此操作以使流程原子化。

    但在某些情况下,如果第二步失败了但第二步的重要性可能不足以使其恢复第一步的执行,例如,您可能不希望将收据发送给客户或卖方的过程影响付款过程。在这种情况下,您可能希望使处理两个流程的组件尽可能地分离,以便它们可以独立执行操作,这时事件总线就可以帮助我们来实现。

    什么是事件总线?

    事件总线是一种机制,它允许不同的组件彼此通信而不无需相互了解。组件可以将事件发送到Eventbus,而无需知道是谁来接听或有多少人来接听。组件也可以侦听Eventbus上的事件,而无需知道谁发送了事件。这样,组件可以相互通信而无需相互依赖。同样的也很容易替换其中一个组件。只要新组件了解正在发送和接收的事件,而这一过程其他组件永远不会知道。

    在本文中,我们将使用Google Guava EventBus来展示如何在Java应用程序中解耦组件。

    Guava EventBus

    Guava的EventBus提供了一个发布-订阅事件机制,该机制允许对象通过观察者模式相互通信。EventBus避开了Java中常见的“事件监听器”模式,在Java中,一个对象实现了特定的接口,然后显式地向另一个对象订阅。

    EventBus允许组件之间进行发布-订阅式通信,而无需组件之间彼此了解。它专门设计为使用显式注册代替传统的Java进程内事件分发。它不是通用的发布-订阅系统,也不能用于进程间的通信。

    组件解耦

    在我们的示例中,我们将通过模拟本文开头提到的付款过程来演示如何使用事件总线。

    我们应用程序涉及的组件:

    在这里插入图片描述

    • 第一部分应该处理与成功付款直接相关的流程,例如减少商店中剩余的物品数量。
    • 第二部分处理向客户发送收据。
    • 第三部分处理向卖方发送收据。

    我们可以通过以不同的方法实现这些流程并将它们依次链接在一起,我们可以像这样实现:

    在这里插入图片描述

    但是这种方法的问题在于,这些组件没有正确地分离,并且在一个过程中发生错误时,可能会影响另一个过程。另外,如果我们必须添加更多要在成功付款后执行的流程,则必须手动添加方法调用,这样做并不好。我们将使用事件总线解决该问题。

    这就是我们改进的样子:

    在这里插入图片描述

    支付组件和收据发送者组件互相完全不知道,事件总线负责将信息从发布者传送到所有订阅者。

    Guava EventBus的实现

    在展示如何实现前先介绍Guava EventBus中的一些重要概念:

    • 事件总线:这是委派负责将事件数据从一个组件传送到另一个组件的对象,通常,您需要一个事件总线的实例,以便生产者和订阅者使用同一事件总线,这是事件总线正常工作所必需的。您可以使用单例模式来确保仅创建此类的一个实例,并在需要事件总线的实例时使用IOC容器提供该实例。

    注意:您可能具有Event的多个实例,但是如果您希望不同的事件总线处理不同的组件集,只需要保证发布者和订阅者必须使用相同的事件总线来通信。

    • 生产者:生产者负责发出事件,然后将这些事件传递到事件总线,并发送给订阅该事件的所有侦听器。

    • 侦听器:侦听器订阅事件,并在生产者发布该事件时触发该事件,您可以让侦听器方法同步或异步运行,具体取决于您使用的事件总线的类型。为了使同步运行的监听方法,你可以使用一个同步事件总线是默认EventBus类,要把它异步运行,你将不得不使用AsyncEventBus类,这是一个EventBus子类,它的构造需要一个executor将被用于在单独的线程上执行该方法。在我们的示例中,我们将使用默认EventBus。

    • 事件:在Guava事件总线中,事件只是使用类名唯一标识的对象。因此,要创建付款成功事件,我们只需创建一个PaymentSuccessfulEvent.java类,并在付款成功后发布该类的实例。

    在这里插入图片描述

    具体实现

    1. 将Google Guava库添加到您的项目中
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>28.0-jre</version>
    </dependency>
    
    1. 创建事件总线对象。它可以注册侦听器并发布事件。使用它就像实例化类一样简单:
    EventBus eventBus = new EventBus();
    
    1. 创建付款成功事件。事件只是一个简单的类,每个事件都由类的名称标识。因此,让我们创建一个PaymentSuccessful事件。
    public class PaymentSuccessfulEvent {
        private String action;
    
        PaymentSuccessfulEvent(String action) {
            this.action = action;
        }
    
        String getAction() {
            return action;
        }
    
        public void setAction(String action) {
            this.action = action;
        }
    }
    
    1. 为“付款成功”事件创建侦听器。在Guava EventBus中,侦听器是一种用@Subscribe注解修饰的方法,用于接收特定事件,该方法接受与发布事件相同类型的对象作为参数。让我们创建一个付款成功事件监听器
    public class PaymentSuccessfulEventListener {
    
        private static int eventsHandled;
        private static final Logger LOG = LoggerFactory.getLogger(PaymentSuccessfulEventListener.class);
    
    
        @Subscribe
        public void paymentEvent(PaymentSuccessfulEvent event) {
            LOG.info("do event [" + event.getAction() + "]");
            eventsHandled++;
        }
    
    
        int getEventsHandled() {
            return eventsHandled;
        }
    
        void resetEventsHandled() {
            eventsHandled = 0;
        }
    }
    
    1. 注册事件侦听者。我们可以通过在EventBus上注册EventListener类来订阅事件:
    PaymentSuccessfulEventListener listener = new PaymentSuccessfulEventListener();
    eventBus.register(listener);
    
    1. 发布事件。这将触发所有将PaymentSuccessfulEvent作为其参数并且还具有@Subscribe注解的方法。
    eventBus.post(paymentEvent);
    

    完整测试类:

    public class GuavaEventBusUnitTest {
    
        private PaymentSuccessfulEventListener listener;
        private EventBus eventBus;
    
        @Before
        public void setUp() {
            eventBus = new EventBus();
            listener = new PaymentSuccessfulEventListener();
    
            eventBus.register(listener);
        }
    
        @After
        public void tearDown() {
            eventBus.unregister(listener);
        }
    
        @Test
        public void paymentSuccessfulEvent_whenEventHandled_thenSuccess() {
            listener.resetEventsHandled();
    
            PaymentSuccessfulEvent paymentEvent = new PaymentSuccessfulEvent("PaymentSuccessful Event");
            eventBus.post(paymentEvent);
    
            assertEquals(1, listener.getEventsHandled());
        }
    
    }
    

    总结

    在本文中我们使用了一个简单的示例讲解如何使用Guava EventBus。

    展开全文
  •        在SuperMap iServer产品中封装了大部分GIS功能,比如基本地图功能、二三维...本文将重点介绍使用iserver REST API和SuperMap iObjects for Java(以下简称Java组件)来...

    作者:dongyx

           在SuperMap iServer产品中封装了大部分的GIS功能,比如基本的地图功能、二三维空间分析功能等,但是在使用上设置的条件都是固定的,用户没法根据自己的应用场景来自定义分析条件。本文将重点介绍使用SuperMap iServer REST API和SuperMap iObjects for Java(以下简称Java组件)来扩展iServer领域组件服务,本文以通过TIN地形或者模型数据缓存提取三维数据为场景,作为示例编写扩展服务。
           一、REST API和Java组件介绍
           SuperMap iServer 提供了基于 REST 的应用编程接口——SuperMap iServer REST API,这些接口封装了大部分的 GIS 功能,包括基本的地图功能,数据编辑功能,分析功能等。SuperMap iServer 将这些 GIS 功能通过 SuperMap iServer REST API 提供给客户端,客户端使用这些 API,能够获取到相应的 GIS 能力。有关 SuperMap iServer REST Service 的使用请参见帮助文档中 REST API 一节,REST API 着重讲述了 SuperMap iServer 提供的 REST 式服务情况和资源列表。访问资源的时候需要传递的参数,资源的响应结构,在其中都有详细的介绍。
    在这里插入图片描述
           SuperMap iObjects Java 是SuperMap Objects 家族中的一员,是基于超图共相式 GIS 内核进行开发的,采用 Java 技术的组件式 GIS 开发平台。SuperMap iObjects Java 9D 具有丰富、强大的GIS功能,Java组件提供了包括地图可视化、数据处理等GIS基础功能,还包括了强大的GIS空间分析、网络分析以及三维数据处理、展示、分析一体化。
    在这里插入图片描述
    二、功能的开发
    1.JSON数据的解析
           在前后端传输时大部分是以JSON格式的数据来进行传输,而且我们提供的REST API中发送GET请求返回的也是JSON数据,这时解析JSON数据就尤为重要了。JSON数据的常用格式如下:

    {"LayerNames":[["dixin","ddd"],["djjj"]],
     "URL":"http://192.168.15.69:8090/iserver/services/3D-dixin/rest/realspace", 
     "SceneNames":["dixin","ddd"], 
     "Point2Ds":["114,35,0","115.567808730122,39.9779554893349,0"]}
    

           JSON最常用的格式是对象的 键值对,如”LayerNames”为JSON的键,冒号后面的数组为这个键的值。那么如何去获取JSON里面的值呢,在Java语言中提供了JSONObject和JSONArray两个类,如果值不是一个数组的形式可以直接通过JSONObject来获取:

    JSONObject json = JSONObject.fromObject(json2);
    String url = (String) json.get("URL");
    

           如果值是一个数组,当然也可能是数组中嵌套了一个数组,下面以一个简单的数组来举例:

    JSONArray arrayLayer = json.getJSONArray("LayerNames");
    JSONArray jsonArray = JSONArray.fromObject(arrayLayer.get(i));
    String[] layerNames = new String[jsonArray.size()];
    for(int layer=0;layer<jsonArray.size();layer++) {
    	layerNames[layer] =(String)jsonArray.get(layer);
    			}
    

           我们在这个示例中所输入的参数就是一个json对象,所以我们在一开始就需要解析这个对象,然后通过REST API发送GET请求。
    2.使用REST API发送GET请求,获取模型缓存的绝对路径和TIN地形的绝对路径,比如在iserver上可以进入到图层节点,然后点击右边的rjson,会返回一个json对象,如:
    在这里插入图片描述
           在这个json对象中可以看到图层的绝对路径位置、图层类型等等,在iserver中也给我们提供了REST API,然后通过Java的URLConnection和URL实例来发送get请求,请求成功后会返回一个String对象,然后转换为JSON对象。
    3.Java功能的开发
           本文所提到的应用场景,通过模型或者地形数据来获取三维数据的功能就需要用Java组件来实现了,实现这个功能使用的接口CacheProcessor3D缓存处理类,实现代码如下:
           地形匹配三维点:

    ArrayList<Geometry3D> resultGeometry = new ArrayList<>();
    resultGeometry = CacheProcessor3D.geometryMatchTIN(data, geometryList);
    if(!resultGeometry.isEmpty()) {
    		pointZ = resultGeometry.get(0).getPosition().z;
    		System.out.println("高度为:"+pointZ);
    	    pointzs[pointNum] =String.valueOf(pointZ);
           	   }
    

           模型匹配三维点:

    ArrayList<Geometry3D> resultGeometry = new ArrayList<>();
    resultGeometry = CacheProcessor3D.geometryMatch(data, geometryList);
    if(!resultGeometry.isEmpty()) {
    	 for(int re = 0;re<resultGeometry.size();re++) {
    			 pointZ = resultGeometry.get(re).getPosition().z;
    			 pointzs[pointSize] = String.valueOf(pointZ);
                          }
    			 return "高度:"+String.join(",", pointzs);
    			   }
    

           如果想用地形匹配三维线,可以在参数中传入二维线几何对象即可。工程源码和json对象地址:Extract
    4.环境配置
           完成所有功能开发后,就需要配置环境了,将工程导出为普通的jar包即可,在工程上,“鼠标右键”–“Export”–“选择Java jar file”–“填写存储jar的路径及名称”–“一直next”–“finish”。即可生成Extract.jar包文件。
    在这里插入图片描述
           将上面生成的calculate.jar文件拷贝到iServer产品安装目录下…\webapps\iserver\WEB-INF\lib文件夹下。
           添加服务组件,进入iServer产品安装目录下…\webapps\iserver\WEB-INF文件夹下,编辑iServer服务配置文件iserver-services.xml,将下列代码添加到components节点内部。
    在这里插入图片描述
           启动iServer服务,进入iServer产品的bin目录,运行startup.bat批处理文件。
           进入服务列表,在领域服务组里找到Extract/rest服务,填写json串,执行即可
    在这里插入图片描述
    在这里插入图片描述
           执行结果如下:
    在这里插入图片描述

    展开全文
  • 窗口一般都会划分为一个个Panel面板,现在介绍如何在Frame窗口中创建Panel 面板. ...import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; /** * GUI 第一个界面...
  • Java组件

    千次阅读 2011-04-28 09:57:00
    JAVA组件大全 复选框、选项按钮、列表方框、下拉式列表的使用与介绍 收藏 7-1:使用JCheckBox组件: 类层次结构图:  java.lang.Object  --java.awt.Component  --java.awt....
  • JAVA 菜单栏组件的使用

    千次阅读 2011-07-22 19:25:17
    用到javax.swing.里一些菜单组件窗口顶部菜单栏,主要用到JMenuBar(菜单条),JMenu(菜单),JMenuItem(菜单项),Separator(分隔符)等关系如下图: 其中,容器.add(JMenuBar) JMenuBar对象.add(JMenu)
  • Java使用ApacheFileUpload组件进行文件上传
  • JAVA组件使用---UUID使用方法

    万次阅读 2013-01-20 19:42:05
    JAVA UUID 生成 GUID是一个128位长数字,一般用16进制表示。算法核心思想是结合机器网卡、当地时间、一...UUID是1.5中新增一个类,在java.util下,用它可以产生一个号称全球唯一ID package com.my
  • JAVA学习之GUI组件中Toolkit的使用

    千次阅读 2016-03-01 11:30:17
    JAVA学习之GUI组件中Toolkit的使用
  • 使用java swing组件搭建简单游戏窗体,实现己方对象上下左右移动基础步骤解析 首先要搭建一个窗口,即新建一个类,继承Jframe类,并且在类中搭建好你窗体:如窗体大小、窗体布局方式、窗体位置、窗体...
  • Java组件(JTree)的使用

    千次阅读 2018-02-13 18:46:55
    JTree的使用,离不开JScrollPane与JPanel。使用JTree,必须先将JTree添加至JScrollPane(带有滚动条),再将JScrollPane添加至JPanel(实现流式布局),再将JPanel添加至JFrame(将JTree显示出来)比如制作一个对生物进行...
  • Java swing 一些组件的学习和使用

    千次阅读 2017-04-11 11:26:36
    利用一些组件编写一个java登录界面: import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax....
  • Java EE 组件使用 Camel Routes

    千次阅读 2015-07-17 02:53:10
    摘要:你可以通过集成 Camel 和 WildFly 应用服务器(使用 WildFly-Camel 子系统)在 Java EE 组件中开始使用 Apache Camel Routes。【编者按】作者 Markus Eisele 是 Red Hat Developer Advocate,主要从事 ...
  • 使用Java组件itext 生成pdf介绍

    千次阅读 2012-11-19 12:19:46
    iText是一个能够快速产生PDF文件的java...使用iText与PDF能够使你正确控制Servlet输出。  iText是一个能够快速产生PDF文件的java类库。iText的java类对于那些要产生包含文本,表格,图形只读文
  • Hutool是一个Java工具包,也只是一个工具包,它帮助我们简化每一行代码,减少每一个方法。针对常用工具提供了如:XML工具-XmlUtil,数字工具-NumberUtil,正则工具-ReUtil,对象工具-ObjectUtil等常用实用,下面说...
  • Java--Apache里面BeanUtils组件使用

    千次阅读 2018-10-11 13:50:59
    BeanUtils BeanUtils是Apache commens组件里面成员,由Apache提供一套开源api,用于简化对javaBean操作,能够对...简单来说,javaBean实质就是java类,只不过是遵循了某种规范的java类。 javaBean特点:...
  • 更多技术文章请访问我个人博客这篇文章使用Java组件显示窗口,在通过输入图片url地址在窗口中显示出来,可作为一个网络图片查看器,感兴趣可以打包成jar或者.exe文件方便使用,这里我只挂出了源码,效果如下图...
  • 原由:使用Jacob访问windows下的COM组件的试验老是不成功(后来搜索到http://blog.sina.com.cn/u/435ce819010002r0,按他的办法据说可以成功),折腾了我一天。网上有说使用Jawin的,我试了一试就成功了
  • 字体和颜色设置 Color类 公共静态属性:共13个静态属性,分别代表13种不同颜色常量。 构造函数 public Color(int r,int g,int b):以整数形式给出红、绿、蓝三个分量值,每个分量范围:0~255 public ...
  • java 调用windowsCOM组件举例(使用JACOB)(转自这里) 最近公司需要做一个效果,开发一个程序能在程序运行时打开microsoft office相关软件,实时写入,然后能关闭,你能看到数据写入效果。如下图: 发现用...
  • JAVA的AWT组件概述

    千次阅读 2018-05-07 15:28:50
    1.组件 组件(component)是构成图形用户界面基本成分和核心元素,组件类(Component)是一个抽象类,是AWT组件根类,实际使用的组件都是Component子类。Component类提供对组件操作通用方法,包括设计组件...
  • 1、java使用到的图形类主要在java.awt 与javax.swing包中。 2、java.awt 与 javax.swing包的区别:① java.awt中使用的图形类都是依赖于系统的图形库的。...组件的类别:容器组件、非容器组件 1...
  • java Swing组件之JSplitPane使用

    万次阅读 2016-05-08 17:00:23
    使用 JSplitPane.HORIZONTAL_SPLIT 可让分隔窗格中两个 Component 从左到右排列,或者使用 JSplitPane.VERTICAL_SPLIT 使其从上到下排列。改变 Component 大小首选方式是调用 setDividerLocation,其中 ...
  • Java——commons-io组件的环境搭建与简单使用 一、commons-io组件的环境搭建 commons-io组件是apache里面的一个组件,组件的也就是jar包的集合。使用来简化我们io操作的。 说起apache,不得不去夸一下这个组织,...
  • Java日志组件 slf4j 使用案例及原理分析 一、slf4j 日志组件介绍 ...在项目线上运行的过程中,日志基本成为我们了解系统运行状态的唯一工具,因此,了解好Java中常见日志组件的使用以及原理,对我...
  • Joone、Encog 和 Neuroph是三个著名开源的java的神经网络的组件,各有特点。这里给出了三个开源代码基于XOR训练和测试过程。对于初涉神经网络程序员是个很好学习资料。
  • 2、创建一个init()方法,用于初始化,并在初始化的时候进行组件的组装,并定义组件需要监听的内容和相应行为; 3、在main()方法中调用初始化方法,使界面呈现。 下面以《疯狂Java讲义》一书中代码进行说明。该代码...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 28,888
精华内容 11,555
关键字:

java组件的使用

java 订阅