2014-07-19 2 views
8

나는 angularjs와 spring mvc를 REST 서비스 제공자로 사용하고 부분 뷰 공급자 (나는 다중 중첩 된 부분을 가질 수 있도록 각도 ui 라우터도 사용하고있다)를 작성하고있다. 나는 모든 각도에서 모든 일을 할 계획이므로 템플릿 언어에 대한 사용법은 현재 가지고 있지 않지만, 내가 시도한 모든 단일 뷰 해석기는 각도와 충돌하고 응용 프로그램을 충돌 시키거나 내 로그를 채우는 템플릿 언어 유형을 가지고 있습니다. 오류가 있습니다.어느 spring view resolver가 angularjs와 잘 맞습니까?

먼저 InternalResourceViewResolver를 사용해 보았지만 행운이 없다. 단지 .jsp 파일 만 기대하고 다른 것은 표시하지 않는 것 같다.

그런 다음 나는 Thymeleaf를 사용해 보았습니다. Thymeleaf는 xml 요구 사항을 따르기 위해 대부분의 html을 다시 작성해야하는 XML 표준을 따르며,이를 수행 한 후에 ng-show 지시문 내에서 &&이 발생할 때 사망했습니다. 그래서 그걸로 운이 없다.

그런 다음 Velocity를 시도했습니다. 나는 지금까지 속도와 함께 가장 운이 좋았다. html 파일을 멋지게 처리하고, 구문 분석 오류가 발생하면 멈추지 않고 InternalResourceViewResolver와 동일한 방식으로 부분 뷰를 제공 할 수 있습니다. 그러나 $ 속도 접두어 각 변수가 발생시 VTL 변수로 구문 분석을 시도하고

velocity - Null reference [template 'clients/createOrEdit.html', line 1, column 65] : $invalid cannot be resolved.

모두가 정상적으로 작동 계속 같은 메시지와 함께 내 로그를 채우고 난 그냥 오류가 떠날 수있는 사람이 아니에요 , 나는 VTL을 사용할 수 없게 만들 방법을 찾지 못했습니다.

이것이보기 확인자에 대한 나의 경험입니다.

또한 mvc:resources을 사용하여 .html 파일을 정적 리소스로 처리하겠다는 생각이 들었습니다. 그러나 어떤보기 리졸버도없이 메인 레이아웃을 설정하더라도 내 애플리케이션을 시작하지 못했습니다. html이 web.xml의 환영 파일이됩니다.

제 질문은입니다. 각도 분석기로 사용하여 각도 분석기와 함께 사용할 수 있도록해야하며보기 확인자를 사용해야하는 경우에도 사용해야합니다.

편집 : 나는 ContentNegotiatingViewResolver를 사용하려고 그리고 난 얻을 :

DEBUG ContentNegotiatingViewResolver - Requested media types are [text/html] based on Accept header types and producible media types [*/*]) 
DEBUG ContentNegotiatingViewResolver - No acceptable view found; returning null 
DEBUG DispatcherServlet - Could not complete request 
javax.servlet.ServletException: Could not resolve view with name 'layout.html' in servlet with name 'springDispatcherServlet' 

웹 애플리케이션-config.xml에 (디스패처 서블릿에서 contextconfig)

<mvc:annotation-driven /> 

    <!-- Resources --> 
    <mvc:resources location="/libs/" mapping="/libs/**" /> 
    <mvc:resources location="/css/" mapping="/css/**" /> 
    <mvc:resources location="/js/" mapping="/js/**" /> 
    <!-- Angular application data --> 
    <mvc:resources location="/WEB-INF/appjs/" mapping="/appjs/**" /> 
    <!-- View locations --> 
    <mvc:resources location="/WEB-INF/html/" mapping="/**"/> 

    <!-- Controllers --> 
    <context:component-scan base-package="com.mrplow.controller" /> 

    <!-- Views --> 
    <util:map id="contentMediaTypes"> 
     <entry key="json" value="application/json" /> 
     <entry key="html" value="text/html" /> 
    </util:map> 

<!-- <util:list id="defaultViews"> --> 
<!--  <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" />  --> 
<!-- </util:list> --> 

    <bean id="viewResolver" class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver" 
    p:order="1" 
    p:ignoreAcceptHeader="false" 
    p:defaultContentType="text/html" 
    p:mediaTypes-ref="contentMediaTypes" /> 

LayoutController.java

@Controller 
@RequestMapping("/") 
public class LayoutController { 

    @RequestMapping 
    public String getIndexPage() { 
     return "layout"; 
    } 
} 

답변

9

(HTML, CSS, IMG는 JS) 봄, 다음과 같은 디렉토리 구조를 사용한다.그냥 ..Same을 /image.jpg하지 /static/img/image.jpg을 언급해야 HTML

<h1>Page with image</h1> 
<img src="/static/img/image.jpg"/> 

참고 CSS와 JS 적용됩니다. 아래 그림과 같이

또는

또한 내용 협상 뷰 리졸버를 사용할 수 있습니다

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> 
      <property name="order" value="1" /> 
      <property name="mediaTypes"> 
      <map> 
       <entry key="json" value="application/json" /> 
       <entry key="xml" value="application/xml" /> 
       <entry key="rss" value="application/rss+xml" /> 
       <entry key="html" value="text/html"/> 
      </map> 
      </property> 

      <property name="defaultViews"> 
      <list> 
       <!-- JSON View --> 
       <bean 
       class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"> 
       </bean> 

스프링 MVC는 "에 ContentNegotiatingViewResolver"를 사용합니다 (순서 = 1)를 기반으로 적절한보기를 (반환 "mediaTypes"속성에서 선언 된 파일 확장명)과 일치하지 않으면 "InternalResourceViewResolver"(order = 2)를 사용하여 기본 JSP 페이지를 반환합니다.

<bean 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="order" value="2" /> 
     <property name="prefix"> 
      <value>/WEB-INF/pages/</value> 
     </property> 
     <property name="suffix"> 
      <value>.jsp</value> 
     </property> 
    </bean> 

는 이제 JSP에서 당신은 당신의 정적 HTML 페이지로 리디렉션 할 수 있습니다뿐만 아니라

@Controller 
    public class LayoutController { 

     @RequestMapping("/index") 
     public String getIndexPage() { 
      return "index"; 
     } 

    } 
index.jsp를

이제

<form:form method="GET" action="/static/html/layout.html"> 

/인덱스가 보여 http://yourapp.com/를 통해 서비스에 액세스하려고 위에서 언급 한 조치를 취하십시오. layout.html

버튼을 클릭하십시오. 또는 layout.html 페이지를 호출하는 JSP 페이지에 제출 봄의 새 버전에서 작동하도록에 ContentNegotiatingViewResolver와 솔루션을 만드는 방법을 찾아 사람들을 위해

+0

감사합니다. 하나의 질문. 미디어 유형은 xml - application/xml을 언급합니다. 그것도 html 파일을 설명합니까? – MrPlow

+0

예, html 에 사용할 수 있습니다. 내 대답을 업데이 트했습니다. 참조하십시오 –

+0

참조하십시오. 한 가지 더 묻습니다. 파일은 어디에서 보입니까? 그것은 내 견해를 찾을 수 없을 것 같습니다. 현재 구성으로 OP를 업데이트하겠습니다. – MrPlow

2

내가 생각하기에 ContentNegotiatin gViewResolver는 JSON, XML 또는 HTML 텍스트 형식의 데이터를 Jackson2와 통합하여 필요한 응답 유형간에 응답 할 수 있기 때문에 최상의보기 결정자입니다.

예를 들어이 방법을 살펴보십시오.

src/ 
    package/ 
    LayoutController.java 
WebContent/ 
    WEB-INF/ 
    static/ 
     html/ 
     layout.html 
     images/ 
     image.jpg 
     css/ 
     test.css 
     js/ 
     main.js 
    web.xml 
    springmvc-servlet.xml 



@Controller 
public class LayoutController { 

@RequestMapping("/staticPage") 
public String getIndexPage() { 
return "layout.htm"; 

} } 



    <!-- in spring config file --> 
<mvc:resources mapping="/static/**" location="/WEB-INF/static/" /> 

레이아웃 정적 자원 사용하려면

http://hillert.blogspot.com.es/2011/01/rest-with-spring-contentnegotiatingview.html

+0

감사합니다. 하나의 질문. 미디어 유형은 xml - application/xml을 언급합니다. 그것도 html 파일을 설명합니까? – MrPlow

+0

질문을 잘 이해하고 있는지 모르겠다. 그러나 HTML 파일에 대한 내용 유형은 "application/xml"대신 "text/html"입니다. Google에서 검색하면 모든 리소스에 대해 differents 콘텐츠 유형을 찾을 수 있습니다. 다른 측면에서는 @RequestMapping에 대해 배우고 속성을 소비/생성하며 모든 질문에 대해 메서드 수준에서 지정합니다. – Dani

1

:

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> 
    <property name="order" value="1" /> 
    <property name="contentNegotiationManager" ref="contentNegotiationManager"/> 
    <property name="defaultViews"> 
     <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/> 
    </property> 
</bean> 

그리고 그 구성 확장 후 무엇을 ContentNegotiationManagerFactoryBean의 필요성 :

<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> 
    <property name="mediaTypes"> 
     <props> 
      <prop key="json">application/json</prop> 
      <prop key="html">text/html</prop> 
      <prop key="xml">application/xml</prop> 
      // and so on 
     </props> 
    </property> 

    <property name="ignoreAcceptHeader" value="true"/> 
</bean> 
관련 문제