1. 程式人生 > >SpringMVC的特性及應用

SpringMVC的特性及應用

{} 方法 視圖解析 表單提交 rest風格 scope gets gin 輸入流

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>

SpringMVC的特性及應用