标签:springmvc javabean ajax 上传 拦截器
前提:
1、web.xml 和spring-mvc核心配置如:SpringMVC学习笔记(一): 基础知识中注解实现。
2、类的@RequestMapping(value="/annotationController")
3、spring-mvc 推荐使用注解实现。
一、数据的接收
(一)URL参数数据的接收
1、使用 HttpServletRequest 获取参数
<span style="font-size:18px;"><span style="font-family:Arial;font-size:18px;"> /** * 利用 HttpServletRequest 获取参数 * @param request * @return */ @RequestMapping(value="/getParam.do") public String getParam(HttpServletRequest request){ String result = request.getParameter("name"); System.out.println(result); return "myJsp"; } </span></span>
1)访问:http://localhost:8080/JavaSpringMvc/annotationController/getParam.do?name=shaoxioabao
2)后台打印shaoxioabao,没有参数的时候也不会报错。
2、直接获取参数
<span style="font-size:18px;"><span style="font-family:Arial;font-size:18px;"> /** * 注解获取参数:获取参数的controller * 访问路径:getParam1.do?name=sam&id=12 * 1、在参数列表上直接定义参数名称,参数名称\类型要匹配接收。 * 2、时间的接收: * @param request * @return */ @RequestMapping(value="/getParam1.do") public String getParam1(String name,Integer id,Date birthday){ System.out.println(name+"--"+id+"--"+birthday);//sam--123--Mon Jan 12 00:09:00 CST 2015 return "myJsp"; } </span></span>
1)访问:http://localhost:8080/JavaSpringMvc/annotationController/getParam1.do?name=shaoxioabao
2)后台输出:shaoxioabao--null--null
3)如Date参数的接收需要属性注册器的使用,不然接收报错。
<span style="font-size:18px;"><span style="font-family:Arial;font-size:18px;"> /** * 属性编辑器 * 注册时间类型的属性注册器 * @param binder */ @InitBinder public void initBinder(ServletRequestDataBinder binder){ binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-mm-dd"), true)); } </span></span>
3、使用JavaBean获取参数
1)JavaBean代码:Person 和User
<span style="font-size:18px;"><span style="font-family:Arial;font-size:18px;">package com.springmvc.bean; import java.util.Date; public class Person { private String name; private Integer age; private String address; private Date birthday; /** * @return the name */ public String getName() { return name; } /** * @param name the name to set */ public void setName(String name) { this.name = name; } /** * @return the age */ public Integer getAge() { return age; } /** * @param age the age to set */ public void setAge(Integer age) { this.age = age; } /** * @return the address */ public String getAddress() { return address; } /** * @param address the address to set */ public void setAddress(String address) { this.address = address; } /** * @return the birthday */ public Date getBirthday() { return birthday; } /** * @param birthday the birthday to set */ public void setBirthday(Date birthday) { this.birthday = birthday; } /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return "Person [name=" + name + ", age=" + age + ", address=" + address + ", birthday=" + birthday + "]"; } } </span></span>
<span style="font-size:18px;"><span style="font-family:Arial;font-size:18px;">package com.springmvc.bean; public class User { private String name; private Integer age; /** * @return the name */ public String getName() { return name; } /** * @param name the name to set */ public void setName(String name) { this.name = name; } /** * @return the age */ public Integer getAge() { return age; } /** * @param age the age to set */ public void setAge(Integer age) { this.age = age; } /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return "User [name=" + name + ", age=" + age + "]"; } } </span></span>
2)单个Bean参数
①、Controller代码:
<span style="font-size:18px;"><span style="font-family:Arial;font-size:18px;"> /** * 利用javaBean获取参数 * 地址:http://localhost:8080/JavaSpringMvc/annotationController/getBeanParam.do?name=sam&id=123&birthday=2015-09-12 * 规则:1、传递的参数的名字,与实体类中setXXX中的XXX名字一致。 * 2、首字母大小写不限。 * @param person * @return */ @RequestMapping(value="/getBeanParam.do") public String getBeanParam(Person person){ System.out.println(person);//【输出】Person [name=sam, age=null, address=null, birthday=Mon Jan 12 00:09:00 CST 2015] return "myJsp"; }</span></span>②、传递的参数的名字,与实体类中setXXX中的XXX名字一致。
③、首字母大小写不限。
④、Date类型的数据,需要属性注册器的使用。
3)多个JavaBean
<span style="font-size:18px;"><span style="font-family:Arial;font-size:18px;"> /** * 多个实体: * 1、一份参数,两个对象都可以接收(如name属性参数) * @param person * @param user * @return */ @RequestMapping(value="/getBeanParam2.do") public String getBeanParam2(Person person, User user){ System.out.println(person);//【输出】Person [name=sam, age=null, address=null, birthday=Mon Jan 12 00:09:00 CST 2015] System.out.println(user); return "myJsp"; } </span></span>
①、注意:一份参数,两个对象都可以接收(如name属性参数):输出
<span style="font-size:18px;"><span style="font-family:Arial;font-size:18px;">Person [name=sam, age=null, address=null, birthday=Mon Jan 12 00:09:00 CST 2015] User [name=sam, age=null]</span></span>
4、接收数组参数
<span style="font-size:18px;"><span style="font-family:Arial;font-size:18px;"> /** * 接收数组参数 * 1、访问地址:/annotationController/getArrayParams.do?name=sam&name=kevin * 2、数组的名称与参数名称一致。 * 3、可以对checkBox的值接收 * @param name * @return */ @RequestMapping(value="/getArrayParams.do") public String getArrayParams(String[] name){ for (String arrName : name) { System.out.println(arrName); } return "myJsp"; } </span></span>
2)数组的名称与参数名称一致,都为name。
(二)Form表单数据的接收
1、页面表单:
<span style="font-size:18px;"><span style="font-family:Arial;font-size:18px;"> <form name="fm" action="annotationController/getFormValue.do"> name:<input name="name" type="text"><br> age:<input name="age" type="text"><br> address:<input name="address" type="text"><br> birthday:<input name="birthday" type="text"><br> <input type="submit" value=" 提交 " ><br> </form> </span></span>
2、Controller 实现代码
<span style="font-size:18px;"><span style="font-family:Arial;font-size:18px;"> /** * 接收表单信息 * 1、利用person Bean参数接收表单数据,名字的一致性 * 2、利用Model 返回数据 */ @RequestMapping(value="/getFormValue.do",method=RequestMethod.POST) public String getFormValue(Person person,Model model){ // Model tModel = new ExtendedModelMap(); model.addAttribute("person", person); return "myJsp"; } </span></span>
2)使用Model对象参数,回显数据。
二、数据的回显
(一)myJsp.jsp页面接收显示参数
<span style="font-size:18px;"><span style="font-family:Arial;font-size:18px;"> 你好,springMVC !! <br/> ${person.name} <br/> ${person.age} <br/> <fmt:formatDate pattern="yyyy-mm-dd" value="${person.birthday}"/> <br/> ${person.address}</span></span>1、引入jstl标签。
(二)实现方式
1、ModelAndView 对象实现
1)代码
<span style="font-size:18px;"><span style="font-family:Arial;font-size:18px;"> /** * 返回model给页面显示 * 把结果数据放入request中,其实不推荐使用 */ @RequestMapping(value="/returnValues.do") public ModelAndView returnValues(){ Person person = new Person(); person.setAge(26); person.setName("sam"); try { person.setBirthday(new SimpleDateFormat("yyyy-mm-dd").parse("1986-09-25") ); } catch (ParseException e) { e.printStackTrace(); } person.setAddress("suzhou"); Map<String,Object> map = new HashMap<String, Object>(); map.put("person", person); return new ModelAndView("myJsp", map); } </span></span>
2)分析
1)把返回的数据放入Map,再把Map放入返回的ModelAndView对象中。
2)ModelAndView("myJsp", map):第一个参数为view,第二个参数为model 。
2、利用map参数实现
<span style="font-size:18px;"><span style="font-family:Arial;font-size:18px;"> /** * 利用map参数:不建议使用 * 1、spring会认为这个map参数就是ModelAndView对象中的Map, * 会自动交给视图解析器处理,返回页面。 * @return */ @RequestMapping(value="/returnValues2.do") public String returnValues2(Map<String,Object> map){ Person person = new Person(); person.setAge(26); person.setName("sam"); try { person.setBirthday(new SimpleDateFormat("yyyy-mm-dd").parse("1990-09-25") ); } catch (ParseException e) { e.printStackTrace(); } person.setAddress("suzhou"); // map = new HashMap<String, Object>();//重新new就没用了 map.put("person", person); return "myJsp"; } </span></span>
2)其实就是第一种方法的变种。
3、使用Model类的数据参数(推荐)
<span style="font-size:18px;"><span style="font-family:Arial;font-size:18px;"> /** * 使用Model类的数据传输,推荐使用 * @param model * @return */ @RequestMapping(value="/returnValuesModel.do") public String returnValuesModel(Model model){ Person person = new Person(); person.setAge(26); person.setName("Shaoxiaobao"); try { person.setBirthday(new SimpleDateFormat("yyyy-mm-dd").parse("1990-09-25") ); } catch (ParseException e) { e.printStackTrace(); } person.setAddress("suzhou"); //相当于把值放入request model.addAttribute("person", person); return "myJsp"; } </span></span>
三、转发与重定向
(一)转发-默认
1、同一个Controller:可以省略forward
<span style="font-size:18px;"><span style="font-family:Arial;font-size:18px;"> /** * 单纯的转发功能,显示myAjaxForm.jsp页面 */ @RequestMapping(value="/toAjaxPage.do") public String toAjaxPage(){ return "myAjaxForm"; } </span></span>
2、不同的Controller
@RequestMapping(value="/toAjaxPage.do") public String toAjaxPage(){ return "forward:/otherController/myAjaxForm"; }
(二)重定向 redirect
1、同一个Controller中的重定向
<span style="font-size:18px;"><span style="font-family:Arial;font-size:18px;"> /** * 同一个Controller中的重定向 */ @RequestMapping(value="/requestRedirect.do") public String requestRedirect(){ //同一个Controller中的重定向:annotationController/toAjaxPage.do String view = "redirect:toAjaxPage.do"; return view; } </span></span>
1)方式:redirect关键字 + 方法的@RequestMapping 即可。
2、不同Controller中的重定向
<span style="font-size:18px;"><span style="font-family:Arial;font-size:18px;"> /** * 不同Controller中的重定向 */ @RequestMapping(value="/requestRedirect.do") public String requestRedirect(){ //另一个Controller中的重定向,需要加“/”.如果不加为:annotationController/otherController/toAjaxPage.do String view = "redirect:/otherController/toAjaxPage.do"; return view; } </span></span>
四、Ajax
(一)Ajax请求页面:
<span style="font-size:18px;"><span style="font-family:Arial;font-size:18px;"><input id="mybutton" type="button" value="AjaxToSpringMvc"> <script type="text/javascript"> $(function(){ $("#mybutton").click(function(){ $.ajax({ //url:"annotationController/getAjax.do",//注意访问地址的正确性 url:"annotationController/getAjaxTrue.do",//注意访问地址的正确性 type:"post", dataType:"text", data:{ name:"zhangsan" }, success:function(responseText){ alert(responseText); }, error:function(){ alert("system error"); } }); }); }); </script> </span></span>
(二)HttpServletResponse 实现
<span style="font-size:18px;"><span style="font-family:Arial;font-size:18px;"> /** * 接受Ajax的请求:不建议使用 * 1、返回值为void * 2、定义HttpServletResponse,返回数据 * @param name * @param response */ @RequestMapping(value="/getAjax.do") public void getAjax(String name,HttpServletResponse response){ name = "Hello,"+ name; try { response.getWriter().write(name); } catch (IOException e) { e.printStackTrace(); } } </span></span>
(三)PrintWriter 实现(推荐)
<span style="font-size:18px;"><span style="font-family:Arial;font-size:18px;"> /** * 接收Ajax的请求:建议直接使用PrintWriter * @param name * @param response */ @RequestMapping(value="/getAjaxTrue.do") public void getAjaxTrue(String name,PrintWriter out){ name = "Hello,ajax,"+ name; out.write(name); } </span></span>
五、上传
(一)配置上传组件 CommonsMultipartResolver 。
<span style="font-size:18px;"><span style="font-family:Arial;font-size:18px;"> <!-- 上传配置 --> <!-- id="multipartResolver"必须是multipartResolver --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- maxUploadSize:文件上传的最大值以byte为单位 --> <property name="maxUploadSize" value="1024000"></property> </bean> </span></span>
(二)上传页面:
<span style="font-size:18px;"><span style="font-family:Arial;font-size:18px;"> <form name="fmUpload" action="annotationController/fileUpload.do" method="post" enctype="multipart/form-data"> pic:<input type="file" name="pic"><br> <input type="submit" value=" 文件上传 " ><br> </form> </span></span>
(三)Controller 上传实现
<span style="font-size:18px;"><span style="font-family:Arial;font-size:18px;"> /** * 文件上传 * 1、必须先配置上传组件 CommonsMultipartResolver * 2、 */ @RequestMapping(value="/fileUpload.do") public String fileUpload(HttpServletRequest request) throws Exception{ // 转化request MultipartHttpServletRequest rm = (MultipartHttpServletRequest) request; // 获得文件 CommonsMultipartFile cfile = (CommonsMultipartFile) rm.getFile("pic"); // 获得文件的字节数组 byte[] bfile = cfile.getBytes(); // 拼接上传后的文件名 String fileName = ""; SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmssSSS"); fileName = format.format(new Date()); Random random = new Random(); for(int i = 0; i < 3; i++){ fileName = fileName + random.nextInt(9); } // 获取原有的文件名 String origFileName = cfile.getOriginalFilename(); String suffix = origFileName.substring(origFileName.lastIndexOf("."));//得到文件类型 String path = request.getSession().getServletContext().getRealPath("/");//路径 OutputStream out = new FileOutputStream(new File(path+"/upload/"+fileName+suffix)); out.write(bfile); out.flush(); out.close(); return "myJsp"; } </span></span>
六、拦截器
(一)核心文件的配置
<span style="font-size:18px;"> <mvc:interceptors> <mvc:interceptor> <!-- 某一模块的拦截:/myPath/**, 拦截所有的请求/** --> <mvc:mapping path="/**"/> <bean class="com.springmvc.interceptor.MyIntercepor"></bean> </mvc:interceptor> </mvc:interceptors> </span>
(二)自定义拦截器
<span style="font-size:18px;">package com.springmvc.interceptor; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; /** * * @Title: 自定义拦截器 * @Description: * @Copyright: Copyright (c) 2015 * @Company: * * @author: SAM-SHO * @version: 1.0 * @CreateDate:Jan 25, 2015 */ public class MyIntercepor implements HandlerInterceptor { /** * 执行时机:视图已经被解析完毕。Exception:监控 * 后置拦截 */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object obj, Exception ex) throws Exception { System.out.println("afterCompletion..."); // System.out.println(ex.getMessage()); System.out.println("================"); } /** * 执行时机:Controller执行完,视图解析器没有把视图解析成页面 * 1、ModelAndView:统一修改视图,如修改Model对象的信息 */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object obj, ModelAndView mv) throws Exception { System.out.println("postHandler..."); Map<String, Object> map = mv.getModel(); map.put("testIntercepor", "append something"); } /** * 前置拦截,主要在于权限拦截。true-会去访问Controller * Object-就是要访问的那个Controller * */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception { System.out.println("preHander..."); System.out.println(obj.getClass().getName()); return true; } } </span>
2、实现3个方法,代表三个不同的执行时机:
1)preHandle :前置拦截,主要在于权限拦截。true-会去访问Controller。
2)postHandle:执行时机:Controller执行完,视图解析器没有把视图解析成页面。
3)afterCompletion:执行时机:视图已经被解析完毕。
3、参数:
1)Object:就是要访问的那个Controller。
2)ModelAndView:统一修改视图,如修改Model对象的信息。
3)Exception:监控异常。
七、@RequestBody 和 @ResponseBody
(一)@RequestBody:
1、作用:
1)该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上。
2)再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。
2、使用时机:
1)GET、POST方式提时, 根据request header Content-Type的值来判断:
①、application/x-www-form-urlencoded, 可选(即非必须,因为这种情况的数据@RequestParam, @ModelAttribute也可以处理,当然@RequestBody也能处理)
②、multipart/form-data, 不能处理(即使用@RequestBody不能处理这种格式的数据)
③、其他格式, 必须(其他格式包括application/json, application/xml等。这些格式的数据,必须使用@RequestBody来处理)
2)PUT方式提交时, 根据request header Content-Type的值来判断:
①、application/x-www-form-urlencoded, 必须
②、multipart/form-data, 不能处理
③、其他格式, 必须;
说明:request的body部分的数据编码格式由header部分的Content-Type指定;
1、作用:
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
2、使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用
<span style="font-size:18px;"> @RequestMapping("/grid/easy") public @ResponseBody String initEasyUIDataGrid() { List<DataGrid> dataList = DataGridService.getData(0, 9); logger.debug("Data rows Count: " + dataList.size() + " !"); String dataJson = JsonUtil.toJson(dataList); logger.debug("Data grid JSON: " + dataJson); return dataJson; } </span>
标签:springmvc javabean ajax 上传 拦截器
原文地址:http://blog.csdn.net/u012228718/article/details/43151019