Solon詳解系列文章:
Solon詳解(一)- 快速入門
Solon詳解(二)- Solon的核心
Solon詳解(三)- Solon的web開發html
//資源路徑說明(不用配置;也不能配置) resources/application.properties(或 application.yml) 爲應用配置文件 resources/static/ 爲靜態文件根目標 resources/WEB-INF/view/ 爲視圖模板文件根目標(支持多視圖共存) //調試模式: 啓動參數添加:-deubg=1
Solon 的默認靜態資源的路徑爲:(這個沒得改,也不讓改;爲了簡化套路)java
resources/static/
在默放的處理規則下,全部請求,都會先執行靜態文件代理。靜態文件代理會檢測是否存在靜態文件,有則輸出,沒有則跳過處理。輸出的靜態文件會作304控制。mysql
Solon裏全部的處理,都屬於XHandler。能夠用handler 的模式寫,也能夠用controller的模式寫(XAction 也是 XHandler)web
// handler模式 // XApp.global().before("/hello/", ctx->{ if(ctx.param("name") == null){ ctx.setHandled(true); //若是沒有name, 則終止處理 } }); // controller模式(只是換了個註解) // @XInterceptor public class HelloInterceptor { @XMapping(value = "/hello/" , before = true) public void handle(XContext ctx, String name) { if(name == null){ ctx.setHandled(true); //若是沒有name, 則終止處理 } } }
@XConfiguration public class Config{ @XInject("${classpath:user.yml}") private UserModel user; }
HiKariCP是數據庫鏈接池的一個後起之秀,號稱性能最好,能夠完美地PK掉其餘鏈接池。做者特別喜歡它。sql
<dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>3.3.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.18</version> </dependency>
test.db1: schema: "rock" jdbcUrl: "jdbc:mysql://localdb:3306/rock?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=true" driverClassName: "com.mysql.cj.jdbc.Driver" username: "demo" password: "UL0hHlg0Ybq60xyb" maxLifetime: 1000000
建議這種操做,都安排在 @XConfiguration 配置類裏執行。數據庫
//註解模式 // @XConfiguration public class Config{ @XBean pubblic HikariDataSource dataSource(@XInject("${test.db1}") HikariDataSource dataSource){ retun dataSource; } } //靜態類模式 // //public class Config{ // pubblic static HikariDataSource dataSource = XApp.cfg().getBean("test.db1", HikariDataSource.class); //}
以後就能夠經過@XInject註解獲得這個數據源了。實際上通常不會直接使用數據源。apache
Wee3是和Solon同樣輕巧的一個框架,配置起來天然是簡單的。json
在pom.xml中引用weed3擴展組件瀏覽器
<dependency> <groupId>org.noear</groupId> <artifactId>weed3-solon-plugin</artifactId> </dependency>
修改剛纔的Config配置類及使用示例,先以單數據源場景演示:mybatis
//修改剛纔的配置 // @XConfiguration public class Config{ @XBean // @XBean("db1") 爲多源模式 public DbContext db1(@XInject("${test.db1}") HikariDataSource dataSource) { String schema = dataSource.getSchema(); return new DbContext(schema, dataSource); } } //使用示例 @XController public class DemoController{ @Db //@Db("db1") 爲多源模式 //@Db是weed3在Solon裏的擴展註解 //能夠注入 Mapper, BaseMapper, DbContext BaseMapper<UserModel> userDao; @XMapping("/user/") pubblic UserModel geUser(long puid){ return userDao.selectById(puid); } }
在pom.xml中引用mybatis擴展組件
<dependency> <groupId>org.noear</groupId> <artifactId>mybatis-solon-plugin</artifactId> </dependency>
添加mybatis mappers及相關的屬性配置
mybatis: typeAliases: #支持包名 或 類名(.class 結尾) - "webapp.model" mappers: #支持包名 或 類名(.class 結尾)或 xml(.xml結尾);配置的mappers 會 mapperScan並交由Ioc容器託管 - "webapp.dso.mapper.UserMapper.class" #mybatis.db1: #多源配置模式 # typeAliases: # - "webapp.model" # mappers: # - "webapp.dso.mapper.UserMapper.class"
修改剛纔的Config配置類及使用示例
//修改剛纔的配置 // @XConfiguration public class Config{ @XBean //@XBean("db1") 爲多源模式 public SqlSessionFactory db1(@XInject("${test.db1}") HikariDataSource dataSource) { return new MybatisAdapter(dataSource) .mapperScan() //此方法會掃描配置的mappers,並進行託管 //這塊比Spring要簡便些 .getFactory(); } } //使用示例 @XController public class DemoController{ @Db //@Db("db1") 爲多源模式 //@Db 可注入 SqlSessionFactory,SqlSession,Mapper UserMapper userDao; //UserMapper 已被 db1 mapperScan並已託管,也可用 @XInject 注入 @XMapping("/user/") pubblic UserModel geUser(long puid){ return userDao.geUser(puid); } }
Solon中推薦使用@XTran註解來申明和管理事務。
@XTran 支持單源事務和多源事務,且使用方便
//使用示例 @XController public class DemoController{ @Db //@Db("db1") 爲多源模式 BaseMapper<UserModel> userDao; @XTran //@XTran("db1") 爲多源模式 @XMapping("/user/add") pubblic Long addUser(UserModel user){ return userDao.insert(user, true); } }
@XController public class DemoController{ @Db UserMapper userDao; //UserMapper 已被 db1 mapperScan並已託管,也可用 @XInject 注入 @XTran //@XTran("db1") 爲多源模式 @XMapping("/user/add") pubblic Long addUser(UserModel user){ return userDao.addUser(user); } }
@XService public class UserService{ @XTran("db1") public void addUser(UserModel user){ //.... } } @XService public class AccountService{ @XTran("db2") public void addAccount(UserModel user){ //.... } } @XController public class DemoController{ @XInject AccountService accountService; @XInject UserService userService; @XTran(multisource = true) //混合多源事務 @XMapping("/user/add") pubblic Long geUser(UserModel user){ Long puid = userService.addUser(user); //會執行db1事務 accountService.addAccount(user); //會執行db2事務 return puid; } }
solon 的jsp支持,是基於視圖模板的定位去處理的。根據啓動器組件的不一樣,配置略有不一樣:
<!-- 添加 solon web 開發包 --> <dependency> <groupId>org.noear</groupId> <artifactId>solon-web</artifactId> <type>pom</type> <exclusions> <!-- 排除默認的 jlhttp 啓動器 --> <exclusion> <groupId>org.noear</groupId> <artifactId>solon.boot.jlhttp</artifactId> </exclusion> </exclusions> </dependency> <!-- 添加 jetty 或 undertow 啓動器 --> <dependency> <groupId>org.noear</groupId> <artifactId>solon.boot.jetty</artifactId> </dependency> <!-- 添加 jetty 或 undertow jsp 擴展支持包 --> <dependency> <groupId>org.noear</groupId> <artifactId>solon.extend.jetty.jsp</artifactId> <type>pom</type> </dependency> <!-- 添加 jsp 視圖引擎 --> <dependency> <groupId>org.noear</groupId> <artifactId>solon.view.jsp</artifactId> </dependency>
控制器,只有一個註解。會自動經過不一樣的返回值作不一樣的處理
@XController public class DemoController{ @XMapping("/test1/") public void test1(){ //沒返回 } @XMapping("/test2/") public String test2(){ return "返回字符串並輸出"; } @XMapping("/test3/") public UseModel test3(){ return new UseModel(2, "noear"); //返回個模型,默認會渲染爲json格式輸出 } @XMapping("/test4/") public ModelAndView test4(){ return new ModelAndView("view path", map); //返回模型與視圖,會被視圖引擎渲染後再輸出,默認是html格式 } }
默認只須要設定value值便可,method默認爲XMethod.HTTP,即接收全部的http方法請求。
@XMapping("/user/")
freemaerker 視圖
<!doctype html> <html> <head> <meta charset="UTF-8"> <title>${title}</title> </head> <body> <div> ${message} </div> </body> </html>
控制器
@XController public class HelloworldController { @XMapping("/helloworld") public Object helloworld(){ ModelAndView vm = new ModelAndView("helloworld.ftl"); vm.put("title","demo"); vm.put("message","hello world!"); return vm; } }
//調試模式: 啓動參數添加:-deubg=1 或 --deubg=1
Solon框架不存在這塊,由於 lombok 框架已經很好了,用着就是。業務層面的數據較驗後面會作個專門的介紹。
XApp.start(source, args) .onError(err->err.printStackTrace()); //或者記錄到日誌系統
Solon 的項目必須開啓編譯參數:-parameters
<build> <finalName>${project.name}</finalName> <plugins> <!-- 配置編譯插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <compilerArgument>-parameters</compilerArgument> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> <!-- 配置打包插件(設置主類,並打包成胖包) --> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <finalName>${project.name}</finalName> <appendAssemblyId>false</appendAssemblyId> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>webapp.DemoApp</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
java -jar DemoApp.jar
便可啓動