从Spring获取Angular 2中的数据

时间:2016-03-11 22:42:08

标签: spring angular

让我们说我有一个由Spring Framework呈现的页面。这是一个包含Angular 2代码的页面。如果Spring发送,我怎么能在页面上接收数据?我不想呈现页面,然后执行HTTP请求,然后获得响应。不,在Spring控制器中我想发送数据并以某种方式接收它与Angular 2并显示(没有额外的请求)。使用JSP很明显该怎么做,但是如何在呈现页面时从Spring发送的JSON设置Angular 2模型?

我现在拥有的是Spring Security管理登录。然后,在控制器数据中根据用户准备,然后我想将它发送到Angular 2页面。所以,我不知道如何渲染页面并附加数据,以便Angular 2同时渲染它。

2 个答案:

答案 0 :(得分:1)

我不确定我是否完全明白这个问题......无论如何,如果我这样做,我就是这样做的 在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中,您可以使用Angular访问模型中包含的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字符串,你可以根据需要使用它...例如将它传递给angular 如果你需要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>

我希望这可以提供帮助

安吉洛

答案 1 :(得分:0)

我能够通过重新设计应用而不是找到真正的解决方案来解决问题。我正在做的是启动Angular 2应用程序,在页面上有一些导航,功能,然后可以点击登录,Spring Security开始发挥作用。但是,在验证后我无法弄清楚如何再次启动Angular 2应用程序:启动一个全新的应用程序?或者以某种方式使用已经推出的继续开发?不确定。

我所做的只是通过始终显示登录页面启动应用程序,并且只有在用户登录后,Angular 2才会起作用。我想,如果我们在用户登录之前需要一些功能,我可以设置第二个网站来开发另一个Angular应用程序,并在那里建立一个可以启动这个的链接。问题是我试图将一个Angular应用程序分成我想是两个。

以防万一,这是我的security.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>

成功登录后启动Angular应用程序的控制器:

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

然后,在启动的Angular 2应用程序中,我计划通过发出HTTP请求并使用Springs&#39;来获取数据。控制器返回我JSON。因此,在Angular启动之后,它本身就可以通过HTTP与服务器进行交互。注销后,用户将无法访问Angular应用,因为它位于受保护的文件夹下且index.jspnot in the app root folder,因此无法通过访问/路径启动它。