Spring MVC入門

jopen 10年前發布 | 93K 次閱讀 Spring MVC Web框架

前言

           在現如今"MVC思想"滿街跑的時代,基于MVC思想的MVC框架也越來越多。現在主流的框架除了Struts這個主力之外,其次就是Spring MVC了,而且相較于Struts,Spring MVC學習更加簡單,更加容易擴展。更為重要的是Spring MVC在性能上是優于struts的(關于兩者的優缺點現不提及了)。基于上述原因,對于中小型項目來說選擇Spring MVC框架進行開發是一個非常令人愉快的決定(SSH太煩了)!
           作為一名Java Web程序員,了解和掌握Spring MVC框架也應該提上日程了。

Spring Web MVC是什么

           作為學習的開篇,首先我們得先了解下Spring MVC到底是什么。
           Spring Web MVC是一種基于Java實現了Web MVC設計模式的請求驅動類型的輕量級Web框架,即使用了MVC架構模式的思想,將web層進行解耦,基于請求-響應模型幫助我們簡化日常web系統的開發。
           Spring Web MVC框架就是一種MVC框架。其前端控制器是DispatcherServlet主要用于控制流程;應用控制器為Handler Mapping-處理器映射器進行處理器管理和View Resolver-視圖解析器進行視圖的解析;頁面控制器/動作跳轉處理器為Controller接口;支持本地化解析、文件上傳等;提供了十分靈活的數據校驗、格式化和數據綁定機制;采用約定優于配置的契約式編程方式。

Spring Web MVC特點

  •   容易設計清爽干凈的web層。
  •   與Spring框架集成(IOC容器、AOP等)。
  •   提供約定優于配置的契約式編程支持。
  •   更加快捷、簡單的單元測試。
  •   靈活的URL到控制器的映射。
  •   支持Rest風格。
  •   ............................

Spring Web MVC框架

           Spring Web MVC框架也是一個基于驅動的MVC框架,通過實現Model-View-Controller模式很好的將數據、業務、展現進行分離。Spring Web MVC的設計是圍繞前端控制器DispatcherServlet來展開的,DispatcherSerlvet負責將請求根據映射規則分發給相應控制器 (Controller),根據可配置的Handler mappings處理請求并轉到相應的視圖。Spring Web MVC的整體處理流程如下:

20140410220519703.png

      上圖只是Spring MVC比較粗淺的執行過程,詳細的執行過程在后續學習中進行討論。由上圖可知,Spring MVC大致的執行流程如下:
                   
      1、首先瀏覽器發送請求給前端控制器DispatcherServlet,DispatcherSerlvet根據請求信息,基于一定的原則選擇合適的控制器進行處理并把 請求委托給它。
      2、頁面控制器接收到請求之后進行功能處理,首先需要收集、綁定請求參數到一個對象(命令對象),并進行驗證,然后將該對象委托給業務對象進行處理(service層);業務對象處理之后控制器將返回一個ModelAndView(模型數據和邏輯視圖名);
      3、DispatcherServlet根據返回的邏輯視圖名,選擇合適的視圖進行渲染(界面展示、資源加載),并把模型數據傳入以便視圖渲染。
      4、前端控制器將響應返回個客戶端瀏覽器。
      到此我們對于Spring Web MVC的概念,以及其粗略的工作流程有了一個大致的了解。接下來搭建一個具體的實例來作為學習Spring Web MVC框架的開端吧。

Spring MVC實例入門

Spring MVC環境搭建(Spring 3.2+Hibernate3)

JAR包引入

 1、Spring框架jar包引入
        將下載下來的spring-framwork.../dist/下的所有jar包拷貝到項目的web-inf/lib目錄下:
 2、Spring框架依賴jar包
       Apache commons logging日志:commons.logging.jar包;jstl標簽庫支持的jar,jstl1.1.2.JAR、standard-1.1.2.jar

配置文件

1、web.xml配置
    <?xml version="1.0" encoding="UTF-8"?>  
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">  
      <display-name>LCore</display-name>  
      <welcome-file-list>  
        <welcome-file>login.jsp</welcome-file>  
      </welcome-file-list>  

      <!-- 加載所有的配置文件  
       這里我將配置文件置于源碼包中  
        -->  
      <context-param>  
        <param-name>contextConfigLocation</param-name>  
        <param-value>classpath*:config/spring/spring-*.xml</param-value>  
      </context-param>  

      <!-- 配置Spring-->  
      <listener>  
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
      </listener>  

      <!-- 配置SpringMVC -->  
      <servlet>  
        <servlet-name>springMVC</servlet-name>  
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
        <init-param>  
            <param-name>contextConfigLocation</param-name>  
            <param-value>classpath*:config/spring/spring-mvc.xml</param-value>  
        </init-param>  
        <load-on-startup>1</load-on-startup>  
      </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>  

      <!-- 配置Session -->  
      <filter>  
        <filter-name>openSession</filter-name>  
        <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>  
      </filter>  
      <filter-mapping>  
        <filter-name>openSession</filter-name>  
        <url-pattern>/*</url-pattern>  
      </filter-mapping>  
    </web-app>  

2、spring-mvc.xml配置
    <?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: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.xsd  
        http://www.springframework.org/schema/context  
        http://www.springframework.org/schema/context/spring-context-3.2.xsd  
        http://www.springframework.org/schema/mvc  
        http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">  

        <!-- 注解掃描包 -->  
        <context:component-scan base-package="com.lcore.ctp.mng" />  
        <!-- 開啟注解 -->  
        <!-- 啟動spring mvc的注解功能,完成請求和注解POJO的映射 -->    
        <bean    
            class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">    
    <!--         配置信息轉換,將用@responsebody注解的返回值轉換為json返回前臺,編碼為utf-8-->    
            <property name="messageConverters">    
                <list>    
                </list>    
            </property>    
        </bean>    
        <mvc:interceptors>  
            <mvc:interceptor>  
                <!-- 需攔截的地址 -->  
                <!-- 一級目錄 -->  
                <mvc:mapping path="/*" />  
                <mvc:mapping path="/*.do" />  
                <mvc:mapping path="/*.ajax" />  
                <mvc:mapping path="/*.htm" />  

                <!-- 二級目錄 -->  
                <mvc:mapping path="/*/*" />  
                <mvc:mapping path="/*/*.do" />  
                <mvc:mapping path="/*/*.ajax" />  
                <mvc:mapping path="/*/*.htm" />  
                <!-- 需排除攔截的地址 -->  
                <mvc:exclude-mapping path="/login" />  
                <bean class="com.lcore.ctp.mng.Interceptor.SecurityInterceptor" />  
            </mvc:interceptor>  
        </mvc:interceptors>  
        <mvc:annotation-driven />  
        <!-- 靜態資源(js/image)的訪問 -->  
        <mvc:resources mapping="/res/**" location="/res/" />  
        <!-- 定義視圖解析器 -->    
        <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
            <property name="prefix" value="/WEB-INF/view/admin/"></property>  
            <property name="suffix" value=".jsp"></property>  
        </bean>  
    </beans>  
          上述的配置中筆者加了攔截器的配置,避免尚未登錄的用戶直接訪問其他頁面。
3、spring-common.xml文件
    <?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: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.xsd">  

        <!-- 配置數據源 -->  
        <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >  
            <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>  
            <property name="url" value="jdbc:mysql://localhost/ScoreMN"></property>  
            <property name="username" value="root"></property>  
            <property name="password" value="root"></property>  
        </bean>  

        <!-- 配置SessionFactory -->  
        <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">  
            <property name="dataSource" ref="dataSource" />  
            <property name="hibernateProperties">  
                <props>  
                    <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>  
    <!--                 <prop key="hibernate.hbm2ddl.auto">update</prop> -->  
    <!--                 <prop key="hibernate.show_sql">true</prop> -->  
    <!--                 <prop key="hibernate.format_sql">true</prop> -->  
                </props>  
            </property>  
            <property name="annotatedClasses">  
                <list>  
                    <value>com.lcore.ctp.mng.domain.User</value>  
                </list>  
            </property>  
        </bean>  

        <!-- 配置一個事務管理器 -->  
        <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">  
            <property name="sessionFactory" ref="sessionFactory"/>  
        </bean>  

        <!-- 配置事務,使用代理的方式 -->  
        <bean id="transactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">    
            <property name="transactionManager" ref="transactionManager"></property>    
            <property name="transactionAttributes">    
                <props>    
                    <prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>    
                    <prop key="modify*">PROPAGATION_REQUIRED,-myException</prop>    
                    <prop key="del*">PROPAGATION_REQUIRED</prop>    
                    <prop key="*">PROPAGATION_REQUIRED</prop>    
                </props>    
            </property>    
        </bean>   
    </beans>  
4、配置spring-beans.xml
<?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: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.xsd">  

    <bean id="userDao" class="com.lcore.ctp.mng.dao.UserDaoImpl">  
        <property name="sessionFactory" ref="sessionFactory"></property>  
    </bean>  

    <bean id="userServiceBase" class="com.lcore.ctp.mng.service.UserServiceImpl">  
        <property name="userDao" ref="userDao"></property>  
    </bean>  

    <!-- 此處為代理 -->  
    <bean name="userService" parent="transactionProxy">  
        <property name="target" ref="userServiceBase"></property>  
    </bean>     
</beans>

PO類

package com.lcore.ctp.mng.domain;  

import java.io.Serializable;  
import java.util.Date;  

import javax.persistence.Entity;  
import javax.persistence.GeneratedValue;  
import javax.persistence.Id;  
import javax.persistence.Inheritance;  
import javax.persistence.InheritanceType;  
import javax.persistence.Table;  

import org.hibernate.annotations.GenericGenerator;  

@Entity  
@Table(name = "user")  
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)  
public class User implements Serializable {  
    /** 
     *  
     */  
    private static final long serialVersionUID = 1L;  
    private String id;  
    private String name;  
    private String password;  
    @Id  
    @GeneratedValue(generator = "systemUUid")     
    @GenericGenerator(name = "systemUUid", strategy = "uuid")  
    public String getId() {  
        return id;  
    }  
    public void setId(String id) {  
        this.id = id;  
    }  
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  
    public String getPassword() {  
        return password;  
    }  
    public void setPassword(String password) {  
        this.password = password;  
    }  

}


Controller編寫

    package com.lcore.ctp.mng.controller.login;  

    import java.io.IOException;  
    import java.io.PrintWriter;  

    import javax.annotation.Resource;  
    import javax.servlet.http.HttpServletRequest;  
    import javax.servlet.http.HttpServletResponse;  

    import org.springframework.beans.factory.annotation.Autowired;  
    import org.springframework.stereotype.Controller;  
    import org.springframework.web.bind.annotation.RequestMapping;  

    import com.lcore.ctp.mng.controller.BaseController;  
    import com.lcore.ctp.mng.domain.User;  
    import com.lcore.ctp.mng.service.UserService;  


    @Controller  
    public class UserController extends BaseController{  

        @Resource(name="userService")  
        private UserService userService;  

        @RequestMapping("/login")//Controller訪問url  
        public String login(User user,HttpServletRequest request)  
        {  
            user.setPassword(request.getParameter("password"));  
            user.setName(request.getParameter("username"));  
            System.out.println(user.getName()+user.getPassword());  
            if(userService.login(user)){  
                request.getSession().setAttribute("user", user);  
                return "redirect:index";  
            }  
            else  
                return "/login";//登錄失敗則返回login.jsp界面  
        }  

        @RequestMapping("/loginOut")  
        public String loginOut(User user,HttpServletRequest request)  
        {  
            return "login";  
        }  

    }  

            編寫完Controller,前端如何訪問呢?需要將form表單的action屬性置為如下形式:
      
 
    action="<%=request.getContextPath()%>/login"  
          至此一個簡單的Spring MVC工程就完成了,可以看到的是對于Dao層,Servcie層這里我們仍使用的是用XML文件進行配置的,感覺十分的不靈活,實際上也可以使用注解的方式來實現,不過這里就不去具體實現了。
          OK,了解完Spring MVC大致的工作流程,能夠自己搭建一個簡單的基于Spring MVC的例子,知道配置文件中的相關配置項的作用。,對于Spring MVC框架的學習也算是能夠進行下去了吧!

來自:http://blog.csdn.net/lcore/article/details/23133579
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!