Spring学习之旅(九) 综合利用之前的框架完成主页

来源:互联网 发布:平高集团待遇知乎 编辑:程序博客网 时间:2024/05/13 20:19

辛苦堆砌,转载请注明出处,谢谢!

        今天利用之前的框架,完成剩余的主页部分,先看看实体类Message

package com.yjp.springmvc.blog.beans.model;import java.io.Serializable;import java.util.Date;import javax.persistence.CascadeType;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.ManyToOne;import javax.persistence.Table;import org.hibernate.annotations.GenericGenerator;@Entity@Table(name="messages")public class Message implements Serializable {private static final long serialVersionUID = 3939608685011245576L;@Id@GeneratedValue(generator = "uuid")@GenericGenerator(name = "uuid", strategy = "uuid")private String id;@ManyToOne(cascade={CascadeType.MERGE})@JoinColumn(name="username", nullable=false)private User user;@Column(nullable=false)private Date date;@Column(nullable=false)private String txt;public Message() {}public Message(Date date, String txt, User user) {this.date = date;this.txt = txt;this.user = user;}public String getId() {return id;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}public Date getDate() {return date;}public void setDate(Date date) {this.date = date;}public String getTxt() {return txt;}public void setTxt(String txt) {this.txt = txt;}}
值得注意的一点是使用了@ManyToOne,完成了Message和User的外键关联,Message和User是多对一的关系,Message以User的username为外键。再来看看MessageRepository的接口

package com.yjp.springmvc.blog.beans.repository;import java.util.List;import com.yjp.springmvc.blog.beans.model.Message;public interface MessageRepository {List<Message> findMessagesByUsername(String username);void save(Message msg);void delete(String id);}
实现

package com.yjp.springmvc.blog.beans.repository;import java.util.List;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.query.Query;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Repository;import com.yjp.springmvc.blog.beans.model.Message;@Repositorypublic class MessageRepositoryImpl implements MessageRepository {private SessionFactory sessionFactory;@Autowiredpublic MessageRepositoryImpl(SessionFactory sessionFactory) {this.sessionFactory = sessionFactory;}@Overridepublic List<Message> findMessagesByUsername(String username) {Session session = currentSession();session.beginTransaction();String hql = "from Message as message where message.user.username=:username";Query<Message> query = session.createQuery(hql, Message.class);query.setParameter("username", username);List<Message> messages = query.getResultList();session.getTransaction().commit();return messages;}@Overridepublic void save(Message msg) {Session session = currentSession();session.beginTransaction();session.save(msg);session.getTransaction().commit();}@SuppressWarnings("rawtypes")@Overridepublic void delete(String id) {Session session = currentSession();session.beginTransaction();String hql = "delete Message as message where message.id=:id";Query query = session.createQuery(hql);query.setParameter("id", id);query.executeUpdate();session.getTransaction().commit();}private Session currentSession() {return sessionFactory.getCurrentSession();}}
查询和删除使用了HQL,接下来是MessageService

package com.yjp.springmvc.blog.beans.service;import java.util.List;import com.yjp.springmvc.blog.beans.model.Message;import com.yjp.springmvc.blog.beans.model.User;public interface MessageService {void addMessage(Message msg);List<Message> getUserMessages(User user);void deleteMessage(String id);}
实现

package com.yjp.springmvc.blog.beans.service;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.yjp.springmvc.blog.beans.model.Message;import com.yjp.springmvc.blog.beans.model.User;import com.yjp.springmvc.blog.beans.repository.MessageRepository;@Servicepublic class MessageServiceImpl implements MessageService {private MessageRepository messageRepository;@Autowiredpublic MessageServiceImpl(MessageRepository messageRepository) {this.messageRepository = messageRepository;}@Overridepublic void addMessage(Message msg) {messageRepository.save(msg);}@Overridepublic List<Message> getUserMessages(User user) {return messageRepository.findMessagesByUsername(user.getUsername());}@Overridepublic void deleteMessage(String id) {messageRepository.delete(id);}}
没有什么特殊的,我们的控制器

package com.yjp.springmvc.blog.web.controller;import java.util.Date;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.security.core.context.SecurityContextHolder;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import com.yjp.springmvc.blog.beans.model.Message;import com.yjp.springmvc.blog.beans.model.User;import com.yjp.springmvc.blog.beans.service.MessageService;@Controllerpublic class HomeController {private MessageService messageService;@Autowiredpublic HomeController(MessageService messageService) {this.messageService = messageService;}@RequestMapping(method=RequestMethod.GET, value="/")public String home(Model model) {refreshModel(model);return "home";}@RequestMapping(method=RequestMethod.GET, value="/delete")public String delete(@RequestParam String id, Model model) {messageService.deleteMessage(id);refreshModel(model);return "home";}@RequestMapping(method=RequestMethod.POST, value="/message")public String message(@RequestParam String message, Model model) {if (!message.isEmpty()) {Message msg = new Message(new Date(), message, getCurrentUser());messageService.addMessage(msg);}refreshModel(model);return "home";}private void refreshModel(Model model) {model.addAttribute("messages", messageService.getUserMessages(getCurrentUser()));model.addAttribute("username", getCurrentUser().getUsername());}private User getCurrentUser() {//通过Spring Security获取当前的用户User user = (User) SecurityContextHolder.getContext()    .getAuthentication()    .getPrincipal();return user;}}
基于之前的基础,看懂这个也没什么问题,我都不想说什么了XD,最后是JSP

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><%@ page isELIgnored="false"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %><!DOCTYPE html"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>简微</title><link rel="stylesheet" href="resources/css/home.css" type="text/css"></head><body><div class="leftPanel"><img src="resources/images/logo.png" alt="简微" /><br><br><form method="post" action="logout" style=""><input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/><button type="submit">注销 ${username}</button></form></div><form method="post" action="message">说说你的事...<br><br>        <textarea cols="60" rows="4" name="message" placeholder="输入您的内容"></textarea><br><br><button type="submit">送出</button><input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/></form><table style="text-align: left; width: 510px; height: 88px;border='0'; cellpadding='2'; cellspacing='2'"><thead><tr><th><hr></th></tr></thead><tbody><c:forEach var="message" items="${messages}"><tr><td style="vertical-align: top;">${message.user.username}<br><c:out value="${message.txt}"/><br><fmt:formatDate value="${message.date}" type="both"dateStyle="full" timeStyle="full"/><a href="delete?id=${message.id}">删除</a></td></tr></c:forEach></tbody></table></body></html>
这样就全部完成了,可以运行测试一下。

       另外,在做这一部分过程中,发现POST的message内容乱码,但是查看了各个位置,都标记了UTF-8编码,后来发现是Spring Security引起的,可以看看我的这篇文章。

      现在,Spring的学习旅程基本完成了,但这不代表这就是全部,Spring的好东西实在是太多了。。。根本停不下来











1 0