Galaxy 开源框架

简介

Galaxy是一款Java web开发框架,集轻量级、高性能、创新于一体,为Javaosc社区提供核心支持。通过最佳项目实践,在保证性能和稳定的同时,引入优秀的第三方插件,让开发者能够更加简洁和高效的使用Java语言来开发。接下来就让我们一起来学习下Galaxy框架吧~

基础环境

在框架的开发中我们逐渐发现了Jdk1.7+的一些进步和改善以及Jdk1.6的一些不足之处,所以本框架基于Jdk1.7+和Tomcat7.0+环境而开发。如果您是将要建立的工程或项目,我们欢迎您加入到Galaxy的使用中;如果您是老项目的迁移,我们建议您评估当前迁移的工作量和人力成本,自我做下决定。


依赖关系

核心依赖:

slf4j-api.jar(通用日志接口),属于强依赖,必不可少。(可以用此接口引入logback或log4j实现日志功能)

选择性场景依赖:(看到下面的介绍不要恐惧,以下是全场景的可选依赖,并且类包小到没有朋友)

1. Dao层不使用接口类,仅当作编写Sql的模板用或注入无接口的单例类,则引用Cglib-nodep动态代理类包;
2. 页面需要返回Json数据,则需引入Google的Gson类包;
3. 实现数据库连接池,则需要引入HikariCP或C3p0类包;
4. 页面需要使用模板引擎,则需要引入Dubbo作者的Httl类包;

依赖预览: 必须依赖:555.1 KB,可选依赖:1069.27 KB,版本推荐实时维护

  • 立即下载必须galaxy-0.9.6.RELEASE.jar - Galaxy框架 - 172KB
  • 立即下载必须slf4j-api-1.7.22.jar - 通用日志接口 - 40.1KB - 建议使用logback实现日志,原log4j作者新作 *
  • 立即下载必须cglib-nodep-3.2.4.jar - 动态代理,Jdk代理的增强实现 - 343KB
  • 立即下载可选gson-2.8.0.jar - Json处理插件 - 143KB
  • 立即下载可选HikariCP-2.4.7.jar - 数据库连接池 - 133.17KB - 推荐使用,字节码实现,新一代连接池 *
  • 立即下载可选c3p0-0.9.2.jar - 数据库连接池 - 414KB
  • 立即下载可选httl-1.0.12.jar - 模板引擎 - 526KB
  • 由于作者08年后不再维护,通过精简重构,已内置于框架。原作者:Tim O'Reillycos-05Nov2002.jar - 上传插件 - 55KB

启动尝鲜

1. 新建web项目并将galaxy-x.x.x.RELEASE.jar和slf4j-api-1.7.22.jar添加到lib目录下 目前maven仓库还未开放

2. 为该项目的WEB-INF目录下,添加如下web.xml配置并新建index.jsp,并在该页面的body里写入Hello!

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:jsp="http://java.sun.com/xml/ns/javaee/jsp" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>galaxy framework example</display-name>
<!-- 配置框架监听 --> <listener> <listener-class>org.javaosc.galaxy.web.ContextListener</listener-class> </listener>
<!-- 监听下装载核心配置 --> <context-param> <param-name>>galaxyConfig</param-name> <param-value>galaxy.properties</param-value> </context-param>
<!-- 静态文件放行 --> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.css</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.jpg</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.png</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.gif</url-pattern> </servlet-mapping> <!-- 配置核心转发 --> <servlet> <servlet-name>galaxy</servlet-name> <servlet-class>org.javaosc.galaxy.web.ContextServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>galaxy</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- 配置启动欢迎页 --> <welcome-file-list> <welcome-file>/WEB-INF/index.jsp</welcome-file> </welcome-file-list> </web-app>
<body>
Hello!
</body>

3. 为该项目的src目录添加galaxy.properties核心配置

#============== galaxy configuration setting ==============
galaxy.context.encode = UTF-8  //设置框架的上下文编码,默认UTF-8
galaxy.request.character.encode = true //设置请求编码 ,默认false
galaxy.response.character.encode = true //设置响应编码,默认false

galaxy.console.started.status = true //控制台是否输出框架欢迎提示,默认true

galaxy.datasource.open.status = false //开启数据源初始化,默认true
			   

4. 将项目工程部署到Tomcat7.0下启动,控制台输出框架欢迎提示并且新建的index.jsp成功显示Hello!。


转发控制器

action的method方法的接收参数支持Java基础类型、基础包装类型、自定义oo对象、HttpServletRequest和HttpServletResponse、Json数据的body体和上传文件的MultipartFile,目前上传可以根据HttpServletRequest和框架工具类实现,还在考虑是否包装对象参数来实现,这样势必会增加学习曲线,后期会根据大家的建议来考虑是否把cos插件纳入到框架中成为Galaxy的一部分,cos插件的作者已经不维护了,纳入进来后我们会进行二次重构,请知悉!

1) 网页发送请求到自定义url路径,并成功返回

1. 为galaxy.properties添加页面路径和扫描类包路径配置

galaxy.view.prefix = /WEB-INF //请求返回的页面根目录,默认/WEB-INF
galaxy.view.suffix = .jsp //请求返回的页面的后缀格式,默认.jsp

galaxy.scaner.annotation.package = com.javaosc //要扫描的类包根目录或指定目录

2. 在src目录下新建包:com.javaosc.user.action,并新建类:UserAction

3. 为UserAction类上添加@Mapping("/user")注解;新建返回类型为String的方法,并在方法上添加注解@Mapping("/hello"),并在方法里添加返回到页面的数据:world,并将方法返回到index.jsp

package com.javaosc.user.action;

import org.javaosc.galaxy.annotation.Mapping;
import org.javaosc.galaxy.web.assist.ContextHandler;

@Mapping("/user")
public class UserAction {
	
	@Mapping("/hello")
	public String getUserList(){
	   ContextHandler.putAttr("h","world");
	   return "index";
	}
}

4. 编辑在WEB-INF目录下的index.jsp,在Hello后面添加${h}

<body>
Hello,${h }!
</body>

5. 在浏览器输入localhost/user/hello 回车发送请求,成功显示Hello,world!即可

2) 让action的方法具备返回json的能力

1. 改造之前的方法,加入传参Byte type,并将gson-2.8.0.jar添加到lib下,返回json数据

@Mapping("/hello")
public String getUserList(Byte type){
	if(type==null || type==0){
		ContextHandler.putAttr("h","world");
		return "index";
	}else{
		ContextHandler.putJson("h","world");
		return null;
	}
}

2. 在地址栏输入localhost/user/hello?type=1回显json格式数据即成功,不输入或者type=0返回到index.jsp数据

3) 让action的方法返回到页面多个参数或者输出oo对象

1. 在src目录下新建包:com.javaosc.user.model,并且新建类:User,并在类上注入@Bean注解

package com.javaosc.user.model;

import org.javaosc.galaxy.annotation.Bean;

@Bean
public class User {
  
  private Integer userId;
  private String userName;
  private Integer age;
  private Byte type;
  
  public Integer getUserId() {
    return userId;
  }
  public void setUserId(Integer userId) {
    this.userId = userId;
  }
  public String getUserName() {
    return userName;
  }
  public void setUserName(String userName) {
    this.userName = userName;
  }
  public Integer getAge() {
    return age;
  }
  public void setAge(Integer age) {
    this.age = age;
  }
  public Byte getType() {
    return type;
  }
  public void setType(Byte type) {
    this.type = type;
  }
  
}

2. 改造之前的方法参数为User user,并用putAttr多个参数到页面,将User对象包含在内返回,并对User对象里的age属性设置18

@Mapping("/hello")
public String getUserList(User user){
	user = user==null?new User():user;
	user.setAge(18);
	if(user.getType()==null || user.getType()==0){	
		ContextHandler.putAttr("h","world","name","dylan","user",user);
		return "index";
	}else{
		ContextHandler.putJson("h","world");
		return null;
	}
}

3. 在index.jsp获取name的值,并且从User对象里获取到age属性显示


Hello,${h }! my name is ${name },${user.age } year old!

4. 在地址栏输入localhost/user/hello 或者后缀type=0,回显index.jsp数据即可

4) 让action的方法返回json的User对象

1. 改造else的putJson如下,返回User对象

ContextHandler.putJson(user);

2. 在地址栏输入localhost/user/hello?type=1,返回User对象的json数据即可

5) 让action的方法返回json自定义属性的对象

1. 改造else的putJson如下,返回多个自定义属性

ContextHandler.putJson("h","world","name","dylan","user",user);

2. 在地址栏输入localhost/user/hello?type=1,返回json数据中包含user对象即可

6) 让action的方法可以拥有动态占位url

1. 改造方法上的@Mapping注解的设置为{type}

@Mapping("/{type}")
public String getUserList(User user){
    user = user==null?new User():user;
    user.setAge(18);
    if(user.getType()==null || user.getType()==0){
      ContextHandler.putAttr("h","world","name","dylan","user",user);
      return "index";
    }else{
      ContextHandler.putJson(user);
      return null;
    }
}

2. 在地址栏输入localhost/user/0或者localhost/user/1,分别页面对象和json数据即可

7) action默认是单例多线程的,让其成为多例模式,在类上添加@Prototype注解

@Prototype
@Mapping("/user")
public class UserAction {
    ...
}

8) 通过url请求直接返回到页面,不经过action控制器的处理(可以无限多个)

1. 为galaxy.properties添加页面url跳转,配置必须以galaxy.url.为开头。其中第二个等号的左边为浏览器url;右边为以galaxy.view.prefix配置为基础的相对页面目录(格式:galaxy.url.x.x...= /浏览器url=/相对页面目录)

galaxy.url.user.detail = /user/detail=/detail

2. 在WEB-INF根目录下,新建detail.jsp并在body标签里填写Hello,world!

<body>
Hello,World!
</body>

3. 在地址栏输入localhost/user/detail,页面直接成功跳转到detail.jsp并显示Hello,world!


Sql模板

目前jdbcHanler支持单列单行,单列多行,对象(多列)单行,对象(多列)多行,分页多行查询;支持单条和批量增、删、改,能够支撑几乎所有的场景,除级联一对多个附表查询以外,对数据库的列我们内置做了预缓存,数据库表的列多个字母可以用英文下划线隔开,ps:user_name,对其他特殊字符我们无法完成表列对oo对象的映射,请知悉!

1) 为action转发控制器添加数据源访问,完成dao模板注入到action控制器(下个模块会加入service业务逻辑处理)

1. 为galaxy.properties添加数据源(目前支持HikariCP或C3P0连接池)配置并开启访问数据源开关,我们选择HikariCP来完成演示

galaxy.datasource.open.status = true //数据源开关,默认true,修改为true或者将此配置项移除

# ====== HikariCP connect setting ======

db.driverClassName = com.mysql.jdbc.Driver //数据库驱动
db.jdbcUrl = jdbc:mysql://localhost:3306/javaosc?useUnicode=true&characterEncoding=UTF-8 //数据库链接及库名
db.username = root //数据库的账号
db.password = 123 //数据库的密码

pool.dataSource = com.zaxxer.hikari.HikariDataSource //数据连接池
pool.maxPoolSize = 100
pool.maxIdleTime = 300000
pool.maxLifetime = 900000
pool.connectionTimeout = 30000
pool.validationTimeout = 5000

pool.cachePrepStmts=true
pool.prepStmtCacheSize=250
pool.prepStmtCacheSqlLimit=2048

2. 将cglib-nodep-3.2.4.jar,HikariCP-2.4.7.jar连接池和mysql-connector-java-5.1.38.jar数据库驱动添加到项目lib目录,并在mysql中新建javaosc库和user表,添加user_id,user_name,age,type列,完成和之前控制器中User对象的列对应关系

3. 在src目录下新建包:com.javaosc.user.dao,并且新建dao模板类:UserDao,在该类上添加@Dao注解,并且将jdbcTemplate声明为全局类变量,为此全局变量添加@Autowired,达到注入作用

package com.javaosc.user.dao;

import org.javaosc.galaxy.annotation.Autowired;
import org.javaosc.galaxy.annotation.Dao;
import org.javaosc.galaxy.jdbc.JdbcTemplate;

@Dao
public class UserDao{
  
  @Autowired
  private JdbcTemplate jdbcTemplate;
  

}

4. 在UserDao类中新建方法User getUser(User user),并在此类中新建方法,编写对象单行查询sql

package com.javaosc.user.dao;

import org.javaosc.galaxy.annotation.Autowired;
import org.javaosc.galaxy.annotation.Dao;
import org.javaosc.galaxy.jdbc.JdbcTemplate;

import com.javaosc.user.model.User;

@Dao
public class UserDao{
  
  @Autowired
  private JdbcTemplate jdbcTemplate;

  public User getUser(User user) {
    String sql = "select * from user where user_id = ?";
    return jdbcTemplate.getForObject(sql, User.class, user.getUserId());
  }
  
}

5. 将UserDao类声明为UserAction的全局变量类,并将其用@Autowired注解注入,在UserAction类中新建geyUserDetail(Integer userId)方法并调用dao模板的getUser(User user)方法,完成控制器访问数据源

package com.javaosc.user.action;

import org.javaosc.galaxy.annotation.Autowired;
import org.javaosc.galaxy.annotation.Mapping;
import org.javaosc.galaxy.web.assist.ContextHandler;

import com.javaosc.user.dao.UserDao;
import com.javaosc.user.model.User;

@Mapping("/user")
public class UserAction {
  
  @Autowired
  private UserDao userDao;
  
  @Mapping("/get")
  public String getUserList(Integer userId){
    User user = new User();
    user.setUserId(userId);
    User result = userDao.getUser(user);
    ContextHandler.putJson(result);
    return null;
  }

}

6. 在地址栏输入localhost/user/get?userId=1,页面能够成功显示数据源的json格式数据即可!

web.xml 细节说明

1. 添加框架监听容器配置 (建议放在文件最顶部) 必须

<listener>
<listener-class>org.javaosc.galaxy.web.ContextListener</listener-class>
</listener>

2. 为框架装载核心配置 (紧跟上述监听配置) 必须

<context-param>
<param-name>galaxyConfig</param-name>
<param-value>configuration.properties</param-value>
</context-param>

说明:其中galaxyConfig命名不可改变;configuration.properties文件推荐建立在src根目录下,此文件可以自由重命名和改变所在目录,前提是文件命名和所在目录要与此配置项引用保持一致。

3. 为框架装载业务扩展配置 (紧跟核心配置项) 可选

<context-param>
<param-name>expandConfig</param-name>
<param-value>a.properties,b.properties</param-value>
</context-param>

说明:其中expandConfig命名不可改变;a,b.properties文件推荐建立在src根目录或子目录下,支持多个扩展配置装载,此文件可以自由重命名和改变所在目录,前提是文件命名和所在目录要与此配置项引用保持一致。


侧栏导航
官方社区
www.javaosc.com
正在开发中,敬请期待~ 谢谢!