SpringMVC

    SpringMvc和struct相似,都是表現層的框架。用來接收用戶的請求,返回給用戶渲染後的頁面。html

Springmvc的流程圖:前端

                        

    Springmvc的核心:前端控制器。根據這個圖能夠知道springmvc的執行路徑。springmvc的三大組件:處理器映射器、處理器適配器、視圖解析器。可是咱們須要作的只有處理器、view。java

 Spring MVC工做原理web

  • Spring MVC框架圍繞DispatcherServlet這個核心控制器來開展工做
  • DispatcherServlet它負責攔截請求並將其分配給相應的處理器
  • 整個Spring MVC的工做流程以下
    • 客戶端發送HTTP請求,Web服務器接收請求並查找配置在web.xml中的DispatcherServlet
    • DispatcherServlet接收請求後,將根據請求的信息以及HandlerMapping的配置找處處理請求的處理器
    • DispatcherServlet根據HandlerMapping獲得對應當前請求的Handler後,經過HandlerAdapter對Handler進行封裝
    • 處理器完成業務邏輯處理後返回一個ModelAndView給DispatcherServlet,ModelAndView包含視圖邏輯名和模型數據信息
    • DispatcherServlet藉由ViewResolver完成邏輯視圖名到真實視圖對象的解析工做
    • 獲得真實的視圖View對象,DispatcherServlet就使用這個View對象對ModelAndView中的模型數據進行視圖渲染

建立簡單的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的註解注入方式有兩種:

    @Controller

    class Controller{

        @Autowired

        Service service;

        ........

    }
    (1)@Autowired:不用get/set,自動注入,可是若是在這個Controller中注入兩個就沒法區分,因此@Autowired適合單例(我理解的)

    (2)@Resource:使用的時候@Resource(name="")是@Autowired的優化,能夠指定名字加以區分

    可是通常時候使用@Autowired就夠了。

相關文章
相關標籤/搜索