package org.xmx0632.deliciousfruit.web.task;
import java.util.Map;
import javax.servlet.ServletRequest;
import javax.validation.Valid;
import org.apache.shiro.SecurityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.springside.modules.web.Servlets;
import org.xmx0632.deliciousfruit.entity.Task;
import org.xmx0632.deliciousfruit.entity.User;
import org.xmx0632.deliciousfruit.service.account.ShiroUser;
import org.xmx0632.deliciousfruit.service.task.TaskService;
import com.google.common.collect.Maps;
/**
* Task管理的Controller, 使用Restful风格的Urls:
*
* List page : GET /task/
*
* Create page : GET /task/create
*
* Create action : POST /task/create
*
* Update page : GET /task/update/{id}
*
* Update action : POST /task/update
*
* Delete action : GET /task/delete/{id}
*
* @author calvin
*/
@Controller
@RequestMapping(value = "/task/task")
public class TaskController {
private Logger log = LoggerFactory.getLogger(this.getClass());
private static final int PAGE_SIZE = 3;
private static Map<String, String> sortTypes = Maps.newLinkedHashMap();
static {
sortTypes.put("auto", "自动");
sortTypes.put("title", "标题");
}
@Autowired
private TaskService taskService;
@RequestMapping(value = "")
public String list(
@RequestParam(value = "sortType", defaultValue = "auto") String sortType,
@RequestParam(value = "page", defaultValue = "1") int pageNumber,
Model model, ServletRequest request) {
Map<String, Object> searchParams = Servlets.getParametersStartingWith(
request, "search_");
Long userId = getCurrentUserId();
Page<Task> tasks = taskService.getUserTask(userId, searchParams,
pageNumber, PAGE_SIZE, sortType);
model.addAttribute("tasks", tasks);
model.addAttribute("sortType", sortType);
model.addAttribute("sortTypes", sortTypes);
model.addAttribute("searchParams", Servlets
.encodeParameterStringWithPrefix(searchParams, "search_"));
return "task/taskList";
}
@RequestMapping(value = "create", method = RequestMethod.GET)
public String createForm(Model model) {
model.addAttribute("task", new Task());
model.addAttribute("action", "create");
return "task/taskForm";
}
@RequestMapping(value = "create", method = RequestMethod.POST)
public String create(@Valid Task newTask,
RedirectAttributes redirectAttributes) {
User user = new User(getCurrentUserId());
newTask.setUser(user);
taskService.saveTask(newTask);
redirectAttributes.addFlashAttribute("message", "创建任务成功");
return "redirect:/task/task/";
}
@RequestMapping(value = "update/{id}", method = RequestMethod.GET)
public String updateForm(@PathVariable("id") Long id, Model model) {
model.addAttribute("task", taskService.getTask(id));
model.addAttribute("action", "update");
return "task/taskForm";
}
@RequestMapping(value = "update", method = RequestMethod.POST)
public String update(@Valid @ModelAttribute("preloadTask") Task task,
RedirectAttributes redirectAttributes) {
taskService.saveTask(task);
redirectAttributes.addFlashAttribute("message", "更新任务成功");
return "redirect:/task/task/";
}
@RequestMapping(value = "delete/{id}")
public String delete(@PathVariable("id") Long id,
RedirectAttributes redirectAttributes) {
taskService.deleteTask(id);
redirectAttributes.addFlashAttribute("message", "删除任务成功");
return "redirect:/task/task/";
}
/**
* 使用@ModelAttribute, 实现Struts2
* Preparable二次部分绑定的效果,先根据form的id从数据库查出Task对象,再把Form提交的内容绑定到该对象上。
* 因为仅update()方法的form中有id属性,因此本方法在该方法中执行.
*/
@ModelAttribute("preloadTask")
public Task getTask(@RequestParam(value = "id", required = false) Long id) {
if (id != null) {
return taskService.getTask(id);
}
return null;
}
/**
* 取出Shiro中的当前用户Id.
*/
private Long getCurrentUserId() {
ShiroUser user = (ShiroUser) SecurityUtils.getSubject().getPrincipal();
log.debug("user id:" + user.id);
return user.id;
}
}