SpringMvc 笔记
整理出来是 SpringMvc 笔记 方便以后查询 框架太多了 不经常使用 忘记的可能性很大 自己整理一套笔记 一看就明白了
1 对比 2 原始请求响应流程 3 4 1 发送请求 --> 2 控制层 --> 模型层进行处理 --> 视图 --> 渲染HTML 5 创建模型层 对象 6 7 8 Mvc模式 9 10 1 发送请求 --> 2 控制层 ---> 3 处理器映射器 11 <-- 返回结果 (寻找请求处理的类) 12 13 ---> 4 处理器执行器 14 <-- 返回处理结果 ModelAndView(执行 映射器查询到的 处理类 执行对应处理方法) 15 16 ---> 5 视图解析器 17 <-- 返回查询到的视图地址 (解析视图 (获取当前请求 对应的 视图页面)) 18 19 ---> 6 渲染视图 20 7 返回响应 <-- <-- 渲染视图 (JSP) 21 22 23 24 25 PS: 控制层 是前端执行器 具体执行类 是 后端控制器 26 27 28 29 配置文件模式 30 { 31 32 33 1 配置SpringMvc 前端控制器 DispatcherServlet 34 35 SpringMvc 是基于 servlet的 36 37 web.xml配置前端控制器:DispatcherServlet 38 39 40 <!-- 配置springmvc核心分发器,对所有的url后缀为action的进行过滤 --> 41 <servlet> 42 <servlet-name>action</servlet-name> 43 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 44 <!-- 改变springmvc配置文件的位置和名称 --> 45 <init-param> 46 <param-name>contextConfigLocation</param-name> 47 <param-value>classpath:springmvc.xml</param-value> 48 </init-param> 49 </servlet> 50 <servlet-mapping> 51 <servlet-name>action</servlet-name> 52 <url-pattern>/</url-pattern> 53 </servlet-mapping> 54 55 2 配置springmvc.xml 56 57 <!-- 配置处理器映射器,springmvc默认的处理器映射器 58 BeanNameUrlHandlerMapping:根据bean(自定义Controler)的name属性的url去寻找hanler(Action:Controller) 59 --> 60 <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean> 61 62 <!-- 配置处理器适配器执行Controlelr ,springmvc默认的 63 SimpleControllerHandlerAdapter:执行Controller 64 --> 65 <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean> 66 67 68 <!-- 配置自定义Controler --> 也就是执行方法 69 <bean id="myController" name="/hello.do" class="cn.controller.MyController"></bean> 70 71 72 public class MyController implements Controller{ 73 74 public ModelAndView handleRequest(HttpServletRequest arg0, 75 HttpServletResponse arg1) throws Exception { 76 // 接受请求,接受参数,验证参数 77 //封装参数,调用业务方法 78 //返回视图 79 ModelAndView mv = new ModelAndView(); 80 //设置页面回显数据 81 mv.addObject("hello", "欢迎学习springmvc!"); 82 83 //指定跳转的视图 84 //返回物理视图 85 //mv.setViewName("/WEB-INF/jsps/index.jsp"); 86 //返回逻辑视图 87 mv.setViewName("index"); 88 89 return mv; 90 } 91 92 } 93 94 95 <!-- 配置sprigmvc视图解析器:解析逻辑试图 96 后台返回逻辑试图:index 97 视图解析器解析出真正物理视图:前缀+逻辑试图+后缀====/WEB-INF/jsps/index.jsp 98 --> 99 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 100 <property name="prefix" value="/WEB-INF/jsps/"></property> 101 <property name="suffix" value=".jsp"></property> 102 </bean> 103 104 105 配置完上面的 就可以运行 Spring Mvc 了 106 } 107 108 109 处理器映射器 110 { 111 112 1 简单处理器映射器 SimpleUrlHandlerMaping 113 114 多个 Url 地址 指向一个处理类 和 手动控制 Url映射地址 115 116 <!-- 简单处理器映射器: 117 把Url进行集中配置 118 --> 119 <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 120 <property name="mappings"> 121 <props> 122 <prop key="/abc.do">myController</prop> 123 <prop key="/ss.do">http</prop> 124 <prop key="/mine.do">http</prop> 125 </props> 126 </property> 127 128 129 <!-- 配置自定义Controler --> 130 <bean id="myController" name="/hello.do" class="cn.lw.controller.MyController"></bean> 131 132 <!-- 配置自定义HttpController --> 133 <bean id="http" class="cn.lw.controller.HttpController"></bean> 134 135 2 控制类名处理程序映射 ControllerClassNameHandlerMapping 136 137 根据类名(MyController)类名.do来访问,类名首字母小写 138 139 <!-- 定义通过: 类名.do 形式来访问controller --> 140 <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"></bean> 141 142 <bean id="myController" name="/hello.do" class="cn.lw.controller.MyController"></bean> 143 144 Url : myController.do 145 146 3 默认处理器映射器 BeanNameUrlHandlerMapping 147 148 根据url请求去匹配bean的name属性url,从而获取Controller 执行类 149 <bean name="/hello.do" class="cn.controller.MyController"></bean> 150 151 152 PS: 多个处理器映射器是可以共存的 153 154 } 155 156 157 处理器适配器 158 { 159 160 1 默认的处理器适配器 SimpleControllerHandlerAdapter 161 162 调用controller里面方法,返回modelAndView。 163 164 <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean> 165 166 167 该 处理器适配器 只处理 继承了 Controller 接口的 controller类 168 169 2 HttpRequestHandlerAdapter 170 171 <!-- HttpRequestHandlerAdapter负责执行实现接口HttpRequestHandler的后端 172 控制器。 173 --> 174 <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean> 175 176 177 该 处理器适配器 只处理 继承了 HttpRequestHandler 接口的 controller类 178 179 180 public class HttpController implements HttpRequestHandler{ 181 182 public void handleRequest(HttpServletRequest request, HttpServletResponse response) 183 throws ServletException, IOException { 184 //给Request设置值,在页面进行回显 185 request.setAttribute("hello", "这是HttpRequestHandler!"); 186 //跳转页面 187 request.getRequestDispatcher("/WEB-INF/jsps/index.jsp").forward(request, response); 188 189 } 190 191 PS: 两个 处理器适配器 是可以共从的 192 193 } 194 } 195 196 197 命令控制器 198 { 199 用于接收页面参数 200 public class CommandController extends AbstractCommandController{ 201 202 //指定参数绑定到那个javaBean 203 public CommandController(){ 204 this.setCommandClass(User.class); 205 } 206 @Override 207 protected ModelAndView handle(HttpServletRequest request, 208 HttpServletResponse response, Object command, BindException errors) 209 throws Exception { 210 //把命令对象强转成User对象 211 User user = (User) command; 212 ModelAndView mv = new ModelAndView(); 213 mv.addObject("user", user); 214 mv.setViewName("index"); 215 return mv; 216 } 217 } 218 } 219 220 221 乱码问题 222 { 223 224 Get方式: 225 在Servers下面找 server.xml 226 <Connector URLEncoding="UTF-8" connectionTimeout="20000" port=.....> 227 228 Post方式 229 使用 String编码过滤器: 230 在web.xml配置 231 <filter> 232 <filter-name>characterEncoding</filter-name> 233 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 234 <init-param> 235 <param-name>encoding</param-name> 236 <param-value>UTF-8</param-value> 237 </init-param> 238 </filter> 239 240 <filter-mapping> 241 <filter-name>characterEncoding</filter-name> 242 <url-pattern>/*</url-pattern> 243 </filter-mapping> 244 245 } 246 247 时间类型转换问题 248 { 249 250 SpringMvc 会自动调用 一个initBinder 方法 251 252 @Override 253 protected void initBinder(HttpServletRequest request, 254 ServletRequestDataBinder binder) throws Exception { 255 String str = request.getParameter("birthday"); 256 if(str.contains("/")){ 257 258 binder.registerCustomEditor(Date.class, 259 new CustomDateEditor(new SimpleDateFormat("yyyy/MM/dd"), true)); 260 }else{ 261 262 binder.registerCustomEditor(Date.class, 263 new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true)); 264 } 265 } 266 267 268 } 269 270 配置文件开发实在是蛋疼 271 272 ------------------------------------------分割线------------------------------------------ 273 274 注解模式 275 { 276 277 配置Web.xml 278 和配置文件中的一样 不需要更改什么 279 280 281 配置springmvc配置文件 282 283 284 <!-- 包自动扫描 --> 285 <context:component-scan base-package="cn.lw.controller"/> 286 <!-- 配置注解处理器映射器 287 功能:寻找执行类Controller 288 --> 289 <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean> 290 291 <!-- 配置注解处理器适配器 292 功能:调用controller方法,执行controller 293 --> 294 <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean> 295 296 297 <!-- 配置sprigmvc视图解析器:解析逻辑试图 298 后台返回逻辑试图:index 299 视图解析器解析出真正物理视图:前缀+逻辑试图+后缀====/WEB-INF/jsps/index.jsp 300 --> 301 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 302 <property name="prefix" value="/WEB-INF/jsps/"></property> 303 <property name="suffix" value=".jsp"></property> 304 </bean> 305 </beans> 306 307 308 自定义 Connector 309 310 @Controller//<bean class="UserController"/> 311 @RequestMapping("/user") 312 public class UserController { 313 314 315 @RequestMapping(value="/hello.do",method={RequestMethod.GET,RequestMethod.POST}) 316 public String hello(){ 317 return "index"; 318 } 319 320 //跳转到add页面 321 @RequestMapping("toAdd") 322 public String toAdd(){ 323 return "add"; 324 } 325 326 //接受int类型参数 327 @RequestMapping("recieveInt") 328 public String recieveInt(Integer id){ 329 System.out.println(id); 330 return "success"; 331 } 332 333 //接受字符类型参数 334 @RequestMapping("recieveStr") 335 public String recieveStr(String username) 336 { 337 System.out.println(username); 338 return "success"; 339 } 340 341 //接受数组类型参数 342 @RequestMapping("recieveArray") 343 public String recieveArray(Integer[] ids){ 344 System.out.println(ids); 345 return "success"; 346 } 347 HTML 348 { 349 ID:<input type="checkbox" name="ids" value="1" id="ids"> 350 ID:<input type="checkbox" name="ids" value="2" id="ids"> 351 ID:<input type="checkbox" name="ids" value="3" id="ids"> 352 } 353 354 355 //接受参数封装User对象 356 @RequestMapping("recieveUser") 357 public String recieveUser(User user){ 358 System.out.println(user); 359 return "success"; 360 } 361 HTML 362 { 363 姓名:<input type="text" name="user.username" id="username"> 364 生日:<input type="text" name="user.birthday" id="birthday"> 365 性别:<input type="text" name="user.sex" id="sex"> 366 地址:<input type="text" name="user.address" id="address"> 367 } 368 369 370 371 //接受包装类型参数 372 @RequestMapping("recieveUserCustom") 373 public String recieveUserCustom(UserCustom userCustom){ 374 System.out.println(userCustom); 375 return "success"; 376 } 377 HTML 378 { 379 姓名:<input type="text" name="user.username" id="username"> 380 生日:<input type="text" name="user.birthday" id="birthday"> 381 性别:<input type="text" name="user.sex" id="sex"> 382 地址:<input type="text" name="user.address" id="address"> 383 } 384 385 386 387 388 //接受集合类型参数 389 @RequestMapping("recieveList") 390 public String recieveList(UserCustom userCustom){ 391 System.out.println(userCustom); 392 return "success"; 393 } 394 HTML 395 { 396 姓名:<input type="text" name="userList[0].username" id="username"> 397 地址:<input type="text" name="userList[0].address" id="address"> 398 姓名:<input type="text" name="userList[1].username" id="username"> 399 地址:<input type="text" name="userList[1].address" id="address"> 400 } 401 402 //接受集合类型参数 403 @RequestMapping("recieveMap") 404 public String recieveMap(UserCustom userCustom){ 405 System.out.println(userCustom); 406 return "success"; 407 } 408 HTML 409 { 410 姓名:<input type="text" name="maps['username']" id="username"> 411 地址:<input type="text" name="maps['address']" id="address"> 412 } 413 414 415 //页面回显 416 @RequestMapping("list") 417 public String list(Model model){ 418 //model 相当于application域对象 419 List<User> userList = new ArrayList<User>(); 420 User user1 = new User(); 421 user1.setId(1); 422 user1.setSex("男"); 423 user1.setUsername("张三"); 424 user1.setAddress("北京"); 425 user1.setBirthday(new Date()); 426 427 User user2 = new User(); 428 user2.setId(2); 429 user2.setSex("男2"); 430 user2.setUsername("张三222"); 431 user2.setAddress("北京222"); 432 user2.setBirthday(new Date()); 433 434 User user3 = new User(); 435 user3.setId(3); 436 user3.setSex("男3"); 437 user3.setUsername("张三333"); 438 user3.setAddress("北京333"); 439 user3.setBirthday(new Date()); 440 441 userList.add(user1); 442 userList.add(user2); 443 userList.add(user3); 444 445 // springmvc使用 model 这个对象进行 数据传递 446 // model对象相当于 application 域 页面可以使用EL 进行处理 447 model.addAttribute("userList", userList); 448 return "list"; 449 450 } 451 452 //修改 453 @RequestMapping("updateByID/{id}") 454 public String updateByID(@PathVariable Integer id,Model model){ 455 User user1 = new User(); 456 user1.setId(id); 457 user1.setSex("男"); 458 user1.setUsername("张三"); 459 user1.setAddress("北京"); 460 user1.setBirthday(new Date()); 461 462 model.addAttribute("user", user1); 463 464 return "edit"; 465 } 466 467 //测试转发 468 @RequestMapping("forward") 469 public String forward(){ 470 471 return "forward:/items/list.do"; 472 } 473 474 //测试重定向 475 @RequestMapping("redirect") 476 public String redirect(){ 477 478 return "redirect:/items/list.do"; 479 } 480 } 481 482 RequestMapping 注解 483 484 requestMapping(“hello”) 485 requestMapping(“/hello.do”) 486 requestMapping(value=”/hello.do”) 487 requestMapping(value=”/hello.do”,method=RequestMethod.GET) 488 489 浏览器直接访问,a标签都是get请求 490 表单提交(指定post),ajax指定post提交,post提交。 491 requestMapping(value=”/hello.do”,method=RequestMethod.POST) 492 493 requestMapping(value=”/hello.do”,method={RequestMethod.POST, RequestMethod.GET}) 494 495 RequestMapping 根路径问题 496 497 如果出现方法名称相同 那就需要设置这个具体是哪个执行类的根路径 498 499 @RequestMapping("/a") 500 public class aController{ 501 502 @RequestMapping("save") 503 public void save(){ 504 } 505 } 506 Url 就是 /a/save.do 507 508 @RequestMapping("/b") 509 public class bController{ 510 511 @RequestMapping("save") 512 public void save(){ 513 } 514 } 515 Url 就是 /b/save.do 516 517 518 RequestParam 注解 519 520 defaultValue是默认值 521 value是别名 如 页面传递过来的是 id 就可以在方法中使用ids接收 522 required是 是否该参数必须传递 设置默认值后 改参数不起作用 如果没有传递 400错误 523 524 @RequestMapping("/home") 525 public String gohome(HttpServletRequest request, 526 @RequestParam(defaultValue="1",value="id",required=true)String ids){ 527 System.out.println(request.getRequestURL()); 528 return "index"; 529 } 530 531 } 532 533 534 URL模版映射 535 { 536 537 普通页面访问传参 538 Url :/执行类路径地址/updateid?id=1 539 540 @RequestMapping("updateid") 541 public String updateByID(Integer id,Model model){ 542 User user1 = new User(); 543 user1.setId(id); 544 user1.setSex("男"); 545 user1.setUsername("张三"); 546 user1.setAddress("北京"); 547 user1.setBirthday(new Date()); 548 model.addAttribute("user", user1); 549 return "edit"; 550 } 551 Restfull风格设计 552 553 初始版本 554 555 Url:/执行类路径地址/updateid/1.do 556 //需要PathVariable这个注解 557 @RequestMapping("updateByID/{id}") 558 public String updateByID(@PathVariable Integer id,Model model){ 559 User user1 = new User(); 560 user1.setId(id); 561 user1.setSex("男"); 562 user1.setUsername("张三"); 563 user1.setAddress("北京"); 564 user1.setBirthday(new Date()); 565 566 model.addAttribute("user", user1); 567 568 return "edit"; 569 } 570 真正使用 571 配置Web 572 573 添加一个约定 574 575 <servlet-mapping> 576 <servlet-name>springmvc</servlet-name> 577 <url-pattern>/rest/*</url-pattern> 578 </servlet-mapping> 579 580 Url:/rest/执行类路径地址/updateid/1 581 } 582 583 转发和重定向 584 { 585 586 587 转发 forward 588 589 本类进行转发 590 方式一:return ”forward:list.do“; 591 方式二:return ”forward:/user/list.do“; 592 593 //测试转发 594 @RequestMapping("forward") 595 public String forward(){ 596 597 return "forward:/user/list.do"; 598 } 599 注意:user根路径前面必须有/ 600 601 跨类进行转发: 602 转发方式:return ”forward:/order/list.do“; 603 604 605 重定向 redirect 606 607 本类进行重定向 608 方式一:return ”redirect:list.do“; 609 方式二:return ”redirect:/user/list.do“; 610 611 跨类进行重定向: 612 转发方式:return ”redirect:/order/list.do“; 613 614 } 615 616 617 618 Mvc 注解模式 <mvc:annotation-driven/> 619 { 620 加入该标签 默认就创建了 621 622 配置注解处理器映射器 功能:寻找执行类Controller 623 RequestMappingHandlerMapping 624 625 配置注解处理器适配器 功能:调用controller方法,执行controller 626 RequestMappingHandlerAdapter 627 628 同时 默认提供了 json 格式的支持 629 630 631 springmvc 配置 632 { 633 <!-- 包自动扫描 --> 634 <context:component-scan base-package="cn.lw.controller"/> 635 <!-- Mvc 注解模式 --> 636 <mvc:annotation-driven/> 637 638 <!-- 配置sprigmvc视图解析器:解析逻辑试图 639 后台返回逻辑试图:index 640 视图解析器解析出真正物理视图:前缀+逻辑试图+后缀====/WEB-INF/jsps/index.jsp 641 --> 642 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 643 <property name="prefix" value="/WEB-INF/jsps/"></property> 644 <property name="suffix" value=".jsp"></property> 645 </bean> 646 } 647 648 } 649 650 651 SpringMvc 对json 格式的支持 652 { 653 654 加入Jar包 655 656 使用<mvc:annotation-driven/> 无法对其扩展 657 658 659 <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 660 <property name="messageConverters"> 661 <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean> 662 </property> 663 664 由于 665 666 @RequestMapping("requestJson") 667 public @ResponseBody User requestJson(@RequestBody User user) 668 { 669 return user; 670 } 671 672 由于<mvc:annotation-driven/> 标签已经默认对Json支持了 所有 bean 就不用配置了 673 674 675 } 676 677 678 SpringMvc 对多视图的支持 679 { 680 配置 springmvc配置文件 681 <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> 682 <!-- 配置支持媒体类型 --> 683 <property name="contentNegotiationManager"> 684 <bean 685 class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> 686 <property name="mediaTypes"> 687 <map> 688 <entry key="json" value="application/json"></entry> 689 <entry key="xml" value="application/xml"></entry> 690 </map> 691 </property> 692 </bean> 693 </property> 694 695 <!-- 指定默认视图 --> 696 <property name="defaultViews"> 697 <!-- 支持多个视图 --> 698 <list> 699 <!-- 对josn格式视图支持 --> 700 <bean 701 class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"></bean> 702 703 <!-- xml格式视图支持 --> 704 <bean class="org.springframework.web.servlet.view.xml.MarshallingView"> 705 <constructor-arg> 706 <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 707 <property name="classesToBeBound"> 708 <list> 709 <value>cn.lw.domain.User</value> 710 </list> 711 </property> 712 </bean> 713 </constructor-arg> 714 </bean> 715 </list> 716 </property> 717 </bean> 718 719 @RequestMapping("userView") 720 public User userView(){ 721 User u=new User(); 722 return u; 723 } 724 725 访问很简单 通过后缀名 就自动转换成对应格式了 726 727 728 /rest/user/userView.json 729 /rest/user/userView.xml 730 731 Ps: 配置 路径 732 733 } 734 735 736 文件上传 737 { 738 739 在SpringMVC中配置文件上传解析器 740 741 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 742 <property name="maxUploadSize" value="10240000"/> 743 </bean> 744 745 夸服务器上传 如果不写ID 可能会出错 746 747 解释一下 夸服务器上传 什么意思 748 就是单独的拿出一台服务器来保存图片,改服务器什么都不做 建立一个文件夹 修改一下允许 修改的 权限 749 最终结果就是 提供一个服务器路径 如 http://10.10.10.10:8080/imgs/1.img 750 751 <script type="text/javascript"> 752 function submitImgSize1Upload(){ 753 var option={ 754 type:'POST', 755 url:'${pageContext.request.contextPath }/upload/uploadPic.do', 756 dataType:'text', 757 data:{ 758 fileName : 'imgSize1File' 759 }, 760 success:function(data){ 761 //把json格式的字符串转换成json对象 762 var jsonObj = $.parseJSON(data); 763 //返回服务器图片路径,把图片路径设置给img标签 764 $("#imgSize1ImgSrc").attr("src",jsonObj.fullPath); 765 //数据库保存相对路径 766 $("#imgSize1").val(jsonObj.relativePath); 767 } 768 }; 769 $("#itemForm").ajaxSubmit(option); 770 } 771 </script> 772 773 <form id="itemForm" action="${pageContext.request.contextPath }/items/saveOrUpdate.do" method="post"> 774 <input type='file' id='imgSize1File' name='imgSize1File' class="file" onchange='submitImgSize1Upload()' /> 775 </form> 776 777 778 @RequestMapping("uploadPic") 779 public void uploadPic(HttpServletRequest request,String fileName,PrintWriter out){ 780 //把Request强转成多部件请求对象 781 MultipartHttpServletRequest mh = (MultipartHttpServletRequest) request; 782 //根据文件名称获取文件对象 783 CommonsMultipartFile cm = (CommonsMultipartFile) mh.getFile(fileName); 784 //获取文件上传流 785 byte[] fbytes = cm.getBytes(); 786 787 //文件名称在服务器有可能重复? 788 String newFileName=""; 789 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); 790 newFileName = sdf.format(new Date()); 791 792 Random r = new Random(); 793 794 for(int i =0 ;i<3;i++){ 795 newFileName=newFileName+r.nextInt(10); 796 } 797 798 //获取文件扩展名 799 String originalFilename = cm.getOriginalFilename(); 800 String suffix = originalFilename.substring(originalFilename.lastIndexOf(".")); 801 802 //创建jesy服务器,进行跨服务器上传 803 Client client = Client.create(); 804 //把文件关联到远程服务器 805 WebResource resource = client.resource(Commons.PIC_HOST+"/upload/"+newFileName+suffix); 806 //上传 807 resource.put(String.class, fbytes); 808 809 810 //ajax回调函数需要会写写什么东西? 811 //图片需要回显:需要图片完整路径 812 //数据库保存图片的相对路径. 813 String fullPath = Commons.PIC_HOST+"/upload/"+newFileName+suffix; 814 815 String relativePath="/upload/"+newFileName+suffix; 816 //{"":"","":""} 817 String result="{\"fullPath\":\""+fullPath+"\",\"relativePath\":\""+relativePath+"\"}"; 818 819 out.print(result); 820 } 821 822 } 823 824 springmvc 页面缓存 freemarker 825 { 826 配置xml 827 <!-- 配置freemarker模版文件前缀,模版文件编码 --> 828 <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> 829 <property name="templateLoaderPath" value="/WEB-INF/jsps/"></property> 830 <property name="defaultEncoding" value="UTF-8"></property> 831 </bean> 832 <!-- 配置freemarker视图解析后缀,页面显示视图编码 --> 833 <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> 834 <property name="suffix" value=".ftl"></property> 835 <property name="contentType" value="text/html;charset=utf-8"></property> 836 </bean> 837 838 839 意思是 .ftl 后缀的 请求 都走 freemarker视图 840 841 freemarker 有自己的 标签 和jsp 差不多 详细的请百度 842 843 } 844 845 846 847 springMvc 拦截器 848 { 849 局部拦截器 850 851 针对单个处理器映射器,就叫局部拦截器。 852 853 全局拦截器 854 855 <!--拦截器 --> 856 <mvc:interceptors> 857 <!--多个拦截器,顺序执行 --> 858 <mvc:interceptor> 859 <mvc:mapping path="/**"/> 860 <bean class="cn.lw.interceptor.Interceptor1"></bean> 861 </mvc:interceptor> 862 <mvc:interceptor> 863 <mvc:mapping path="/**"/> 864 <bean class="cn.lw.interceptor.Interceptor2"></bean> 865 </mvc:interceptor> 866 </mvc:interceptors> 867 868 869 public class Interceptor1 implements HandlerInterceptor{ 870 871 //preHandle在处理器映射器之前进行执行 872 //return false:拦截 return true:放行 873 public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, 874 Object arg2) throws Exception { 875 System.out.println("这是第一个拦截器Interceptor1。。。preHandle"); 876 return true; 877 } 878 879 //还没有调用Controller,还没返回modelAndView执行 880 public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, 881 Object arg2, ModelAndView arg3) throws Exception { 882 System.out.println("这是第一个拦截器Interceptor1。。。postHandle"); 883 884 } 885 886 //返回modelAndView之后执行 887 public void afterCompletion(HttpServletRequest arg0, 888 HttpServletResponse arg1, Object arg2, Exception arg3) 889 throws Exception { 890 System.out.println("这是第一个拦截器Interceptor1。。。afterCompletion"); 891 892 } 893 } 894 895 Springmvc规定:凡是preHandle返回true,afterCompletion必须执行 896 897 898 第一个拦截器放行,第二个拦截器也放行: 899 900 这是第一个拦截器Interceptor1。。。preHandle 901 这是第二个拦截器Interceptor2。。。preHandle 902 这是第二个拦截器Interceptor2。。。postHandle 903 这是第一个拦截器Interceptor1。。。postHandle 904 这是第二个拦截器Interceptor2。。。afterCompletion 905 这是第一个拦截器Interceptor1。。。afterCompletion 906 907 908 第一个拦截器放行,第二个不放行: 909 910 Springmvc规定:凡是preHandle返回true,afterCompletion必须执行。 911 912 这是第一个拦截器Interceptor1。。。preHandle 913 这是第二个拦截器Interceptor2。。。preHandle 914 这是第一个拦截器Interceptor1。。。afterCompletion 915 916 }
一些问题
关于MVC REST 请求的问题 格式1 @RequestMapping(value = "{itemCatId}", method = RequestMethod.GET) public ResponseEntity<TbItemParam> queryItemParamByItemCatid( @PathVariable Long itemCatId) { } 格式2 @RequestMapping(value = "{itemCatId}", method = RequestMethod.GET) @ResponseBody public ResponseEntity<TbItemParam> queryItemParamByItemCatid( @PathVariable("itemCatId") Long itemCatId) { } 格式3 @RequestMapping(value = "/destroy/{ConsumerID:^[0-9]*.*@[0-9]*}", method = RequestMethod.GET, produces = "application/json; charset=utf-8") @ResponseBody public String destroyMqConsumer(@PathVariable String ConsumerID) { } 返回值的问题 try { TbItemParam queryitemParam = new TbItemParam(); queryitemParam.setItemCatId(itemCatId); return ResponseEntity.ok(queryitemParam); // 状态码是 200 return ResponseEntity.status(HttpStatus.CREATED).build(); // 状态码是 200 不返回 实体数据 return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(queryitemParam); // 状态码是 200 返回 实体数据 } catch (Exception e) { e.printStackTrace(); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null); // 状态码是 200 返回 实体数据 是null return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); // 状态码是 500 } 关于 请求过滤器 处理PUT 没有参数的问题 <!-- PUT 请求过滤器 处理PUT 没有参数的问题 --> <filter> <filter-name>HttpPutFormContentFilter</filter-name> <filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class> </filter> <filter-mapping> <filter-name>HttpPutFormContentFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 关于options 请求不处理的问题 <servlet> <servlet-name>springdispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springMvc-viewresolver.xml</param-value> </init-param> <init-param> <param-name>dispatchOptionsRequest</param-name> <param-value>true</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
自己写的笔记,不管多久后 查看后也能非常快速的回顾起来。看别人写的始终是别人的