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

編寫Spring MVC控制器的14個(gè)技巧(小結(jié))

 更新時(shí)間:2019年11月07日 11:39:36   作者:summer_lyf  
這篇文章主要介紹了編寫Spring MVC控制器的14個(gè)技巧,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

通常,在Spring MVC中,我們編寫一個(gè)控制器類來處理來自客戶端的請(qǐng)求。然后,控制器調(diào)用業(yè)務(wù)類來處理與業(yè)務(wù)相關(guān)的任務(wù),然后將客戶端重定向到邏輯視圖名稱,該名稱由Spring的調(diào)度程序Servlet解析,以呈現(xiàn)結(jié)果或輸出。這樣就完成了典型的請(qǐng)求-響應(yīng)周期的往返。今天整理了一下編寫Spring MVC控制器的14個(gè)技巧,你今天get到了嗎? \(≧▽≦)/

1.使用@Controller構(gòu)造型

這是創(chuàng)建可以處理一個(gè)或多個(gè)請(qǐng)求的控制器類的最簡(jiǎn)單方法。僅通過用構(gòu)造型注釋一個(gè)類@Controller ,例如:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HomeController {
 @RequestMapping("/")
 public String visitHome() {
 
 return "home";
 }
}

如你所見,visitHome()方法通過重定向到名為home的視圖來處理來自應(yīng)用程序上下文路徑(/)的請(qǐng)求。

注意:@Controller原型只能在Spring的配置文件中啟用注解驅(qū)動(dòng)時(shí)使用:

<annotation-driven />

啟用注釋驅(qū)動(dòng)時(shí),Spring容器自動(dòng)在以下語句指定的包下掃描類:

<context:component-scan base-package="net.codejava.spring" />

由@Controller 注釋注釋的類被配置為控制器。這是最可取的,因?yàn)樗芎?jiǎn)單:無需在配置文件中為控制器聲明bean。

注意:通過使用@Controller 注解,您可以擁有一個(gè)多動(dòng)作控制器類,該類能夠處理多個(gè)不同的請(qǐng)求。例如:

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

正如你可以在上面的控制器類看,有處理三種不同的請(qǐng)求3種處理方法   /listUsers,/saveUser,和/deleteUser分別。

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

在Spring MVC中創(chuàng)建控制器的另一種(也許是經(jīng)典的)方法是讓類實(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;
public class MainController implements Controller {
 @Override
 public ModelAndView handleRequest(HttpServletRequest request,
  HttpServletResponse response) throws Exception {
 System.out.println("Welcome main");
 return new ModelAndView("main");
 }
}

實(shí)現(xiàn)類必須重寫該  handleRequest() 方法,當(dāng)匹配請(qǐng)求進(jìn)入時(shí),該方法將由Spring調(diào)度程序Servlet調(diào)用。此控制器處理的請(qǐng)求URL模式在Spring的上下文配置文件中定義如下:

<bean name="/main" class="net.codejava.spring.MainController" />

但是,此方法的缺點(diǎn)是控制器類無法處理多個(gè)請(qǐng)求URL。

3.擴(kuò)展AbstractController類

如果要輕松控制受支持的HTTP方法,會(huì)話和內(nèi)容緩存。擴(kuò)展你的控制器  AbstractController 類是理想的選擇。請(qǐng)考慮以下示例:

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

這將創(chuàng)建具有有關(guān)受支持的方法,會(huì)話和緩存的配置的單動(dòng)作控制器,然后可以在控制器的bean聲明中指定這些配置。例如:

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

此配置指示POST 此控制器的hander 方法僅支持該方法。

Spring MVC還提供了幾種針對(duì)特定目的而設(shè)計(jì)的控制器類,包括:

4.為處理程序方法指定URL映射

這是編碼控制器類時(shí)必須執(zhí)行的強(qiáng)制性任務(wù),該控制器類旨在處理一個(gè)或多個(gè)特定請(qǐng)求。Spring MVC提供了@RequestMapping 注釋,該注解用于指定URL映射。例如:

@RequestMapping("/login")

這映射了/login 要由帶注解的方法或類處理的URL模式。當(dāng)在類級(jí)別使用此注解時(shí),該類將成為單動(dòng)作控制器。例如:

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

當(dāng)@RequestMapping 注解在方法級(jí)別使用的,你可以有一個(gè)多動(dòng)作控制器。例如:

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

@RequestMapping注釋還可以用于指定一個(gè)方法要處理的多個(gè)URL模式。例如:

@RequestMapping({"/hello", "/hi", "/greetings"})

此外,此注解還具有在某些情況下可能有用的其他屬性,例如method。

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

可以使用 注解的method 屬性   指定處理程序方法支持哪種HTTP方法(GET,POST,PUT等)  @RequestMapping。這是一個(gè)例子:

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

此控制器有兩個(gè)處理相同URL模式的方法/login,但前者用于  GET 方法,而后者用于  POST 方法。

有關(guān)使用@RequestMapping 注解的更多信息,請(qǐng)參見  @RequestMapping注解。

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

Spring MVC的很酷的功能之一是,您可以使用@RequestParam 注解將請(qǐng)求參數(shù)作為處理程序方法的常規(guī)參數(shù)進(jìn)行檢索。這是將控制器HttpServletRequest 與Servlet API 的接口分離的好方法。

@RequestMapping(value = "/login", method = RequestMethod.POST)
public String doLogin(@RequestParam String username,
   @RequestParam String password) {
}

Spring將方法參數(shù)用戶名和密碼綁定到具有相同名稱的HTTP請(qǐng)求參數(shù)。這意味著您可以按以下方式調(diào)用URL(如果請(qǐng)求方法是GET):

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

類型轉(zhuǎn)換也是自動(dòng)完成的。例如,如果您聲明integer 如下類型的參數(shù)  :

@RequestParam int securityNumber

然后,Spring將在處理程序方法中自動(dòng)將請(qǐng)求參數(shù)(字符串)的值轉(zhuǎn)換為指定的類型(整數(shù))。

如果參數(shù)名稱與變量名稱不同,則可以如下指定參數(shù)的實(shí)際名稱:

@RequestParam("SSN") int securityNumber

該@RequestParam 注解也有兩個(gè)額外的屬性,這可能是在某些情況下是有用的。該屬性指定參數(shù)是否為必需。例如: required 

@RequestParam(required = false) String country

這意味著該參數(shù)  country 是可選的;因此,它可能會(huì)從請(qǐng)求中丟失。在上面的示例中,country 如果請(qǐng)求中不存在此類參數(shù),則變量  將為null。

另一個(gè)屬性是  defaultValue,可以在請(qǐng)求參數(shù)為空時(shí)用作后備值。例如:

@RequestParam(defaultValue = "18") int age

Map 如果方法參數(shù)是type,Spring還允許我們將所有參數(shù)作為對(duì)象   訪問  Map<String, String>。例如:

doLogin(@RequestParam Map<String, String> params)

然后,映射參數(shù)包含鍵-值對(duì)形式的所有請(qǐng)求參數(shù)。有關(guān)使用@RequestParam 注釋的更多信息,請(qǐng)參見  @RequestParam注解。

 7.返回模型和視圖

處理完業(yè)務(wù)邏輯后,處理程序方法應(yīng)返回一個(gè)視圖,然后由Spring的調(diào)度程序servlet對(duì)其進(jìn)行解析。Spring允許我們ModelAndView 從handler 方法中返回String或  對(duì)象  。在以下示例中,該  handler 方法返回一個(gè)String并表示一個(gè)名為的視圖  LoginForm:

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

 這是返回視圖名稱的最簡(jiǎn)單方法。但是,如果要將其他數(shù)據(jù)發(fā)送到視圖,則必須返回一個(gè)  ModelAndView 對(duì)象??紤]以下處理程序方法:

@RequestMapping("/listUsers")
public ModelAndView listUsers() {
 List<User> listUser = new ArrayList<>();
 // 從DAO獲取用戶列表…
 ModelAndView modelView = new ModelAndView("UserList");
 modelView.addObject("listUser", listUser);
 return modelView;
}

如您所見,此處理程序方法返回一個(gè)  ModelAndView 保存視圖名稱  UserList 的User 對(duì)象和一個(gè)可在視圖中使用的對(duì)象集合  。

Spring也非常靈活,因?yàn)槟梢詫odelAndView 對(duì)象聲明  為處理程序方法的參數(shù),而不用創(chuàng)建一個(gè)新的對(duì)象。因此,以上示例可以重寫如下:

@RequestMapping("/listUsers")
public ModelAndView listUsers(ModelAndView modelView) {
 List<User> listUser = new ArrayList<>();
 //從DAO獲取用戶列表…
 modelView.setViewName("UserList");
 modelView.addObject("listUser", listUser);
 return modelView;
}

了解有關(guān)該類的更多信息,請(qǐng)參見  :ModelAndView class。

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

在遵循MVC架構(gòu)的應(yīng)用程序中,控制器(C)應(yīng)該將數(shù)據(jù)傳遞到模型(M)中,然后在視圖(V)中使用該模型。正如我們?cè)谇懊娴氖纠锌吹降哪菢樱?nbsp;該類的addObject() 方法  ModelAndView是以名稱-值對(duì)的形式將對(duì)象放入模型中:

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

同樣,Spring非常靈活。你可以Map 在處理程序方法中聲明類型的參數(shù)  。Spring使用此映射存儲(chǔ)模型的對(duì)象。讓我們看另一個(gè)例子:

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

這比使用ModelAndView 對(duì)象還要簡(jiǎn)單  。根據(jù)你的喜好,可以使用Map 或  使用  ModelAndView 對(duì)象。在這里要感謝Spring的靈活性。

 9.處理程序方法中的重定向

如果你希望在滿足條件的情況下將用戶重定向到另一個(gè)URL,請(qǐng)redirect:/ 在URL之前追加。以下代碼段給出了一個(gè)示例:

// 檢查登錄狀態(tài)....
if (!isLogin) {
 return new ModelAndView("redirect:/login");
}
// 返回用戶列表

在上面的代碼中,/login 如果未登錄,用戶將被重定向到該   URL。

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

通過提供@ModelAttribute 用于將表單字段綁定到表單支持對(duì)象的注解以及BindingResult 用于驗(yàn)證表單字段的界面,Spring使處理表單提交變得容易。下面的代碼片段顯示了一種典型的處理程序方法,該方法負(fù)責(zé)處理和驗(yàn)證表單數(shù)據(jù):

@Controller
public class RegistrationController {
 @RequestMapping(value = "/doRegister", method = RequestMethod.POST)
 public String doRegister(
  @ModelAttribute("userForm") User user, BindingResult bindingResult) {
  if (bindingResult.hasErrors()) {
   // 表單驗(yàn)證錯(cuò)誤
  } else {
   // 表單輸入沒問題
  }
  // 注冊(cè)過程……
  return "Success";
 }
}

從Spring的官方文檔中了解有關(guān)@ModelAttribute 注釋和BindingResult 接口的更多信息   :

11.處理文件上傳

通過自動(dòng)將上傳數(shù)據(jù)綁定到CommonsMultipartFile 對(duì)象數(shù)組,Spring還使在處理程序方法中處理文件上傳變得容易。Spring使用Apache Commons FileUpload作為基礎(chǔ)的多部分解析器。

以下代碼段顯示了從客戶端上傳文件有多么容易

@RequestMapping(value = "/uploadFiles", method = RequestMethod.POST)
public String handleFileUpload(
  @RequestParam CommonsMultipartFile[] fileUpload) throws Exception {
 for (CommonsMultipartFile aFile : fileUpload){
  // 存儲(chǔ)上傳的文件
  aFile.transferTo(new File(aFile.getOriginalFilename()));
 }
 return "Success";
}

12.在控制器中自動(dòng)裝配業(yè)務(wù)類

控制器應(yīng)將業(yè)務(wù)邏輯的處理委托給相關(guān)的業(yè)務(wù)類。為此,您可以使用@Autowired 注解讓Spring自動(dòng)將業(yè)務(wù)類的實(shí)際實(shí)現(xiàn)注入控制器??紤]以下控制器類的代碼段:

@Controller
public class UserController {
 @Autowired
 private UserDAO userDAO;
 public String listUser() {
  // 列出所有用戶的處理方法
  userDAO.list();
 }
 public String saveUser(User user) {
  // 保存/更新用戶的處理方法
  userDAO.save(user);
 }
 public String deleteUser(User user) {
  // 刪除用戶的處理方法
  userDAO.delete(user);
 }
 public String getUser(int userId) {
  // 獲取用戶的處理方法
  userDAO.get(userId);
 }
}

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

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

有關(guān)@Autowired 注解的更多信息,請(qǐng)參見  注釋類型自動(dòng)裝配。

13.訪問HttpServletRequest和HttpServletResponse

在某些情況下,您需要直接 在處理程序方法中訪問  HttpServletRequest 或  HttpServletResponse對(duì)象。通過Spring的靈活性,只需在處理方法中添加相關(guān)參數(shù)即可。例如:

@RequestMapping("/download")
public String doDownloadFile(
  HttpServletRequest request, HttpServletResponse response) {
 // 訪問請(qǐng)求
 // 訪問響應(yīng)
 return "DownloadPage";
}

Spring檢測(cè)并自動(dòng)將  HttpServletRequest 和  HttpServletResponse 對(duì)象注入方法中。然后,可以訪問請(qǐng)求和響應(yīng)如獲取  InputStream,  OutputStream或返回一個(gè)特定的HTTP代碼。

14.遵循單一責(zé)任原則

最后,在設(shè)計(jì)和編寫Spring MVC控制器時(shí),有兩個(gè)很好的實(shí)踐是你應(yīng)該遵循的:

控制器類不應(yīng)執(zhí)行業(yè)務(wù)邏輯。相反,它應(yīng)該將業(yè)務(wù)處理委托給相關(guān)的業(yè)務(wù)類別。這使控制器始終專注于其設(shè)計(jì)職責(zé)是控制應(yīng)用程序的工作流程。例如:

@Controller
public class UserController {
 @Autowired
 private UserDAO userDAO;
 public String listUser() {
  userDAO.list();
 }
 public String saveUser(User user) {
  userDAO.save(user);
 }
 public String deleteUser(User user) {
  userDAO.delete(user);
 }
 public String getUser(int userId) {
  userDAO.get(userId);
 }
}

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

@Controller
public class UserController {
}
@Controller
public class ProductController {
}
@Controller
public class OrderController {
}
@Controller
public class PaymentController {
}

這14個(gè)小技巧,可以幫助你正確有效地在Spring MVC中編寫控制器類。如果你有其他提示或建議,請(qǐng)隨時(shí)在評(píng)論中分享您的想法。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • JavaWeb實(shí)現(xiàn)文件上傳功能詳解

    JavaWeb實(shí)現(xiàn)文件上傳功能詳解

    這篇文章主要介紹了JavaWeb實(shí)現(xiàn)文件上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Java?Web項(xiàng)目中解決中文亂碼方法總結(jié)(三種最新方法)

    Java?Web項(xiàng)目中解決中文亂碼方法總結(jié)(三種最新方法)

    這篇文章主要介紹了Java?Web項(xiàng)目中解決中文亂碼方法總結(jié),本文給大家分享三種最新解決方法,需要的朋友可以參考下
    2022-06-06
  • java五子棋小游戲?qū)崿F(xiàn)代碼

    java五子棋小游戲?qū)崿F(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了java五子棋實(shí)現(xiàn)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 關(guān)于java中多個(gè)JDK和切換版本介紹

    關(guān)于java中多個(gè)JDK和切換版本介紹

    大家好,本篇文章主要講的是關(guān)于java中多個(gè)JDK和切換版本介紹,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • 為什么Java是程序員受歡迎的語言這幾個(gè)原因你該清楚

    為什么Java是程序員受歡迎的語言這幾個(gè)原因你該清楚

    Java一直穩(wěn)居程序員很受歡迎的編程語言的榜首,是企業(yè)中使用最廣泛的編程語言。這篇文章主要介紹了為什么Java是程序員受歡迎的語言這幾個(gè)原因你該清楚,需要的朋友可以參考下
    2020-07-07
  • SpringBoot?+DynamicDataSource切換多數(shù)據(jù)源的全過程

    SpringBoot?+DynamicDataSource切換多數(shù)據(jù)源的全過程

    這篇文章主要介紹了SpringBoot?+DynamicDataSource切換多數(shù)據(jù)源的全過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 聊聊Spring——AOP詳解(AOP概覽)

    聊聊Spring——AOP詳解(AOP概覽)

    這篇文章主要介紹了Spring——AOP詳解(AOP概覽),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java之Buffer屬性案例詳解

    Java之Buffer屬性案例詳解

    這篇文章主要介紹了Java之Buffer屬性案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Java中synchronized正確使用方法解析

    Java中synchronized正確使用方法解析

    這篇文章主要介紹了Java中syncronized正確使用方法解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Java隨機(jī)生成手機(jī)短信驗(yàn)證碼的方法

    Java隨機(jī)生成手機(jī)短信驗(yàn)證碼的方法

    這篇文章主要介紹了Java隨機(jī)生成手機(jī)短信驗(yàn)證碼的方法,涉及Java數(shù)學(xué)運(yùn)算計(jì)算隨機(jī)數(shù)及字符串操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11

最新評(píng)論