Solon?MVC?的?@Mapping?用法示例說明
在 Solon Mvc 里,@Mapping 注解一般是配合 @Controller 和 @Remoting,作請(qǐng)求路徑映射用的。且,只支持加在 public 函數(shù) 或 類上。
1、注解屬性
| 屬性 | 說明 | 備注 |
|---|---|---|
| value | 路徑 | 與 path 互為別名 |
| path | 路徑 | 與 value 互為別名 |
| method | 請(qǐng)求方式限定(def=all) | 可用 @Post、@Get 等注解替代此屬性 |
| consumes | 指定處理請(qǐng)求的提交內(nèi)容類型 | 可用 @Consumes 注解替代此屬性 |
| produces | 指定返回的內(nèi)容類型 | 可用 @Produces 注解替代此屬性 |
| multipart | 申明支持多分片請(qǐng)求(def=false) | 如果為false,則自動(dòng)識(shí)別 |
當(dāng) method=all,即不限定請(qǐng)求方式
2、支持的路徑映射表達(dá)式
| 符號(hào) | 說明 | 示例 |
|---|---|---|
** | 任意字符、不限段數(shù) | ** 或 /user/** |
* | 任意字符 | /user/* |
? | 可有可無 | /user/? |
/ | 路徑片段開始符和間隔符 | / 或 /user |
{name} | 路徑變量申明 | /user/{name} |
路徑組合(控制器映射與動(dòng)作映射)及應(yīng)用示例:
import org.noear.solon.annotation.Controller;
import org.noear.solon.annotation.Mapping;
@Mapping("/user") //或 "user",開頭自動(dòng)會(huì)補(bǔ)"/"
@Controller
public void DemoController{
@Mapping("") //=/user
public void home(){ }
@Mapping("/") //=/user/,與上面是有區(qū)別的,注意下。
public void home2(){ }
@Mapping("/?") //=/user/ 或者 /user,與上面是有區(qū)別的,注意下。
public void home3(){ }
@Mapping("list") //=/user/list ,間隔自動(dòng)會(huì)補(bǔ)"/"
public void getList(){ }
@Mapping("/{id}") //=/user/{id}
public void getOne(long id){ }
@Mapping("/ajax/**") //=/user/ajax/**
public void ajax(){ }
}提醒:一個(gè) @Mapping 函數(shù)不支持多個(gè)路徑的映射
3、參數(shù)注入
非請(qǐng)求參數(shù)的可注入對(duì)象:
| 類型 | 說明 |
|---|---|
| Context | 請(qǐng)求上下文(org.noear.solon.core.handle.Context) |
| Locale | 請(qǐng)求的地域信息,國際化時(shí)需要 |
| ModelAndView | 模型與視圖對(duì)象(org.noear.solon.core.handle.ModelAndView) |
支持請(qǐng)求參數(shù)自動(dòng)轉(zhuǎn)換注入:
- 當(dāng)變量名有對(duì)應(yīng)的請(qǐng)求參數(shù)時(shí)(即有名字可對(duì)上的請(qǐng)求參數(shù))
- 會(huì)直接嘗試對(duì)請(qǐng)求參數(shù)值進(jìn)行類型轉(zhuǎn)換
- 當(dāng)變量名沒有對(duì)應(yīng)的請(qǐng)求參數(shù)時(shí)
- 當(dāng)變量為實(shí)體時(shí):會(huì)嘗試所有請(qǐng)求參數(shù)做為屬性注入
- 否則注入 null
支持多種形式的請(qǐng)求參數(shù)直接注入:
- queryString
- form-data
- x-www-form-urlencoded
- path
- json body
其中 queryString, form-data, x-www-form-urlencoded, path 參數(shù),支持 ctx.param() 接口統(tǒng)一獲取。
import org.noear.solon.core.handle.Context;
import org.noear.solon.core.handle.ModelAndView;
import org.noear.solon.core.handle.UploadedFile;
import java.util.Locale;
@Mapping("/user")
@Controller
public void DemoController{
//非請(qǐng)求參數(shù)的可注入對(duì)象
@Mapping("case1")
public void case1(Context ctx, Locale locale , ModelAndView mv){ }
//請(qǐng)求參數(shù)(可以是散裝的;支持 queryString, form;json,或支持的其它序列化格式)
@Mapping("case2")
public void case2(String userName, String nickName, long[] ids, List<String> names){ }
//請(qǐng)求參數(shù)(可以是整裝的結(jié)構(gòu)體;支持 queryString, form;json,或支持的其它序列化格式Mapping
@Mapping("case3")
public void case3(UserModel user){ }
//也可以是混搭的
@Mapping("case4")
public void case4(Context ctx, UserModel user, String userName){ }
//文件上傳 //注意與 <input type='file' name="file1" /> 名字對(duì)上
@Mapping("case5")
public void case5(UploadedFile file1, UploadedFile file2){ }
//同名多文件上傳
@Mapping("case6")
public void case6(UploadedFile[] file){ }
}提醒: ?user[name]=1&ip[0]=a&ip[1]=b&order.id=1 風(fēng)格的參數(shù)注入,需要引入插件:solon-serialization-properties
4、帶注解的參數(shù)注入
注解:
| 注解 | 說明 |
|---|---|
| @Param | 注入請(qǐng)求參數(shù)(包括:query-string、form)。起到指定名字、默認(rèn)值等作用 |
| @Header | 注入請(qǐng)求 header |
| @Cookie | 注入請(qǐng)求 cookie |
| @Path | 注入請(qǐng)求 path 變量(因?yàn)榭蚣軙?huì)自動(dòng)處理,所以這個(gè)只是標(biāo)識(shí)下方便文檔生成用) |
| @Body | 注入請(qǐng)求體(一般會(huì)自動(dòng)處理。僅在主體的 String, InputSteam, Map 時(shí)才需要) |
注解相關(guān)屬性:
| 屬性 | 說明 | 適用注解 |
|---|---|---|
| value | 參數(shù)名字 | @Param, @Header, @Cookie, @Path |
| name | 參數(shù)名字(與 value 互為別名) | @Param, @Header, @Cookie, @Path |
| required | 必須的 | @Param, @Header, @Cookie, @Body |
| defaultValue | 默認(rèn)值 | @Param, @Header, @Cookie, @Body |
import org.noear.solon.annotation.Controller;
import org.noear.solon.annotation.Mapping;
import org.noear.solon.annotation.Header;
import org.noear.solon.annotation.Body;
import org.noear.solon.annotation.Path;
@Mapping("/user")
@Controller
public void DemoController{
@Mapping("case1")
public void case1(@Body String bodyStr){ }
@Mapping("case2")
public void case2(@Body Map<String,String> paramMap, @Header("Token") String token){ }
@Mapping("case3")
public void case3(@Body InputStream stream, @Cookie("Token") token){ }
//這個(gè)用例加不加 @Body 效果一樣
@Mapping("case4")
public void case4(@Body UserModel user){ }
@Mapping("case5/{id}")
public void case5(String id){ }
//如果名字不同,才有必要用 @Path //否則是自動(dòng)處理(如上)
@Mapping("case5_2/{id}")
public void case5_2(@Path("id") String name){ }
@Mapping("case6")
public void case6(String name){ }
//如果名字不同,才有必要用 @Param //否則是自動(dòng)處理(如上)
@Mapping("case6_2")
public void case6_2(@Param("id") String name){ }
//如果要默認(rèn)值,才有必要用 @Param
@Mapping("case6_3")
public void case6_3(@Param(defaultValue="world") String name){ }
@Mapping("case7")
public void case7(@Header String token){ }
@Mapping("case7_2")
public void case7_2(@Header String[] user){ } //v2.4.0 后支持
}5、請(qǐng)求方式限定
可以1個(gè)或多個(gè)加個(gè) @Mppaing 注解上,用于限定請(qǐng)求方式(不限,則支持全部請(qǐng)求方式)
| 請(qǐng)求方式限定注解 | 說明 |
|---|---|
| @Get | 限定為 Http Get 請(qǐng)求方式 |
| @Post | 限定為 Http Post 請(qǐng)求方式 |
| @Put | 限定為 Http Put 請(qǐng)求方式 |
| @Delete | 限定為 Http Delete 請(qǐng)求方式 |
| @Patch | 限定為 Http Patch 請(qǐng)求方式 |
| @Head | 限定為 Http Head 請(qǐng)求方式 |
| @Options | 限定為 Http Options 請(qǐng)求方式 |
| @Trace | 限定為 Http Trace 請(qǐng)求方式 |
| @Http | 限定為 Http 所有請(qǐng)求方式 |
| @Message | 限定為 Message 請(qǐng)求方式 |
| @To | 標(biāo)注轉(zhuǎn)發(fā)目標(biāo) |
| @WebSokcet | 限定為 WebSokcet 請(qǐng)求方式 |
| @Sokcet | 限定為 Sokcet 請(qǐng)求方式 |
| @All | 允許所有請(qǐng)求方式(默認(rèn)) |
| 其它限定注解 | 說明 |
|---|---|
| @Produces | 申明輸出內(nèi)容類型 |
| @Consumes | 申明輸入內(nèi)容類型(當(dāng)輸出內(nèi)容類型未包函 @Consumes,則響應(yīng)為 415 狀態(tài)碼) |
| @Multipart | 顯式申明支持 Multipart 輸入 |
例:
import org.noear.solon.boot.web.MimeType;
@Mapping("/user")
@Controller
public void DemoController{
@Get
@Mapping("case1")
public void case1(Context ctx, Locale locale , ModelAndView mv){ }
//也可以直接使用 Mapping 的屬性進(jìn)行限定。。。但是沒使用注解的好看
@Mapping(path = "case1_2", method = MethodType.GET)
public void case1_2(Context ctx, Locale locale , ModelAndView mv){ }
@Put
@Message
@Mapping("case2")
public void case2(String userName, String nickName){ }
//如果沒有輸出申明,側(cè) string 輸出默認(rèn)為 "text/plain"
@Produces(MimeType.APPLICATION_JSON_VALUE)
@Mapping("case3")
public String case3(){
return "{code:1}";
}
////也可以直接使用 Mapping 的屬性進(jìn)行限定。。。但是沒使用注解的好看
@Mapping(path= "case3_2", produces=MimeType.APPLICATION_JSON_VALUE))
public String case3_2(){
return "{code:1}";
}
//如果沒有輸出申明,側(cè) object 輸出默認(rèn)為 "application/json"
@Mapping("case3_3")
public User case3_3(){
return new User();
}
}6、輸出類型
@Mapping("/user")
@Controller
public void DemoController{
//輸出視圖與模型,經(jīng)后端渲染后輸出最終格式
@Maping("case1")
public ModelAndView case1(){
ModelAndView mv = new ModelAndView();
mv.put("name", "world");
mv.view("hello.ftl");
return mv;
}
//輸出結(jié)構(gòu)體,默認(rèn)會(huì)采用josn格式渲染后輸出
@Maping("case2")
public UserModel case2(){
return new UserModel();
}
//輸出下載文件
@Maping("case3")
public Object case3(){
return new File(...); //或者 return new DownloadedFile(...);
}
}7、父類繼承支持
@Mapping("user")
public void UserController extends CrudControllerBase<User>{
}
public class CrudControllerBase<T>{
@Post
@Mapping("add")
public void add(T t){
...
}
@Delete
@Mapping("remove")
public void remove(T t){
...
}
}到此這篇關(guān)于Solon MVC 的 @Mapping 用法示例說明的文章就介紹到這了,更多相關(guān)Solon MVC @Mapping 用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java實(shí)現(xiàn)聯(lián)機(jī)五子棋
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)聯(lián)機(jī)五子棋,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
String s = new String(''a '') 到底產(chǎn)生幾個(gè)對(duì)象
這篇文章主要介紹了String s = new String(" a ") 到底產(chǎn)生幾個(gè)對(duì)象,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
如何利用Java實(shí)現(xiàn)MySQL的數(shù)據(jù)變化監(jiān)聽
在高并發(fā)和大數(shù)據(jù)環(huán)境下,實(shí)時(shí)獲取?MySQL?數(shù)據(jù)庫的增量變化對(duì)數(shù)據(jù)同步、數(shù)據(jù)分析、緩存更新等場(chǎng)景至關(guān)重要,下面我們就來看看如何通過Java實(shí)現(xiàn)MySQL的數(shù)據(jù)變化監(jiān)聽吧2025-02-02
Java實(shí)現(xiàn)轉(zhuǎn)換圖片格式的示例代碼
在日常的軟件開發(fā)中,處理圖像文件是一項(xiàng)常見任務(wù),這篇文章將實(shí)現(xiàn)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的Java程序,用于將一種圖片格式轉(zhuǎn)換為另一種格式,需要的可以了解下2025-02-02
Mybatis-Plus的saveOrUpdateBatch(null)問題及解決
這篇文章主要介紹了Mybatis-Plus的saveOrUpdateBatch(null)問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07

