2016-03-11 75 views
2

假設我有一個由Spring Framework呈現的頁面。這是一個包含Angular 2代碼的頁面。如果Spring發送它,我怎麼能在頁面上接收數據?我不想渲染一個頁面,然後做一個HTTP請求,然後得到一個響應。不,在Spring控制器中,我想發送數據,並以某種方式接收它與Angular 2並顯示(沒有額外的請求)。有了JSP,顯然該怎麼做,但是如何在呈現頁面時由Spring發送JSON來設置Angular 2模型?從Spring獲取Angular 2中的數據

我現在所擁有的是Spring Security管理登錄。然後,在控制器數據獲取準備取決於用戶,然後我想將它發送到Angular 2頁面。所以,我堅持不知道如何渲染頁面並附上數據,以便同時由Angular 2渲染它。

回答

0

我不確定我是否完全理解了這個問題......無論如何,如果我這樣做,我會這樣做 在Spring控制器中,在呈現JSP頁面之前,我需要所有您需要的業務邏輯創建JSON;然後我想創建一個JSON字符串,我會附加到模型 這意味着我會做這樣的事情:

@RequestMapping("/render") 
public String renderView(ModelAndView model) 
{ 
    //Your JSON String 
    String json = "{\"foo\":\"bar\"}"; 
    model.addAttribute("json", json); 
    return "yourJspName"; 
} 

然後在你的JSP可以用角來訪問包含在JSON該模型(即在pageContext中);例如,通過使用JSTL:

<script type="text/javascript"> 
var theJsonString = '${json}'; 
</script> 

<script type="text/javascript"> 
var theJsonString = '<c:out value="${json}" />'; 
</script> 

在這一點上,你有一個名爲theJsonString JS的變量,你JSON字符串你可以通過使用它,只要你想...例如它傳遞給角 如果需要JSON對象,你應該到這樣的事情:

<script type="text/javascript"> 
var theJsonString = '${json}'; 
var theJsonObj = JSON.parse(theJsonString); 
</script> 

<script type="text/javascript"> 
var theJsonString = '<c:out value="${json}" />'; 
var theJsonObj = JSON.parse(theJsonString); 
</script> 

我希望這可以幫助

安傑洛

+0

謝謝。你知道嗎,我怎麼才能把'sonObj'分配給Angular 2模型變量? –

+0

不幸的是,我不是一個偉大的角度專家:( –

+0

仍然掙扎着它。這是真正的問題:從角度的應用程序代碼'JSP'標籤不工作,所以我不能檢索它,我試圖從Angular 2發出HTTP請求。 –

0

我是能夠解決的問題,但通過找到一個真正的解決重新設計的應用程序,而不是。我正在做的是啓動Angular 2應用程序,在頁面上有一些導航功能,然後可以點擊登錄,並且Spring Security發揮作用。但是,經過驗證,我無法弄清楚如何再次推出Angular 2應用程序:開始一個全新的應用程序?或者以某種方式使用已經啓動的進行開發?不確定。

我所做的只是通過始終顯示登錄頁面來啓動應用程序,並且只有在用戶登錄後纔會啓動應用程序,而Angular 2發揮作用。我想,我可以建立第二個網站來開發另一個Angular應用程序,並在那裏啓動這個鏈接,如果我們在用戶登錄之前需要某些功能的話。問題是我試圖將一個Angular應用程序拆分爲兩個,我猜。

爲了以防萬一,這裏是我的安全。XML部分(Spring Security的版本4.0.4.RELEASE):

<http use-expressions="true"> 
    <intercept-url pattern="/views/**" access="hasAnyRole('ROLE_CUSTOMER', 'ROLE_ADMIN')" /> 

    <form-login 
     login-page="/login.jsp" 
     login-processing-url="/views/home" 
     authentication-failure-url="/login.jsp?error=failed_login" 
    /> 
    <logout logout-url="/logout" logout-success-url="/login.jsp" delete-cookies="JSESSIONID" /> 
    <remember-me /> 
    <headers> 
     <cache-control/> 
     <xss-protection/> 
    </headers> 
</http> 

登錄形式:

<form class="form-signin" method="POST" 
    action="${pageContext.servletContext.contextPath}/views/home"> 
    <h2 class="form-signin-heading">Please sign in</h2> 
    <label for="inputEmail" class="sr-only">Email address</label> 
    <input type="text" name="username" class="form-control" placeholder="Login" required autofocus> 
    <label for="inputPassword" class="sr-only">Password</label> 
    <input type="password" name="password" class="form-control" placeholder="Password" required> 
    <div class="checkbox"> 
     <label> 
     <input type="checkbox" value="remember-me"> Remember me 
     </label> 
    </div> 
    <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button> 
    <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/> 
    </form> 

和控制器,在成功登錄後啓動角應用:

@RequestMapping("/views/home") 
public String login() { 
    return "index"; 
} 

然後,在推出角2應用程序我打算通過發出HTTP請求來獲取數據,並使用Springs的控制器返回我JSON。所以,在Angular啓動之後,它本身就可以通過HTTP與服務器進行交互。註銷後,用戶將無法訪問Angular應用程序,因爲它位於受保護的文件夾下,index.jspnot in the app root folder,因此無法通過訪問/路徑啓動。