Solon 框架详解(三)- Solon的web与data开发

摘要:
您可以在处理程序模式或控制器模式下进行写入//处理程序模式//Solomon。全局()。在//控制器模式之前//@ControllerpublicclassHelloInterceptor{//@Mappingpublicvoid句柄{if{ctx.setHandled;//如果没有名称,处理将终止}}{3。读取外部配置文件@ConfigurationpublicclassConfig{@InjectprivateUserModeluser;}4.HiKariCDataSource配置HiKariCP是数据库连接池的后起之秀。它拥有最好的性能,可以完美地PK其他连接池。useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=true“driverClassName:”com.mysql.cj.jdbc。驱动程序“用户名:”demo“密码:”UL0hHlg0Ybq60xyb“MaxLifetime:1000000c。配置HikariCP数据源建议在@Configuration配置类中执行此操作。可以重用pom.xml中的weed3扩展组件<dependency><groupId>org.noear</groupId><artifactId>weed3 solo plugin</artifactId><dependence>。

Solon 详解系列文章:
Solon 框架详解(一)- 快速入门
Solon 框架详解(二)- Solon的核心
Solon 框架详解(三)- Solon的web开发
Solon 框架详解(四)- Solon的事务传播机制
Solon 框架详解(五)- Solon扩展机制之Solon Plugin
Solon 框架详解(六)- Solon的校验框架使用、定制与扩展
Solon 框架详解(七)- Solon Ioc 的注解对比Spring及JSR330
Solon 框架详解(八)- Solon的缓存框架使用和定制
Solon 框架详解(九)- 渲染控制之定制统一的接口输出
Solon 框架详解(十)- Solon 的常用配置
Solon 框架详解(十一)- Solon Cloud 的配置说明

一、Web基础配置

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

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

1、访问静态资源

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

resources/static/

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

2、自定义拦截器

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

// handler模式(前置处理)
//
Solon.global().before("/hello/", ctx->{
    if(ctx.param("name") == null){    
        ctx.setHandled(true);    //如果没有name, 则终止处理
    }
});

// controller模式
//
@Controller
public class HelloInterceptor  {
    //(申明前置处理)
    @Mapping(value = "/hello/" , before = true)   
    public void handle(Context ctx, String name) {
        if(name == null){            
            ctx.setHandled(true);  //如果没有name, 则终止处理
        }
    }
}

3、读取外部的配置文件

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

4、HikariCP DataSource的配置

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

a.引入依赖
<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>
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数据源

建议这种操作,都安排在 @Configuration 配置类里执行。

//注解模式
//
@Configuration
public class Config{
    // 同时支持 name 和 类型 两种方式注入(注入时没有name,即为按类型注入)
    //
    @Bean(value = "db1", typed = true)   
    pubblic DataSource dataSource(@Inject("${test.db1}") HikariDataSource ds){
        return ds;
    }
}

//静态类模式(或纯手动模式)
//
//public class Config{
//    pubblic static HikariDataSource dataSource = Solon.cfg().getBean("test.db1", HikariDataSource.class);
//}

之后就可以通过@Inject注解得到这个数据源了。一般会改用加强注解对数据源进行自动转换;所有与solon对接的ORM框架皆采用这种方案。

6、数据库操作框架集成

a.Weed3集成

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

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

<dependency>
    <groupId>org.noear</groupId>
    <artifactId>weed3-solon-plugin</artifactId>
</dependency>

刚才的Config配置类即可复用。先以单数据源场景演示:

//使用示例
@Controller
public class DemoController{
    //@Db 按类型注入  //或 @Db("db1") 按名字注入  
    //@Db是weed3在Solon里的扩展注解 //可以注入 Mapper, BaseMapper, DbContext
    //
    @Db  
    BaseMapper<UserModel> userDao;
    
    @Mapping("/user/")
    pubblic UserModel geUser(long puid){
        return userDao.selectById(puid);
    }
}
b.Mybatis集成

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

<dependency>
    <groupId>org.noear</groupId>
    <artifactId>mybatis-solon-plugin</artifactId>
</dependency>

添加mybatis mappers及相关的属性配置

mybatis.db1: #db1 要与数据源的bean name 对上
    typeAliases:    #支持包名 或 类名(.class 结尾)
        - "webapp.model"
    mappers:        #支持包名 或 类名(.class 结尾)或 xml(.xml结尾);配置的mappers 会 mapperScan并交由Ioc容器托管
        - "webapp.dso.mapper.UserMapper.class"

刚才的Config配置类即也可复用

//使用示例
@Controller
public class DemoController{
    //@Db 是  mybatis-solon-plugin 里的扩展注解,可注入 SqlSessionFactory,SqlSession,Mapper
    //
    @Db    
    UserMapper userDao;  //UserMapper 已被 db1 自动 mapperScan 并已托管,也可用 @Inject 注入
    
    @Mapping("/user/")
    pubblic UserModel geUser(long puid){
        return userDao.geUser(puid);
    }
}

7、使用事务

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

@Tran 支持多数据源事务,且使用方便

a.Weed3的事务
//使用示例
@Controller
public class DemoController{
    @Db  //@Db("db1") 为多数据源模式
    BaseMapper<UserModel> userDao;
    
    @Tran 
    @Mapping("/user/add")
    pubblic Long addUser(UserModel user){
        return userDao.insert(user, true); 
    }
}
b.Mybatis的事务
@Controller
public class DemoController{
    @Db  
    UserMapper userDao;  //UserMapper 已被 db1 mapperScan并已托管,也可用 @Inject 注入
    
    @Tran 
    @Mapping("/user/add")
    pubblic Long addUser(UserModel user){
        return userDao.addUser(user); 
    }
}
c.混合多源事务(这个时候,我们需要Service层参演了)
@Service
public class UserService{
    @Db("db1")  //数据库1
    UserMapper userDao;  
    
    @Tran
    public void addUser(UserModel user){
        userDao.insert(user);
    }
}

@Service
public class AccountService{
    @Db("db2")  //数据库2
    AccountMapper accountDao;  
    
    @Tran
    public void addAccount(UserModel user){
        accountDao.insert(user);
    }
}

@Controller
public class DemoController{
    @Inject
    AccountService accountService; 
    
    @Inject
    UserService userService; 
    
    @Tran
    @Mapping("/user/add")
    pubblic Long geUser(UserModel user){
        Long puid = userService.addUser(user);     //会执行db1事务
        
        accountService.addAccount(user);    //会执行db2事务
        
        return puid;
    }
}

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

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>

二、Web开发进阶

1、Solon的MVC注解

a.@Controller

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

@Controller
public class DemoController{
    @Mapping("/test1/")
    public void test1(){
        //没返回
    }
    
    @Mapping("/test2/")
    public String test2(){
        return "返回字符串并输出";
    }
    
    @Mapping("/test3/")
    public UseModel test3(){
        return new UseModel(2, "noear"); //返回个模型,默认会渲染为json格式输出
    }
    
    @Mapping("/test4/")
    public ModelAndView test4(){
        return new ModelAndView("view path", map); //返回模型与视图,会被视图引擎渲染后再输出,默认是html格式
    }
}
b.@Mapping(value, method, produces)

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

@Mapping("/user/")

2、视图模板开发

freemaerker 视图

<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <title>${title}</title>
</head>
<body>
<div>
     ${message}
</div>
</body>
</html>

控制器

@Controller
public class HelloworldController {
    @Mapping("/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校验的是Context上的参数(即http传入的参数),是在Action参数注入之前的预处理。这与Spring验证框架区别是很大的。

@Valid  //为控制器开启校验能力;也可以做用在一个基类上
@Controller
public class ValidationController {

    @NoRepeatSubmit
    @NotNull({"name", "icon", "mobile"})
    @Mapping("/valid")
    public void test(String name, String icon, @Pattern("13\d{9}") String mobile) {

    }
}

下面是更多的校验注解,可以研究一下:

注解作用范围说明
Date参数校验注解的参数值为日期格式
DecimalMax(value)参数校验注解的参数值小于等于@ DecimalMax指定的value值
DecimalMin(value)参数校验注解的参数值大于等于@ DecimalMin指定的value值
Email参数校验注解的参数值为电子邮箱格式
Length(min, max)参数校验注解的参数值长度在min和max区间内
Max(value)参数校验注解的参数值小于等于@Max指定的value值
Min(value)参数校验注解的参数值大于等于@Min指定的value值
NoRepeatSubmit控制器 或 动作校验本次请求没有重复
NotBlank动作 或 参数校验注解的参数值不是空白
NotEmpty动作 或 参数校验注解的参数值不是空
NotNull动作 或 参数校验注解的参数值不是null
NotZero动作 或 参数校验注解的参数值不是0
Null动作 或 参数校验注解的参数值是null
Numeric动作 或 参数校验注解的参数值为数字格式
Pattern(value)参数校验注解的参数值与指定的正则表达式匹配
Whitelist控制器 或 动作校验本次请求在白名单范围内

5、统一异常处理

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

三、打包与部署

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

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

<build>
    <finalName>${project.name}</finalName>
    <plugins>

        <!-- 配置编译插件 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <compilerArgument>-parameters</compilerArgument> 
                <source>1.8</source>
                <target>1.8</target>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>

        <!-- 配置打包插件(设置主类,并打包成胖包) -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.3.0</version>
            <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>

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

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

附:Solon项目地址

免责声明:文章转载自《Solon 框架详解(三)- Solon的web与data开发》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Docker 安装、卸载、启动、停止ES6新特性:使用export和import实现模块化下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

如何自己开发软件测试工具?

序言:一说到自动化测试工具,大家很多人都会想到的是QTP、LR或者selenium之类的工具,要大家一开始设计一个这样的工具,其实确实很有难度,因为其包含的功能细节太过庞大。当年的我,开始设计开发工具的过程中,走了很多弯路,例如:做工具的界面技术的历程,刚开始用tcl/tk脚本语言,用tcl写底层框架,用tk写图形界面,后来发现tk虽然构造图形方便,但可拓...

可能是一份没什么用的爬虫代理IP指南

写在前面 做爬虫的小伙伴一般都绕不过代理IP这个问题. PS:如果还没遇到被封IP的场景,要不就是你量太小人家懒得理你,要不就是人家压根不在乎... 爬虫用户自己是没有能力维护一系列的代理服务器和代理IP的,这个成本实在有点高了。 所以公用代理服务器应运而生,现在几大云服务商家都提供代理IP服务,一般论个买... 同时网上也有很多代理IP共享网站,会把一些...

Asp.Net开源服务端框架,WebApi后端框架(C#.NET)

本文主要讲解基于Asp.Net平台的服务端框架WebApi后端框架,C#语言+SQL数据库(支持多数据库,如:Oracle/MySql)。   C/S框架网最新发布:基于Asp.Net开源服务端框架,WebApi后端框架标准版V1.0   产品介绍:http://www.csframework.com/cs-framework-webapi-1.0.ht...

TP6框架--EasyAdmin学习笔记:列表调用搜索,开发常见问题记录

这是我写的学习EasyAdmin的第五章,这一章我给大家分享下列表调用搜索的相关知识,并记录说明下开发时碰到的常见问题 首先说明下如何在页面中调用layui的搜索,效果如下:  代码如下: define(["jquery", "easy-admin"], function ($, ea) { var init = { table...

表单校验

1.为什么要使用表单验证 1.减轻服务器的压力 2.保证输入的数据符合要求 2.常用的表单验证 1.日期格式 2.表单元素是否为空 3.用户名和密码 4.E-mail地址 5.身份证号码 3.表单选择器 1.常用的表单选择器 nput:匹配所有input、textarea、select和button元素 text:匹配所有单行文本框 password:匹...

CRL快速开发框架系列教程十三(嵌套查询)

本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框架系列教程四(删除数据) CRL快速开发框架系列教程五(使用缓存) CRL快速开发框架系列教程六(分布式缓存解决方案) CRL快速开发框架系列教程七(使用事...