下面我将为大家详细讲解“springmvc视图解析流程代码实例”的完整攻略。
什么是SpringMVC视图解析器?
SpringMVC视图解析器指的是一个组件,它用于将控制器返回给客户端的模型数据解析成最终的HTML、JSON、XML等格式的视图响应。在SpringMVC中,视图解析器通常工作在处理器映射器之后,即处理器执行方法之后。
SpringMVC视图解析器流程
SpringMVC视图解析器的流程大致如下:
- 执行控制器逻辑,返回模型数据
- SpringMVC找到与请求对应的视图解析器
- 视图解析器将模型数据及视图名称传入,确定哪个视图将被渲染
- 返回渲染后的视图给客户端
SpringMVC视图解析器代码实例
下面我们通过两个实例来演示SpringMVC视图解析器的使用。
实例一:通过FreeMarker视图解析器渲染模型数据
首先,我们需要在pom.xml中加入对FreeMarker的依赖:
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.29</version>
</dependency>
然后,我们需要在SpringMVC配置文件中进行如下配置:
<!-- 配置FreeMarker -->
<bean id="freeMarkerConfigurer" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/WEB-INF/ftl/"/>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/>
<property name="prefix" value=""/>
<property name="suffix" value=".ftl"/>
<property name="contentType" value="text/html;charset=UTF-8"/>
</bean>
最后,我们写一个简单的控制器方法如下:
@GetMapping("/user/{id}")
public ModelAndView getUser(@PathVariable Long id){
User user = userService.getUserById(id);
Map<String,Object> model = new HashMap<>();
model.put("user",user);
return new ModelAndView("user","model",model);
}
这个方法返回的是一个ModelAndView对象,其中视图名称是"user",模型数据为"user"。
实例二:通过自定义视图解析器渲染模型数据
假设我们现在需要实现自己的视图解析器,首先我们需要继承AbstractTemplateViewResolver类,并重写其中的resolveViewName()方法:
public class MyViewResolver extends AbstractTemplateViewResolver {
public MyViewResolver(){
setViewClass(MyView.class);
}
@Override
protected AbstractUrlBasedView buildView(String viewName) throws Exception {
MyView view = (MyView) super.buildView(viewName);
// 设置模板名
view.setTemplateName(viewName);
return view;
}
@Override
protected String getPrefix() {
return "/WEB-INF/template/";
}
@Override
protected String getSuffix() {
return ".html";
}
}
接着,我们需要实现自己的视图类MyView,这里我们可以继承AbstractTemplateView类:
public class MyView extends AbstractTemplateView {
private String templateName;
public void setTemplateName(String templateName) {
this.templateName = templateName;
}
@Override
protected void renderMergedTemplateModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
// 此处省略渲染模板的代码,可以使用thymeleaf、velocity等模板引擎进行渲染
// 渲染完后,将结果写到响应中
response.getWriter().write("templateName:"+templateName+",model:"+model.toString());
}
}
最后,在SpringMVC配置文件中进行如下配置:
<!-- 配置自定义视图解析器 -->
<bean id="myViewResolver" class="com.test.MyViewResolver"/>
<!-- 配置与之对应的控制器 -->
<bean id="myController" class="com.test.MyController"/>
<!-- 配置InternalResourceViewResolver -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
其中,对应的控制器如下:
@Controller
public class MyController {
@GetMapping("/hello")
public ModelAndView hello(ModelAndView modelAndView){
modelAndView.addObject("name","world");
modelAndView.setViewName("hello");
return modelAndView;
}
}
至此,我们就通过自定义视图解析器的方式实现了模型数据的渲染。
总结
通过以上的两个实例,我们了解了SpringMVC视图解析器的使用,以及自定义视图解析器的实现过程。希望可以对大家有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springmvc视图解析流程代码实例 - Python技术站