2

タイプレベルのワイルドカードリクエストマッピングと、voidおよびドメインオブジェクトから派生したSprings論理ビュー名に関する質問が返されます。私は次のように言ってください

@Controller
class HomeController
{
    @RequestMapping(value="/")
    public void index () {}
}

Springsの論理ビュー名の生成方法についての私の理解は、上記のコントローラーが「/」を論理ビュー名「index」にマップし、たとえば、ApacheTilesを使用して適切なjspビューと照合できることです。

同様に、これはSpringsの論理ビュー名の作成についての私の理解を示しています(しかし、私は何かが欠けていると思います...)

@Controller
@RequestMapping("/collection/*")
class CollectionController
{

    @Autowired
    private SomeService someService;

    @RequestMapping(method=RequestMethod.GET)
    public List<Item> list ()
    {
        // in my understanding
        // itemList should be available in the model (via generated name),
        // that the logical view name generated should be
        // collection/list and that this method
        // would intercept the url "/collection/" or "/collection"
        return someService.getItems();
    }

    @RequestMapping("/{itemId}")
    public Item item (@PathVariable final String itemId)
    {
        // similiarly, item should be available in the
        // model and the logical view name should be
        // collection/item
        return someService.getItem(itemId);
    }
}

つまり、listメソッドはコレクションの「インデックス」ページとして解決されることはありません-代わりに、論理ビュー名は「コレクション」(私は定義していません-論理ビュー名を「コレクション/」にしたい)のように見えますリスト」。「item」メソッドは機能します-インデックスページが機能しないというだけです-漠然とした質問をお詫びします-他にどのように配置すればよいかわかりません-

論理ビュー名を定義するための文字列を返さずに、タイプレベルでワイルドカードURLに基​​づくメソッド名からSprings論理ビュー名を生成するにはどうすればよいですか?上記は私が期待したようには機能しません。私は何が欠けていますか?

アップデート:

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter
{

    static private String [] TILES_DEFINITIONS= new String [] { "/WEB-INF/layouts/tiles.xml", "/WEB-INF/views/**/tiles.xml"};

    /* static resource resolution */ 
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) 
    {
        registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
    }

    /**
     * ViewResolver configuration required to work with Tiles2-based views.
     */
    @Bean  
    public ViewResolver viewResolver ()
    {
        UrlBasedViewResolver viewResolver= new UrlBasedViewResolver();
        viewResolver.setViewClass(TilesView.class);
        return viewResolver;
    }

    /**
     * Configures Tiles at application startup.
     */
    @Bean
    public TilesConfigurer tilesConfigurer () 
    {
        final TilesConfigurer configurer= new TilesConfigurer();
        configurer.setDefinitions(TILES_DEFINITIONS);
        configurer.setCheckRefresh(true);
        return configurer;
    }
}

そして私のタイルフォルダ構造は

src/main/webapp/layouts (contains base page.jsp)

src/main/webapp/views/[VIEWNAME]/tiles.xml

ここで、VIEWNAMEはビュー名(申し訳ありません!)であり、そのビュー名のビューパスはそのフォルダーtiles.xmlで定義されています。それが物事をより明確にすることを願っています...

4

1 に答える 1

1

私が正しく理解していれば、listメソッドは/ collectionsのGETに応答するように設定されており、デフォルトのビュー名解決を利用したいが、デフォルトで解決されたものとは異なるビュー名が必要です-

デフォルトの解像度は、リクエストが送信される場所へのhttpパス(この場合)に基づいて/collectionsおり、ビューはになりますcollections。代わりにGETリクエストがに送信された/collections/list場合、ビュー名はになりますcollections/list。ルールの詳細については、DefaultRequestToViewNameTranslatorのAPIを参照してください。

ただし、あなたの場合、送信されたリクエストをビュー名/collectionsとして解決する必要があります。collections/list

私はそれを行う唯一の方法を見ることができます-メソッドからビュー名を明示的に返すこと return "collections/list";

カスタムのRequestToViewNameTranslatorを作成してみることができますが、渡されるパラメーターはhttprequestであり、それから多くを派生させて、探しているもののようなものを構築することはできません。

于 2012-05-15T01:45:59.773 に答える