日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

如何編寫優雅的 Controller 代碼?

來源: 責編: 時間:2024-06-24 17:13:27 212觀看
導讀作為一名 Java程序員,對 Controller肯定不陌生,它是與外部客戶端通信的入口,比如常見的 REST 操作(GET、PUT、POST、DELETE等),那么,Controller里面應該如何編寫才算優雅呢?其實,一個優雅的 Controller,里面的代碼主要包含下面

作為一名 Java程序員,對 Controller肯定不陌生,它是與外部客戶端通信的入口,比如常見的 REST 操作(GET、PUT、POST、DELETE等),那么,Controller里面應該如何編寫才算優雅呢?spv28資訊網——每日最新資訊28at.com

spv28資訊網——每日最新資訊28at.com

其實,一個優雅的 Controller,里面的代碼主要包含下面 6個部分:spv28資訊網——每日最新資訊28at.com

  • 接收 HTTP(s)請求
  • 解析請求參數
  • 驗證請求參數
  • 調用業務方法
  • 組織返回數據
  • 統一異常處理

spv28資訊網——每日最新資訊28at.com

下面一一講解這 6個部分:spv28資訊網——每日最新資訊28at.com

spv28資訊網——每日最新資訊28at.com

一、接收 HTTP(s)請求

接收 HTTP(s)請求是 Controller的入口,這里以查詢用戶信息為例進行說明,如下代碼:spv28資訊網——每日最新資訊28at.com

@RestControllerpublic class UserController {    @GetMapping("/user/{userId}")    public void getUserById(@PathVariable String userId) {        // 業務邏輯    }}

在上面的示例中,我們使用 URL/user/{id}接收用戶發出的 GET請求,然后通過getUserById方法進行真實的業務處理。通過上面的代碼,一個請求就被 Controller層成功接收了。spv28資訊網——每日最新資訊28at.com

二、解析請求參數

接收到請求后,一般需要對請求參數進行解析,如下示例代碼:spv28資訊網——每日最新資訊28at.com

@RestControllerpublic class UserController {    @PostMapping("/user/register")    public void getGradeById(@RequestBody User user) {        // 代碼邏輯    }}public class User {    private String nickname;    private Integer age;    // getters and setters and constructors}

上述示例代碼將請求的 body映射到 User對象上,因此,請求的 body體應該是:spv28資訊網——每日最新資訊28at.com

{  "nickname": "huahua",  "age": "18"}

在 SpringMVC 中,常見的參數類型及其用途如下:spv28資訊網——每日最新資訊28at.com

1.原始 HTTP請求和響應對象

直接接收原始的 HTTP請求和響應對象,HttpServletRequest 和 HttpServletResponsespv28資訊網——每日最新資訊28at.com

@RequestMapping("/test")public void example(HttpServletRequest request, HttpServletResponse response) {    // 處理請求和響應}

2.路徑變量 (@PathVariable)

用于獲取 URL 路徑中的動態部分。spv28資訊網——每日最新資訊28at.com

@RequestMapping("/user/{id}")public String getUser(@PathVariable("id") String userId) {    // 使用 userId 進行處理    return "userDetail";}

3.請求參數 (@RequestParam)

用于獲取 URL 查詢參數或表單數據。spv28資訊網——每日最新資訊28at.com

@RequestMapping("/search")public String search(@RequestParam("query") String query) {    // 使用 query 進行搜索    return "searchResults";}

4.請求體 (@RequestBody)

用于接收請求體中的數據,常用于處理 JSON 或 XML 格式的數據。spv28資訊網——每日最新資訊28at.com

@RequestMapping(value = "/create", method = RequestMethod.POST)public String create(@RequestBody User user) {    // 處理 user 對象    return "user";}

5.模型屬性 (@ModelAttribute)

用于綁定表單數據到模型對象。spv28資訊網——每日最新資訊28at.com

@RequestMapping("/register")public String register(@ModelAttribute User user) {    // 處理 user 對象    return "user";}

6.會話屬性 (@SessionAttribute)

用于訪問會話中的屬性。spv28資訊網——每日最新資訊28at.com

@RequestMapping("/profile")public String profile(@SessionAttribute("user") User user) {    // 處理會話中的 user 對象    return "profile";}

7.請求頭 (@RequestHeader)

用于訪問 HTTP 請求頭信息。spv28資訊網——每日最新資訊28at.com

@RequestMapping("/headers")public String headers(@RequestHeader("User-Agent") String userAgent) {    // 使用 userAgent 進行處理    return "headerInfo";}

8.Cookie 值 (@CookieValue)

用于訪問 Cookie 的值。spv28資訊網——每日最新資訊28at.com

@RequestMapping("/cookies")public String cookies(@CookieValue("sessionId") String sessionId) {    // 使用 sessionId 進行處理    return sessionId;}

9.自定義參數解析器

可以通過實現 HandlerMethodArgumentResolver接口來自定義參數解析邏輯。spv28資訊網——每日最新資訊28at.com

@RequestMapping("/custom")public String custom(CustomObject customObject) {// 使用自定義對象進行處理    return "";}

三、驗證請求參數

請求參數的驗證需要在 Controller層完成,如下代碼,對 nickname進行判空處理,參數驗證一般有 2種方式:spv28資訊網——每日最新資訊28at.com

  • 原始方式,這種方式比較靈活,如果需要對參數進行一些邏輯計算后再校驗;
  • 借助三方工具,比如 Spring validation,javax validation等,這種方式靈活度會低一些,但是更優雅;
// 原始方式校驗參數@RestControllerpublic class UserController {    @PostMapping("/user/register")    public void getGradeById(@RequestBody User user) {        // 代碼邏輯        if (StringUtils.isBlank(user.getNickname)) {            throw new Exception("Nickname is required.");        }    }}

或者使用 Spring validation驗證機制,Controller需要增加@Validated注解,User對象中增加@NotBlank注解。spv28資訊網——每日最新資訊28at.com

// 借助Spring validation方式校驗參數@RestControllerpublic class UserController {    @PostMapping("/user/register")    public void getGradeById(@Validated @RequestBody User user) {        // 代碼邏輯    }}public class User {    @NotBlank(message = "Nickname is required.")    private String nickname;    private Integer age;    // getters and setters and constructors}

四、調用業務方法

如下代碼,調用 UserService.register()進行注冊業務處理:spv28資訊網——每日最新資訊28at.com

@RestControllerpublic class UserController {    private final UserService userService;    public UserController(UserService userService) {        this.userService = userService;    }    @PostMapping("/user/register")    public void getGradeById(@Validated @RequestBody User user) {        // 調用注冊的業務方法        userService.register(user);    }}public class User {    @NotBlank(message = "Nickname is required.")    private String nickname;    private Integer age;    // getters and setters and constructors}

關于調用業務方法,這里的業務方法是寫一個大而全的方法?還是需要按業務歸類?spv28資訊網——每日最新資訊28at.com

遵守一個原則:有強關聯性的邏輯放在一個service方法內,沒有強關聯性的單令拎出來。spv28資訊網——每日最新資訊28at.com

這里以用戶注冊之后需要新人發券為例進行說明:spv28資訊網——每日最新資訊28at.com

大而全的方法:spv28資訊網——每日最新資訊28at.com

    @PostMapping("/user/register")    public void getGradeById(@Validated @RequestBody User user) {        // 調用注冊的業務方法        userService.doRegister(user);    }        public String doRegister(Uswr user){        String userId = userService.register(user);        coupon.sendCoupon(userId);        // 其他業務邏輯        return userId;    }

業務歸類:spv28資訊網——每日最新資訊28at.com

    @PostMapping("/user/register")    public void getGradeById(@Validated @RequestBody User user) {        // 調用注冊的業務方法        userService.register(user);        coupon.sendCoupon(userId);    }

五、組織返回數據

如下代碼,調用 UserService.register()進行注冊業務處理:spv28資訊網——每日最新資訊28at.com

@RestControllerpublic class UserController {    private final UserService userService;    public UserController(UserService userService) {        this.userService = userService;    }    @PostMapping("/user/register")    public UserResponse getGradeById(@Validated @RequestBody User user) {        // 調用注冊的業務方法        String userId = userService.regist(user);        return new UserResponse(userId, user.getNickname);    }}public class UserResponse {    private String userId;    private String nickname;    // getters and setters and constructors}

六、統一異常處理

比如上述過程在 userService.regist(user);出現異常時,可以做一個try-catch,然后在 Controller層封裝有業務意思的異常信息:spv28資訊網——每日最新資訊28at.com

@RestControllerpublic class UserController {    private final UserService userService;    @PostMapping("/user/register")    public UserResponse getGradeById(@Validated @RequestBody User user) {        // 調用注冊的業務方法        try {            String userId = userService.regist(user);        } catch (Exception e) {            throw new CustomException();        }        return new UserResponse(userId, user.getNickname);    }}

建議和總結

看過很多代碼,業務邏輯全部寫在 Controller層,并不能說這樣的做法是錯的,但是看起來很別扭,不優雅!因此,建議在編寫代碼時,最好能遵守一個比較好的規范,比如常見的SOLID規范。spv28資訊網——每日最新資訊28at.com

SOLID 實際上是五個設計原則首字母的縮寫,它們分別是:spv28資訊網——每日最新資訊28at.com

  • 單一職責原則(Single responsibility principle, SRP)
  • 開放封閉原則(Open–closed principle, OCP)
  • Liskov 替換原則(Liskov substitution principle, LSP)
  • 接口隔離原則(Interface segregation principle, ISP)
  • 依賴倒置原則(Dependency inversion principle, DIP)

另外,建議我們技術人員平時多去閱讀一些優秀開源框架,學習他們的設計思想,代碼規范,相信我:養成一個良好的編碼規范,絕對受益頗多!spv28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-96045-0.html如何編寫優雅的 Controller 代碼?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 美國兩名 05 后高中生聯手打造 API 初創,已獲 50 萬美元融資

下一篇: Python 處理 CSV 文件的 12 個高效技巧

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
亚洲成色777777女色窝| 国产精品国产亚洲精品看不卡15| 亚洲午夜在线观看视频在线| 国产精品乱人伦中文| 久久蜜桃香蕉精品一区二区三区| 日韩视频在线观看| 国产色产综合色产在线视频| 欧美日韩国产三区| 亚洲欧洲一区二区三区在线观看| 国产精品大片| 欧美成ee人免费视频| 午夜久久久久久| 日韩写真视频在线观看| 影音先锋亚洲电影| 国产精品女人网站| 欧美日韩黄视频| 麻豆成人小视频| 欧美一区二区三区四区高清| 亚洲一区二区高清| 日韩一区二区精品| 亚洲免费不卡| 激情综合网激情| 国产日韩亚洲欧美| 亚洲黄色成人网| 伊大人香蕉综合8在线视| 亚洲区一区二| 亚洲精品欧美日韩专区| 亚洲激情视频在线播放| 亚洲男女自偷自拍| 亚洲天堂网站在线观看视频| 99v久久综合狠狠综合久久| 亚洲欧美日韩天堂| 欧美成人精品三级在线观看| 亚洲精品孕妇| 亚洲综合三区| 亚洲一级特黄| 男女激情视频一区| 嫩模写真一区二区三区三州| 国产精品久久久久久久久久直播| 激情成人综合网| 影音先锋久久精品| 亚洲在线一区二区| 欧美一区二区三区四区视频| 午夜在线观看欧美| 欧美精品激情在线| 欧美精品久久久久久久免费观看| 久久天堂成人| 久久精品国产综合精品| 久久国产精品久久国产精品| 久久久精品欧美丰满| 久久青草福利网站| 国产精品国产| 亚洲精品久久久久久久久久久久久| 亚洲黄色小视频| 一区二区三区精品视频| 99精品视频免费观看视频| 欧美视频福利| 欧美日韩国产三级| 在线观看日韩av电影| 亚洲日本va午夜在线电影| 欧美一区二区成人| 免费看黄裸体一级大秀欧美| 国产视频亚洲精品| 一区二区三区在线视频观看| 午夜精品国产精品大乳美女| 欧美日韩精品在线播放| 国产精品久久久久9999| 久久国产精品99精品国产| 久久精品国产清高在天天线| 麻豆精品在线视频| 国产亚洲欧洲997久久综合| 亚洲一区综合| 久久亚洲精品一区二区| 国产欧美精品xxxx另类| 激情av一区二区| 亚洲美女尤物影院| 午夜久久黄色| 久久亚洲精品伦理| 欧美精品情趣视频| 国产精品久久999| 国产日本欧美视频| 国产精品制服诱惑| 亚洲国产欧美日韩| 亚洲视频欧洲视频| 欧美日韩国产在线播放网站| 国产精品永久免费在线| 亚洲国产91| 亚洲综合日韩在线| 久久久久综合| 欧美亚洲成人精品| 136国产福利精品导航网址| 亚洲一区二区四区| 欧美精品一区二区三区久久久竹菊 | 欧美www视频在线观看| 1024亚洲| 午夜精彩国产免费不卡不顿大片| 欧美gay视频| 亚洲国产一区在线| 欧美激情精品久久久久| 国产欧美精品一区| 欧美中文字幕久久| 一区二区在线视频观看| 久久综合一区二区| 国产欧美日韩一区二区三区在线 | 麻豆国产精品va在线观看不卡| 欧美日韩在线播放三区| 亚洲大胆人体视频| 欧美大片免费观看| 精品动漫一区| 欧美a级片一区| 亚洲精一区二区三区| 国产精品草草| 久久av资源网站| 亚洲第一中文字幕| 久久精品国产久精国产思思| 尤物yw午夜国产精品视频明星| 午夜精品婷婷| 国产精品国产三级国产a| 午夜欧美精品| 国产精品久久中文| 久久狠狠久久综合桃花| 亚洲国产欧美日韩| 欧美天堂亚洲电影院在线观看| 欧美一区日韩一区| 亚洲国产午夜| 欧美一级黄色录像| 黄色一区三区| 欧美涩涩网站| 久久久久久久999| 黑人操亚洲美女惩罚| 久久精品国产久精国产思思 | 亚洲欧美日韩在线观看a三区 | 一区二区三区日韩精品| 国产一区二区精品久久| 欧美一区二区免费视频| 亚洲电影毛片| 国产精品美女在线| 六十路精品视频| 亚洲国产日韩一级| 欧美午夜在线一二页| 一本色道久久88亚洲综合88| 欧美区日韩区| 99热在线精品观看| 国产日韩在线看片| 欧美精品观看| 久久精品一区四区| 亚洲最新在线| 在线免费日韩片| 国产精品夜夜夜| 欧美黄色一区二区| 一本久久精品一区二区| 国产一区二区高清不卡| 欧美日韩福利视频| 亚洲午夜一区二区三区| 精品不卡在线| 国产精品免费看片| 性欧美精品高清| 亚洲精品一区二区在线观看| 欧美日韩一区二区精品| 久久久一区二区| 亚洲欧美国产不卡| 亚洲毛片av在线| 在线观看日韩www视频免费 | 欧美制服丝袜第一页| 亚洲天堂成人| 亚洲精品久久久久久一区二区 | 欧美日韩喷水| 免费日韩成人| 一本色道久久综合狠狠躁篇怎么玩| 国产精品初高中精品久久| 欧美一区激情| 亚洲风情亚aⅴ在线发布| 国产精品日韩欧美| 久久久久久久久久码影片| 亚洲影院一区| 亚洲视频欧美视频| 国产亚洲精品高潮| 国产精品二区三区四区| 欧美激情一区二区三区不卡| 久久婷婷丁香| 久久久www| 欧美主播一区二区三区| 亚洲嫩草精品久久| 亚洲色图在线视频| 日韩网站在线看片你懂的| 亚洲国产91色在线| 一区免费观看| 黄色小说综合网站| 国产一区二区三区久久| 欧美成人亚洲成人| 亚洲自拍偷拍视频| 夜夜精品视频| 亚洲精品之草原avav久久| 亚洲激情网站免费观看| 在线日本高清免费不卡| 今天的高清视频免费播放成人| 国产午夜精品在线观看| 国产日韩一区二区三区| 欧美精品在线播放| 欧美精品国产一区二区| 欧美黄色一区| 欧美一区二区视频观看视频| 亚洲欧美日韩国产中文在线| 亚洲欧美日韩国产成人|