5

Spring MVC を REST サーバーとして、AngularJS をクライアント側で使用できるようにしたいと考えています。

REST 用の URL がいくつかあります。

  • /残り/製品
  • /rest/products/{id}

そして、私はUI用のいくつかのURLを持っています:

  • /ショップ/製品
  • /shop/products/{id}

クライアント側でトリックを行うのは AngularJS であるため、AngularJS で使用される index.html ファイルにすべてのデフォルトの ui URL (残りのものではない) をリダイレクトできるようにしたいだけです。

したがって、Spring MVC 構成では、次のようなことができるようにしたいと考えています。

@EnableWebMvc
@Configuration
@ComponentScan(basePackages = "com.mypackage.web")
public class WebAppConfiguration extends WebMvcConfigurerAdapter {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/**").setViewName("index");
    }

    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/");
        resolver.setSuffix(".html");
        return resolver;
    }

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

}

それで、すべての UI URL 処理を AngularJS に委譲したいと考えています。

また、ユーザーがブラウザーに不適切な URL を書き込んだ場合、Spring MVC によって index.html ファイルにリダイレクトされ、AngularJS がエラー UI ページでリダイレクトを行うようにしたいと考えています。Web 上で 1 つの index.html ファイルを使用するプロジェクトをいくつか見てきましたが、このエラー ケースを処理する人は誰もいません。

私はこのトリックを実行しようとして多くの時間を費やしてきましたが、解決策が見つかりません。

だから私の質問は:どうすればそれを行うことができますか?より一般的には、このSpring MVC-AngularJSの必要な構成が間違っていますか?

非常に重要:私はSpring MVC 3.2とTomcat 7.34をweb.xmlなしで使用しています(フルサーブレット3.0)

どうもありがとう。

4

4 に答える 4

0

$routeProviderで解決できるかもしれません:

$routeProvider.when('/redirect/:redirectParams', {templateUrl: 'partials/homePartial', controller: redirectController});
$routeProvider.when('/home', {templateUrl: 'partials/homePartial', controller: homeController});
$routeProvider.when('/someRoute', {templateUrl: 'partials/somePartial', controller: someController});
$routeProvider.when('/error/', {templateUrl: 'partials/errorPartial', controller: errorController});
$routeProvider.when('/error/:errorMessage', {templateUrl: 'partials/errorPartial', controller: errorController});
$routeProvider.otherwise({redirectTo: '/error'})

$routeProviderルートが見つからなかった場合は、エラー ページにリダイレクトするだけです。

編集:

上記の例では、redirectController を追加しました。このコントローラは を読み取り、$routeParamsこの場合は$location$routeParams.redirectParamsを使用してルートを に変更します。/error

Spring は にリダイレクトするだけhttp://host:port/index.html/#/redirect/error=blablaです。これを微調整して、複数の routeParams をサポートすることができます。

Spring では、基本的に 3 つのリクエスト マッピングがあります。

他のすべてのリクエストをリダイレクトするには:

@RequestMapping(value = "{path}", method = RequestMethod.GET)
public String redirect(@PathVariable String path) {
   String route = null;
   if (path.equals("/") || path.startsWith("/index.html")) {
     // load index.html
   } else {
     route = "redirect:/index.html/#/redirect/" + path; 
   }
   return route;
}
于 2013-01-01T17:12:49.873 に答える
0

/rest/ 、 /resources/、 /webjars/*などのいくつかの既知の URL を許可し、他の URL をindex.htmlにリダイレクトするインターセプターを作成できると思います。

于 2015-05-04T04:04:59.007 に答える
0

urlrewritefilterを使用してみてください

これでうまくいくはずです。すべてのURLが処理されるようにweb.xmlで構成/追加する必要があり、それを操作してindex.htmlにリダイレクトできます

于 2016-01-30T22:11:11.577 に答える
0

少し遅れていることはわかっていますが、誰かが同じ問題に遭遇した場合に備えて、クラスパス urlwrite.xml に入れられた URL フィルターのサンプルを次に示します。

フィルタリングしたい特定の URL のリダイレクトを設定できます。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 4.0//EN"
        "http://www.tuckey.org/res/dtds/urlrewrite4.0.dtd">

<!-- Configuration file for UrlRewriteFilter http://www.tuckey.org/urlrewrite/ -->

<urlrewrite>

    <rule>
        <note>
            The rule means that requests to /test/status/ will be redirected
            to
            /rewrite-status
            the url will be rewritten.
        </note>
        <from>/index.ipxs/directory</from>
        <to type="redirect">/index.ipxs/marketplace</to>

    </rule>
    <rule>
        <from>/index.ipxs/faq</from>
        <to type="redirect">/index.ipxs/marketplace</to>
    </rule>
    <rule>
        <from>/index.ipxs/marketplace</from>
        <to type="redirect">/iPlexus/index.ipxs</to>
    </rule>

</urlrewrite>
于 2016-11-17T10:07:51.030 に答える