[Spring MVC] of BeanNameViewResolver usage (Custom View)

BeanNameViewResolver (Custom View)

BeanNameViewResolverThis view resolver, custom views for returning. As the name suggests, by configuring the controller then returns the view custom bean名, to return custom views.

Custom View
package org.views;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.View;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.util.Map;

@Component("myview")
public class MyView implements View {
    private static final String ContentType = "text/html;charset=utf-8";
	@Override
    public String getContentType() {
        return ContentType;
    }

    @Override
    public void render(Map<String, ?> map,
                       HttpServletRequest httpServletRequest,
                       HttpServletResponse response)
            throws Exception {

        response.setContentType(ContentType);
        PrintWriter writer = response.getWriter();
        map.forEach((k,v)->writer.println(k+" "+v));
        writer.println("<pre>this is bottom</pre>");
    }


}

Analysis : implement the interface View(or inherited AbstractView), which method renderis actually with the servlet servicesimilar method function, but also render method was introduced to model (model). @Component("myview")The view is declared as frame assembly, and BeanNameis set to myview, since it is necessary to add to the view path defined scheduler (DispatcherServlet) tag component scans the configuration file, such as

<context:component-scan base-package="org.spring;org.spring2;org.views"/>

The above is by way of comment, the use of custom configuration view. A BeanNamecan be seen, may be added in the configuration file beanto achieve the same effect manner,

<bean name="myview" class="org.views.MyView"/>

Finally, it must remind implement the interface Viewwhen we must implement getContentTypea method (even realize the getContentTypemethod, do not think that was set up in response to the type of body, then you are wrong), otherwise the view resolver will not return this view, for unknown reasons, measured so . Abstract class AbstractViewimplements Viewan interface, abstract class inherited recommended AbstractViewto replace Viewthe interface.

package org.views;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.view.AbstractView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.util.Map;

@Component("myview")
public class MyView extends AbstractView {
    private static final String ContentType = "text/html;charset=utf-8";

    protected void renderMergedOutputModel(
            Map<String, Object> map,
            HttpServletRequest httpServletRequest,
            HttpServletResponse response
    ) throws Exception {
        response.setContentType(ContentType);
        PrintWriter writer = response.getWriter();
        map.forEach((k,v)->writer.println(k+" "+v));
        writer.println("<pre>this is bottom</pre>");
    }
}
Controller
package org.spring;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;


@Controller
public class HelloController {

    @RequestMapping(path = "/hello")
    public String execute(ModelMap modelMap) {
        modelMap.addAttribute(
                "testMessage",
                "<pre>hello huanghaifeng</pre>"
        );
        return "myview";
    }

}

Analysis : The model adds a property, then returns the custom viewsBeanName

Profiles
 <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
        <property name="viewResolvers">
            <list>
                <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                    <property name="prefix" value="/"/>
                    <property name="suffix" value=".jsp"/>
                </bean>
                <bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
                    <property name="order" value="10"/>
                </bean>
            </list>
        </property>
    </bean>

Here, the BeanNameViewResolverneed to initialize the order property, so InternalResourceViewResolver"it is finally located the default view chain.

发布了52 篇原创文章 · 获赞 4 · 访问量 4591

Guess you like

Origin blog.csdn.net/qq_42777577/article/details/104266541