Configuração Inicial e Estrutura MVC no JFinal

Inicialização do Servidor

Para iniciar um projeto baseado no framework JFinal, é necessário cofnigurar o ponto de entrada da aplicação e o servidor web embarcado. O exemplo abaixo demonstra como bootstrapar o servidor Undertow com as configurações adequadas para ambiente de desenvolvimento.

package com.example.bootstrap;

import com.example.config.SystemConfig;
import com.jfinal.server.undertow.UndertowServer;

public class Bootstrap {

    public static void main(String[] args) {
        UndertowServer server = UndertowServer.create(SystemConfig.class);
        
        server.setDevMode(true);
        server.setHost("0.0.0.0");
        server.setPort(8080);
        server.setContextPath("/app");
        
        server.start();
    }
}

Alternativamente, a configuração pode ser realizada de forma mais fluida utilizando encadeamento de métodos, o que resulta em um código mais conciso para a inicialização.

package com.example.bootstrap;

import com.example.config.SystemConfig;
import com.jfinal.server.undertow.UndertowServer;

public class MainServer {

    public static void main(String[] args) {
        UndertowServer.create(SystemConfig.class)
            .setDevMode(true)
            .setPort(8080)
            .start();
    }
}

Implementando a Lógica de Negócio

Na arquitetura MVC do JFinal, a camada de serviço é responsável por interagir com o banco de dados e encapsular as regras de negócio. Abaixo está um exemplo de gestão de entidades acadêmicas.

package com.example.service;

import com.example.model.University;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.kit.Ret;
import java.util.List;

public class UniversityLogic {

    private static final University dao = new University().dao();

    public List<University> fetchAll() {
        return dao.findAll();
    }

    public Ret removeRecord(Integer recordId) {
        if (recordId == null || recordId <= 0) {
            return Ret.fail("ID inválido");
        }

        University entity = dao.findById(recordId);
        if (entity == null) {
            return Ret.fail("Registro não encontrado");
        }

        return entity.delete() ? Ret.ok("Remoção efetuada") : Ret.fail("Erro na remoção");
    }
}

Controladores e Requisições

Os controladores recebem as requisições HTTP, invocam a camada de serviço e retornam as respostas adequadas, seja renderizando views ou dados brutos.

package com.example.controller;

import com.example.service.UniversityLogic;
import com.jfinal.core.Controller;
import java.util.List;

public class UniversityController extends Controller {

    private final UniversityLogic logic = new UniversityLogic();

    public void list() {
        List<University> institutions = logic.fetchAll();
        setAttr("institutions", institutions);
        render("index.html");
    }

    public void remove() {
        Integer id = getInt(0);
        if (id == null) {
            renderText("Parâmetro ID ausente");
            return;
        }

        Ret result = logic.removeRecord(id);
        renderText(result.getMsg());
    }
}

Tags: jfinal undertow java-mvc ActiveRecord web-framework

Publicado em 9-11 15:29