1. 程式人生 > >Java Web 框架 Latke v2.4.39,重寫控制器層

Java Web 框架 Latke v2.4.39,重寫控制器層

  

簡介

Latke('lɑ:tkə,土豆餅)是一個簡單易用的 Java Web 應用開發框架,包含 MVC、IoC、事件通知、ORM、外掛等元件。

在實體模型上使用 JSON 貫穿前後端,使應用開發更加快捷。這是 Latke 不同於其他框架的地方,非常適合小型應用的快速開發。

特性

  • 註解式、函式式路由

  • 依賴注入

  • 多種資料庫 ORM

  • 多語言

  • 記憶體/Redis 快取

  • 事件機制

  • 外掛機制

案例

  • Demo:簡單的 Latke 應用示例

  • Solo:一款小而美的 Java 部落格系統

  • Symphony:一款用 Java 實現的現代化社群(論壇/BBS/社交網路/部落格)平臺

安裝

<dependency>
    <groupId>org.b3log</groupId>
    <artifactId>latke-core</artifactId>
    <version>${latke.version}</version>
</dependency>

控制器層用法

請求路由

註解宣告式

@RequestProcessing("/")
public void index(final RequestContext context) {
    context.setRenderer(new SimpleFMRenderer("index.ftl"));
    final Map<String, Object> dataModel = context.getRenderer().getRenderDataModel();
    dataModel.put("greeting", "Hello, Latke!");
}

函式式

DispatcherServlet.post("/register", registerProcessor::register);
DispatcherServlet.mapping();

請求引數

路徑變數和查詢字串

@RequestProcessing("/var/{pathVar}")
public void paraPathVar(final RequestContext context) {
    final String paraVar = context.param("paraVar");
    final String pathVar = context.pathVar("pathVar");
    context.renderJSON(new JSONObject().put("paraVar", paraVar).put("pathVar", pathVar));
}

JSON 解析

final JSONObject requestJSON = context.requestJSON();

Servlet 封裝

final String remoteAddr = context.remoteAddr();
final String requestURI = context.requestURI();
final Object att = context.attr("name");
final String method = context.method();
context.sendRedirect("https://b3log.org");
final HttpServletRequest request = context.getRequest();
final HttpServletResponse response = context.getResponse();

服務層用法

依賴注入、事務

@Service
public class UserService {

    private static final Logger LOGGER = Logger.getLogger(UserService.class);

    @Inject
    private UserRepository userRepository;

    @Transactional
    public void saveUser(final String name, final int age) {
        final JSONObject user = new JSONObject();
        user.put("name", name);
        user.put("age", age);

        String userId;

        try {
            userId = userRepository.add(user);
        } catch (final RepositoryException e) {
            LOGGER.log(Level.ERROR, "Saves user failed", e);

            // 丟擲異常後框架將回滾事務
            throw new IllegalStateException("Saves user failed");
        }

        LOGGER.log(Level.INFO, "Saves a user successfully [userId={0}]", userId);
    }
}

持久層用法

構造 ORM

@Repository
public class UserRepository extends AbstractRepository {

    public UserRepository() {
        super("user");
    }
}

單表 CRUD

public interface Repository {
    String add(final JSONObject jsonObject) throws RepositoryException;
    void update(final String id, final JSONObject jsonObject) throws RepositoryException;
    void remove(final String id) throws RepositoryException;
    void remove(final Query query) throws RepositoryException;
    JSONObject get(final String id) throws RepositoryException;
    long count(final Query query) throws RepositoryException;
}

條件查詢

public JSONObject getByName(final String name) throws RepositoryException {
    final List<JSONObject> records = getList(new Query().
            setFilter(new PropertyFilter("name", FilterOperator.EQUAL, name)));
    if (records.isEmpty()) {
        return null;
    }

    return records.get(0);
}

分頁查詢

new Query().setCurrentPageNum(1).setPageSize(50)

按欄位排序

new Query().addSort("name", SortDirection.DESCENDING);

僅獲取需要欄位

new Query().addProjection("name", String.class);

原生 SQL

final List<JSONObject> records = select("SELECT * FROM `user` WHERE `name` = ?", name);

文件

社群

鳴謝

Latke 的誕生離不開以下開源專案: