Solon?MVC?的?@Mapping?用法示例說明
在 Solon Mvc 里,@Mapping 注解一般是配合 @Controller 和 @Remoting,作請求路徑映射用的。且,只支持加在 public 函數(shù) 或 類上。
1、注解屬性
屬性 | 說明 | 備注 |
---|---|---|
value | 路徑 | 與 path 互為別名 |
path | 路徑 | 與 value 互為別名 |
method | 請求方式限定(def=all) | 可用 @Post 、@Get 等注解替代此屬性 |
consumes | 指定處理請求的提交內容類型 | 可用 @Consumes 注解替代此屬性 |
produces | 指定返回的內容類型 | 可用 @Produces 注解替代此屬性 |
multipart | 申明支持多分片請求(def=false) | 如果為false,則自動識別 |
當 method=all,即不限定請求方式
2、支持的路徑映射表達式
符號 | 說明 | 示例 |
---|---|---|
** | 任意字符、不限段數(shù) | ** 或 /user/** |
* | 任意字符 | /user/* |
? | 可有可無 | /user/? |
/ | 路徑片段開始符和間隔符 | / 或 /user |
{name} | 路徑變量申明 | /user/{name} |
路徑組合(控制器映射與動作映射)及應用示例:
import org.noear.solon.annotation.Controller; import org.noear.solon.annotation.Mapping; @Mapping("/user") //或 "user",開頭自動會補"/" @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 ,間隔自動會補"/" public void getList(){ } @Mapping("/{id}") //=/user/{id} public void getOne(long id){ } @Mapping("/ajax/**") //=/user/ajax/** public void ajax(){ } }
提醒:一個 @Mapping
函數(shù)不支持多個路徑的映射
3、參數(shù)注入
非請求參數(shù)的可注入對象:
類型 | 說明 |
---|---|
Context | 請求上下文(org.noear.solon.core.handle.Context) |
Locale | 請求的地域信息,國際化時需要 |
ModelAndView | 模型與視圖對象(org.noear.solon.core.handle.ModelAndView) |
支持請求參數(shù)自動轉換注入:
- 當變量名有對應的請求參數(shù)時(即有名字可對上的請求參數(shù))
- 會直接嘗試對請求參數(shù)值進行類型轉換
- 當變量名沒有對應的請求參數(shù)時
- 當變量為實體時:會嘗試所有請求參數(shù)做為屬性注入
- 否則注入 null
支持多種形式的請求參數(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{ //非請求參數(shù)的可注入對象 @Mapping("case1") public void case1(Context ctx, Locale locale , ModelAndView mv){ } //請求參數(shù)(可以是散裝的;支持 queryString, form;json,或支持的其它序列化格式) @Mapping("case2") public void case2(String userName, String nickName, long[] ids, List<String> names){ } //請求參數(shù)(可以是整裝的結構體;支持 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" /> 名字對上 @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
風格的參數(shù)注入,需要引入插件:solon-serialization-properties
4、帶注解的參數(shù)注入
注解:
注解 | 說明 |
---|---|
@Param | 注入請求參數(shù)(包括:query-string、form)。起到指定名字、默認值等作用 |
@Header | 注入請求 header |
@Cookie | 注入請求 cookie |
@Path | 注入請求 path 變量(因為框架會自動處理,所以這個只是標識下方便文檔生成用) |
@Body | 注入請求體(一般會自動處理。僅在主體的 String, InputSteam, Map 時才需要) |
注解相關屬性:
屬性 | 說明 | 適用注解 |
---|---|---|
value | 參數(shù)名字 | @Param, @Header, @Cookie, @Path |
name | 參數(shù)名字(與 value 互為別名) | @Param, @Header, @Cookie, @Path |
required | 必須的 | @Param, @Header, @Cookie, @Body |
defaultValue | 默認值 | @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){ } //這個用例加不加 @Body 效果一樣 @Mapping("case4") public void case4(@Body UserModel user){ } @Mapping("case5/{id}") public void case5(String id){ } //如果名字不同,才有必要用 @Path //否則是自動處理(如上) @Mapping("case5_2/{id}") public void case5_2(@Path("id") String name){ } @Mapping("case6") public void case6(String name){ } //如果名字不同,才有必要用 @Param //否則是自動處理(如上) @Mapping("case6_2") public void case6_2(@Param("id") String name){ } //如果要默認值,才有必要用 @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、請求方式限定
可以1個或多個加個 @Mppaing 注解上,用于限定請求方式(不限,則支持全部請求方式)
請求方式限定注解 | 說明 |
---|---|
@Get | 限定為 Http Get 請求方式 |
@Post | 限定為 Http Post 請求方式 |
@Put | 限定為 Http Put 請求方式 |
@Delete | 限定為 Http Delete 請求方式 |
@Patch | 限定為 Http Patch 請求方式 |
@Head | 限定為 Http Head 請求方式 |
@Options | 限定為 Http Options 請求方式 |
@Trace | 限定為 Http Trace 請求方式 |
@Http | 限定為 Http 所有請求方式 |
@Message | 限定為 Message 請求方式 |
@To | 標注轉發(fā)目標 |
@WebSokcet | 限定為 WebSokcet 請求方式 |
@Sokcet | 限定為 Sokcet 請求方式 |
@All | 允許所有請求方式(默認) |
其它限定注解 | 說明 |
---|---|
@Produces | 申明輸出內容類型 |
@Consumes | 申明輸入內容類型(當輸出內容類型未包函 @Consumes,則響應為 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 的屬性進行限定。。。但是沒使用注解的好看 @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){ } //如果沒有輸出申明,側 string 輸出默認為 "text/plain" @Produces(MimeType.APPLICATION_JSON_VALUE) @Mapping("case3") public String case3(){ return "{code:1}"; } ////也可以直接使用 Mapping 的屬性進行限定。。。但是沒使用注解的好看 @Mapping(path= "case3_2", produces=MimeType.APPLICATION_JSON_VALUE)) public String case3_2(){ return "{code:1}"; } //如果沒有輸出申明,側 object 輸出默認為 "application/json" @Mapping("case3_3") public User case3_3(){ return new User(); } }
6、輸出類型
@Mapping("/user") @Controller public void DemoController{ //輸出視圖與模型,經后端渲染后輸出最終格式 @Maping("case1") public ModelAndView case1(){ ModelAndView mv = new ModelAndView(); mv.put("name", "world"); mv.view("hello.ftl"); return mv; } //輸出結構體,默認會采用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){ ... } }
到此這篇關于Solon MVC 的 @Mapping 用法示例說明的文章就介紹到這了,更多相關Solon MVC @Mapping 用法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
String s = new String(''a '') 到底產生幾個對象
這篇文章主要介紹了String s = new String(" a ") 到底產生幾個對象,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-05-05如何利用Java實現(xiàn)MySQL的數(shù)據(jù)變化監(jiān)聽
在高并發(fā)和大數(shù)據(jù)環(huán)境下,實時獲取?MySQL?數(shù)據(jù)庫的增量變化對數(shù)據(jù)同步、數(shù)據(jù)分析、緩存更新等場景至關重要,下面我們就來看看如何通過Java實現(xiàn)MySQL的數(shù)據(jù)變化監(jiān)聽吧2025-02-02Mybatis-Plus的saveOrUpdateBatch(null)問題及解決
這篇文章主要介紹了Mybatis-Plus的saveOrUpdateBatch(null)問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07