最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring?MVC中@Controller和@RequestMapping注解使用

 更新時(shí)間:2022年02月22日 08:56:23   作者:糊涂的奮斗  
這篇文章主要介紹了Spring?MVC中@Controller和@RequestMapping注解使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

@Controller和@RequestMapping注解使用

RequestMapping 注解類型

1)方法級(jí)別注解

@RequestMapping(value = "/index/login")
public String login() {
/**
* login代表邏輯視圖名稱,需要根據(jù)Spring MVC配置
* 文件中internalResourceViewResolver的前綴和后綴找到對(duì)應(yīng)的物理視圖
*/
return "login";
}

2)類級(jí)別注解

@RequestMapping("/index")
public class IndexController {
}

通過 @RequestParam 接收請(qǐng)求參數(shù)

@RequestMapping("/register")
/**
* 通過@RequestParam接收請(qǐng)求參數(shù)
*/
public String register(@RequestParam String uname,
? ? @RequestParam String upass, Model model) {
? ? if ("zhangsan".equals(uname) && "123456".equals(upass)) {
? ? ? ? logger.info("成功");
? ? ? ? return "login"; // 注冊(cè)成功,跳轉(zhuǎn)到 login.jsp
? ? } else {
? ? ? ? // 在register.jsp頁面上可以使用EL表達(dá)式取出model的uname值
? ? ? ? model.addAttribute("uname", uname);
? ? ? ? return "register"; // 返回 register.jsp
? ? }
}
@RequestMapping("/register")
public String register(@ModelAttribute("user") UserForm user) {
? ? if ("zhangsan".equals(uname) && "123456".equals(upass)) {
? ? ? ? logger.info("成功");
? ? ? ? return "login"; // 注冊(cè)成功,跳轉(zhuǎn)到 login.jsp
? ? } else {
? ? ? ? logger.info("失敗");
? ? ? ? // 使用@ModelAttribute("user")與model.addAttribute("user",user)的功能相同
? ? ? ? //register.jsp頁面上可以使用EL表達(dá)式${user.uname}取出ModelAttribute的uname值
? ? ? ? return "register"; // 返回 register.jsp
? ? }
}

Spring MVC應(yīng)用@Autowired和@Service進(jìn)行依賴注入

<context:component-scan base-package="service" />

通過 org.springframework.web.bind.annotation.ModelAttribute

注解類型可經(jīng)常實(shí)現(xiàn)以下兩個(gè)功能:

1.綁定請(qǐng)求參數(shù)到實(shí)體對(duì)象(表單的命令對(duì)象)

@RequestMapping("/register")
public String register(@ModelAttribute("user") UserForm user) {
? ? if ("zhangsan".equals(uname) && "123456".equals(upass)) {
? ? ? ? logger.info("成功");
? ? ? ? return "login";
? ? } else {
? ? ? ? logger.info("失敗");
? ? ? ? return "register";
}

在上述代碼中“@ModelAttribute("user")UserForm user”語句的功能有兩個(gè):

將請(qǐng)求參數(shù)的輸入封裝到 user 對(duì)象中。

創(chuàng)建 UserForm 實(shí)例。

以“user”為鍵值存儲(chǔ)在 Model 對(duì)象中,和“model.addAttribute("user",user)”語句的功能一樣。如果沒有指定鍵值,即“@ModelAttribute UserForm user”,那么在創(chuàng)建 UserForm 實(shí)例時(shí)以“userForm”為鍵值存儲(chǔ)在 Model 對(duì)象中,和“model.addAtttribute("userForm", user)”語句的功能一樣。

2.注解一個(gè)非請(qǐng)求處理方法 

被 @ModelAttribute 注解的方法將在每次調(diào)用該控制器類的請(qǐng)求處理方法前被調(diào)用。這種特性可以用來控制登錄權(quán)限,當(dāng)然控制登錄權(quán)限的方法有很多,例如攔截器、過濾器等。

攔截器的配置 

讓自定義的攔截器生效需要在 Spring MVC 的配置文件中進(jìn)行配置,配置示例代碼如下:

<!-- 配置攔截器 -->
<mvc:interceptors>
? ? <!-- 配置一個(gè)全局?jǐn)r截器,攔截所有請(qǐng)求 -->
? ? <bean class="interceptor.TestInterceptor" />?
? ? <mvc:interceptor>
? ? ? ? <!-- 配置攔截器作用的路徑 -->
? ? ? ? <mvc:mapping path="/**" />
? ? ? ? <!-- 配置不需要攔截作用的路徑 -->
? ? ? ? <mvc:exclude-mapping path="" />
? ? ? ? <!-- 定義<mvc:interceptor>元素中,表示匹配指定路徑的請(qǐng)求才進(jìn)行攔截 -->
? ? ? ? <bean class="interceptor.Interceptor1" />
? ? </mvc:interceptor>
? ? <mvc:interceptor>
? ? ? ? <!-- 配置攔截器作用的路徑 -->
? ? ? ? <mvc:mapping path="/gotoTest" />
? ? ? ? <!-- 定義在<mvc: interceptor>元素中,表示匹配指定路徑的請(qǐng)求才進(jìn)行攔截 -->
? ? ? ? <bean class="interceptor.Interceptor2" />
? ? </mvc:interceptor>
</mvc:interceptors>?

在上述示例代碼中,<mvc:interceptors> 元素用于配置一組攔截器,其子元素 <bean> 定義的是全局?jǐn)r截器,即攔截所有的請(qǐng)求。

<mvc:interceptor> 元素中定義的是指定路徑的攔截器,其子元素 <mvc:mapping> 用于配置攔截器作用的路徑,該路徑在其屬性 path 中定義。

如上述示例代碼中,path 的屬性值“/**”表示攔截所有路徑,“/gotoTest”表示攔截所有以“/gotoTest”結(jié)尾的路徑。如果在請(qǐng)求路徑中包含不需要攔截的內(nèi)容,可以通過 <mvc:exclude-mapping> 子元素進(jìn)行配置。

需要注意的是,<mvc:interceptor> 元素的子元素必須按照 <mvc:mapping.../>、<mvc:exclude-mapping.../>、<bean.../> 的順序配置。

@RequestMapping和Controller方法返回值

@RequestMapping

通過@RequestMapping注解可以定義不同的處理器映射規(guī)則。

1. URL路徑映射

@RequestMapping(value="/item") 或 @RequestMapping("/item") --當(dāng)括號(hào)里有多個(gè)屬性時(shí),value=不可以省略。

value的值是數(shù)組,可以將多個(gè)url映射到同一個(gè)方法。

/**
 * 查詢商品列表
 * @return
 */
@RequestMapping(value = { "itemList", "itemListAll" })
public ModelAndView queryItemList() {
    // 查詢商品數(shù)據(jù)
    List<Item> list = this.itemService.queryItemList(); 
    // 創(chuàng)建ModelAndView,設(shè)置邏輯視圖名
    ModelAndView mv = new ModelAndView("itemList"); 
    // 把商品數(shù)據(jù)放到模型中
    mv.addObject("itemList", list);
    return mv;
}

2. 添加在類上面

在class上添加@RequestMapping(url)指定通用請(qǐng)求前綴,限制此類下的所有方法請(qǐng)求url必須以請(qǐng)求前綴開頭

可以使用此方法對(duì)url進(jìn)行分類管理,如下圖:

此時(shí)需要進(jìn)入queryItemList()方法的請(qǐng)求url為:http://127.0.0.1:8080/api/item/itemList.action

或者

http://127.0.0.1:8080/api/item/itemListAll.action

3.請(qǐng)求方法限定

除了可以對(duì)url進(jìn)行設(shè)置,還可以限定請(qǐng)求進(jìn)來的方法。不寫的話默認(rèn)所有方法都可以。

(1)限定GET方法

@RequestMapping(method = RequestMethod.GET)

如果通過POST訪問則報(bào)錯(cuò):

HTTP Status 405 - Request method 'POST' not supported

例如:

@RequestMapping(value = "itemList",method = RequestMethod.POST)

(2)限定POST方法

@RequestMapping(method = RequestMethod.POST)

如果通過GET訪問則報(bào)錯(cuò):

HTTP Status 405 - Request method 'GET' not supported

(3)GET和POST都可以

@RequestMapping(method = {RequestMethod.GET,RequestMethod.POST})

Controller方法返回值

1. 返回ModelAndView --無敵的,帶著數(shù)據(jù),返回視圖路徑

controller方法中定義ModelAndView對(duì)象并返回,對(duì)象中可添加model數(shù)據(jù)、指定view。

@RequestMapping(value = "/item/itemlist.action")
public ModelAndView itemList(){     
    // 從MySQL中查詢數(shù)據(jù)
    List<Items> list = itemService.selectItemsList(); 
    // 創(chuàng)建ModelAndView,用來存放數(shù)據(jù)和視圖
    ModelAndView mav = new ModelAndView();
    // 設(shè)置數(shù)據(jù)到模型中
    mav.addObject("itemList", list); //頁面上循環(huán)的是itemList
    // 設(shè)置視圖的路徑,需要設(shè)置視圖的物理地址
    //mav.setViewName("/WEB-INF/jsp/itemList.jsp");
    mav.setViewName("itemList"); //在springmvc.xml中替換掉默認(rèn)的視圖解析器 
    return mav;
}

2. 返回void --數(shù)據(jù)通過形參 Model model 或者 ModelMap model,但是沒辦法return視圖。

如果需要返回視圖得通過request或response。這種比較適合ajax請(qǐng)求,但是給ajax返回?cái)?shù)據(jù)得json格式數(shù)據(jù)。

在Controller方法形參上可以定義request和response,使用request或response指定響應(yīng)結(jié)果:

(1)使用request轉(zhuǎn)發(fā)頁面,如下:

request.getRequestDispatcher("頁面路徑").forward(request, response);
request.getRequestDispatcher("/WEB-INF/jsp/success.jsp").forward(request, response);

(2)可以通過response頁面重定向:

response.sendRedirect("url")
response.sendRedirect("/itemEdit.action");

(3)可以通過response指定響應(yīng)結(jié)果,例如響應(yīng)json數(shù)據(jù)如下:

response.getWriter().print("{\"abc\":123}");

代碼:

/**
 * 返回void測(cè)試
 *
 * @param request
 * @param response
 * @throws Exception
 */
@RequestMapping("queryItem")
public void queryItem(HttpServletRequest request, HttpServletResponse response) throws Exception {
    // 1 使用request進(jìn)行轉(zhuǎn)發(fā)
    // request.getRequestDispatcher("/WEB-INF/jsp/success.jsp").forward(request,
    // response);
 
    // 2 使用response進(jìn)行重定向到編輯頁面
    // response.sendRedirect("/springmvc-web2/itemEdit.action");
 
    // 3 使用response直接顯示
    response.getWriter().print("{\"abc\":123}");
}

【注意】:改映射@RequestMapping、改方法名、改方法形參、改返回值都需要重啟程序,其他不需要重啟。

3.返回字符串(官方推薦此種方式) --返回視圖路徑,數(shù)據(jù)通過形參 Model model 或者 ModelMap model

(1)邏輯視圖名

controller方法返回字符串可以指定邏輯視圖名,通過視圖解析器解析為物理視圖地址。

//指定邏輯視圖名,經(jīng)過視圖解析器解析為jsp物理路徑:/WEB-INF/jsp/itemList.jsp
return "itemList";

示例代碼:

/**
 * 根據(jù)id查詢商品,綁定簡單數(shù)據(jù)類型
 *
 * @param id
 * @param model
 * @return
 */
@RequestMapping("/itemEdit.action")
public String queryItemById(Integer id, ModelMap model) { //不要用int,萬一傳進(jìn)來一個(gè)long
    // 根據(jù)id查詢商品數(shù)據(jù)
    Items item = this.itemService.selectItemsById(id);
 
    // 把商品數(shù)據(jù)放在模型中
    model.addAttribute("item", item);
 
    return "editItem";
}

(2)Redirect重定向

Contrller方法返回字符串可以重定向到一個(gè)url地址。

如下商品修改提交后重定向到商品編輯頁面。

/**
  * 更新商品
  *
  * @param item
  * @return
  */
 @RequestMapping("updateItem")
 public String updateItemById(Items item) {
     // 更新商品
     this.itemService.updateItemById(item);
 
     // 修改商品成功后,重定向到商品編輯頁面
     // 重定向后瀏覽器地址欄變更為重定向的地址,
     // 重定向相當(dāng)于執(zhí)行了新的request和response,所以之前的請(qǐng)求參數(shù)都會(huì)丟失
     // 如果要指定請(qǐng)求參數(shù),需要在重定向的url后面添加 ?itemId=1 這樣的請(qǐng)求參數(shù)
     return "redirect:/itemEdit.action?itemId=" + item.getId();
 }

(3)forward轉(zhuǎn)發(fā)

Controller方法執(zhí)行后繼續(xù)執(zhí)行另一個(gè)Controller方法

如下商品修改提交后轉(zhuǎn)向到商品修改頁面,修改商品的id參數(shù)可以帶到商品修改方法中。

/**
 * 更新商品
 *
 * @param item
 * @return
 */
@RequestMapping("updateItem")
public String updateItemById2(Items item) {
    // 更新商品
    this.itemService.updateItemById(item);
 
    // 修改商品成功后,重定向到商品編輯頁面
    // 重定向后瀏覽器地址欄變更為重定向的地址,
    // 重定向相當(dāng)于執(zhí)行了新的request和response,所以之前的請(qǐng)求參數(shù)都會(huì)丟失
    // 如果要指定請(qǐng)求參數(shù),需要在重定向的url后面添加 ?itemId=1 這樣的請(qǐng)求參數(shù)
    // return "redirect:/itemEdit.action?itemId=" + item.getId();
 
    // 修改商品成功后,繼續(xù)執(zhí)行另一個(gè)方法
    // 使用轉(zhuǎn)發(fā)的方式實(shí)現(xiàn)。轉(zhuǎn)發(fā)后瀏覽器地址欄還是原來的請(qǐng)求地址,
    // 轉(zhuǎn)發(fā)并沒有執(zhí)行新的request和response,所以之前的請(qǐng)求參數(shù)都存在
    return "forward:/itemEdit.action"; 
}

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家?!?/p>

相關(guān)文章

  • Java?新特性之Option示例詳解

    Java?新特性之Option示例詳解

    使用Optional開發(fā)時(shí)要注意正確使用Optional的“姿勢(shì)”,特別注意不要使用3.2節(jié)提到的錯(cuò)誤示范,謹(jǐn)慎使用isPresent()和get()方法,盡量多使用map()、filter()、orElse()等方法來發(fā)揮Optional的作用,對(duì)Java??Option相關(guān)知識(shí)感興趣的朋友一起看看吧
    2024-02-02
  • springboot之Jpa通用接口及公共方法使用示例

    springboot之Jpa通用接口及公共方法使用示例

    這篇文章主要為大家介紹了springboot?之Jpa通用接口及公共方法使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Java實(shí)現(xiàn)FutureTask的示例詳解

    Java實(shí)現(xiàn)FutureTask的示例詳解

    在并發(fā)編程當(dāng)中我們最常見的需求就是啟動(dòng)一個(gè)線程執(zhí)行一個(gè)函數(shù)去完成我們的需求,而在這種需求當(dāng)中,我們需要函數(shù)有返回值。Java給我們提供了這種機(jī)制,去實(shí)現(xiàn)這一個(gè)效果:FutureTask。本文為大家準(zhǔn)備了Java實(shí)現(xiàn)FutureTask的示例代碼,需要的可以參考一下
    2022-08-08
  • IDEA下載并大學(xué)生edu郵箱認(rèn)證免費(fèi)使用教程(圖文)

    IDEA下載并大學(xué)生edu郵箱認(rèn)證免費(fèi)使用教程(圖文)

    這篇文章主要介紹了IDEA下載并大學(xué)生edu郵箱認(rèn)證免費(fèi)使用教程(圖文),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Java使用設(shè)計(jì)模式中的工廠方法模式實(shí)例解析

    Java使用設(shè)計(jì)模式中的工廠方法模式實(shí)例解析

    當(dāng)系統(tǒng)準(zhǔn)備為用戶提供某個(gè)類的子類的實(shí)例,又不想讓用戶代碼和該子類形成耦合時(shí),就可以使用工廠方法模式來設(shè)計(jì)系統(tǒng).工廠方法模式的關(guān)鍵是在一個(gè)接口或抽象類中定義一個(gè)抽象方法,下面我們會(huì)具體介紹Java使用設(shè)計(jì)模式中的工廠方法模式實(shí)例解析.
    2016-05-05
  • Spring?Boot?教程之創(chuàng)建項(xiàng)目的三種方式

    Spring?Boot?教程之創(chuàng)建項(xiàng)目的三種方式

    這篇文章主要分享了Spring?Boot?教程之創(chuàng)建項(xiàng)目的三種方式,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-05-05
  • 將idea工程打包成jar文件的全步驟

    將idea工程打包成jar文件的全步驟

    這篇文章主要給大家介紹了關(guān)于將idea工程打包成jar文件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Java中的StringBuilder()常見方法詳解

    Java中的StringBuilder()常見方法詳解

    StringBuilder是一個(gè)可變的字符序列,此類提供一個(gè)與 StringBuffer 兼容的 API,但不保證同步,這篇文章主要介紹了StringBuilder()常見方法,需要的朋友可以參考下
    2023-09-09
  • HashSet和TreeSet使用方法的區(qū)別解析

    HashSet和TreeSet使用方法的區(qū)別解析

    這篇文章主要介紹了HashSet和TreeSet使用方法的區(qū)別解析,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • logback ThresholdFilter臨界值日志過濾器源碼解讀

    logback ThresholdFilter臨界值日志過濾器源碼解讀

    這篇文章主要為大家介紹了logback ThresholdFilter臨界值日志過濾器源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11

最新評(píng)論

利辛县| 南安市| 屏南县| 营山县| 西充县| 辽宁省| 扶风县| 南康市| 长汀县| 临洮县| 云南省| 阿鲁科尔沁旗| 额尔古纳市| 左贡县| 兴国县| 天长市| 天全县| 九龙城区| 视频| 兖州市| 巴林左旗| 和静县| 开阳县| 北辰区| 肇东市| 琼海市| 肥乡县| 镶黄旗| 壶关县| 龙南县| 神农架林区| 长乐市| 连江县| 孟津县| 疏附县| 泾源县| 新绛县| 肇州县| 中江县| 汉川市| 邢台市|