您的位置:首页 > 编程语言 > Java开发

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

2016-12-28 16:31 495 查看
辛苦堆砌,转载请注明出处,谢谢!

        今天利用之前的框架,完成剩余的主页部分,先看看实体类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;

@Repository
public class MessageRepositoryImpl implements MessageRepository {

private SessionFactory sessionFactory;

@Autowired
public MessageRepositoryImpl(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}

@Override
public 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;
}

@Override
public void save(Message msg) {
Session session = currentSession();
session.beginTransaction();
session.save(msg);
session.getTransaction().commit();
}

@SuppressWarnings("rawtypes")
@Override
public 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;

@Service
public class MessageServiceImpl implements MessageService {

private MessageRepository messageRepository;

@Autowired
public MessageServiceImpl(MessageRepository messageRepository) {
this.messageRepository = messageRepository;
}

@Override
public void addMessage(Message msg) {
messageRepository.save(msg);
}

@Override
public List<Message> getUserMessages(User user) {
return messageRepository.findMessagesByUsername(user.getUsername());
}

@Override
public 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;

@Controller
public class HomeController {

private MessageService messageService;

@Autowired
public 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的好东西实在是太多了。。。根本停不下来

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: