目录

一、项目结构与依赖

1.1 项目结构

1.2 依赖说明

1.3 应用配置文件

二、核心代码解析

2.1 启动类(App.java)

2.2 数据访问层(UserDao.java)

2.3 控制器(UserController.java)

2.4 Freemarker 模板(helloworld.ftl)

2.5 Thymeleaf 模板(th1.html)

三、多视图技术演示

3.1 简单字符串响应

3.2 Freemarker 视图访问

3.3 Thymeleaf 视图访问


        Solon 是一款轻量、高效的 Java 微服务框架,在保持简洁的同时,也支持多视图技术,能灵活对接 Freemarker、Thymeleaf 等模板引擎,满足不同场景下的页面渲染需求。本篇博客将结合示例项目,讲解 Solon 框架及多视图技术的应用。

一、项目结构与依赖

1.1 项目结构

  • src/main/java:存放 Java 代码,包含控制器(controller)、数据访问层(dao)和启动类(App)。
  • src/main/resources:存放资源文件,templates 目录用于放置视图模板(如 Freemarker 的 helloworld.ftl、Thymeleaf 的 th1.html),app.yml 是配置文件。
  • pom.xml:管理项目依赖。

1.2 依赖说明

在 pom.xml 中,引入了 Solon 相关核心依赖:

  • solon-web:Solon 核心 Web 模块,提供 Web 开发基础能力。

  • solon-view-freemarker:Solon 对 Freemarker 视图模板的支持依赖。

  • solon-view-thymeleaf:Solon 对 Thymeleaf 视图模板的支持依赖。

  • solon-maven-plugin: Solon专用的Maven插件,简化打包部署。

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.pp</groupId>
    <artifactId>solonweb1</artifactId>

    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <parent>
        <groupId>org.noear</groupId>
        <artifactId>solon-parent</artifactId>
        <version>3.5.0</version>
        <relativePath />
    </parent>


    <name>solonweb1</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

    </properties>

    <dependencies>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>

          <!-- Solon Web核心 -->
        <dependency>
            <groupId>org.noear</groupId>
            <artifactId>solon-web</artifactId>
        </dependency>

         <!-- Freemarker视图支持 -->
        <dependency>
            <groupId>org.noear</groupId>
            <artifactId>solon-view-freemarker</artifactId>
        </dependency>

         <!-- Thymeleaf视图支持 -->
        <dependency>
            <groupId>org.noear</groupId>
            <artifactId>solon-view-thymeleaf</artifactId>
        </dependency>

    </dependencies>

<!-- Solon专用的Maven插件,简化打包部署 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.noear</groupId>
                <artifactId>solon-maven-plugin</artifactId>
            </plugin>
        </plugins>

    </build>
</project>
 

1.3 应用配置文件

# app.yml

server.port: 8081

二、核心代码解析

2.1 启动类(App.java)

Solon.start(App.class, args) 是 Solon 应用的启动入口,它会加载配置,扫描并初始化相关组件,启动 Web 服务。

package com.pp.solonweb1;

import org.noear.solon.Solon;

import com.pp.solonweb1.App;


public class App 
{
    public static void main( String[] args )
    {
    	 Solon.start(App.class, args);
    }
}

2.2 数据访问层(UserDao.java)

使用 @Component 注解将 UserDao 类标识为 Solon 组件,使其能被框架扫描并纳入容器管理,方便在其他组件(如控制器)中通过依赖注入使用。

package com.pp.solonweb1.dao;

import org.noear.solon.annotation.Component;

@Component
public class UserDao {

	public String query() {
		
		System.out.println("查询数据库");

		return "查询数据库的表的数据";
	}

}

2.3 控制器(UserController.java)

  • @Controller:标识该类为控制器组件,处理 Web 请求。

  • @Mapping("/user"):指定控制器的基础访问路径为 /user

  • @Inject:依赖注入,从 Solon 容器中获取 UserDao 实例。

  • 三个请求处理方法:

  • loadIndex1:直接返回字符串,由框架处理为简单响应。

  • loadIndex2:使用 Freemarker 模板(helloworld.ftl),通过 ModelAndView 传递数据到模板进行渲染。

  • loadIndex3:使用 Thymeleaf 模板(th1.html),同样通过 ModelAndView 传递数据。

package com.pp.solonweb1.controller;

import org.noear.solon.annotation.Controller;
import org.noear.solon.annotation.Inject;
import org.noear.solon.annotation.Mapping;
import org.noear.solon.core.handle.ModelAndView;

import com.pp.solonweb1.dao.UserDao;

@Controller
@Mapping("/user")
public class UserController {

	@Inject
	private UserDao dao;	// 依赖注入,自动注入UserDao实例

	/**
	 * 返回纯文本数据
	 */
	@Mapping("/index1")
	public String loadIndex1() {
		System.out.println("UserController  is loadIndex1  start...");
		return this.dao.query();
	}

	/**
	 * 使用Freemarker模板渲染
	 */
	@Mapping("/index2")
	public Object loadIndex2() {
		System.out.println("UserController  is loadIndex2  start...");

		// 注意,ModelAndView带后缀。自动根据文件后缀选择对应的模板引擎。
		ModelAndView vm = new ModelAndView("helloworld.ftl");
		
		// put()方法向模板传递数据
		vm.put("title", "Solon的多视图技术");
		vm.put("message", "欢迎大家学习Solon的技术");
		vm.put("schoolname", "喵喵咪");

		return vm;
	}

	/**
	 * 使用Thymeleaf模板渲染
	 */
	@Mapping("/index3")
	public Object loadIndex3() {
		System.out.println("UserController  is loadIndex3  start...");

		ModelAndView model = new ModelAndView("th1.html");
		model.put("title", "dock");
		model.put("msg", "你好 world!");

		return model;

	}

}

2.4 Freemarker 模板(helloworld.ftl)

 Freemarker 模板通过 ${} 语法获取 ModelAndView 中传递的数据,如 ${title} 会渲染为 Solon的多视图技术${message} 渲染为 欢迎大家学习Solon的技术${schoolname} 渲染为 喵喵咪

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

2.5 Thymeleaf 模板(th1.html)

Thymeleaf 模板使用 th:text 等属性来渲染数据,th:text="${title}" 会将 title 的值(dock)设置为 <title> 标签的文本内容,th:text="${msg}" 会将 msg 的值(你好 world!)设置为 <span> 标签的文本内容。

<!DOCTYPE html>
<html>
<head>
    <title th:text="${title}"></title>
</head>
<body>
<main>
thymeleaf::<span th:text="${msg}"></span>
</main>
</body>
</html>

三、多视图技术演示

3.1 简单字符串响应

访问地址:http://localhost:8081/user/index1

        该接口直接返回 UserDao 的 query 方法结果字符串 查询数据库的表的数据,框架会将其作为响应体返回:

3.2 Freemarker 视图访问

访问地址:http://localhost:8081/user/index2

        Solon 会根据 ModelAndView 中指定的 helloworld.ftl,找到对应的 Freemarker 模板,将 titlemessageschoolname 数据渲染到模板中,最终返回渲染后的 HTML 页面。

3.3 Thymeleaf 视图访问

访问地址:http://localhost:8081/user/index3

        Solon 会根据 ModelAndView 中指定的 th1.html,找到对应的 Thymeleaf 模板,将 titlemsg 数据渲染到模板中,返回渲染后的 HTML 页面。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐