Spring?MVC如何實(shí)現(xiàn)接口Controller定義控制器
實(shí)現(xiàn)接口Controller定義控制器
控制器提供訪問應(yīng)用程序的行為,通常通過服務(wù)接口定義或注解定義兩種方法實(shí)現(xiàn)。 控制器解析用戶的請(qǐng)求并將其轉(zhuǎn)換為一個(gè)模型。在Spring MVC中一個(gè)控制器可以包含多個(gè)Action(動(dòng)作、方法)。
方法一:實(shí)現(xiàn)接口Controller定義控制器
Controller是一個(gè)接口,處在包org.springframework.web.servlet.mvc下,接口中只有一個(gè)未實(shí)現(xiàn)的方法,具體的接口
FooController.java
package com.wbg.spring; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class FooController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { return new ModelAndView("/view/index", "message", "Hello,我是通過實(shí)現(xiàn)接口定義的一個(gè)控制器"); } }
springmvc-servlet.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd"> <!-- Spring MVC不處理靜態(tài)資源 --> <mvc:default-servlet-handler /> <!-- 支持mvc注解驅(qū)動(dòng) --> <mvc:annotation-driven /> <!-- 視圖解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <!-- 前綴 --> <property name="prefix" value="/WEB-INF" /> <!-- 后綴 --> <property name="suffix" value=".jsp" /> </bean> <bean name="/foo" class="com.wbg.spring.FooController"></bean> </beans>
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Foo</title> </head> <body> ${message} </body> </html>
運(yùn)行結(jié)果
方法二:使用注解@Controller定義控制器
org.springframework.stereotype.Controller注解類型用于聲明Spring類的實(shí)例是一個(gè)控制器(在講IOC時(shí)還提到了另外3個(gè)注解);Spring可以使用掃描機(jī)制來找到應(yīng)用程序中所有基于注解的控制器類,為了保證Spring能找到你的控制器,需要在配置文件中聲明組件掃描。
Controller02.java
package com.wbg.spring; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class Controller02 { @RequestMapping("/fs") public String index(Model model){ model.addAttribute("message","這是通過注解的一個(gè)控制器"); return "/view/index"; } }
在springmvc-servlet.xml加上支持注解
<!-- 自動(dòng)掃描包,實(shí)現(xiàn)支持注解的IOC --> <context:component-scan base-package="com.wbg.spring" />
運(yùn)行結(jié)果
詳談Controller(控制器)
一、controller架構(gòu)介紹
controller是一個(gè)運(yùn)行在獨(dú)立的服務(wù)器上的軟件程序,實(shí)現(xiàn)的語(yǔ)言沒有規(guī)定,可以運(yùn)行在不同的操作系統(tǒng)上。目前,controller分為兩類,一類是廣義的controller,也叫SDN controller,支持多種協(xié)議,OpenFlow就是其中一種。這種controller奉行控制和轉(zhuǎn)發(fā)分離的SDN原則,但是可以通過別的南向接口協(xié)議去控制轉(zhuǎn)發(fā)設(shè)備,而opendaylight組織研制的就是SDN controller;第二類是協(xié)議的controller,也叫OpenFlow controller,OpenFlow是唯一支持的協(xié)議。
各大廠商在SDN市場(chǎng)爭(zhēng)奪,更多是對(duì)controller定義權(quán)和控制權(quán)的爭(zhēng)奪,反而交換機(jī)爭(zhēng)奪沒那么激烈。這是因?yàn)槲磥砭W(wǎng)絡(luò)是應(yīng)用為主,最終的趨勢(shì)是底層都將被屏蔽掉,網(wǎng)絡(luò)服務(wù)于應(yīng)用。一旦SDN發(fā)展起來,controller就是SDN的核心,在controller有發(fā)言權(quán),在SDN市場(chǎng)就有發(fā)言權(quán)。
controller有很多個(gè)屬性,要分析一個(gè)controller,就需要分析每一個(gè)屬性:
北向接口
- 每個(gè)controller都有面向用戶程序的編程接口,也就是北向接口,北向接口的差異性很大,最簡(jiǎn)單,最傳統(tǒng)的北向接口是CLI,SNMP,目前流行的是REST API
集成的服務(wù)和應(yīng)用
- controller并非僅僅提供編程接口,還會(huì)提供各種各樣的應(yīng)用和服務(wù),比如提供了路由協(xié)議,訪問控制,QOS,防火墻等豐富的網(wǎng)絡(luò)功能,當(dāng)然也有簡(jiǎn)單的controller只提供控制接口。通常大廠商都會(huì)提供一些應(yīng)用和服務(wù),這將是用來提供差異化服務(wù)的重要手段,也是廠商想控制市場(chǎng)的重要原因之一。
南向接口
- 所有的OpenFlow controller自然支持OpenFlow這樣一個(gè)南向接口,而SDN controller就不同了,除了OpenFlow,還支持別的,比如SNMP,NetConf,OF-Config等。
控制方式
- 很多人認(rèn)為SDN就是集中控制的,所以controller都是集中式controller,其實(shí)不然,集中式的controller明顯有可擴(kuò)展性的問題,當(dāng)網(wǎng)絡(luò)規(guī)模比較大的時(shí)候,一個(gè)controller根本搞不定,所以必須有分布式的controller,多個(gè)controller一起協(xié)同完成對(duì)網(wǎng)絡(luò)的控制工作,之間的協(xié)調(diào)通常通過全局的控制邏輯服務(wù)器來負(fù)責(zé)。
對(duì)物理和虛擬設(shè)備的通用管理
- 無論是OpenFlow controller還是SDN controller,管理對(duì)象都是包括物理設(shè)備,虛擬設(shè)備,理論上的控制方式是統(tǒng)一的,但是目前并不是每個(gè)controller都是如此。
支持的OpenFlow標(biāo)準(zhǔn)
- 無論是OpenFlow controller還是SDN controller,都可能支持不同的OpenFlow標(biāo)準(zhǔn)。
二、Onix分布式controller模型
很多controller都是基于Onix模型搭建起來的,包括nicira的NVP中所用的controller和Google的基于OpenFlow的B4 WAN網(wǎng)所用的controller,以及一些別的公司私有的分布式controller。
這是一個(gè)分布式架構(gòu)的controller模型,是被用來設(shè)計(jì)控制大型網(wǎng)絡(luò)的,具有很強(qiáng)的可擴(kuò)展性。它通過引入control logic控制邏輯,controller和物理設(shè)備三層架構(gòu),每個(gè)controller只控制部分設(shè)備,并且只發(fā)送匯聚過后的信息到邏輯控制服務(wù)器,邏輯控制服務(wù)器了解全網(wǎng)的拓?fù)浣Y(jié)構(gòu),來達(dá)到分布式控制的目的,從而使整個(gè)方案具有高度可擴(kuò)展性。
下圖是使用Onix controller來組網(wǎng)的分布式架構(gòu)圖
三、FloodLight
FloodLight是Big Switch公司的Big Network Controller的開源版,Big Switch最初就是做的這個(gè)開源的controller,后來才基于開源的controller又開發(fā)了商業(yè)版的controller。
FloodLight的內(nèi)核是使用java編寫以便支持跨平臺(tái),提供北向API,北向API支持java和python,內(nèi)部集成了一些應(yīng)用,比如LLDP。
四、Ryu
Ryu是日本NTT一個(gè)實(shí)驗(yàn)室發(fā)起的開源controller項(xiàng)目,是基于python開發(fā)的。不僅支持OpenFlow,還支持一些別的控制協(xié)議,比如ON-Config等。
五、NOX/POX
NOX最初是nicira公司開發(fā)的,為網(wǎng)絡(luò)操作系統(tǒng),network operating system,2008年貢獻(xiàn)給開源社區(qū),是世界上第一個(gè)OpenFlow controller,是基于C++的,這個(gè)controller伴隨OpenFlow而生,OpenFlow只是NOX項(xiàng)目的一個(gè)副產(chǎn)品。
除了OpenFlow外,還提供了一些應(yīng)用工具,包括拓?fù)浒l(fā)現(xiàn),網(wǎng)絡(luò)可視化,網(wǎng)絡(luò)監(jiān)控等。
POX是NOX的python版本,除了用的編程語(yǔ)言不同,POX還比NOX多了很多功能。
六、Trema
Trema是NEC開發(fā)的一個(gè)開源controller,是用C和python寫的,目標(biāo)是打造一個(gè)OpenFlow programming framework即一個(gè)基于OpenFlow的可編程框架。Trema也提供了不少應(yīng)用和服務(wù),包括拓?fù)浒l(fā)現(xiàn)LLDP,flow管理,路由交換,OpenStack插件等。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java并發(fā)編程JUC CountDownLatch線程同步
這篇文章主要介紹CountDownLatch是什么、CountDownLatch 如何工作、CountDownLatch 的代碼例子來展開對(duì)java并發(fā)編程JUC CountDownLatch線程同步,需要的朋友可以參考下面文章內(nèi)容2021-09-09Java并發(fā)LinkedBlockingQueue源碼分析
這篇文章主要為大家介紹了Java并發(fā)LinkedBlockingQueue源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02Hadoop源碼分析四遠(yuǎn)程debug調(diào)試
本篇是Hadoop源碼分析系列文章第四篇,主要介紹一下Hadoop的遠(yuǎn)程debug調(diào)試步驟,后續(xù)本系列文章會(huì)持續(xù)更新,有需要的朋友可以借鑒參考下2021-09-09Collections工具類_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
Collections工具類提供了大量針對(duì)Collection/Map的操作。這篇文章主要介紹了Collections工具類_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理,需要的朋友可以參考下2017-04-04詳解JDBC的概念及獲取數(shù)據(jù)庫(kù)連接的5種方式
Java?DataBase?Connectivity是將Java與SQL結(jié)合且獨(dú)立于特定的數(shù)據(jù)庫(kù)系統(tǒng)的應(yīng)用程序編程接口,一種可用于執(zhí)行SQL語(yǔ)句的JavaAPI。本文主要介紹了JDBC的概念及獲取數(shù)據(jù)庫(kù)連接的5種方式,需要的可以參考一下2022-09-09用C++實(shí)現(xiàn)求N!中末尾0的個(gè)數(shù)的方法詳解
這篇文章主要介紹了用C++實(shí)現(xiàn)求N!中末尾0的個(gè)數(shù)的方法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07