SpringMVC的特性及應用


Spring MVC特點

  • 清晰地角色划分
  •  靈活的配置功能
  •  提供了大量的控制器接口和實現類
  •  真正的View層實現無關(JSP、Velocity、Xslt等)
  •  國際化支持
  •  面向接口編程
  • Spring提供了Web應用開發的一整套流程,不僅僅是MVC,他們之間可以很方便的結合一起

視圖解析器

  •   將邏輯視圖的名字與JSP等視圖技術進行匹配
  •   InternalResourceViewResolver
  •   在Web應用程序的WAR文件中查找視圖模板,視圖模板的路徑根據加完前綴和后綴的邏輯視圖名稱來確定
  •   prefix
  •   suffix

REST風格

  •   Representational State Transfer表述性狀態轉移
  •   傳統的查、改、刪的URL與REST風格的增刪改URL對比
  1.   /userview.action?id=12    VS    /user/12
  2.   /userdelete.action?id=12   VS    /user/12/delete
  3.   /userupdate.action?id=12  VS    /user/12/update
  •   請求方式
  1.  GET
  2.  POST
  3.  DELETE
  4.  PUT
  •   他強調的是一個資源可以對應多種視圖

配置步驟:

  1.導入spring-web類庫,

  2.配置web.xml:

           <servlet>

                     <!--注意這里的名字會被spring.xml文件名引用(springMVC-servlet.xml)-->

                     <servlet-name>springMVC</servlet-name>

                     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

           </servlet>

           <servlet-mapping>

                     <servlet-name>springMVC</servlet-name>

                     <url-pattern>/</url-pattern>

           </servlet-mapping>

  亂碼處理:

    <filter>

        <filter-name>encodingFilter</filter-name>

        <filter-class> org.springframework.web.filter.CharacterEncodingFilter </filter-class>

        <init-param>

            <param-name>encoding</param-name>

            <param-value>UTF-8</param-value>

        </init-param>

        <!-- 響應也設為相同的編碼 -->

        <init-param>

            <param-name>forceEncoding</param-name>

            <param-value>true</param-value>

        </init-param>

     </filter>

     <filter-mapping>

        <filter-name>encodingFilter</filter-name>

        <url-pattern>/*</url-pattern>

     </filter-mapping>

  3.配置<springMVC>-servlet.xml,放在和web.xml同目錄

         方式一:BeanNameUrlHandlerMapping方式:

           <!-- 控制器bean,name為訪問此控制器用的url,class為繼承AbstractController的控制器類 -->

          <bean name="/index.html" class="com.zhp.controller.HelloController"></bean>

           <!-- 視圖解析器 -->

           <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

                     <property name="prefix" value="/WEB-INF/jsp/"></property>

                     <property name="suffix" value=".jsp"></property>

            </bean>

        方式二:DefaultAnnotationHandlerMapping注解方式:

          <context:component-scan base-package="com.zhp.*"/>   

        <mvc:annotation-driven/>

                視圖解析器如上相同

      4.跳轉:

               方式一:ModelAndView mav = new ModelAndView("hello");//hello會結合試圖解析器的前綴和后綴來確定url

               方式二:注解時,直接return "hello";即可

      5.接收參數:

               login(String uname)可以直接通過uname=zhang來傳參

               reg(@ModelAttribute Usertbl user)通過注解也可自動封裝對象

         Rest風格:

              @RequestMapping("/update/{username}")

              public String update(@PathVariable String username)//注意注解@PathVariable

       6.轉發數據:

            方式一:通過方法中參數Model:

                 public String login(Model model){

                         model.addAttribute("uname","zhang");//頁面通過${requestScope.uname}取出

                  }

            方式二:session對象的獲取:自動注入session對象

                  public String login(@ModelAttribute Usertbl user,Model model,HttpSession session){}

          注意:頁面傳遞參數:

                  1.Model----model.addAttribute("upass",upass);

                  2.Map<String,Object>---------map.put("user", user);

                  3.HttpSession----session.setAttribute("name", uname);

           注意:如果指定了提交方式method=RequestMethod.GET/method=RequestMethod.POST時,springMVC會根據頁面的提交方式判斷提交的;

       7.數據校驗

             JSR-303 是Java EE 6 中的一項子規范,叫做Bean Validation,官方參考實現是Hibernate Validator。

             此實現與Hibernate ORM 沒有任何關系。JSR 303 用於對Java Bean 中的字段的值進行驗證。

             spring MVC 3.x之中也大力支持 JSR-303,可以在控制器中對表單提交的數據方便地驗證。

        8.異常處理

             a.局部處理:

             //運行時異常處理

        @ExceptionHandler(value=RuntimeException.class)

             public String doException(RuntimeException e){

                                   System.out.println("---RuntimeException---異常了-----"+e.getMessage());

                                    return "error";

                         }

                        // 非運行時異常處理

                        @ExceptionHandler(value=Exception.class)

                         public String doException(Exception e){

                                 System.out.println("---Exception---異常了-----"+e.getMessage());

                                 return "error";

                          }

               b.全局處理:

                         <!-- 異常解析器 -->

                         <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">

                               <property name="exceptionMappings">

                                   <props>

                                          <prop key="java.lang.Exception">error</prop>

                                   </props>

                               </property>

                          </bean>

       9.靜態資源處理:

                  將靜態文件指定到某個特殊的文件夾中統一處理

                  <mvc:resources mapping="/resources/**" location="/resources/" />

                  注意:mapping="/resources/**":表示映射路徑,在頁面應用resources映射名 

                            location="/resources/":表示文件存放的真實路徑

        10.文件上傳

                a.導入文件上傳夾包:commons-fileupload-1.2.2.jar、commons-io-2.4.jar

                b.配置文件:<!-- 配置MultipartResolver,用於上傳文件,使用spring的CommonsMultipartResolver --> 

                             <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

                                      <property name="maxUploadSize" value="5000000"/>

                                      <property name="defaultEncoding" value="UTF-8"/>

                            </bean>

                 c.編寫頁面:<form action="upload" method="post" enctype="multipart/form-data">

                                     <input type="submit" value="上傳">

                 d.編寫控制器類:

                                   @Controller

                                    public class ProductAction {

                                                 @RequestMapping("/upload")

                                                   public String upload(Product product,@RequestParam MultipartFile pic,HttpSession session){

                                                             System.out.println(pic.getOriginalFilename()+"------upload-----"+product);

                                                             //獲取工程路徑

                                                             String savePath=session.getServletContext().getRealPath("resources/upload");

                                                              //獲取上傳文件名稱

                                                              String fileName=pic.getOriginalFilename();

                                                               File saveFile=new File(savePath, fileName);

                                                               //封裝到對象

                                                              product.setImgSrc(fileName);

                                                              try {//實現上傳,以拷貝輸入流的方式實現

                                                                      FileUtils.copyInputStreamToFile(pic.getInputStream(), saveFile);

                                                               } catch (IOException e) {  e.printStackTrace(); }

                                                               return "index";

                                                        }

                                              // 多文件上傳

                                             @RequestMapping("/uploads")

                                              public String uploads(Product product,@RequestParam MultipartFile[] pic,HttpSession session){

                                                //獲取工程路徑

                                                String savePath=session.getServletContext().getRealPath("resources/upload");

                                                for (int i = 0; i < pic.length; i++) {

                                                   //獲取上傳文件名稱

                                                  String fileName=pic[i].getOriginalFilename();

                                                  File saveFile=new File(savePath, fileName);

                                                  try { //springMVC提供文件拷貝

                                                             pic[i].transferTo(saveFile);

                                                  } catch (IOException e) { e.printStackTrace();}

                                            }

                                      return "index";

                                            }

                                  }

 

       11.SpringMVC中的JSON

                 @Controller

      public class ProductController {

             @Resource(name="service")

             private ProductService service;

             @RequestMapping(value="/query/{id}",method=RequestMethod.GET)

             @ResponseBody

             public Product query(@PathVariable int id){

                       Product prod=service.getProductById(id);

                            return prod;

       }

     }

     對應前台js:

      <script type="text/javascript" src="resources/js/jquery-1.9.1.js"></script>

         <script type="text/javascript">

                 $(document).ready(function(){

                           $(":button").click(function(){

                                    var id=$("[name=pid]").val();

                                    $.getJSON("query/"+id,"",function(data){

                                                  if(data!=null && data!=""){

                                                           $("#show").html("商品編號:"+data.pid+"<br>商品名稱:"+data.pname+"<br>商品價格:"+data.price);

                                                   }

                                      });

                            });

                  });

           </script>

 

歡迎關注


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM