SpringMvc 筆記

atliwen發表於2016-03-11

整理出來是 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>

自己寫的筆記,不管多久後 檢視後也能非常快速的回顧起來。看別人寫的始終是別人的

相關文章