package com.hg.ecommerce.action.demo; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.util.Arrays; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.util.MultiValueMap; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.CookieValue; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import com.hg.ecommerce.service.DemoService; @Controller @RequestMapping("/demo/advance") public class AdvancedDemoController { @Autowired private DemoService demoService; /** * 应当将带有注释 @ModelAttribute 的方法放在放在Controller的最前方,因为无论位置在何处, * 这些方法都会优于任何@RequestMapping方法执行,这些方法执行后返回的对象会存在潜在的Model对象中。 * 通过将@ModelAttribute放在入参参数前,来自动再获取这些保存的对象。 * <br> * 如果有一种对象的构建方法,会存在于多个@RequestMapping中,请使用此种特性,来减少代码冗余, * 获取Mail对象的方法,见下一方法 * @param content * @return * @throws UnsupportedEncodingException */ @ModelAttribute("mail") public void fetchMail(@RequestParam(value="content",required=false,defaultValue="Hello, I am from Dalian") String content, Model model) throws UnsupportedEncodingException { Mail mail = new Mail(); mail.setTitle("Greeting"); mail.setContent(demoService.greeting(content)); model.addAttribute(mail); } /** * 当访问/mail时, fetchMail 会先于 returnMail调用,returnMail可以通过@ModelAttribute获取fetchMail返回的Mail对象, * 通过传BindingResult入参,可以检测任何 TypeConversion是否出错。 * @param cacheMail * @param result * @return */ @RequestMapping(value="/mail",produces="text/plain") @ResponseBody public String returnMail(@ModelAttribute("mail") Mail cacheMail , BindingResult result) throws UnsupportedEncodingException{ if(result.hasErrors()){ cacheMail.setContent("Error!"); } return cacheMail.getTitle()+"\n"+cacheMail.getContent(); } /** * 使用原生Servlet Class, 响应信息写入response中,handler方法返回void * @param request * @param response * @return * @throws IOException */ @RequestMapping("/origin") public void useOriginal(HttpServletRequest request, HttpServletResponse response) throws IOException{ response.setContentType("text/html"); response.setCharacterEncoding("utf8"); HttpSession session = request.getSession(true); session.setAttribute("greeting", demoService.greeting("Hi!")); PrintWriter writer = response.getWriter(); writer.println("<h1>大家好~</h1>"); writer.flush(); writer.close(); } /** * 使用Stream IO类 * @param inputStream * @param outputStream */ @RequestMapping("/stream") public void useStream(InputStream inputStream, OutputStream outputStream){ PrintWriter writer = new PrintWriter(outputStream); writer.println("<h1>Hello From Stream</h1>"); writer.flush(); writer.close(); } /** * Cookie support * @param cookie */ @RequestMapping("/displayCookieInfo.do") @ResponseBody public String displayHeaderInfo(@CookieValue("JSESSIONID") String cookie) { return cookie; } /** * Header support * @param encoding * @param keepAlive */ @RequestMapping("/displayHeaderInfo.do") @ResponseBody public String displayHeaderInfo(@RequestHeader("Accept-Encoding") String[] encoding) { return "<h1>"+Arrays.toString(encoding)+"</h1>"; } /** * @ResponseBody & @RequestBody 的说明 * <p>RequestBody注解利用HttpMessageConverter的子类将请求体从流中读取后转换为用户索要的类型,这种转换时潜在的, * Spring选择合适的Converter作类型转换,用户直接利用所需的类型进行合适的操作,如果想要实现自定义类型的转换,需要 * 自行编写Converter子类,并注册到AnnotationMethodHandlerAdapter中。</p> * * <p>ResponseBody注解正好是相反的过程,转换后直接写入输出流,跳过view这一部分</p> */ @RequestMapping(value="/body",produces="text/plain") @ResponseBody public String useBodyAnnotation(@RequestBody MultiValueMap<String,String> formTrans){ return formTrans.toString(); } /** * 此实体无任何实际作用,就是为了演示Controller功能 * @author lihe */ class Mail { private String title; private String content; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } } }