搭建一个基础的Resty项目框架

 更新时间:2022年03月07日 14:19:43   作者:gitbooks  
这篇文章主要为大家介绍了如何搭建一个基础的Resty项目框架示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步

一个Resty项目包含的部分(resty-route):

1. RestFilter

像其他web框架一样,Resty也需要一个入口,在web.xml里配置,和常规的Filter区别不大

  <filter>
    <filter-name>RestyFilter</filter-name>
    <filter-class>cn.dreampie.route.RestyFilter</filter-class>
    <init-param>
      <param-name>exclusions</param-name>
      <!--把不经过Resty过滤的文件或者目录配置在这儿,逗号分割-->
      <param-value>/**/*.js,/**/*.gif,/**/*.jpg,/**/*.png,/**/*.css,/**/*.ico,/druid/**</param-value>
    </init-param>
    <init-param>
      <!--Resty的核心配置文件,看第2点-->
      <param-name>configClass</param-name>
      <param-value>cn.dreampie.config.AppConfig</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>RestyFilter</filter-name>
    <!--过滤的路径-->
    <url-pattern>/*</url-pattern>
  </filter-mapping>

2. Config

Resty的核心配置文件,你需要自己编写一个Config的java文件,并继承Config类,参考如下,根据自己的实际情况选择配置

public class AppConfig extends Config {
  /**
   * Config constant
   * 配置常量,目前只能配置render,其他全局配置会自动读取根目录下的application.properties文件
   */
  public void configConstant(ConstantLoader constantLoader) {
    //通过后缀来返回不同的数据类型  你可以自定义自己的 render
    //如:public class FreemarkerRender extends Render{}
    //目前支持json,text,file三种输出
    //constantLoader.addRender("ftl", new FreemarkerRender());
  }
  /**
   * Config resource
   * 配置Resource的扫描目录
   */
  public void configResource(ResourceLoader resourceLoader) {
    //设置resource的目录 Resty启动时通过扫描配置的目录来添加Resouce
    //排除某个目录
    //resourceLoader.addExcludePackages("cn.dreampie.resource");
    //扫描某个目录
    resourceLoader.addIncludePackages("cn.dreampie.resource");
  }
  /**
   * Config plugin
   * 配置插件 数据库相关配置信息和constant一样  都会自动读取application.properties文件
   */
  public void configPlugin(PluginLoader pluginLoader) {
    //第一个数据源 使用c3p0连接池,数据源名字 default
    //C3p0DataSourceProvider cdsp = new C3p0DataSourceProvider("default");
    //activerecord 初始化会从数据库获取表的元数据 并映射到class
    //ActiveRecordPlugin activeRecordCdsp = new ActiveRecordPlugin(cdsp, true);
    //排除的model目录
    //activeRecordCdsp.addExcludePackages("cn.dreampie.orm");
    //扫描的model目录
    //activeRecordCdsp.addIncludePackages("cn.dreampie.orm");
    //pluginLoader.add(activeRecordCdsp);
    //第二个数据源 使用druid连接池 数据源名字 demo
    //DruidDataSourceProvider ddsp = new DruidDataSourceProvider("demo");
    //ActiveRecordPlugin activeRecordDdsp = new ActiveRecordPlugin(ddsp, true);
    //pluginLoader.add(activeRecordDdsp);
    //jndi数据源 数据源名字jndiDs
    //JndiDataSourceProvider jdsp=new JndiDataSourceProvider("jndiDs","jndiName");
    //ActiveRecordPlugin activeRecordJdsp = new ActiveRecordPlugin(ddsp, true);
    //pluginLoader.add(activeRecordJdsp);
  }
  /**
   * Config interceptor applied to all actions.
   * 全局拦截,会在进入路由后,执行方法前执前 
   */
  public void configInterceptor(InterceptorLoader interceptorLoader) {
    //权限拦截器
    //interceptorLoader.add(new SecurityInterceptor(2, new MyAuthenticateService()));
    //Resource层事务的拦截器 @Transaction
    //interceptorLoader.add(new TransactionInterceptor());
  }
  /**
   * Config handler
   * 全局的拦截,会在进入路由前执行
   */
  public void configHandler(HandlerLoader handlerLoader) {
    //跨域
    handlerLoader.add(new CORSHandler());
  }
  /**
   * Call back after Resty start
   */
  public void afterStart() {
    //Resty启动前执行的操作
  }
  /**
   * Call back before Resty stop
   */
  public void beforeStop() {
    //Resty停止前执行的操作
  }

3. resources

application.properties 系统全局的配置信息

#not must auto load
app.encoding=UTF-8
app.devMode=true
app.showRoute=false
app.cacheEnabled=true
app.cacheManager=cn.dreampie.cache.redis.RedisCacheManager
##druid plugin auto load
db.default.url=jdbc:mysql://127.0.0.1/example?useUnicode=true&characterEncoding=UTF-8
db.default.user=dev
db.default.password=dev1010
db.default.dialect=mysql
#c3p0配置
c3p0.default.minPoolSize=3
c3p0.default.maxPoolSize=20
#druid配置
#druid.default.initialSize=10
#druid.default.maxPoolPreparedStatementPerConnectionSize=20
#druid.default.timeBetweenConnectErrorMillis=1000
#druid.default.filters=slf4j,stat,wall
#flyway database migration auto load
flyway.default.valid.clean=true
flyway.default.migration.auto=true
flyway.default.migration.initOnMigrate=true
db.demo.url=jdbc:mysql://127.0.0.1/demo?useUnicode=true&characterEncoding=UTF-8
db.demo.user=dev
db.demo.password=dev1010
db.demo.dialect=mysql
#druid
druid.demo.initialSize=10
druid.demo.maxPoolPreparedStatementPerConnectionSize=20
druid.demo.timeBetweenConnectErrorMillis=1000
druid.demo.filters=slf4j,stat,wall
#flyway
flyway.demo.valid.clean=true
flyway.demo.migration.auto=true
flyway.demo.migration.initOnMigrate=true

4. 编写一个Resource

如果我们需要在url中体现版本推荐首先创建一个ApiResource的基础Resource的java类

/**
 * 通过@API 来知道api的url,如果子对象也使用了@API注解,他们的url会拼接
 */
@API("/api/v1.0")
public class ApiResource extends Resource {
  /**
   * 基础的api Resource 用来添加基础的路径或版本号 和一些公用方法
   */
}
/**
 *上面说到@API会被拼接,那么TestResource的api就是 /api/v1.0/tests
 */
@API("/tests")
public class TestResource extends ApiResource {
  /**
   * @GET 没有指定url时,访问改方法的api为 GET /api/v1.0/tests
   */
  @GET
  public WebResult get() {
    //如果需要返回请求状态  使用new WebResult
    return new WebResult(HttpStatus.OK, Maper.of("a", "1", "b", "2"));
  }
  /**
   * @GET("/:name") 或 @GET("/{name}") 来设置url参数
   */
  @GET("/:name")
  public WebResult get(String name) {
    //如果需要返回请求状态  使用new WebResult
    return new WebResult(HttpStatus.OK, Maper.of("a", "1", "b", "2"));
  }
  /**
   * 访问改方法的api为 POST /api/v1.0/tests/post
   * 传入参数时 test=json字符串
   */
  @POST("/post")
  public Map post(Map<String, String> test) {
    return test;
  }
}

以上就是搭建一个基础的Resty项目框架的详细内容,更多关于搭建Resty项目框架的资料请关注脚本之家其它相关文章!

相关文章

  • 为什么程序中突然多了 200 个 Dubbo-thread 线程的说明

    为什么程序中突然多了 200 个 Dubbo-thread 线程的说明

    这篇文章主要介绍了为什么程序中突然多了 200 个 Dubbo-thread 线程的说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • java学习之JVM运行时常量池理解

    java学习之JVM运行时常量池理解

    这篇文章主要介绍了java学习之JVM运行时常量池理解,对常量池的好处以及基本类型的包装类常量池等作了简要分析,有需要的朋友可以借鉴参考下
    2021-09-09
  • SpringBoot项目启动后再请求远程接口的解决方式

    SpringBoot项目启动后再请求远程接口的解决方式

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的创建、运行、调试、部署等,这篇文章主要介绍了SpringBoot项目启动后再请求远程接口的实现方式 ,需要的朋友可以参考下
    2023-02-02
  • Spring自动装配@Autowired教程

    Spring自动装配@Autowired教程

    @Autowired注解是Spring中非常重要且常见的,接下来就简要的介绍一下它的用法。@Autowired默认是通过set方法,按照类型自动装配JavaBean,set方法可省略不写,它主要是修饰在成员变量上
    2023-01-01
  • log4j.properties 配置(实例讲解)

    log4j.properties 配置(实例讲解)

    下面小编就为大家带来一篇log4j.properties 配置(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Java使用continue语句的实例详解

    Java使用continue语句的实例详解

    这篇文章主要介绍了Java使用continue语句的实例详解的相关资料,希望通过本文能帮助到大家,让大家掌握使用方法,需要的朋友可以参考下
    2017-10-10
  • java二叉树的非递归遍历

    java二叉树的非递归遍历

    二叉树的递归遍历比较简单,这里就不聊了,今天主要聊聊二叉树的非递归遍历,主要借助于“栈”后进先出的特性来保存节点的顺序,先序遍历和中序遍历相对来说比较简单,重点理解后序遍历
    2020-12-12
  • java 压缩图片(只缩小体积,不更改图片尺寸)的示例

    java 压缩图片(只缩小体积,不更改图片尺寸)的示例

    这篇文章主要介绍了java 如何压缩图片体积,帮助大家更好的利用Java处理图片,应对特殊情况,感兴趣的朋友可以了解下
    2020-10-10
  • Spring中的Filter过滤器详解

    Spring中的Filter过滤器详解

    这篇文章主要介绍了Spring中的Filter过滤器详解,Filter 程序是一个实现了特殊接口的 Java 类,与 Servlet 类似,也是由 Servlet 容器进行调用和执行的,需要的朋友可以参考下
    2023-08-08
  • spring中@Transactional 注解失效的原因及解决办法

    spring中@Transactional 注解失效的原因及解决办法

    面试中经常会被问到事务失效的场景有哪些,本文主要介绍了spring中@Transactional 注解失效的原因及解决办法,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06

最新评论