package com.sishuok.mvc.controller;
import com.sishuok.mvc.entity.User;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.async.DeferredResult;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.concurrent.Callable;
/**
* <p>User: Zhang Kaitao
* <p>Date: 13-12-26
* <p>Version: 1.0
*/
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/{id}")
public ModelAndView view(@PathVariable("id") Long id, HttpServletRequest req) {
User user = new User();
user.setId(id);
user.setName("zhang");
ModelAndView mv = new ModelAndView();
mv.addObject("user", user);
mv.setViewName("user/view");
return mv;
}
@RequestMapping(method = RequestMethod.POST)
public String create(
@ModelAttribute("user") User user,
BindingResult result,
RedirectAttributes redirectAttributes) {
if ("admin".equals(user.getName())) {
result.rejectValue("name", "用户名不能为admin");
return "showCreateForm";
} else {
redirectAttributes.addFlashAttribute("success", "创建成功");
}
return "redirect:/user";
}
@RequestMapping(value = "/{id}/icon", method = RequestMethod.POST)
public String uploadIcon(
@PathVariable("id") Long id,
@RequestParam("icon") MultipartFile icon, Model model) throws IOException {
model.addAttribute("icon", icon.getBytes());
return "success";
}
@RequestMapping(method = RequestMethod.POST,
consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public User json(@RequestBody User user) {
return user;
}
@RequestMapping(method = RequestMethod.POST,
consumes = MediaType.APPLICATION_XML_VALUE, produces = MediaType.APPLICATION_XML_VALUE)
@ResponseBody
public User xml(@RequestBody User user) {
return user;
}
@RequestMapping("/exception")
public String exception() {
throw new IllegalArgumentException();
}
@RequestMapping(value = "/async1", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public Callable<User> async1(final User user) {
return new Callable<User>() {
@Override
public User call() throws Exception {
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
}
return user;
}
};
}
@RequestMapping(value = "/async2", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public DeferredResult<User> async2(final User user) {
final DeferredResult<User> result = new DeferredResult<User>();
new Thread() {
@Override
public void run() {
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
}
result.setResult(user);
}
}.start();
return result;
}
@ExceptionHandler
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public String exceptionHandler(IllegalArgumentException e) {
return "error";
}
}