SpringMVC--初級

什麼是SpringMVC

springmvc是spring框架的一個模塊,springmvc和spring無需通過中間整合層進行整合。springmvc是一個基於mcv的web框架。

mvc在b/s中的應用

mvc是一個設計模式,

springmvc框架原理(掌握)

  1. 前端控制器
  2. 處理器映射器
  3. 處理器適配器
  4. 視圖解析器
  5. SpringMVC和mybatis整合
  6. 自定義參數綁定

springmvc執行步驟

  1. 發起請求到前端控制器(DispatcherServlet)
  2. 前端控制器請求處理器映射器HandlerMapping查找Handler

    可根據xml配置、註解進行查找

  3. 處理器映射器HandlerMapping向前端控制器返回Handler
  4. 前端控制器調用處理器適配器去執行Handler
  5. 處理器適配器執行Handler
  6. Handler執行完成給處理器適配器返回ModelAndView
  7. 處理器適配器給前端返回ModelAndView

    ModelAndView是springmvc框架的一個底層對象,包括Model和View

  8. 前端控制器請求視圖解析器去進行視圖解析

    根據邏輯視圖名解析成真正的視圖(jsp)

  9. 視圖解析器向前端控制器返回View
  10. 前端控制器進行視圖渲染

    視圖渲染將模型數據(在ModelAndView對象中)填充到request域

  11. 前端控制器向用戶響應結果

組件的作用

  1. 前端控制器DispatcherServlet

    作用:接受請求,響應結果。相當於轉發器

  2. 處理器映射器HandlerMapping

    作用:根據請求的URL查找Handler

  3. 處理器適配器HandlerAdapter

    作用:按照規定規則(HandlerAdapter要求的規則)去執行Handler
    注意:編寫Handler時按照HandlerAdapter的要求去做,這樣適配器纔可以去正確執行Handler

  4. 視圖解析器View resolver

    作用:進行視圖解析,根據邏輯視圖名解析成真正的視圖

  5. 視圖View

    View是一個接口,實現類支持不同的View類型(jsp、freemarker、pdf......)

第一個程序

  1. 導入jar包,spring-webmvc.jar

  2. 在web.xml中配置springmvc的前端控制器

    <!-- 配置springmvc前端控制器 -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    
    
        <!-- contextConfigLocation配置springmvc加載的配置文件(處理器映射器、適配器等)
             如果不配置contextConfigLocation,默認加載的是/WEB-INF/servlet名稱-servlet。xml(這裏是springmvc-servlet.xml)
         -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
    </servlet>
    
    
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!-- 
             第一種:*.action,訪問以.action結尾的請求,由DispatcherServlet進行解析
             第二種:/,所有的訪問地址都有DispatcherServlet進行解析,對於靜態文件的解析需要配置不讓DispatcherServlet進行解析,使用這種方式可以實現REDTful風格的url
             第三種:/*,這種配置不對,這種配置最終要轉發到一個jsp頁面時,仍然會由DispatcherServlet解析jsp地址,不能根據jsp頁面找到Handler,會報錯
         -->
         <url-pattern>*.action</url-pattern>
    </servlet-mapping>
    
  3. 配置springmvc.xml(首先引入Spring約束)

  4. 配置處理器適配器。這個適配器的support方法可以處理實現Controller接口的類

    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
    
  5. 創建處理器實現Controller接口

    public class ItemController implements Controller{
    
    
    
    
        public ModelAndView handleRequest(HttpServletRequest request,
                HttpServletResponse response) throws Exception {
            Item item1=new Item();
            item1.setName("乒乓球");
            item1.setPrice("5");
            item1.setDetail("好球");
    
    
            Item item2=new Item();
            item2.setName("藍球");
            item2.setPrice("100");
            item2.setDetail("球");
            List<Item> listitem=new ArrayList<Item>();
            listitem.add(item1);
            listitem.add(item2);
    
    
            ModelAndView modelAndView=new ModelAndView();
            //相當於setAttribute
            modelAndView.addObject("listitem",listitem);
            //指定視圖
            modelAndView.setViewName("/WEB-INF/jsp/items/item/itemList.jsp");
    
    
            return modelAndView;
        }
    
    
    }
    
  6. 創建視圖(這裏是在/WEB-INF/jsp/items/item路徑下創建itemList.jsp)

  7. 在springmvc.xml配置處理器、處理器映射器、視圖解析器

    <!-- 配置Handler -->
    <bean name="/queryItems.action" class="cn.zcw.ssm.controller.ItemController"></bean>
    
    
    <!-- 配置處理器映射器 
         將bean的name作爲Url進行查找,需要在配置Handler時指定bean的name(url)
    -->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    
    
    <!-- 視圖解析器 
         jsp解析,默認使用jstl標籤,所以classpath下得有jstl的包
    -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean> 
    
  8. 測試

非註解處理器映射器

  1. org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping

    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    
  2. org.springframework.web.servlet.handler.SimpleUrlHandlerMapping

    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="hello.action">itemController1</prop>
            </props>
        </property>
    </bean>
    

    key表示URL,值爲handel的idspringmvc會自己選擇正確的處理器映射器,所以可以同時配置以上兩種處理器映射器

非註解的處理器適配器

  1. org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
  2. org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter

    對應的handler類

    public class ItemController2 implements HttpRequestHandler{
    
    
        @Override
        public void handleRequest(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            Item item1=new Item();
            item1.setName("乒乓球");
            item1.setPrice("5");
            item1.setDetail("好球");
    
    
            Item item2=new Item();
            item2.setName("藍球");
            item2.setPrice("100");
            item2.setDetail("球");
            List<Item> listitem=new ArrayList<Item>();
            listitem.add(item1);
            listitem.add(item2);
    
    
            request.setAttribute("listitem", listitem);
    
    
            request.getRequestDispatcher("/WEB-INF/jsp/items/item/itemList.jsp").forward(request, response);
    
    
        }
    
    
    }
    

    這個適配器可以指定傳給jsp頁面的數據格式,例如json

註解方式的適配器和映射器

第一種方式:

<!-- 註解適配器-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

第二種方式(推薦):

    <!-- 使用mvc:annotation-driven代替上邊註解映射器和註解適配器
         mvc:annotation-driven默認加載很多的參數綁定方法
         比如json轉換解析器就默認加載,如果使用mvc:annotation-driven就不用配置上面兩個註解映射器、註解適配器
         實際開發中也是使用mvc:annotation-driven
     -->
    <mvc:annotation-driven></mvc:annotation-driven>

Handler使用註解方式

@Controller
public class ItemController3{


    @RequestMapping("/itemlist.action")
    public ModelAndView itemList(){
        Item item1=new Item();
        item1.setName("乒乓球");
        item1.setPrice("5");
        item1.setDetail("好球");


        Item item2=new Item();
        item2.setName("棒球");
        item2.setPrice("100");
        item2.setDetail("球");
        List<Item> listitem=new ArrayList<Item>();
        listitem.add(item1);
        listitem.add(item2);


        ModelAndView modelAndView=new ModelAndView();
        //相當於setAttribute
        modelAndView.addObject("listitem",listitem);
        //指定視圖
        modelAndView.setViewName("/WEB-INF/jsp/items/item/itemList.jsp");


        return modelAndView;


    }
}

在springmvc.xml開啓組件掃描

<!-- 可以掃描controller、service。。。。 -->
<context:component-scan base-package="cn.zcw.ssm.controller"></context:component-scan>

視圖解析器的參數配置

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!-- 配置jsp路徑前綴 -->
    <property name="prefix" value="/WEB-INF/jsp/"></property>
    <!-- 配置JSP路徑後綴 -->
    <property name="suffix" value=".jsp"></property>
</bean>

在控制其中做出jsp路徑相應修改

//modelAndView.setViewName("/WEB-INF/jsp/items/item/itemList.jsp");
modelAndView.setViewName("items/item/itemList");

ssm框架整合步驟

  1. 整合dao層

    mybatis和Spring整合,通過Spring管理mapper接口使用mapper的掃描器自動掃描mapper接口在Spring中進行註冊

  2. 整合service層

    通過Spring管理service接口使用配置方式將service接口配置在Spring配置文件中實現事務控制

  3. 整合springmvc

    由於springmvc是Spring的模塊,不需要整合

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章