欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

14個(gè)編寫(xiě)Spring MVC控制器的實(shí)用小技巧(吐血整理)

 更新時(shí)間:2019年11月18日 10:51:36   作者:讀芯術(shù)  
這篇文章主要介紹了14個(gè)編寫(xiě)Spring MVC控制器的實(shí)用小技巧(吐血整理),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

本文介紹了編寫(xiě)Spring MVC框架的控制器(controller)的基礎(chǔ)技巧和最佳操作。在Spring MVC框架中,編寫(xiě)控制器類(lèi)通常是為了處理用戶提出的請(qǐng)求。

編寫(xiě)完成后,控制器會(huì)調(diào)用一個(gè)業(yè)務(wù)類(lèi)來(lái)處理業(yè)務(wù)相關(guān)任務(wù),進(jìn)而重定向客戶到邏輯視圖名。Springdispatcher servlet會(huì)對(duì)邏輯視圖名進(jìn)行解析,并渲染結(jié)果或輸出。這就是一個(gè)典型的“請(qǐng)求—響應(yīng)”的完整流程。

1.使用@controllerstereotype

創(chuàng)建一個(gè)能夠處理單個(gè)或多個(gè)請(qǐng)求的控制器類(lèi),最簡(jiǎn)單的方法就是使用@controllerstereotype注解一個(gè)類(lèi),如:

import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
@Controller 
publicclassHomeController { 
  @RequestMapping("/") 
  publicString visitHome() { 
    // do something before returning view name 
    return"home"; 
  } 
}

如上所示,visitHome()方法通過(guò)重定向跳轉(zhuǎn)到視圖名home來(lái)處理應(yīng)用程序內(nèi)容路徑(/)收到的請(qǐng)求。

注意:只有在Spring配置文件中啟用了注解驅(qū)動(dòng),才能使用@controllerstereotype。

啟用注解驅(qū)動(dòng)后,Spring的容器(container)會(huì)自動(dòng)掃描如下包中的類(lèi):

帶有@controller注解的類(lèi)會(huì)被標(biāo)記成控制器。由于其簡(jiǎn)單方便,且不再需要對(duì)配置文件中的控制器聲明beans,這一方法非常實(shí)用。

注意:使用@controller注解可以創(chuàng)建一個(gè)多動(dòng)作控制器類(lèi),可同時(shí)處理多個(gè)不同的請(qǐng)求。如:

@Controller 
publicclassMultiActionController { 
  @RequestMapping("/listUsers") 
  public ModelAndView listUsers() { 
  } 
  @RequestMapping("/saveUser") 
  public ModelAndView saveUser(User user) { 
  } 
  @RequestMapping("/deleteUser") 
  public ModelAndView deleteUser(User user) { 
  } 
}

如上所示,有三個(gè)處理器(handler)在分別處理三個(gè)請(qǐng)求,/listUsers,/saveUser,和/deleteUser。

2.實(shí)現(xiàn)控制器接口

在Spring MVC中創(chuàng)建控制器還可以用另一個(gè)經(jīng)典的方法,即對(duì)一個(gè)類(lèi)實(shí)現(xiàn)Controller接口。如:

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import org.springframework.web.servlet.ModelAndView; 
import org.springframework.web.servlet.mvc.Controller; 
publicclassMainControllerimplements Controller { 
  @Override 
  public ModelAndView handleRequest(HttpServletRequest request, 
      HttpServletResponse response) throws Exception { 
    System.out.println("Welcome main"); 
    returnnew ModelAndView("main"); 
  } 
}

實(shí)現(xiàn)類(lèi)必須重寫(xiě)handleRequest()方法(當(dāng)收到相匹配的請(qǐng)求時(shí),Spring dispatcher servlet會(huì)調(diào)用handleRequest)。由該控制器處理的請(qǐng)求URL模式在Spring的內(nèi)容配置文件中的定義如下:

這一方法的缺點(diǎn)在于其控制類(lèi)無(wú)法同時(shí)處理多個(gè)請(qǐng)求URL。

3.繼承AbstractController類(lèi)

如果想要輕松控制受支持的HTTP方法、會(huì)話和內(nèi)容緩存,讓控制類(lèi)繼承AbstractController類(lèi)是理想的方法。如: 

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import org.springframework.web.servlet.ModelAndView; 
import org.springframework.web.servlet.mvc.AbstractController; 
publicclassBigControllerextends AbstractController { 
  @Override 
  protected ModelAndView handleRequestInternal(HttpServletRequest request, 
      HttpServletResponse response) throws Exception { 
    System.out.println("You're big!"); 
    returnnew ModelAndView("big"); 
  } 
}

上例創(chuàng)建了一個(gè)配置了受支持的方法、會(huì)話和緩存的單動(dòng)作控制器,能夠在控制器的bean聲明中被指明。如:

<beanname="/big"class="net.codejava.spring.BigController"> 
  <propertyname="supportedMethods"value="POST"/> 
</bean>

這一配置表明該控制器handler方法僅支持POST方法。了解更多配置(如會(huì)話、緩存),參見(jiàn)AbstractController。 

SpringMVC還提供了多個(gè)支持特定目的的控制器類(lèi),包括:

  • AbstractUrlViewController
  • MultiActionController
  • ParameterizableViewController
  • ServletForwardingController
  • ServletWrappingController
  • UrlFilenameViewController

4.為處理器指定URL映射

這是編寫(xiě)控制器類(lèi)必不可少的一步,旨在處理一個(gè)及以上特定請(qǐng)求。Spring MVC提供了@RequestMapping注解,用于指定URL映射。如:

這一步映射了URL模式/login,并用注解或注解類(lèi)對(duì)其進(jìn)行了處理。@RequestMapping注解用于類(lèi)上時(shí),類(lèi)變成了單動(dòng)作控制器。如:

import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
@Controller 
@RequestMapping("/hello") 
publicclassSingleActionController { 
  @RequestMapping(method = RequestMethod.GET) 
  publicString sayHello() { 
    return"hello"; 
  } 
}

@RequestMapping注解用于方法上時(shí),則可生成多動(dòng)作控制器。如: 

import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
@Controller 
publicclassUserController { 
  @RequestMapping("/listUsers") 
  publicString listUsers() { 
    return"ListUsers"; 
  } 
  @RequestMapping("/saveUser") 
  publicString saveUser() { 
    return"EditUser"; 
  } 
  @RequestMapping("/deleteUser") 
  publicString deleteUser() { 
    return"DeleteUser"; 
  } 
}

@RequestMapping注解也可用于指定多個(gè)URL模式,并用單一方法對(duì)其進(jìn)行處理。如:

此外,該注解還有其他的屬性,在一些情況下能發(fā)揮作用,如下一小節(jié)將講到的method屬性。

5.為處理器方法指定HTTP請(qǐng)求方法

使用@RequestMapping注解的method屬性,可以指定處理器方法支持的HTTP方法(包括GET、POST、PUT等)。如:

import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping 
import org.springframework.web.bind.annotation.RequestMethod; 
@Controller 
publicclassLoginController { 
  @RequestMapping(value = "/login", method = RequestMethod.GET) 
  publicString viewLogin() { 
    return"LoginForm"; 
  } 
  @RequestMapping(value = "/login", method = RequestMethod.POST) 
  publicString doLogin() { 
    return"Home"; 
  } 
}

如上所示,對(duì)于同一個(gè)URL模式/login,該控制器有兩個(gè)處理方法。第一個(gè)方法用于GET方法,第二個(gè)則用于POST方法。

了解更多@RequestMapping注解相關(guān)知識(shí),參見(jiàn)@RequestMapping注解。

6.將請(qǐng)求參數(shù)映射至處理器方法

SpringMVC的特征之一,就是可以使用@RequestParam注解將請(qǐng)求參數(shù)作為處理器方法的常規(guī)參數(shù)取回。這是一個(gè)將控制器從ServletAPI的HttpServletRequest接口中解耦出來(lái)的好方法。 

如:

@RequestMapping(value = "/login", method = RequestMethod.POSTpublic String doLogin(@RequestParamString username @RequestParamString password) {}

Spring將方法參數(shù)用戶名及密碼和命名相同的HTTP請(qǐng)求參數(shù)綁定到一起。這也就意味著可用如下方式調(diào)用一個(gè)URL(以GET請(qǐng)求方法為例):

http://localhost:8080/spring/login?username=scott&password=tiger

類(lèi)型轉(zhuǎn)換也自動(dòng)完成了。如果對(duì)一個(gè)integer類(lèi)型的參數(shù)聲明如下:

則Spring會(huì)在處理方法中自動(dòng)將請(qǐng)求參數(shù)的值(String類(lèi)型)轉(zhuǎn)換為指定類(lèi)型(integer)。

為防止參數(shù)名與變量名不同,可將參數(shù)實(shí)名指定如下:

@RequestParam注解還有另外兩個(gè)屬性,可在一些情況下發(fā)揮作用。其中一個(gè)屬性是required,可指定一個(gè)參數(shù)是強(qiáng)制參數(shù)還是可選參數(shù)。如:

這就意味著參數(shù)country是可選的,在請(qǐng)求中可略去。當(dāng)請(qǐng)求中沒(méi)有參數(shù)country時(shí),則變量country為空值。 

另一個(gè)屬性是defaultValue,可在請(qǐng)求參數(shù)為空時(shí)充當(dāng)回退值(fallbackvalue)。如:

當(dāng)方法參數(shù)類(lèi)型為Map<String,String>時(shí),Spring也支持將所有參數(shù)作為Map對(duì)象。如:

則映射參數(shù)包含所有鍵值對(duì)形式的請(qǐng)求參數(shù)。了解更多@RequestParam注解相關(guān)知識(shí),參見(jiàn)@RequestParam注解。 

7.返回模型和視圖

處理器方法在處理完業(yè)務(wù)邏輯后,會(huì)返回一個(gè)視圖,該視圖隨后由Springdispatcher servlet進(jìn)行解析。Spring支持handler方法返回String對(duì)象或ModelAndView對(duì)象。如下所示,handler方法返回了一個(gè)String對(duì)象,并表示了視圖名LoginForm:

@RequestMapping(value = "/login", method = RequestMethod.GET) 
public String viewLogin() { 
  return"LoginForm"; 
}

這是返回視圖名最簡(jiǎn)單的方法。但是如果想要發(fā)送其他數(shù)據(jù)到視圖,則必須返回ModelAndView對(duì)象。如: 

@RequestMapping("/listUsers") 
public ModelAndView listUsers() { 
  List<User> listUser = new ArrayList<>(); 
  // get user list from DAO... 
  ModelAndView modelView = new ModelAndView("UserList"); 
  modelView.addObject("listUser", listUser); 
  return modelView; 
}

如上所示,該處理器方法返回了一個(gè)ModelAndView對(duì)象,該對(duì)象視圖名為UserList,并有一個(gè)可用在視圖中的User對(duì)象集。

Spring是一個(gè)非常靈活的框架,支持將ModelAndView對(duì)象聲明為處理器方法的參數(shù),而無(wú)需再重新創(chuàng)建一個(gè)。因此,上例可以重寫(xiě)為:

@RequestMapping("/listUsers") 
public ModelAndView listUsers(ModelAndView modelView) { 
  List<User> listUser = new ArrayList<>(); 
  // get user list from DAO... 
  modelView.setViewName("UserList"); 
  modelView.addObject("listUser", listUser); 
  return modelView; 
}

了解更多ModelAndView類(lèi)相關(guān)知識(shí),參見(jiàn)ModelAndView類(lèi)。 

8.將對(duì)象放入模型

在MVC架構(gòu)的應(yīng)用程序中,控制器將數(shù)據(jù)輸入到模型中,該模型則被用在視圖中。從上一節(jié)中的舉例中可以看到,ModelAndView類(lèi)的addObject()用于將對(duì)象以名值對(duì)的形式放入模型中:

modelView.addObject("listUser", listUser); 
modelView.addObject("siteName", newString("CodeJava.net")); 
modelView.addObject("users", 1200000);

Spring同樣支持聲明處理器方法中的Map類(lèi)型參數(shù)。Spring使用這一映射存儲(chǔ)將放入模型的對(duì)象。如:

@RequestMapping(method = RequestMethod.GET) 
publicStringviewStats(Map<String, Object> model) { 
  model.put("siteName", "CodeJava.net"); 
  model.put("pageviews", 320000); 
  return"Stats"; 
}

這一方法比使用ModelAndView對(duì)象更加簡(jiǎn)單。Spring支持用戶靈活選擇Map對(duì)象和ModelAndView對(duì)象。

9.處理器方法中的重定向

當(dāng)條件允許時(shí),只需在URL前加上redirect:/就可將用戶重定向跳轉(zhuǎn)到另一個(gè)URL。如:

// check login status.... 
if (!isLogin) { 
  returnnew ModelAndView("redirect:/login"); 
} 
// return a list of Users

在上述代碼中,沒(méi)有登陸的用戶將會(huì)跳轉(zhuǎn)到/loginURL。

10.處理表單提交和表單驗(yàn)證

Spring中的@ModelAttribute注解支持將表單字段綁定到表單返回對(duì)象,BingingRequest接口則支持驗(yàn)證表單字段。這使得處理表單提交變得非常簡(jiǎn)單。一個(gè)處理和驗(yàn)證表單數(shù)據(jù)的典型處理器方法的代碼如下所示:

@Controller 
publicclassRegistrationController { 
  @RequestMapping(value = "/doRegister", method = RequestMethod.POST) 
  publicString doRegister( 
    @ModelAttribute("userForm") User user, BindingResult bindingResult) { 
    if (bindingResult.hasErrors()) { 
      // form validation error 
    } else { 
      // form input is OK 
    } 
    // process registration... 
    return"Success"; 
  } 
}

了解更多@ModelAttribute注解和BindingResult接口相關(guān)知識(shí),參見(jiàn)Spring官方文檔:

  • Using @ModelAttribute on a method argument
  • Using @ModelAttribute on a method
  • Interface BindingResult

11.處理文件上傳

Spring支持自動(dòng)將上傳數(shù)據(jù)綁定到CommonsMultiparFile數(shù)組對(duì)象,這使得在處理器方法中處理文件上傳變得非常簡(jiǎn)單。Spring使用Apache CommonsFileUpload作為深層多部分解析器(underlyingmultipart resolver)。

簡(jiǎn)單上傳用戶文件的代碼如下所示:

@RequestMapping(value = "/uploadFiles", method = RequestMethod.POST) 
publicStringhandleFileUpload( 
    @RequestParam CommonsMultipartFile[] fileUpload) throws Exception { 
  for (CommonsMultipartFile aFile : fileUpload){ 
    // stores the uploaded file 
    aFile.transferTo(new File(aFile.getOriginalFilename())); 
  } 
  return"Success"; 
}

了解Spring MVC處理文件上傳的完整方法,參見(jiàn)Spring MVC 文件上傳教程。 

12.在處理器中自動(dòng)注入業(yè)務(wù)類(lèi)

為了讓控制器將業(yè)務(wù)邏輯處理委托到相關(guān)業(yè)務(wù)類(lèi),可以使用@Autowired注解,讓Spring自動(dòng)將業(yè)務(wù)類(lèi)的實(shí)際實(shí)現(xiàn)注入到控制器中。如:

@Controller 
publicclassUserController { 
  @Autowired 
  private UserDAO userDAO; 
  publicString listUser() { 
    // handler method to list all users 
    userDAO.list(); 
  } 
  publicString saveUser(User user) { 
    // handler method to save/update a user 
    userDAO.save(user); 
  } 
  publicString deleteUser(User user) { 
    // handler method to delete a user 
    userDAO.delete(user); 
  } 
  publicString getUser(int userId) { 
    // handler method to get a user 
    userDAO.get(userId); 
  } 
}

本例中所有與用戶管理相關(guān)的業(yè)務(wù)邏輯都由UserDAO接口的實(shí)現(xiàn)提供。如:

interfaceUserDAO { 
  List<User> list(); 
  void save(User user); 
  void checkLogin(User user); 
}

如上所示,使用@Autowired注解使處理器方法可以將任務(wù)委托到業(yè)務(wù)類(lèi):

了解更多@Autowired注解相關(guān)知識(shí),參見(jiàn)Annotation TypeAutowired。

13.獲取HttpServletRequest和HttpServletResponse

有些情況要求在處理器方法中直接獲取HttpServletRequest或HttpServletResponse對(duì)象。在Spring靈活的框架中,僅需給處理器方法加上一個(gè)相關(guān)參數(shù)就可以完成此任務(wù)。如:

@RequestMapping("/download") 
publicStringdoDownloadFile( 
    HttpServletRequest request, HttpServletResponse response) { 
  // access the request 
  // access the response 
  return"DownloadPage"; 
}

Spring支持檢測(cè)并自動(dòng)將HttpServletRequest和HttpServletResponse對(duì)象注入到方法中。這樣一來(lái),就可以直接獲取請(qǐng)求和響應(yīng),如獲取InputStream、OutputStream或返回特定的HTTP代碼。

14.遵守單一職責(zé)原則

在Spring MVC中設(shè)計(jì)和編寫(xiě)控制器時(shí),應(yīng)遵循以下兩個(gè)非常實(shí)用的操作:

不要用控制器類(lèi)來(lái)執(zhí)行業(yè)務(wù)邏輯,應(yīng)該用控制器類(lèi)將業(yè)務(wù)處理委托到相關(guān)的業(yè)務(wù)類(lèi)。這可以保證控制器專(zhuān)注于其指定職責(zé),即控制應(yīng)用程序的工作流。如:

@Controller 
publicclassUserController { 
  @Autowired 
  private UserDAO userDAO; 
  publicString listUser() { 
    // handler method to list all users 
    userDAO.list(); 
  } 
  publicString saveUser(User user) { 
    // handler method to save/update a user 
    userDAO.save(user); 
  } 
  publicString deleteUser(User user) { 
    // handler method to delete a user 
    userDAO.delete(user); 
  } 
  publicString getUser(int userId) { 
    // handler method to get a user 
    userDAO.get(userId); 
  } 
}

給每個(gè)業(yè)務(wù)領(lǐng)域創(chuàng)建一個(gè)獨(dú)立的控制器。如,用UserController控制用戶管理的工作流,用OrderController控制訂單處理的工作流,等等:

@Controller 
publicclassUserController { 
} 
@Controller 
publicclassProductController { 
} 
@Controller 
publicclassOrderController { 
} 
@Controller 
publicclassPaymentController { 
}

以上就是本文全部?jī)?nèi)容,希望這14個(gè)小技巧可以幫助讀者準(zhǔn)確且高效地編寫(xiě)Spring MVC中的控制器類(lèi)代碼。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java開(kāi)發(fā)學(xué)習(xí)之Bean的作用域和生命周期詳解

    Java開(kāi)發(fā)學(xué)習(xí)之Bean的作用域和生命周期詳解

    這篇文章主要介紹了淺談Spring中Bean的作用域,生命周期和注解,從創(chuàng)建到消亡的完整過(guò)程,例如人從出生到死亡的整個(gè)過(guò)程就是一個(gè)生命周期。本文將通過(guò)示例為大家詳細(xì)講講,感興趣的可以學(xué)習(xí)一下
    2022-06-06
  • Spring Boot多模塊化后,服務(wù)間調(diào)用的坑及解決

    Spring Boot多模塊化后,服務(wù)間調(diào)用的坑及解決

    這篇文章主要介紹了Spring Boot多模塊化后,服務(wù)間調(diào)用的坑及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • SSH框架網(wǎng)上商城項(xiàng)目第6戰(zhàn)之基于DataGrid的數(shù)據(jù)顯示

    SSH框架網(wǎng)上商城項(xiàng)目第6戰(zhàn)之基于DataGrid的數(shù)據(jù)顯示

    SSH框架網(wǎng)上商城項(xiàng)目第6戰(zhàn)之基于DataGrid的數(shù)據(jù)顯示,提供了豐富的選擇、排序、分組和編輯數(shù)據(jù)的功能支持,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Java并發(fā)包之CopyOnWriteArrayList類(lèi)的深入講解

    Java并發(fā)包之CopyOnWriteArrayList類(lèi)的深入講解

    這篇文章主要給大家介紹了關(guān)于Java并發(fā)包之CopyOnWriteArrayList類(lèi)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 最新評(píng)論