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());
}
}