Spring MVC特點
- 清晰地角色划分
- 靈活的配置功能
- 提供了大量的控制器接口和實現類
- 真正的View層實現無關(JSP、Velocity、Xslt等)
- 國際化支持
- 面向接口編程
- Spring提供了Web應用開發的一整套流程,不僅僅是MVC,他們之間可以很方便的結合一起
視圖解析器
- 將邏輯視圖的名字與JSP等視圖技術進行匹配
- InternalResourceViewResolver
- 在Web應用程序的WAR文件中查找視圖模板,視圖模板的路徑根據加完前綴和后綴的邏輯視圖名稱來確定
- prefix
- suffix
REST風格
- Representational State Transfer表述性狀態轉移
- 傳統的查、改、刪的URL與REST風格的增刪改URL對比
- /userview.action?id=12 VS /user/12
- /userdelete.action?id=12 VS /user/12/delete
- /userupdate.action?id=12 VS /user/12/update
- 請求方式
- GET
- POST
- DELETE
- 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>
歡迎關注