### 1、约定

```xml
//资源路径约定（不用配置；也不能配置）
resources/app.yml（ 或 app.properties ） #为应用配置文件

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

//调试模式约定：
启动参数添加：--debug=1
```


### 2、应用启动过程

请参考： [《应用生命周期》](/article/240) 的上两段。


### 3、服务端口配置

在应用主配置文件里指定：

```yml
server.port: 8081
```


可以在运行时指定系统属性（优先级高）：

```shell
java -Dserver.port=9091 -jar DemoApp.jar
```


还可以，在运行时通过启动参数指定（优先级更高）：

```shell
java -jar DemoApp.jar -server.port=9091
```


### 4、静态资源放哪里

Solon 的默认静态资源的路径为：
```xml
resources/static/     #为静态文件根目录（目录二选一，v2.2.10 后支持）
```

这个默认没得改，但是可以添加更多（具体可参考：[《生态 / solon-web-staticfiles》](/article/268)）：

```yaml
#添加静态目录映射。（按需选择）#v1.11.0 后支持
solon.staticfiles.mappings:
  - path: "/img/" #路径，可以是目录或单文件
    repository: "/data/sss/app/" #1.添加本地绝对目录（仓库只能是目录）
  - path: "/"
    repository: "classpath:user" #2.添加资源路径（仓库只能是目录）
  - path: "/"
    repository: ":extend" #3.添加扩展目录
```


在默认的处理规则下，所有请求，都会先执行静态文件代理。静态文件代理会检测是否存在静态文件，有则输出，没有则跳过处理。输出的静态文件会做304控制。


框架不支持 "/" 自动跳转到 "/index.html" 的方式（现在少见了，也省点性能）。如有需要，可添过滤器手动处理：

```java
@Component(index = 0) //index 为顺序位（不加，则默认为0）
public class AppFilter implements Filter {
    @Override
    public void doFilter(Context ctx, FilterChain chain) throws Throwable {
        if("/".equals(ctx.pathNew())){ //ContextPathFilter 就是类似原理实现的
            ctx.pathNew("/index.html");
        }

        chain.doFilter(ctx);
    }
} 
```


### 5、路径映射表达式说明



| 符号 | 说明 | 示例 |
| -------- | -------- | -------- |
| `**`     | 任意字符、不限段数     | `**` 或 `/user/**`     |
| `*`     | 任意字符     | `/user/*`     |
| `?`     | 可有可无     | `/user/?`     |
| `/`     | 路径片段开始符和间隔符     | `/` 或 `/user`     |
| `{name}`     | 路径变量声明     |  `/user/{name}`     |


具体可参考：[《常用注解 / @Mapping 用法说明》](/article/327)


### 6、输出视图和Json


```java
public class DemoController{
    //返回任何结构体，默认会以 JSON 格式输出
    @Mapping("/json")
    public User home() {
        return new User();  
    }
    
    //通过 ModelAndView 输出后端模板
    @Mapping("/view")
    public ModelAndView home() {
        return new ModelAndView("view.ftl");  
    }
}    
```


### 7、路径重定向与转发

路径重定向

```java
public class DemoController{
    @Mapping("/")
    public void home(Context ctx) {
        //通过302方式，通知客户端跳转到 “/index.html” （浏览器会发生2次请求，地址会变成/login）
        ctx.redirect("/index.html");
    }
}    
```

路径转发

```java
public class DemoController{
    @Mapping("/")
    public void home(Context ctx) {
        //在服务端重新路由到 “/index.html” （浏览器发生1次请求，地址不会变）
        ctx.forward("/index.html");
    }
}    
```


### 8、请求参数注入或手动获取

支持 queryString, form-data, x-www-form-urlencoded, path, json body 等不同形式的参数直接注入：

```java
//GET http://localhost:8080/test1?str=a&num=1
public class DemoController{
    @Mapping("/test1")
    public void test1(String str, int num) { //可自动注入 get, post, json body 形式的参数
        
    }
    
    @Mapping("/test2")
    public void test2(Context ctx) {  
        //手动获取 get, post 参数
        String str = ctx.param("str");
        int num = ctx.paramAsInt("num", 0);
        
        //手动获取 body 请求的数据
        String body = ctx.body();
    }
}
```

其中 queryString, form-data, x-www-form-urlencoded, path 参数，支持 ctx.param() 接口统一获取。






