当前位置: 首页 > 面试题库 >

Spring View解析器可以与angularjs配合使用?

巢皓君
2023-03-14
问题内容

我正在使用angularjs和spring mvc作为REST服务提供程序和部分视图提供程序编写一个webapp(我也使用angular-ui-router,以便可以有多个嵌套的部分)。我目前对模板语言没有任何用处,因为我计划按角度进行所有操作,但是我尝试过的每个单一视图解析器都有某种类型的模板语言,与角度冲突,或者使应用程序崩溃和/或填充我的日志有错误。

首先,我尝试使用InternalResourceViewResolver,但是没有运气,因为它似乎只希望使用.jsp文件,并且不会显示其他任何内容。

然后,我尝试使用Thymeleaf。Thymeleaf遵循XML标准,该标准迫使我重写我的大多数html以符合xml要求,在我这样做之后,它在遇到&&ng-show指令内部时就死了。所以也没有运气。

然后我尝试了Velocity。到目前为止,我最幸运的是速度。它很好地提供了html文件,不会在遇到解析错误时停下来,并且使我能够像InternalResourceViewResolver一样提供部分视图。但是,在遇到以$ Velocity开头的角度变量时,尝试将其解析为VTL变量,并在日志中填充如下消息

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

一切都会按预期进行,但我不是一个只留下错误的人,而且我发现无法禁用VTL。

这就是我目前在视图解析器上的经验。

我也有一个想法使用.html文件将其视为静态资源(它们在mvc:resources某种角度之前就算是静态的)在没有任何视图解析器的情况下,即使我将main layout.html设置为欢迎,我的应用程序也无法启动-web.xml中的文件

我的问题是。我应该使用什么作为视图解析器,以便它与angularjs配合使用,以及什至应该使用视图解析器?

编辑:我正在尝试使用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'

webapp-config.xml(调度程序servlet中的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";
    }
}

问题答案:

为了在spring使用静态资源(html,css,img,js),请使用类似于以下内容的目录结构:

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/" />

layout.html

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

请注意,你必须提及/static/img/image.jpg而不只是/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>

Spring MVC将使用“ ContentNegotiatingViewResolver”(order = 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/ / index 访问你的服务,显示上述表单操作,它将显示layout.html

单击一个按钮或在jsp页面中提交以调用layout.html页面



 类似资料:
  • 问题内容: 总而言之,我们正在使用AngularJS开发一个Web应用程序,并且我们有一个用例/需求(根本不会经常发生),在此我们需要从静态服务器中检索完整的HTML文档。但是,似乎$ http对象返回了原始HTML字符串作为其“数据”。我们试图避免使用外部库(例如jQuery),但是我们需要将该原始HTML字符串解析为可查询的DOM对象。我们可以使用iframe并完成它,但是出于众所周知的原因,

  • 问题内容: 我正在使用与此类似的命令: 尽管我没有使用chmod,但我使用的是其他命令,在此不再列出。此命令运行正常。但是,有成千上万的文件和目录要操作,并且此操作需要一些时间。我想知道是否可以在操作完成后显示某种总数?也许算个修改过的文件? 我唯一能想到的就是做类似的事情: 那行得通吗?至少我们可以看到正在发生某些事情……有人有更好的建议吗? 问题答案: 这有效: 您必须花一秒钟的时间才能起作用

  • 我在这里使用的是一步语法,当我运行grun时,它非常有效: 但是,当使用具有以下代码的生成的java解析器运行时: 我得到这个错误:

  • 问题内容: 我编写角度控制器的风格是这样的(使用控制器名称而不是函数) 我现在需要的是提供我要定义解析部分的路线时: 由于控制器定义为名称,如何解决以下问题? 为了更详细地阐明,我想在解析路由之前从服务器加载一些数据,然后在控制器中使用这些数据。 更新: 更准确地说,我希望每个模块都有其“解析”功能,该功能将在执行具有该控制器的root用户之前被调用。这篇文章中的解决方案(由MiskoHevery

  • 问题内容: 我有一个Flask网站,并且想使用AngularJS JavaScript框架。不幸的是,似乎分隔符重叠。 如果两个都依赖于双花括号(),如何将Angular与Jinja2配合使用?可能吗 问题答案: 您有一些选择。 1)更改Angular的定界符表示法: 无论选择什么作为开始和结束符号,都将充当新的分隔符。在这种情况下,您可以使用将变量表示为Angular 。 这种方法的优点是只需要

  • 问题内容: 我正在使用Phonegap + React.js和Socket.io开发一个应用程序。但是,随后React-Native发行了,其原生感觉很棒。 我试图让socket.io-client与React Native一起工作,但是不幸的是没有成功。我做了一些研究,发现与此问题中描述的错误完全相同:https : //github.com/facebook/react- native/iss