SpringMVC簡介和環境搭建
SpringMVC簡介
Spring 為展現層提供的基于 MVC 設計理念的優秀的Web 框架,是目前最主流的 MVC 框架之一,在Spring3.0 后全面超越 Struts2,成為最優秀的 MVC 框架,通過一套 MVC 注解,讓 POJO 成為處理請求的控制器,而無須實作任何介面,支持 REST 風格的 URL 請求,采用了松散耦合可插拔組件結構,比其他 MVC 框架更具擴展性和靈活性,
與Struts2比較
- springmvc的入口是一個servlet即前端控制器,而struts2入口是一個filter過慮器,
- springmvc是基于方法開發(一個url對應一個方法),請求引數傳遞到方法的形參,可以設計為單例或多例(建議單例),struts2是基于類開發,傳遞引數是通過類的屬性,只能設計為多例,
- Struts采用值堆疊存盤請求和回應的資料,通過OGNL存取資料,springmvc通過引數決議器是將request請求內容決議,并給方法形參賦值,將資料和視圖封裝成ModelAndView物件,最后又將ModelAndView中的模型資料通過reques域傳輸到頁面,Jsp視圖決議器默認使用jstl,
SpringMVC環境搭建
- web.xml配置
<!-- springmvc前端控制器,servlet-name見名知意即可 --> <servlet> <servlet-name>springMvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- servlet初始化引數,即組態檔內容 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:SpringMvc.xml</param-value> </init-param> <!-- 在tomcat啟動的時候就加載,數值越大優先級越低 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springMvc</servlet-name> <!--*.action 代表攔截后綴名為.action結尾的--> <url-pattern>*.action</url-pattern> </servlet-mapping> <!--服務器啟動的時候就會創建Filter,將init-param中的引數加載,注入到CharacterEncodingFilter 類中,瀏覽器每次發送請求都會經過這個過濾器--> <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> <!--encoding用來指定編碼格式,forceEncoding表示是否強制response的編碼格式--> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <!-- encoding filter for jsp page --> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
- Spring-mvc.xml配置
<!--啟用注解驅動--> <mvc:annotation-driven/> <!--配置注解掃描包,我們一般寫專案根路徑--> <context:component-scan base-package=“com.yuan.test” /> <!--回傳視圖決議器配置--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/" p:suffix=".jsp" /> <property name="viewClass" value="https://www.cnblogs.com/xrwdgj/p/org.springframework.web.servlet.view.JstlView"/> <!--控制器中使用MultiActionController時,使用path+方法名訪問指定方法--> <bean name="/test1/multi" class="com.yuan.test.MultiController"> <property name="methodNameResolver"> <ref bean="paramMethodResolver"/> </property> </bean> <!--vhttps://www.cnblogs.com/xrwdgj/p/alue="a" 可以按需設定--> <bean id="paramMethodResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver"> <property name="paramName" value="a"></property> </bean> 訪問url:http://localhost:8080/test/multi?a=methodName <!--檔案上傳--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="defaultEncoding" value="utf-8" /> <property name="maxUploadSize" value="100000" /> <property name="maxInMemorySize" value="960" /> </bean>
<!-- 配置視圖 BeanNameViewResolver 決議器: 使用視圖的名字來決議視圖 --> <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"> <!-- 通過 order 屬性來定義視圖決議器的優先級, order 值越小優先級越高且一定要設定order以保證InternalResourceViewResolver優先級最低,最后執行--> <property name="order" value="100"></property> </bean> <!-- 配置國際化資源檔案 --> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basename" value="i18n"></property> </bean> <!-- 可以直接相應轉發的頁面, 而無需再經過 Handler 的方法. path意義不大 --> <mvc:view-controller path="/success" view-name="success"/>
SpringMVC架構流程

- 用戶發送請求至前端控制器DispatcherServlet
- DispatcherServlet收到請求呼叫HandlerMapping處理器映射器,
- 處理器映射器根據請求url找到具體的處理器,生成處理器物件及處理器攔截器(如果有則生成)一并回傳給DispatcherServlet,
- DispatcherServlet通過HandlerAdapter處理器配接器呼叫處理器
- 執行處理器(Controller,也叫后端控制器),
- Controller執行完成回傳ModelAndView
- HandlerAdapter將controller執行結果ModelAndView回傳給DispatcherServlet
- DispatcherServlet將ModelAndView傳給ViewReslover視圖決議器
- ViewReslover決議后回傳具體View
- DispatcherServlet對View進行渲染視圖(即將模型資料填充至視圖中),
-
DispatcherServlet回應用戶
SpringMVC組件說明
- DispatcherServlet:前端控制器
用戶請求到達前端控制器,它就相當于mvc模式中的c,dispatcherServlet是整個流程控制的中心,由它呼叫其它組件處理用戶的請求,dispatcherServlet的存在降低了組件之間的耦合性,
- HandlerMapping:處理器映射器
HandlerMapping負責根據用戶請求找到Handler即處理器,springmvc提供了不同的映射器實作不同的映射方式,例如:組態檔方式,實作介面方式,注解方式@RequestMaping等,
- Handler:處理器
Handler 是繼DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler對具體的用戶請求進行處理,
由于Handler涉及到具體的用戶業務請求,所以一般情況需要程式員根據業務需求開發Handler,
- HandlAdapter:處理器配接器
通過HandlerAdapter對處理器進行執行,這是配接器模式的應用,通過擴展配接器可以對更多型別的處理器進行執行,如對標記@ResquestMapping的方法進行適配,
- View Resolver:視圖決議器
View Resolver負責將處理結果生成View視圖,View Resolver首先根據邏輯視圖名決議成物理視圖名即具體的頁面地址,再生成View視圖物件,最后對View進行渲染將處理結果通過頁面展示給用戶,
- View:視圖
springmvc框架提供了很多的View視圖型別的支持,包括:jstlView、freemarkerView、pdfView等,我們最常用的視圖就是jsp,
一般情況下需要通過頁面標簽或頁面模版技術將模型資料通過頁面展示給用戶,需要由程式員根據業務需求開發具體的頁面,
springmvc web專案在idea中配置
- 配置Project Structure





- 配置Tomcat

Springmvc示例
檔案上傳示例
/**上傳單個檔案*/ public String uploadOne(@RequestParam("file") CommonsMultipartFile file) throws IOException{ if(!file.isEmpty()){ try { /**將檔案存入D盤并重新命名*/ FileOutputStream fileOutputStream = new FileOutputStream("D:/" + new Date().getTime() + file.getOriginalFilename()); InputStream inputStream = file.getInputStream(); int byte = 0; while((byte=inputStream.read()) != -1){ fileOutputStream.write(byte); } fileOutputStream.flush(); fileOutputStream.close(); inputStream.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } } return "/success"; } /**一次性上傳多個檔案*/ public String uploadMore(HttpServletRequest request,HttpServletResponse response) throws IllegalStateException, IOException{ CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext()); if(multipartResolver.isMultipart(request)){ MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest)request; Iterator<String> iter = multiRequest.getFileNames(); while(iter.hasNext()){ MultipartFile file = multiRequest.getFile((String)iter.next()); if(file != null){ String fileName = "upload" + file.getOriginalFilename(); String path = "D:/" + fileName; File localFile = new File(path); file.transferTo(localFile); } } } return "/success"; }
與其他框架集成
與Spring集成
web.xml中添加
<!--集成spring--> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:config/spring-*.xml</param-value> </context-param>
與Hibernate集成
<beans> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="oracle.jdbc.driver.MySQL"/> <property name="url" value="jdbc:XXXXXXX"/> <property name="username" value=""/> <property name="password" value=""/> </bean> <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.Oracle10gDialect</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hiberante.format_sql">true</prop> </props> </property> <property name="configLocations"> <list> <value> classpath*:com/yuan/web/controller/hibernate/hibernate.cfg.test.xml </value> </list> </property> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <bean id="transactionBase" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" lazy-init="true" abstract="true"> <property name="transactionManager" ref="transactionManager"></property> <property name="transactionAttributes"> <props> <prop key="add*">PROPAGATION_REQUIRED,-Exception</prop> <prop key="update*">PROPAGATION_REQUIRED,-Exception</prop> <prop key="insert*">PROPAGATION_REQUIRED,-Exception</prop> <prop key="modify*">PROPAGATION_REQUIRED,-Exception</prop> <prop key="delete*">PROPAGATION_REQUIRED,-Exception</prop> <prop key="get*">PROPAGATION_NEVER</prop> </props> </property> </bean> <bean id="userDao" class="com.yuan.web.controller.dao.UserDAO"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <bean id="userManagerBase" class="com.yuan.web.controller.service.UserManager"> <property name="userDao" ref="userDao"></property> </bean> <bean id="userManager" parent="transactionBase"> <property name="target" ref="userManagerBase"></property> </bean> </beans>
與mybatis集成
sqlMapConfig.xml
<?xmlversion="1.0"encoding="UTF-8"?> <!DOCTYPEconfiguration PUBLIC"-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> </configuration>
applicationcontext-dao.xml
<?xmlversion="1.0"encoding="UTF-8"?> <beansxmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"> <!-- 加載組態檔 --> <context:property-placeholderlocation="classpath:db.properties"/> <!-- 資料庫連接池 --> <beanid="dataSource"class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <propertyname="driverClassName"value="${jdbc.driver}"/> <propertyname="url"value="${jdbc.url}"/> <propertyname="username"value="${jdbc.username}"/> <propertyname="password"value="${jdbc.password}"/> <propertyname="maxActive"value="10"/> <propertyname="maxIdle"value="5"/> </bean> <!-- mapper配置 --> <!-- 讓spring管理sqlsessionfactory 使用mybatis和spring整合包中的 --> <beanid="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 資料庫連接池 --> <propertyname="dataSource"ref="dataSource"/> <!-- 加載mybatis的全域組態檔 --> <propertyname="configLocation"value="classpath:mybatis/SqlMapConfig.xml"/> </bean> <!-- 配置Mapper掃描器 --> <beanclass="org.mybatis.spring.mapper.MapperScannerConfigurer"> <propertyname="basePackage"value="cn.itcast.springmvc.mapper"/> </bean> </beans>
db.properties
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/xxx?characterEncoding=utf-8 jdbc.username=root jdbc.password=root
applicationcontext-service.xml
<?xmlversion="1.0"encoding="UTF-8"?> <beansxmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"> <context:component-scanbase-package="com.yuan.springmvc.service"/> </beans>
applicationcontext-transaction.xml
<?xmlversion="1.0"encoding="UTF-8"?> <beansxmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"> <!-- 事務管理器 --> <beanid="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- 資料源 --> <propertyname="dataSource"ref="dataSource"/> </bean> <!-- 通知 --> <tx:adviceid="txAdvice"transaction-manager="transactionManager"> <tx:attributes> <!-- 傳播行為 --> <tx:methodname="save*"propagation="REQUIRED"/> <tx:methodname="insert*"propagation="REQUIRED"/> <tx:methodname="delete*"propagation="REQUIRED"/> <tx:methodname="update*"propagation="REQUIRED"/> <tx:methodname="find*"propagation="SUPPORTS"read-only="true"/> <tx:methodname="get*"propagation="SUPPORTS"read-only="true"/> </tx:attributes> </tx:advice> <!-- 切面 --> <aop:config> <aop:advisoradvice-ref="txAdvice" pointcut="execution(* com.yuan.springmvc.service.*.*(..))"/> </aop:config> </beans>
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/479205.html
標籤:Java
