Java Web 框架 Latke v2.4.39,重寫控制器層
阿新 • • 發佈:2018-12-21
簡介
Latke('lɑ:tkə,土豆餅)是一個簡單易用的 Java Web 應用開發框架,包含 MVC、IoC、事件通知、ORM、外掛等元件。
在實體模型上使用 JSON 貫穿前後端,使應用開發更加快捷。這是 Latke 不同於其他框架的地方,非常適合小型應用的快速開發。
特性
註解式、函式式路由
依賴注入
多種資料庫 ORM
多語言
記憶體/Redis 快取
事件機制
外掛機制
案例
安裝
<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 的誕生離不開以下開源專案:
FreeMarker:使用廣泛的 Java 模版引擎
Commons Lang:Java 語言相關工具庫
Commons IO:Java IO 相關工具庫
Commons Codec:Java 編解碼庫
Javassist:Java 位元組碼處理工具庫
SLF4j:Java 日誌門戶
Gin:又快又好用的 golang HTTP web 框架