Loading...
Loading...
Compare original and translation side by side
main()main()@Action@ActionApplicationAbstractApplication@ActionContextBuilderBuildersAbstractDatagenerateURLRequestHTTPHandlerapplication.propertiesAbstractApplicationApplication@ActionContextBuilderBuildersAbstractDatagenerateURLRequestHTTPHandlerapplication.properties@ActionAbstractApplicationinit()ContextActionRegistryBuilderBuildersAbstractData@ActionAbstractApplicationinit()ContextActionRegistryBuilderBuildersAbstractDatapublic class MyService extends AbstractApplication {
@Override
public void init() {
this.setTemplateRequired(false); // Disable .view lookup for data/API apps
}
@Override public String version() { return "1.0.0"; }
@Action("greet")
public String greet() {
return "Hello from tinystruct!";
}
// Path parameter: GET /?q=greet/James OR bin/dispatcher greet/James
@Action("greet")
public String greet(String name) {
return "Hello, " + name + "!";
}
}public class MyService extends AbstractApplication {
@Override
public void init() {
this.setTemplateRequired(false); // 禁用数据/API应用的.view文件查找
}
@Override public String version() { return "1.0.0"; }
@Action("greet")
public String greet() {
return "Hello from tinystruct!";
}
// 路径参数:GET /?q=greet/James 或 bin/dispatcher greet/James
@Action("greet")
public String greet(String name) {
return "Hello, " + name + "!";
}
}@Action(value = "login", mode = Mode.HTTP_POST)
public String doLogin(Request<?, ?> request) throws ApplicationException {
request.getSession().setAttribute("userId", "42");
return "Logged in";
}@Action(value = "login", mode = Mode.HTTP_POST)
public String doLogin(Request<?, ?> request) throws ApplicationException {
request.getSession().setAttribute("userId", "42");
return "Logged in";
}import org.tinystruct.data.component.Builder;
import org.tinystruct.data.component.Builders;
@Action("api/data")
public String getData() throws ApplicationException {
Builders dataList = new Builders();
Builder item = new Builder();
item.put("id", 1);
item.put("name", "James");
dataList.add(item);
Builder response = new Builder();
response.put("status", "success");
response.put("data", dataList);
return response.toString(); // {"status":"success","data":[{"id":1,"name":"James"}]}
}import org.tinystruct.data.component.Builder;
import org.tinystruct.data.component.Builders;
@Action("api/data")
public String getData() throws ApplicationException {
Builders dataList = new Builders();
Builder item = new Builder();
item.put("id", 1);
item.put("name", "James");
dataList.add(item);
Builder response = new Builder();
response.put("status", "success");
response.put("data", dataList);
return response.toString(); // {"status":"success","data":[{"id":1,"name":"James"}]}
}import org.tinystruct.http.SSEPushManager;
@Action("sse/connect")
public String connect() {
return "{\"type\":\"connect\",\"message\":\"Connected to SSE\"}";
}
// Push to a specific client
String sessionId = getContext().getId();
Builder msg = new Builder();
msg.put("text", "Hello, user!");
SSEPushManager.getInstance().push(sessionId, msg);
// Broadcast to all
// Broadcast to all
SSEPushManager.getInstance().broadcast(msg);import org.tinystruct.http.SSEPushManager;
@Action("sse/connect")
public String connect() {
return "{\"type\":\"connect\",\"message\":\"Connected to SSE\"}";
}
// 推送给指定客户端
String sessionId = getContext().getId();
Builder msg = new Builder();
msg.put("text", "Hello, user!");
SSEPushManager.getInstance().push(sessionId, msg);
// 广播给所有客户端
SSEPushManager.getInstance().broadcast(msg);import org.tinystruct.data.FileEntity;
@Action(value = "upload", mode = Mode.HTTP_POST)
public String upload(Request<?, ?> request) throws ApplicationException {
List<FileEntity> files = request.getAttachments();
if (files != null) {
for (FileEntity file : files) {
System.out.println("Uploaded: " + file.getFilename());
}
}
return "Upload OK";
}import org.tinystruct.data.FileEntity;
@Action(value = "upload", mode = Mode.HTTP_POST)
public String upload(Request<?, ?> request) throws ApplicationException {
List<FileEntity> files = request.getAttachments();
if (files != null) {
for (FileEntity file : files) {
System.out.println("Uploaded: " + file.getFilename());
}
}
return "Upload OK";
}src/main/resources/application.propertiesundefinedsrc/main/resources/application.propertiesundefined
Access config values in your application:
```java
String port = this.getConfiguration("server.port");
在应用中访问配置值:
```java
String port = this.getConfiguration("server.port");| Symptom | Correct Pattern |
|---|---|
Importing | Use |
Using | Use |
| Call |
Annotating | Actions must be |
Hardcoding | Use |
Manual | Prefer the |
| Action not found at runtime | Ensure class is imported via |
| CLI arg not visible | Pass with |
| Two methods same path, wrong one fires | Set explicit |
| 问题表现 | 正确做法 |
|---|---|
导入 | 使用 |
使用 | 使用 |
出现 | 在 |
给 | Action方法必须为 |
在应用中硬编码 | 使用 |
手动注册 | 优先使用 |
| 运行时提示Action未找到 | 确保类通过 |
| CLI参数不可见 | 使用 |
| 两个方法路径相同,触发错误的方法 | 设置明确的 |
init()init()setAction()@ActionMode@ActionCLIgetContext().getAttribute("--flag")CompletableFuture.runAsync()init()init()setAction()@Action@ActionModeCLIgetContext().getAttribute("--flag")CompletableFuture.runAsync()references/references/src/main/java/org/tinystruct/AbstractApplication.javasrc/main/java/org/tinystruct/system/annotation/Action.javasrc/main/java/org/tinystruct/application/ActionRegistry.javasrc/main/java/org/tinystruct/data/component/Builder.javasrc/main/java/org/tinystruct/data/component/Builders.javasrc/main/java/org/tinystruct/data/component/AbstractData.javasrc/main/java/org/tinystruct/data/Mapping.javasrc/main/java/org/tinystruct/data/tools/MySQLGenerator.javasrc/main/java/org/tinystruct/data/component/FieldType.javasrc/main/java/org/tinystruct/data/component/Condition.javasrc/main/java/org/tinystruct/http/SSEPushManager.javasrc/test/java/org/tinystruct/application/ActionRegistryTest.javasrc/test/java/org/tinystruct/system/HttpServerHttpModeTest.javasrc/main/java/org/tinystruct/AbstractApplication.javasrc/main/java/org/tinystruct/system/annotation/Action.javasrc/main/java/org/tinystruct/application/ActionRegistry.javasrc/main/java/org/tinystruct/data/component/Builder.javasrc/main/java/org/tinystruct/data/component/Builders.javasrc/main/java/org/tinystruct/data/component/AbstractData.javasrc/main/java/org/tinystruct/data/Mapping.javasrc/main/java/org/tinystruct/data/tools/MySQLGenerator.javasrc/main/java/org/tinystruct/data/component/FieldType.javasrc/main/java/org/tinystruct/data/component/Condition.javasrc/main/java/org/tinystruct/http/SSEPushManager.javasrc/test/java/org/tinystruct/application/ActionRegistryTest.javasrc/test/java/org/tinystruct/system/HttpServerHttpModeTest.java