List<ViewResolver> 有什么作用
时间: 2024-04-15 20:24:27 浏览: 36
List<ViewResolver> 是一个 Spring MVC 中的接口,它的作用是用于解析视图(View)并返回相应的视图对象。视图解析器(ViewResolver)负责将逻辑视图名(例如 "home")解析为具体的视图对象(例如 JSP、Thymeleaf 模板等),从而实现将模型数据渲染到具体的视图上。
通常情况下,我们会配置多个视图解析器,并按照优先级的顺序进行解析。当控制器处理请求后,会根据配置的视图解析器列表逐个尝试解析视图名,直到找到能够解析该视图名的视图解析器为止。因此,List<ViewResolver> 中的顺序是非常重要的。
视图解析器可以根据不同的配置和需求进行选择和定制,常见的视图解析器包括 InternalResourceViewResolver(解析 JSP 视图)、ThymeleafViewResolver(解析 Thymeleaf 模板)、FreeMarkerViewResolver(解析 FreeMarker 模板)等。
总结起来,List<ViewResolver> 的作用是用于配置多个视图解析器,并按照优先级的顺序进行解析,将逻辑视图名解析为具体的视图对象,实现将模型数据渲染到具体的视图上。
相关问题
@Controller public class FreeMarkerController { Map<String ,Object> map = new HashMap<>(); List<Object> list = new ArrayList(); @GetMapping("/freemaker/{id}/{name}") public String demo(@PathVariable("id")String id ,@PathVariable("name") String name,Model model){ map.clear(); map.put("id",id); map.put("name",name); list.add(2); list.add(4); map.put("aa",null); model.addAttribute("map",map); model.addAttribute("list",list); model.addAttribute("date",new Date()); return "index"; } } 这里的demo方法,返回了"index",spring怎么知道是让freemarker去进行模板解析处理?
Spring框架通过配置文件或注解来指定视图解析器,从而告知Spring要使用哪个模板引擎进行模板解析处理。
在这个例子中,如果你想要使用FreeMarker模板引擎,你需要在Spring的配置文件中进行相应的配置,或使用注解的方式进行配置。以下是两种常见的配置方式:
1. 配置文件方式:
在Spring的配置文件中,可以通过以下配置来告诉Spring使用FreeMarker模板引擎进行解析处理:
```xml
<!-- 配置视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="prefix" value="/WEB-INF/views/"/> <!-- 设置模板文件的路径 -->
<property name="suffix" value=".ftl"/> <!-- 设置模板文件的后缀名 -->
<property name="cache" value="true"/> <!-- 是否开启模板缓存 -->
<property name="order" value="1"/> <!-- 设置视图解析器的顺序 -->
</bean>
<!-- 配置FreeMarker模板引擎 -->
<bean id="freeMarkerConfigurer" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/WEB-INF/templates/"/> <!-- 设置模板文件的路径 -->
<property name="preferFileSystemAccess" value="false"/> <!-- 是否优先使用文件系统路径 -->
<property name="defaultEncoding" value="UTF-8"/> <!-- 设置默认编码 -->
</bean>
```
2. 注解方式:
在Spring Boot项目中,可以使用`@EnableAutoConfiguration`注解自动配置FreeMarker模板引擎。只需在启动类上添加该注解即可:
```java
@SpringBootApplication
@EnableAutoConfiguration
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
```
以上配置完成后,Spring将会自动根据返回的视图名字("index")在配置的模板路径中查找对应的模板文件(如:/WEB-INF/views/index.ftl),并使用FreeMarker模板引擎进行解析处理。最终生成的HTML内容将会返回给客户端。
帮我设计一个基于ssm框架的留言功能,包含留言和回复两张表,回复不限制层级。要求包含mybatis层到dao层再到controller层实例说明
好的,基于SSM框架的留言功能的设计和实现步骤如下:
1. 创建Maven项目,引入Spring、SpringMVC和MyBatis的相关依赖。
2. 在web.xml中配置DispatcherServlet,并指定SpringMVC的配置文件位置。
```
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
```
3. 在SpringMVC配置文件中开启组件扫描和注解驱动,并配置视图解析器。
```
<context:component-scan base-package="com.example.controller" />
<mvc:annotation-driven />
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
```
4. 创建数据库,并在MyBatis中配置数据源和SQL映射文件。
```
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
<mapper namespace="com.example.dao.MessageDao">
<select id="findAllMessages" resultType="com.example.entity.Message">
SELECT * FROM message
</select>
</mapper>
<mapper namespace="com.example.dao.ReplyDao">
<select id="findAllReplies" resultType="com.example.entity.Reply">
SELECT * FROM reply
</select>
</mapper>
```
5. 创建实体类Message和Reply,用于映射数据库中的表和字段。
```
public class Message {
private int id;
private String content;
private Date createTime;
private Date updateTime;
private List<Reply> replies;
// 省略getter和setter方法
}
public class Reply {
private int id;
private int messageId;
private String content;
private int parentId;
private Date createTime;
private Date updateTime;
private List<Reply> replies;
// 省略getter和setter方法
}
```
6. 创建DAO层接口MessageDao和ReplyDao,并在MyBatis中配置对应的SQL映射。
```
public interface MessageDao {
List<Message> findAllMessages();
}
public interface ReplyDao {
List<Reply> findAllReplies();
}
```
7. 创建Service层接口MessageService和ReplyService,并注入DAO层依赖,实现查询所有留言和所有回复的方法。
```
public interface MessageService {
List<Message> findAllMessages();
}
@Service
public class MessageServiceImpl implements MessageService {
@Autowired
private MessageDao messageDao;
@Override
public List<Message> findAllMessages() {
List<Message> messages = messageDao.findAllMessages();
for (Message message : messages) {
List<Reply> replies = messageDao.findRepliesByMessageId(message.getId());
message.setReplies(replies);
}
return messages;
}
}
public interface ReplyService {
List<Reply> findAllReplies();
}
@Service
public class ReplyServiceImpl implements ReplyService {
@Autowired
private ReplyDao replyDao;
@Override
public List<Reply> findAllReplies() {
List<Reply> replies = replyDao.findAllReplies();
for (Reply reply : replies) {
List<Reply> subReplies = replyDao.findSubRepliesByParentId(reply.getId());
reply.setReplies(subReplies);
}
return replies;
}
}
```
8. 创建Controller层,并注入Service层依赖,实现查询所有留言和所有回复的接口。
```
@Controller
@RequestMapping("/message")
public class MessageController {
@Autowired
private MessageService messageService;
@RequestMapping("/findAll")
public ModelAndView findAll() {
List<Message> messages = messageService.findAllMessages();
ModelAndView mav = new ModelAndView("message");
mav.addObject("messages", messages);
return mav;
}
}
@Controller
@RequestMapping("/reply")
public class ReplyController {
@Autowired
private ReplyService replyService;
@RequestMapping("/findAll")
public ModelAndView findAll() {
List<Reply> replies = replyService.findAllReplies();
ModelAndView mav = new ModelAndView("reply");
mav.addObject("replies", replies);
return mav;
}
}
```
9. 在jsp页面中展示查询结果。
```
<!-- message.jsp -->
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>留言列表</title>
</head>
<body>
<h1>留言列表</h1>
<table>
<thead>
<tr>
<th>ID</th>
<th>内容</th>
<th>创建时间</th>
<th>更新时间</th>
</tr>
</thead>
<tbody>
<c:forEach items="${messages}" var="message">
<tr>
<td>${message.id}</td>
<td>${message.content}</td>
<td>${message.createTime}</td>
<td>${message.updateTime}</td>
</tr>
<c:forEach items="${message.replies}" var="reply">
<tr>
<td>${reply.id}</td>
<td>${reply.content}</td>
<td>${reply.createTime}</td>
<td>${reply.updateTime}</td>
</tr>
<c:forEach items="${reply.replies}" var="subReply">
<tr>
<td>${subReply.id}</td>
<td>${subReply.content}</td>
<td>${subReply.createTime}</td>
<td>${subReply.updateTime}</td>
</tr>
</c:forEach>
</c:forEach>
</c:forEach>
</tbody>
</table>
</body>
</html>
<!-- reply.jsp -->
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>回复列表</title>
</head>
<body>
<h1>回复列表</h1>
<table>
<thead>
<tr>
<th>ID</th>
<th>留言ID</th>
<th>内容</th>
<th>父级回复ID</th>
<th>创建时间</th>
<th>更新时间</th>
</tr>
</thead>
<tbody>
<c:forEach items="${replies}" var="reply">
<tr>
<td>${reply.id}</td>
<td>${reply.messageId}</td>
<td>${reply.content}</td>
<td>${reply.parentId}</td>
<td>${reply.createTime}</td>
<td>${reply.updateTime}</td>
</tr>
<c:forEach items="${reply.replies}" var="subReply">
<tr>
<td>${subReply.id}</td>
<td>${subReply.messageId}</td>
<td>${subReply.content}</td>
<td>${subReply.parentId}</td>
<td>${subReply.createTime}</td>
<td>${subReply.updateTime}</td>
</tr>
<c:forEach items="${subReply.replies}" var="subSubReply">
<tr>
<td>${subSubReply.id}</td>
<td>${subSubReply.messageId}</td>
<td>${subSubReply.content}</td>
<td>${subSubReply.parentId}</td>
<td>${subSubReply.createTime}</td>
<td>${subSubReply.updateTime}</td>
</tr>
</c:forEach>
</c:forEach>
</c:forEach>
</tbody>
</table>
</body>
</html>
```
至此,我们完成了基于SSM框架的留言功能的设计和实现。对于查询所有留言和所有回复的接口,我们可以通过访问以下URL进行访问:
- 查询所有留言:http://localhost:8080/message/findAll
- 查询所有回复:http://localhost:8080/reply/findAll