SpringMvc和struct相似,都是表現層的框架。用來接收用戶的請求,返回給用戶渲染後的頁面。html
Springmvc的流程圖:前端
Springmvc的核心:前端控制器。根據這個圖能夠知道springmvc的執行路徑。springmvc的三大組件:處理器映射器、處理器適配器、視圖解析器。可是咱們須要作的只有處理器、view。java
Spring MVC工做原理web
建立簡單的springmvc項目:spring
建立Dynamic web project,module version選擇2.5版本。導入springmvc包。數組
(1)web.xml文件瀏覽器
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>//springmvc的核心控制器
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.action</url-pattern>//springmvc攔截的路徑
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>//默認執行首頁
</welcome-file-list>
</web-app>
(2)springmvc.xmlspring-mvc
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- controller層,service層的掃描,包括子包 -->
<context:component-scan base-package="cn.hu"></context:component-scan>
<!--springmvc 三大組件 -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 視圖解析器前綴和後綴 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>//頁面的前綴和後綴
<property name="suffix" value=".jsp"></property>
</bean>安全
</beans>服務器
(3)建立controller包,建立Controller類
@Controller
public class ItemController {
//簡單的測試
@RequestMapping(value="/item/itemList.action")
public ModelAndView itemList(){
List<Items> list = new ArrayList<Items>();
Items it1 = new Items("商品1",11f,new Date(System.currentTimeMillis()),"商品1細節");
Items it2 = new Items("商品2",12f,new Date(System.currentTimeMillis()),"商品2細節");
Items it3 = new Items("商品3",13f,new Date(System.currentTimeMillis()),"商品3細節");
list.add(it1);
list.add(it2);
list.add(it3);
ModelAndView mav = new ModelAndView();
mav.addObject("itemList",list);//頁面須要顯示的
mav.addObject("ok","ok");//頁面顯示的
mav.setViewName("itemList");//頁面的名字---->WEB-INF/jsp/itemList.jsp
return mav;
}
}
(4)根據springmvc.xml中配置的」試圖解析器前綴和後綴「,在/WEB-INF/jsp中建立itemList.jsp頁面。
jstl表達式、EL表達式的使用
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>//jstl標籤的引入
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>查詢商品列表</title>
</head>
<body>
商品列表:
<table width="100%" border=1>
<tr>
<td>商品名稱</td>
<td>商品價格</td>
<td>生產日期</td>
<td>商品描述</td>
<td>操做</td>
</tr>
//下面的itemList 名字對應的是Controller的ModelAndWiew中添加的name,以下:
// mav.addObject("itemList",list);
<c:forEach items="${itemList }" var="item">//$--->EL表達式,c:foreACH--->jstl標籤的使用
<tr>
<td>${item.name }</td>
<td>${item.price }</td>
<td><fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/></td>//表達式傳遞
<td>${item.detail }</td>
<td></td>
</tr>
</c:forEach>
</table>
</body>
</html>
(5)瀏覽器訪問網址:
http://localhost:8080/SpringMVC/item/itemList.action
總結一下Controller的寫法:
(1)經過ModelAndWiew在頁面中添加值、設置跳轉的頁面
@Controller
public class ItemController {
//簡單的測試
@RequestMapping(value="/item/itemList.action")
public ModelAndView itemList(){
List<Items> list = new ArrayList<Items>();
Items it1 = new Items("商品1",11f,new Date(System.currentTimeMillis()),"商品1細節");
Items it2 = new Items("商品2",12f,new Date(System.currentTimeMillis()),"商品2細節");
Items it3 = new Items("商品3",13f,new Date(System.currentTimeMillis()),"商品3細節");
list.add(it1);
list.add(it2);
list.add(it3);
ModelAndView mav = new ModelAndView();
mav.addObject("itemList",list);
mav.setViewName("itemList");
return mav;
}
(2)直接設置跳轉的頁面
@RequestMapping(value="/test.action")
public String get(){
return "a";//頁面的名字
}
頁面請求:
一個頁面若是想訪問一個URL:
頁面請求多個參數時的寫法:
測試的時候能夠直接測試:
SpringMVC參數:
SpringMvc默認綁定的參數:
默認綁定的參數就是不須要傳遞給Controller,Controller就能夠直接使用的參數:
Controller中接受的參數的名稱必需和頁面上傳遞過來的名稱一致。
(1)Controller參數名稱不一致的處理
@RequestMapping(value="/test.action")
public void test(@RequestParam(value="id") Integer ids)
(2)Controller參數設置默認值
@RequestMapping(value="/test.action")
public void test(@RequestParam(defaultValue=1) Integer ids)
(3)required指明這個參數是不是必須的,true表示這個參數是必須的
public String m02(@RequestParam(required=true,value="sid",defaultValue="100") String id)
Springmvc接受pojo參數:
(1)頁面name="name" value=${item.name}、name="price" value=${item.price}
這裏屬性的名字必需和Item類中的屬性名字是對應的,由於Controller的方法接受的參數是直接一個(Item item)。item的名字與頁面上也要是一致的。頁面上屬性的個數不必定要與Item類中屬性個數一致。
(2)Controller接受的參數
@RequestMapping(value="/test.action")
public void tes(Item item)
springmvc接受包裝POJO:
class Item{
String name;
Float price;
get/set
}
class QueryVo{
public Item items;//與頁面的name="items.name"中items名稱一致
get/set
}
Controller接受的:
@RequestMapping(value="/test.action")
public void test(QueryVo vo)
頁面參數:
name="items.name"、name="items.price"//不能直接用name、price。這裏至關因而屬性的傳遞。頁面items名字和QueryVo中的items屬性名稱、Item類中屬性名稱必需是一致的。
Springmvc之日期轉換:
頁面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>//頭
<tr>
<td>商品生產日期</td>
<td><input type="text" name="createtime"
value="<fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/>" /></td>
</tr>
爲了安全起見,手動添加一個時間格式轉換器,保證傳遞給後臺的日期是知足咱們的格式要求的。因此須要自定義日期時間轉換器:
public class DateConverter implements Converter<String, Date>{
public Date convert(String resource) {
try{
if(null != resource){
DateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return f.parse(resource);
}
}catch(Exception e){
e.printStackTrace();
}
return null;
}
}
在springmvc.xml中配置上日期轉換器:
<!-- 三大組件 -->
<mvc:annotation-driven conversion-service="conversionServiceFactoryBean"></mvc:annotation-driven>
<bean id="conversionServiceFactoryBean" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="cn.hu.conversion.DateConverter"></bean>
</list>
</property>
</bean>
傳遞給Controller的仍是一個Item類中的屬性createDate或者包裝類中的items.createDate。
springmvc數組參數:
頁面,在原來item.id的基礎上加上checkbox,命名爲ids,業務上的好比批量刪除,在頁面上點擊刪除按鈕,傳遞過去一組id:
Controller:
Springmvc包裝數組的參數傳遞:
包裝類:
class QueryVo{
Integer[] ids;
get/set
}
頁面:name="ids"
Controller的參數是QueryVo vo
springmvc包裝List參數:
包裝類:
class QueryVo{
List<Item> itemsList;
get/set
}
Controller參數:QueryVo vo
頁面上傳的參數(s.index-->集合下標):
Controller參數來自請求的路徑:
SpringMvc的@RequestMapping用法:
提交的方法類型:
@RequestMapping(method = RequestMethod.GET)、@RequestMapping(value = "itemList",method = RequestMethod.POST)
提交的路徑公共部分的提取:
@Controller
@RequestMapping(value="/item")
class Controller{
@RequestMapping(value="/itemList.acion")
public void test(){}
}
url能夠請求多個路徑:
@RequestMapping(value={"/itemList.acion","/itemLLL.action"})
Springmvc路徑的重定向和請求轉發:
(1)重定向redirect
沒有轉發兩個字,說明請求的url沒有被轉發,用戶從新又發送的url,頁面上的url變化了。用戶請求的request參數會丟失,因此要帶着參數:
Controller中:return "redirect:/item/itemEdit.action?id="+item.getId();
(2)請求轉發forward
轉發,就是請求的url被服務器轉發了,頁面用戶請求的url沒有變化,用戶請求帶過來的參數仍是有的,因此不用攜帶:
Controller中:return "forward:/item/itemEdit.action";
Springmvc中的異常處理:
(1)異常信息的包裝類,不是直接使用Exception或者RunnableException,而是用自定義的異常類來描述異常信息
class MessageException extends Exception{
private String msg;
get/set
public MessageException(String msg){
super(msg);
this.msg = msg;
}
}
(2)異常處理類
異常處理類中指明瞭異常的處理,出現異常時跳轉的頁面。
(3)異常處理器的配置
配置好了就能夠直接使用了
(4)在Controller中使用
@RequestMapping(value="/itemEdit.action")
public ModelAndView itemUpdate(Integer id) throws MessageException{
Items item = service.selectItemListById(id);
ModelAndView mav = new ModelAndView();
//MessageException 有具體異常信息
if(null == item){
throw new MessageException("商品信息不能爲空");
}
//int i = 1/0;//未知異常
mav.addObject("item", item);
mav.setViewName("editItem");
return mav;
}
(5)出現異常時跳轉的頁面error.jsp
可是在實際生產中對異常的處理應該更傾向於記錄在日誌文件中,之後會介紹。這裏的異常處理能夠先不使用。
Springmvc圖片上傳:
須要的包:commons-io、commons-fileupload
(1)頁面上
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>//頭
<form id="itemForm" action="${pageContext.request.contextPath }/item/updateitem.action" method="post" enctype="multipart/form-data">
<tr>
<td>商品圖片</td>
<td>
<c:if test="${item.pic !=null}">
<img src="/pic/${item.pic}" width=100 height=100/>//這裏是圖片展現的時候路徑,根據具體的路徑填寫這裏的值
<br/>
</c:if>
<input type="file" name="pictureFile"/> //這裏是上傳的時候圖片的名字
</td>
</tr>
(2)Controller
將圖片保存在本地項目中,而後查看頁面:
//演示圖片上傳
@RequestMapping(value="/updateitem.action")
public String update(Items item,MultipartFile pictureFile) throws IllegalStateException, IOException{
//注意傳遞給Controller的圖片類型參數名稱與頁面傳遞過來的名稱是一致的,必需有MultipartFile 類型的參數。
//圖片name
String name = UUID.randomUUID().toString().replace("-", "");
//後綴名jpg
String ext = FilenameUtils.getExtension(pictureFile.getOriginalFilename());
//實際的圖片上傳到upload硬盤上
pictureFile.transferTo(new File("D:\\XXX\\upload\\"+name+"."+ext));
item.setPic(name+"."+ext);
service.updateItemById(item);
return "redirect:/item/itemEdit.action?id="+item.getId();//注意:跳轉的路徑必需是完整的
}
@RequestMapping(value="/itemEdit.action")
public ModelAndView itemUpdate(Integer id){
Items item = service.selectItemListById(id);
ModelAndView mav = new ModelAndView();
mav.addObject("item", item);
mav.setViewName("editItem");
return mav;
}
(3)圖片上傳的配置
在springmvc.xml中添加配置:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="5000000"></property>
</bean>
springmvc攔截器:
攔截器也是用的aop思想。springmvc對攔截器aop進行了實現。
(1)springmvc.xml配置文件中的配置
能夠配置多個攔截器,一個攔截路徑一個攔截器。
(2)攔截器類
URI:咱們在項目中使用的Controller請求路徑都是URI
URL:瀏覽器頁面訪問http://localhost:8080/XX/ss是URL
Controller中判斷用戶登陸上以後添加用戶信息進Session,直接使用Controller默認的參數HttpSession.setAttribute("USER",user)
@Autowired與@Resource使用的區別
如今須要在Controller中添加一個service,service的註解注入方式有兩種:
class Controller{
@Autowired
Service service;
........
}
(1)@Autowired:不用get/set,自動注入,可是若是在這個Controller中注入兩個就沒法區分,因此@Autowired適合單例(我理解的)
(2)@Resource:使用的時候@Resource(name="")是@Autowired的優化,能夠指定名字加以區分
可是通常時候使用@Autowired就夠了。