SpringMVC學習記錄

一、瀏覽器發出請求,如url:localhost:8080/test/start.testhtml

二、請求會給到DispatcherServlet(總的控制中心——前端控制器),由它對請求進行派發,前端控制器是須要寫在配置文件web.xml中,即前端

       <servlet>
             <servlet-name> test</servlet-name >
             <servlet-class> org.springframework.web.servlet.DispatcherServlet</servlet-class >
             <load-on-startup> 1</ load-on-startup>
       </servlet>

       <servlet-mapping>
             <servlet-name> test</servlet-name >
             <url-pattern> *.test</url-pattern >
       </servlet-mapping>

因爲限制了url的格式,若是請求是已.test結尾的。java

三、前端控制器DispatcherServlet接收到請求,派發給咱們本身的控制器,即具體的控制器,如StartController,如何派發給本身的控制器呢,就須要一個HandlerMapping,即創建了請求與控制器之間的映射,HandlerMapping須要配置在test-Servlet.xml文件中。web

這裏說一個比較簡單的控制器,SimpleUrlHandlerMapping,配置代碼以下:spring

<!-- 基於Url的控制器,比較簡單的控制器 -->
       <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" >
             <property name="mappings" >
                   <props>
                         <prop key="start.test" >startController</ prop>
                         <prop key="add_emp.test" >addEmpController</ prop>       
                         <!-- UrlFilenameViewController -->
                         <prop key="add.test" >addEmpSuccController</ prop>
                   </props>
             </property>
       </bean>

四、轉到哪一個具體的控制器,就須要按本身的要求去選擇了。瀏覽器

上面提到的,本身創建的控制器,實現的是簡單的Controller接口,以下:restful

       <bean id= "startController" class ="test.StartController"></ bean>mvc

經常使用的,以及好用的控制器,在通常項目中常常使用到的。app

用於直接跳轉頁面的控制器:jsp

ParameterizableViewController,UrlFilenameViewController

配置以下:

(1)須要指定視圖名,name ="viewName" value= "login"

<!-- 參數化的ViewController,咱們不須要本身創建,只須要直接使用就能夠了 -->
       <bean id= "loginController" class="org.springframework.web.servlet.mvc.ParameterizableViewController" >
             <property name="viewName" value="login"/> 
       </ bean>

(2)不須要指定視圖名,他是獲取Url中的「.test」前面那一段。如「add_emp

<!-- 使用UrlFilenameViewController,就不須要配置視圖名這個過程。 -->
       <bean id= "addEmpController"
             class="org.springframework.web.servlet.mvc.UrlFilenameViewController" >
       </bean>

使用時機:有時候,把全部的jsp文件隱藏在WEB-INF中裏面。

進階,控制器,包括

AbstractController

命令控制器——AbstractCommandController

(3)這個控制器開始,能夠自動封裝表單參數成Object commandc對象,控制器中只須要。

             //自動封裝表單參數成command,再強制裝換成 Emp對象。

            Emp emp=(Emp)command;

             //service.addEmp(emp);

            System. out.println(emp);

在配置文件中,須要制定Command是一個什麼樣類型的類。

<!-- 指定command對象是一個什麼樣的類,此處爲員工類test.Emp -->
       <bean id= "addEmpSuccController" class="test.EmpController">
             <property name="commandClass" value="test.Emp"/>
       </bean>

如此就能夠了。

(4)說到這個控制器可以自動封裝表單成爲咱們須要的Bean,表單中的類型爲int或String類型,能夠,若是是Date類型,就不能夠。

整型正確轉行,日期型不正確轉化

屬性編輯器的問題

如何提供本身的屬性編輯器。

DataBind——數據綁定

給數據綁定對象註冊一個日期類型的屬性編輯器,須要重寫初始化綁按期的方法

       @Override
       protected void initBinder(HttpServletRequest request,
                  ServletRequestDataBinder binder) throws Exception {
             // TODO Auto-generated method stub
             super.initBinder(request, binder);
      }

自定義爲以下所示:

//註冊了日期轉換的編輯器
       @Override
       protected void initBinder(HttpServletRequest request,
                  ServletRequestDataBinder binder) throws Exception {
            binder.registerCustomEditor(Date. class, new CustomDateEditor(
                         new SimpleDateFormat("yyyy-MM-dd" ), true));
      }

表單控制器——SimpleFormController

(5)onSubmit方法,當表單用post方法提交時,會轉到這個方法。若是進入一個頁面以前有,有數據須要初始化,須要用到referenceData方法。建造一個map模型。

jsp頁面須要使用到jstl包。

       @Override
       protected Map referenceData(HttpServletRequest request) throws Exception {
            Map<String, Object> model= new HashMap<String, Object>();
            model.put( "deptList", new String[]{"sales", "manage"});
             return model;
      }

       /**
       * onSubmit方法,是當表單提交時處理請求
       * 3.0版本後少用。
       * 若是使用command控制器,只要 Url符合要求,自動就會提交
       * 若是使用Form控制器,只有表單是method="post"時,纔會去執行onSubmit方法。
       */
       @Override
       protected ModelAndView onSubmit(Object command) throws Exception {
            
            Emp emp = (Emp) command;
             // service.addEmp(emp);
            System. out.println(emp);
             return new ModelAndView(getSuccessView() );
            
      }

test-servlet.xml配置文件須要配置以下:

       <bean id= "addEmpController" class ="test.EmpFormController">
             <property name="commandClass" value="test.Emp" />
             <property name="formView" value="add_emp" />
             <property name="successView" value="success" />
       </bean>

(6)

五、視圖解析器。

       <!--基於URL的視圖解析器, 從邏輯視圖名稱到真正視圖上面的映射 -->
       <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver" >
             <property name="viewClass"
                   value="org.springframework.web.servlet.view.JstlView" />
             <property name="prefix" value="/WEB-INF/jsp/" />
             <property name="suffix" value=".jsp" />
       </bean>

       

跳轉到哪一個頁面,是根據這裏設定的,

六、基於註解的MVC

  1. 加入包

  2. 當有多個配置文件時,能夠在web.xml中配置以下:

    1. <servlet >
            <servlet-name >mvc</ servlet-name>
              < servlet-class>org.springframework.web.servlet.DispatcherServlet </servlet-class>
            <init-param >
                   <param-name> contextConfigLocation</param-name ><!-- 上下文配置文件的名稱不變 -->
                   <param-value> /WEB-INF/classes/spring/*.xml </param-value>
            </init-param >
            <load-on-startup >1</ load-on-startup>
        </servlet >
    2. 看樣子是知道了,雖然是在src/config裏面創建配置文件,可是項目運行會把它放到上面的路徑中。

    3.  下面的配置是重點!

    4. <init-param >
                   <param-name> contextConfigLocation</param-name ><!-- 上下文配置文件的名稱不變 -->
                   <param-value> /WEB-INF/classes/spring/*.xml </param-value>
            </init-param >
  3. 在Controller中,添加註解,如

    1. @Controller
      @RequestMapping("/test" )
      public class TestController {
            
             @RequestMapping("/start/{name}" )
             public String start(@PathVariable String name){
                  
                  System. out.println(name);
                   return "start" ;
            }
      
      }
    2. 上面使用了兩個註解。看到了吧

  4.  在servlet.xml中,首先,須要掃描包含控制器的包,找到這些註解。

    1. <!-- 一、進行廣泛掃描 -->
             <context:component-scan base-package="test.controller" />
    2. <!-- 二、視圖解析器,使用 jsp或者jstl 最適合使用這個類。基於Resources的解析器 -->
             <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
                   <property name="prefix" value="/WEB-INF/page/"/>
                   <property name="suffix" value=".jsp"/>
             </bean>

  5. 詳細講              @RequestMapping ("/start" )

    1.  方法級別(必定要有),如上http://localhost:8080/@mvc/start.do

    2.  類級別,至關於根路徑http://localhost:8080/@mvc/test/start.do

    3.  

  6.  restfull,Url層面上的。

相關文章
相關標籤/搜索