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类包;
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. 为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!即可
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数据
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数据即可
1. 改造else的putJson如下,返回User对象
ContextHandler.putJson(user);
2. 在地址栏输入localhost/user/hello?type=1,返回User对象的json数据即可
1. 改造else的putJson如下,返回多个自定义属性
ContextHandler.putJson("h","world","name","dylan","user",user);
2. 在地址栏输入localhost/user/hello?type=1,返回json数据中包含user对象即可
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数据即可
@Prototype @Mapping("/user") public class UserAction { ... }
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!
目前jdbcHanler支持单列单行,单列多行,对象(多列)单行,对象(多列)多行,分页多行查询;支持单条和批量增、删、改,能够支撑几乎所有的场景,除级联一对多个附表查询以外,对数据库的列我们内置做了预缓存,数据库表的列多个字母可以用英文下划线隔开,ps:user_name,对其他特殊字符我们无法完成表列对oo对象的映射,请知悉!
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格式数据即可!
<listener>
<listener-class>org.javaosc.galaxy.web.ContextListener</listener-class>
</listener>
<context-param>
<param-name>galaxyConfig</param-name>
<param-value>configuration.properties</param-value>
</context-param>
说明:其中galaxyConfig命名不可改变;configuration.properties文件推荐建立在src根目录下,此文件可以自由重命名和改变所在目录,前提是文件命名和所在目录要与此配置项引用保持一致。
<context-param>
<param-name>expandConfig</param-name>
<param-value>a.properties,b.properties</param-value>
</context-param>
说明:其中expandConfig命名不可改变;a,b.properties文件推荐建立在src根目录或子目录下,支持多个扩展配置装载,此文件可以自由重命名和改变所在目录,前提是文件命名和所在目录要与此配置项引用保持一致。