帮我设计一个基于ssm框架的留言功能,包含留言和回复两张表,回复不限制层级。要求包含mybatis层到dao层再到controller层实例说明
时间: 2024-03-18 22:42:47 浏览: 122
好的,基于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
阅读全文