Solon Web 开发,七、视图模板与Mvc注解

约定参考:

//资源路径约定(不用配置;也不能配置)
resources/app.yml( 或 app.properties ) #为应用配置文件

resources/static/     #为静态文件根目录(v2.2.10 后支持)
resources/templates/  #为视图模板文件根目录(v2.2.10 后支持)

//调试模式约定:(调试模式下,可以热更新模板)
启动参数添加:--debug=1

1、支持多种视图模板引擎,可同时共用

插件 适配的渲染器 默认视图后缀名 备注
solon-view-freemarker FreemarkerRender .ftl solon-web 快捷组合包里,引用了此包
solon-view-jsp JspRender .jsp
solon-view-velocity VelocityRender .vm
solon-view-thymeleaf ThymeleafRender .html
solon-view-enjoy EnjoyRender .shtm
solon-view-beetl BeetlRender .htm

以 freemaerker 视图为例,helloworld.ftl

<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <title>${title}</title>
</head>
<body>
<div>
     ${message}
</div>
</body>
</html>

控制器

@Controller
public class HelloworldController {
    @Mapping("/helloworld")
    public Object helloworld(){
        ModelAndView vm = new ModelAndView("helloworld.ftl"); //注意,带后缀

        vm.put("title","demo-app");
        vm.put("message","hello world!");

        return vm;
    }
}

2、可以写控制器基类,加些公共的内容

public class BaseController {
    public ModelAndView view(String viewUri){
        ModelAndView vm = new ModelAndView("helloworld.ftl"); //注意,带后缀

        vm.put("context", Context.current());
        vm.put("title","demo-app");

        return vm;
    }
    
    public ModelAndView view(String viewUri, Map<String,Object> model){
        ModelAndView vm = new ModelAndView("helloworld.ftl"); //注意,带后缀

        vm.put("context", Context.current());
        vm.put("title","demo-app");
        vm.putAll(model);

        return vm;
    }
}

@Controller
public class HelloworldController {
    @Mapping("/helloworld")
    public Object helloworld(){
        //注意,带后缀  //支持链式写法
        return view("helloworld.ftl").put("message","hello world!");
    }
}

3、在模板中使用请求上下文对象接口

使用之前,需要手动把它 put 到 model里(见上面第2节的代码)。以 freemaerker 视图为例:

<div>${context.sessionAsLong("user.id")}</div>

关于 Context 的接口,参考《认识请求上下文(Context)》

4、在模板中使用认证标签

以 freemaerker 视图为例:

<@authPermissions name="user:del">
我有user:del权限
</@authPermissions>

<@authRoles name="admin">
我有admin角色
</@authRoles>

5、在模板中使用国际化接口

以 freemaerker 视图为例:

<div>
i18n::${i18n["login.title"]}
i18n::${i18n.get("login.title")}
i18n::${i18n.getAndFormat("login.title",12,"a")}
</div>

具体内容可参考 国际化的章节。

6、主要注解

注解 说明
@Controller 控制器注解(只有一个注解,会自动通过不同的返回值做不同的处理)
@Param 注入请求参数(包括:QueryString、Form、Path)。起到指定名字、默认值等作用
@Header 注入请求 header
@Cookie 注入请求 cookie
@Path 注入请求 path 变量(因为框架会自动处理,所以这个只是标识下方便文档生成用)
@Body 注入请求体(一般会自动处理。仅在主体的 String, Steam, Map 时才需要)
@Mapping 路由关系印射注解
@Get @Mapping 的辅助注解,便于 RESTful 开发
@Post @Mapping 的辅助注解,便于 RESTful 开发
@Put @Mapping 的辅助注解,便于 RESTful 开发
@Delete @Mapping 的辅助注解,便于 RESTful 开发
@Patch @Mapping 的辅助注解,便于 RESTful 开发
@Produces 输出内容类型申明
@Consumes 输入内容类型申明(当输出内容类型未包函 @Consumes,则响应为 415 状态码)
@Multipart 显式申明支持 Multipart 输入

7、组合效果

@Controller
public class DemoController{
    @Get
    @Mapping("/test1/")
    public void test1(){
        //没返回
    }
    
    @Produces(MimeType.APPLICATION_JSON_VALUE)
    @Get
    @Mapping("/test2/")
    public String test2(){
        return "{\"message\":\"返回字符串并输出\"}";
    }
    
    @Mapping("/test3/")
    public UseModel test3(@Param(defaultValue="world") String name){ //接收请求name参数
        //返回个模型,默认会渲染为json格式输出
        return new UseModel(2, name); 
    }
    
    @Mapping("/test4/{qb_dp}")
    public ModelAndView test4(String qb_dp, @Body String bodyStr){//接收路径变量和主体字符串
        //返回模型与视图,会被视图引擎渲染后再输出,默认是html格式
        Map<String,String> map = new HashMap<>();
        map.put("name", qb_dp);
        map.put("body", bodyStr);
        
        return new ModelAndView("view path", map); 
    }
    
    @Mapping("/test5/")
    public void test5(int id, String name, Context ctx){ //可自动接收:get, post, json body 参数
        ModelAndView vm = new ModelAndView("view path");  
        vm.put("id", id);
        vm.put("name", name);
        
        //渲染拼直接返回(不输出)
        String html = ctx.renderAndReturn(vm);
        
        db.table("test").set("html", html).insert();
    }
}
posted @ 2022-01-19 08:15  带刺的坐椅  阅读(236)  评论(0)    收藏  举报