个人项目PowerOfLengedJxBrowser-通过注解处理Js与Java交互(一)

PowerOfLengedJxBrowser项目目前处于暂停状态,它是一个半成品,也不知什么时候再启动。

 

在做Java和Js交互时,需要写jsObject.setProperty("Test",new xxxx());这样的代码注入Java对象。

写一两个还好,写多了,不免有些麻烦。而且,一次注入多个对象,在启动时,很可能出现Js调用Java方法时,对象还没加载完成从而报错。于是,我通过注解设计了一个工具类去统一处理Java和Js交互。

在使用springmvc和springboot开发网站项目时,在Controller层的类上加上注解,我们就可以通过指定路径访问这个类,调用这个类的方法。在shiro中,加入权限注解,便可以实现控制对方法的访问。这便是注解的强大之处。

可参照PowerOfLengedJxBrowser项目阅读本文

设计思路

1、定义注解

2、程序启动时,扫描注解类,创建类对象,保存到内存中

3、前端JS传递参数,调用对应的Java对象的方法

为了避免处理数据类型带来的不便,数据交互统一采用JSON,即JS传入JAVA的数据为JSON字符串,JAVA返回给JS的数据类型也是JSON字符串

定义注解

我定义了三个注解,JsClass、JsFunction、JsObject

JsClass作用于类,标识类的名称。类似于Spring中的@Controller

JsFunction作用于方法,标识方法名。前端JS通过JsFunction的名字调用这个方法

JsObject作用于JsClass生命的类对象,类似于Spring中的@Autowire。用的少

注解定义如下:

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
/**
 * javascript类注解,程序启动时扫描器会扫描指定包下的包含JsClass注解的类
 * jsname为前端公共JS函数调用java方法时的前缀名  如@JsClass(jsname="Test"),js调用形式为 Java.exec("Test.xx",{});
 * @author liuming
 */
@Documented
@Target(ElementType.TYPE)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface JsClass {
    /**类实例名,可根据这个名称获取保存在扫描器的类实例对象*/
    String name() default "";
    /**JS函数名称前缀**/
    String jspre() default "";
}
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
/**
 * javascript函数注解,程序启动时扫描器会扫描指定包下的包含JsClass注解的类,收集包含JsFunction注解的方法
 *
 * @author liuming
 */
@Documented
@Target(ElementType.METHOD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface JsFunction {
    /**函数名*/
    String name();
    /**本方法的调用描述,对应文档的“公共函数调用方式,需引入static/js/common.js”,暂未使用*/
    String desc() default "";
}
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
/**
 * @Description:自动注入扫描器的对象
 * @author liuming
 */
@Documented
@Target(ElementType.FIELD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface JsObject {
 
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值