Solon详解(三)- Solon的web开发

Solon详解系列文章:
Solon详解(一)- 快速入门
Solon详解(二)- Solon的核心
Solon详解(三)- Solon的web开发

一、Web基础配置

//资源路径说明(不用配置;也不能配置)
resources/application.properties(或 application.yml) 为应用配置文件
resources/static/ 为静态文件根目标
resources/WEB-INF/view/ 为视图模板文件根目标(支持多视图共存)

//调试模式:
启动参数添加:-deubg=1

1、访问静态资源

Solon 的默认静态资源的路径为:(这个没得改,也不让改;为了简化套路)

resources/static/

在默放的处理规则下,所有请求,都会先执行静态文件代理。静态文件代理会检测是否存在静态文件,有则输出,没有则跳过处理。输出的静态文件会做304控制。

2、自定义拦截器

Solon里所有的处理,都属于XHandler。可以用handler 的模式写,也可以用controller的模式写(XAction 也是 XHandler)

// 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, 则终止处理
        }
    }
}

3、读取外部的配置文件

@XConfiguration
public class Config{
    @XInject("${classpath:user.yml}")
    private UserModel user;
}

4、HikariCP DataSource的配置

HiKariCP是数据库连接池的一个后起之秀,号称性能最好,可以完美地PK掉其他连接池。作者特别喜欢它。

a.引入依赖

    com.zaxxer
    HikariCP
    3.3.1



    mysql
    mysql-connector-java
    8.0.18

b.添加配置
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
c.配置HikariCP数据源

建议这种操作,都安排在 @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注解得到这个数据源了。实际上一般不会直接使用数据源。

6、数据库操作框架集成

a.Weed3集成

Wee3是和Solon一样轻巧的一个框架,配置起来自然是简单的。

在pom.xml中引用weed3扩展组件


    org.noear
    weed3-solon-plugin

修改刚才的Config配置类及使用示例,先以单数据源场景演示:

//修改刚才的配置
//
@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 userDao;
    
    @XMapping("/user/")
    pubblic UserModel geUser(long puid){
        return userDao.selectById(puid);
    }
}
b.Mybatis集成

在pom.xml中引用mybatis扩展组件


    org.noear
    mybatis-solon-plugin

添加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);
    }
}

7、使用事务

Solon中推荐使用@XTran注解来申明和管理事务。

@XTran 支持单源事务和多源事务,且使用方便

a.Weed3的事务
//使用示例
@XController
public class DemoController{
    @Db  //@Db("db1") 为多源模式
    BaseMapper userDao;
    
    @XTran     //@XTran("db1")  为多源模式
    @XMapping("/user/add")
    pubblic Long addUser(UserModel user){
        return userDao.insert(user, true); 
    }
}
b.Mybatis的事务
@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); 
    }
}
c.混合多源事务(这个时候,我们需要Service层参演了)
@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;
    }
}

8、开始jsp支持(不建议用)

solon 的jsp支持,是基于视图模板的定位去处理的。根据启动器组件的不同,配置略有不同:



    org.noear
    solon-web
    pom
    
        
        
            org.noear
            solon.boot.jlhttp
        
    




    org.noear
    solon.boot.jetty




    org.noear
    solon.extend.jetty.jsp
    pom




    org.noear
    solon.view.jsp

二、Web开发进阶

1、Solon的MVC注解

a.@XController

控制器,只有一个注解。会自动通过不同的返回值做不同的处理

@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格式
    }
}
b.@XMapping(value, method, produces)

默认只需要设定value值即可,method默认为XMethod.HTTP,即接收所有的http方法请求。

@XMapping("/user/")

2、视图模板开发

freemaerker 视图




    
    ${title}


${message}

控制器

@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;
    }
}

3、模板调试模式(即:模板修改后,浏览器刷新即可)

//调试模式:
启动参数添加:-deubg=1 或 --deubg=1

4、数据校验

Solon框架不存在这块,因为 lombok 框架已经很好了,用着就是。业务层面的数据较验后面会做个专门的介绍。

5、统一异常处理

XApp.start(source, args)
    .onError(err->err.printStackTrace()); //或者记录到日志系统

三、打包与部署

1、在pom.xml中配置打包的相关插件

Solon 的项目必须开启编译参数:-parameters


    ${project.name}
    

        
        
            org.apache.maven.plugins
            maven-compiler-plugin
            
                -parameters 
                1.8
                1.8
                UTF-8
            
        

        
        
            maven-assembly-plugin
            
                ${project.name}
                false
                
                    jar-with-dependencies
                
                
                    
                        webapp.DemoApp
                    
                
            
            
                
                    make-assembly
                    package
                    
                        single
                    
                
            
        
    

2、运行 maven 的 package 指令完成打包(IDEA的左测界面,就有这个菜单)

3、终端运行:java -jar DemoApp.jar 即可启动

你可能感兴趣的:(Solon详解(三)- Solon的web开发)