2 Stimmen

Spring 3.1 Type Level RequestMapping und logische Sichtnamen

Eine Frage zur Zuordnung von Wildcard-Anfragen auf Typ-Ebene und zu den logischen Namen von Springs-Ansichten, die aus den Rückgaben von Leere- und Domänenobjekten abgeleitet werden. Nehmen wir an, ich habe das Folgende

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

Mein Verständnis davon, wie Springs logische Ansicht Namen Generation ist, dass die oben genannten Controller "/" auf die logische Ansicht Namen "Index", die ich dann, zum Beispiel, verwenden Apache Tiles, um gegen eine entsprechende JSP-Ansicht übereinstimmen zuordnen wird.

In ähnlicher Weise veranschaulicht dies mein Verständnis von der Erstellung des logischen Ansichtsnamens Springs (aber ich glaube, ich übersehe etwas...)

@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);
    }
}

Sache ist, ist, dass die Liste-Methode nie als die "Index"-Seite der Sammlung aufgelöst wird - stattdessen scheint der logische Ansichtsname "Sammlung" (die ich havent definiert - ich möchte den logischen Ansichtsnamen "Sammlung/Liste" sein. Die "Element"-Methode funktioniert, es ist nur so, dass die Index-Seite nicht sorry für die vage Frage- nicht sicher, wie sonst, um es zu setzen-

Wie kann ich die Vorteile der Generierung des logischen View-Namens von Springs aus Methodennamen auf der Basis von Wildcard-URLs auf Typebene nutzen, ohne Strings zur Definition des logischen View-Namens zurückzugeben? Das obige funktioniert nicht so, wie ich es erwartet habe. Was übersehe ich?

UPDATE :

@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;
    }
}

Und meine Kachelordnerstruktur ist

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

und

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

wobei VIEWNAME ein Ansichtsname ist (Entschuldigung!) und die Ansichtspfade für diesen Ansichtsnamen in der Datei tiles.xml des jeweiligen Ordners definiert sind. Ich hoffe, das macht die Dinge klarer...

1voto

Biju Kunjummen Punkte 47456

Wenn ich Sie richtig verstanden habe, ist Ihre Listenmethode so eingestellt, dass sie auf GET von /collections reagiert, und Sie möchten die Standardauflösung des Ansichtsnamens nutzen, aber Sie möchten einen Ansichtsnamen, der nicht mit dem standardmäßig aufgelösten übereinstimmt.

Die Standardauflösung basiert auf dem http-Pfad, an den die Anfrage gesendet wird (in Ihrem Fall /collections ), und die Ansicht würde lauten collections wenn die GET-Anfrage stattdessen an folgende Adresse gesendet würde /collections/list wäre der Name Ihrer Ansicht wie folgt gewesen collections/list . Sie können sich die API für DefaultRequestToViewNameTranslator für weitere Informationen über die Regeln.

In Ihrem Fall möchten Sie jedoch, dass die Anfrage an folgende Adresse geschickt wird /collections aufgelöst werden als collections/list Name der Ansicht.

Ich sehe nur eine Möglichkeit, dies zu tun - den Namen der Ansicht explizit aus der Methode zurückzugeben return "collections/list";

Sie können versuchen, einen benutzerdefinierten RequestToViewNameTranslator zu schreiben, aber der Parameter, der übergeben wird, ist die httprequest, und Sie können nicht viel davon ableiten, um etwas wie das zu konstruieren, wonach Sie suchen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X