BeanNameViewResolver (Custom View)
BeanNameViewResolver
This 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 render
is actually with the servlet service
similar method function, but also render method was introduced to model (model). @Component("myview")
The view is declared as frame assembly, and BeanName
is 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 BeanName
can be seen, may be added in the configuration file bean
to achieve the same effect manner,
<bean name="myview" class="org.views.MyView"/>
Finally, it must remind implement the interface View
when we must implement getContentType
a method (even realize the getContentType
method, 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 AbstractView
implements View
an interface, abstract class inherited recommended AbstractView
to replace View
the 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 BeanNameViewResolver
need to initialize the order property, so InternalResourceViewResolver"
it is finally located the default view chain.