javascript
JAVA中注解controller_SpringMVC之基于注解的Controller
參考博客:https://www.cnblogs.com/qq78292959/p/3760560.html
Controller注解:
傳統風格的Controller需要實現Controller接口,而現在我們只需要用注解就行了。
基于注解的控制器有幾個優點,1.一個控制器可以處理多個action(動作),而一個實現 Controller接口的控制器只能處理一個動作。? ? 2.基于注解的控制器請求映射不需要存儲在配置文件中,使用RequesetMapping注解類型就可以對一個方法進行請求處理。
要寫一個Controller,你只需要用? org.springframework.stereotype.Controller注解類型去注解
@Controllerpublic classCustomerController {//請求方法
}
Spring用掃描機制來找到應用程序中所有基于注解的控制器類。為了Spring能找到你的控制器,你需要做兩件事:
1.在spring的配置文件中聲明Spring-context,如下:
xmlns:context:="http:www.springframework.org/schema/context"...>
2.然后還需要飲用元素
請在元素中指定控制器類的基本包。請確保所有控制器類都在基本包下,并且不要指定一個太廣泛的基本包,因為這樣會使得SpringMVC掃描了太多無關的包。
RequestMaping注解類型:
現在我們要在控制類的內部為每一個動作開發相應的處理方法。要讓Spring知道用哪一種方法來處理它的動作,需要使用org.springframework.web.bind.annotation.RequestMapping注解類型映射的URL和方法。? ? ? ? ?可以用? @RequestMapping注解一種方法或類。
一個采用@RequestMapping注解的方法將成為一個請求的處理方法。
@Controllerpublic classCustomerController {
@RequestMapping(value="/customer_input")
public String inputCustomer()
{//do somethimg
return"CustomerFrom";
}
}
value屬性將把URL映射到方法。當你用如下的URL就會訪問到inputCustomer方法。
http://domin/context/customer_input
value屬性是RequestMapping注解的唯一默認屬性,因此如果只有這個屬性,value可以省略不寫:@RequestMapping("/customer_input")
RequestMapping除了value屬性外還有其他屬性,method屬性來指示該方法僅處理那些HTTP方法。下面這行注釋代表著只有用HTTP POST方法或PUT方法的時候才調用這個請求方法。
@RequestMapping(value="/order_process",method={RequestMethod.POST,RequestMethod.PUT})
若method屬性只有一個HTTP方法值,則無需花括號:
@RequestMapping(value="/order_process",method=RequestMethod.POST)
@RequestMapping也能注解一個類,這時所有的方法都將映射為相當于類級別的請求,看個例子:
@Controller
@RequestMapping(value="/customer")public classCustomerController {
@RequestMapping(value="/delete",method={RequestMethod.POST,RequestMethod.PUT})publicString deleteCustomer() {//...
return...;
}
}
輸入下面的URL會映射到deleteCustomer方法:? ? http://domin/context/customer/delete
還有其他屬性:
2、 consumes,produces;
consumes: 指定處理請求的提交內容類型(Content-Type),例如application/json, text/html;
produces: 指定返回的內容類型,僅當request請求頭中的(Accept)類型中包含該指定類型才返回;
3、 params,headers;
params: 指定request中必須包含某些參數值是,才讓該方法處理。
headers: 指定request中必須包含某些指定的header值,才能讓該方法處理請求。
其他屬性可以參考博客:https://www.cnblogs.com/qq78292959/p/3760560.html
請求方法接收的參數和返回值:
每個請求處理方法可以有多個不同類型的參數,以及一個多種類型的返回結果。例如如果請求處理方法中需要訪問HttpSession對象,則可以添加HttpSession作為參數。Spring會將對象正確地傳遞給方法。 可以處理方法可以有這些參數:
org.springframework.web.context.request.WebRequest
org.springframework.web.context.request.NativeWebRequest
java.util.Locale 當前請求的語言環境
java.util.TimeZone 時區
java.io.InputStream或java.io.Reader
java.io.OutputStream或java.io.Writer
org.springframework.http.HttpMethod
java.security.Principal
HttpEntity >參數用于訪問Servlet的HTTP請求的標題和內容
java.util.Map / org.springframework.ui.Model / org.springframework.ui.ModelMap 視圖隱含模型
org.springframework.web.servlet.mvc.support.RedirectAttributes 重定向
命令或表單對象
基本數據類型,如int,String,double...
復雜數據類型,如自定義的POJO對象
HandlerAdapter
org.springframework.validation.Errors / org.springframework.validation.BindingResult 驗證結果
org.springframework.web.bind.support.SessionStatus 會話狀態
org.springframework.web.util.UriComponentsBuilder
@PathVariable 注解參數訪問URI模板變量。
@MatrixVariable 注釋參數用于訪問位于URI路徑段鍵值對對,矩陣變量。
@RequestParam 注解參數訪問特定的Servlet請求參數,請求參數綁定。
@RequestHeader 注解參數訪問特定的se??rvlet請求HTTP標頭,映射請求頭。
@RequestBody 注解參數訪問HTTP請求主體,注解映射請求體
@RequestPart 注解參數訪問“的multipart / form-data的”請求部分的內容。處理客戶端上傳文件,多部分文件上傳的支持
@SessionAttribute 注解參數會話屬性
@RequestAttribute 注解參數訪問請求屬性
注意這個org.springframework.ui.Model,這不是個servlet API的類型,而是一個包含Map的StringMVC類型,每次調用請求處理方法的時候,SpringMVC都會創建Model對象并將各種對象注入到Map中。要使用這個model的話,你只要在請求方法中加入這個參數就行了。
請求方法中可以有這些返回值:
ModelAndView
Model
ModelMap
Map(包含模型的屬性)
View
String(代表邏輯視圖名)
Void
提供對servlet的訪問以及相應HTTP頭部和內容HttpEntity或ResponseEntity對象
Callable
DeferredResult
其他任意類型,Spring將視其作輸出給View的對象模型
@Autowired和@service注解的依賴注入:
將依賴注入到SpringMVC最簡單的方法就是通過注解@AutoWired到字段或者方法。這個注解屬于類型org.springframeword.beans.factory.annotation包。
此外,為了能依賴注入,類必須注明為@Service,該類型是org.springframeword.stereotype包的成員,Service注解類型指示類是一個服務,此外在spring的配置文件中還要添加一個元素來掃描依賴基本包。
用的時候就:
//ProductService接口
public interfaceProductService {
Product add(Product product);
Product get(longid);
}//ProductServiceImpl類
@Servicepublic class ProductServiceImpl implementsProductService {
...
Product add(Product product) {
..return..;
}
Product get(longid) {
..return..;
}
}
Controller里面
@Controllerpublic classProductController {
@Autowiredprivate ProductService productService;//注入實例,我們的的Service是個ProductService的實現類,所以這里也有多態的味道
....
....
}
重定向和Flash屬性:
比重定向快,因為重定向要經過客戶端。 有時候,為了避免用戶在重新加載界面的時候,因為如果是同一個url,容易再次調用同一個動作,例如成功提交表單后重新加載后又提交了一次。? ? ? ? ? ? ? ? 為了避免這種現象,我們可以在提交表單后將用戶重定向到一個不同的頁面。
在Controller的方法中返回:
return:"redirect:/product_view/"+saveProduct.getId();
這里的id是另外生成的,那么就可以防止saveProduct這個action被重復調用。但這個時候也有個不方便的地方,就是我們無法方便地傳值給目標頁面,因為這是兩個不同的request和response,不能像轉發一樣簡單地把屬性添加到Model中,幸運的是Spring3.1版本以后提供了Flash屬性——一種供重定向傳值的方法。
要使用Flash屬性,必須在SpringMVC配置文件中有一個元素。然后還要在方法中添加一個新的參數:RedirectAttributes redirectAttributes?,這個類來自org.springframework.web.servket.mvd.support.RedirectAttributes
看個例子:
@RequestMapping(value="product_save")publicString saveProduct(ProductForm productForm,RedirectAttributes redirectAttributes) {
....
redirectAttributes.addFlashAttribute("message","the product was successfully added");return "redirect:/product_view/"+saveProduct.getId();
}
請求參數和路徑變量:
請求參數就是url中的請求參數,想這個url有一個名額為productId的請求參數,其值為3:
http://localhost:8080/app18b/product_retrieve?productId=3
在傳統的servlet編程中,我們用HttpServletRequest.getParameter("")來獲取,現在我們可以通過org.springframework.web.bind.annotation.RequestParam注解類型來獲取請求參數,只要用這個注解在方法參數中注解就行:
public void sendProduct(@RequestParam int productId)
可以理解成調用了
int productId = Integer.parse(request.getParameter("productId")) ;
可見這個注解的參數不一定是字符串
路徑變量就是url中的變量,像url? ? ? ? ?/product_view/productId
其中的productId是表示鏟平標識符的整數,它是url中的一部分,叫做路徑變量。下面這個例子看看路徑變量的使用:
@RequestMapping("/product_view/{id}")public String viewProduct(@PathVariable longid, Model model) {
Product product=productService.get(id);
model.addAttribute("product",product);return "ProductView";
}
為了使用路徑變量,首先要在RequestMapping注解的值屬性中加一個變量,這個變量必須放在花括號里。像上面的{id}? ? ?然后在方法簽名中添加一個同名變量,并加上@PathVariable注解,然后當該方法被調用的時候,url中的這個id就會被復制到方法參數中,然后就可以使用了。? ?路徑變量可以不是字符串,SpringMVC會盡力轉換費字符串類型。
@ModuleAttribute:
前面談到,SpringMVC每次調用請求處理方法的時候,都會創造一個Model類型的一個實例,若打算用這個實例,則可以在方法中添加一個Model類型的參數。事實上可以在方法參數中添加ModelAttribute注解類型來訪問Model實例。? 這個注解類型也是org.springframework.web.bind.annotation包的成員。
可以用這個注解來注解方法參數或者方法。? 帶@ModelAttribute注解的方法參數,方法會將其輸入或創建的參數對象添加到Model對象中。(若方法中沒有閑式地添加)
如? ? ? ?@RequestMapping("xxx")public String submitOrder(@ModelAttribute("newOrder")? Order order? , Model model ) {? ?.....??}
輸入或創建的Order實例將用newOrder為鍵名添加到Model對象中。如果沒有定義鍵的名字,則將使用該對象的名稱? ? ?@ModelAttribute Order order? ? 那么鍵值就是order
該注解也可以用來標注一個非請求的處理方法。? 被@ModelAttribute注解的方法會在每次調用該控制器類的請求方法時被調用(在請求方法之前被調用),這個方法可以返回一個對象或一個void類型。如果返回一個對象,則返回對象會自動添加到Model中;如果返回void,則還需要添加一個Model類型的參數,并自行將實例添加到Model中。
總結
以上是生活随笔為你收集整理的JAVA中注解controller_SpringMVC之基于注解的Controller的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 局域网共享工具_局域网文件共享
- 下一篇: linux 内存规划,生产场景怎么对li