日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring MVC 实践 - Base

發(fā)布時間:2025/3/17 javascript 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring MVC 实践 - Base 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Spring MVC 實踐

標(biāo)簽 : Java與Web


Spring Web MVC

Spring-Web-MVC是一種基于請求驅(qū)動的輕量級Web-MVC設(shè)計模式框架, Spring MVC使用MVC架構(gòu)思想, 對Web層進(jìn)行職責(zé)解耦,使用請求-響應(yīng)模型將數(shù)據(jù)、業(yè)務(wù)視圖進(jìn)行分離, 簡化開發(fā).


MVC

MVC(模型-視圖-控制器)是一個以設(shè)計界面應(yīng)用程序為基礎(chǔ)的架構(gòu)模式,通過分離模型-視圖-控制器在應(yīng)用中的角色將業(yè)務(wù)邏輯從界面中解耦:

  • 模型負(fù)責(zé)封裝應(yīng)用數(shù)據(jù)和業(yè)務(wù)邏輯;
  • 視圖僅負(fù)責(zé)展示數(shù)據(jù);
  • 控制器負(fù)責(zé)接收用戶請求,并調(diào)用模型(Service/Manger/DAO)來處理業(yè)務(wù)邏輯.模型可能會返回一些數(shù)據(jù)需要在視圖層展示,控制器就需要整理模型數(shù)據(jù)并調(diào)用視圖展示.

MVC模式的核心思想就是將業(yè)務(wù)邏輯從界面中分離出來,允許它們單獨改變而不會相互影響.


Spring MVC

Spring MVC框架是基于Java語言的MVC架構(gòu)具體實現(xiàn).他的設(shè)計圍繞DispatcherServlet展開,DispatcherServlet負(fù)責(zé)將請求分派給指定的Controller(Handler),通過可配置的HandlerMapping、HandlAdapter、Controller、ViewResolver來處理請求拿到數(shù)據(jù)并填充對應(yīng)的視圖View:

組件名稱描述
DispatcherServlet調(diào)度器/前端控制器DispatcherServlet是前端控制器模式的具體實現(xiàn)(詳細(xì)可參考Front Controller),他提供了整個Web應(yīng)用的集中訪問點,截獲請求并將其分派給指定的Controller,相當(dāng)于MVC中的C. 他的存在降低了組件之間的耦合性.
HandlerMapping處理器映射器HandlerMapping負(fù)責(zé)根據(jù)用戶請求URI找到對應(yīng)的Controller與Interceptor,并將它們封裝在HandlerExecutionChain中返回給DispatcherServlet.
HandlAdapter處理器適配器Spring MVC通過HandlerAdapter執(zhí)行Controller,這是適配器模式的應(yīng)用,通過擴(kuò)展適配器可以執(zhí)行更多類型的Controller.
Controller處理器Controller(又稱Handler)是繼DispatcherServlet前端控制器之后的后端控制器,在DispatcherServlet的控制下Controller對具體的用戶請求進(jìn)行處理.
ViewResolver視圖解析器負(fù)責(zé)將Model數(shù)據(jù)填充到View, 組合生成視圖展示:他首先將邏輯視圖名解析成物理視圖名,生成View視圖對象,最后對View進(jìn)行渲染(填充數(shù)據(jù)). Spring默認(rèn)提供了針對JSP/Velocity/PFD等視圖的ViewResolver實現(xiàn).

初識Spring MVC

需求: 用戶列表查詢.
  • 創(chuàng)建Maven Web項目
mvn archetype:generate -DgroupId=com.fq.mvc -DartifactId=MVC -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false -DarchetypeCatalog=internal
  • 依賴管理
    在pom.xml中添加Spring、Spring MVC、 SevletVelocity依賴:
<!-- Spring --> <dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version> </dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version> </dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${spring.version}</version> </dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${spring.version}</version> </dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>${spring.version}</version> </dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring.version}</version> </dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring.version}</version> </dependency><!-- WEB --> <dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>${servlet.version}</version> </dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version> </dependency><!-- Velocity --> <dependency><groupId>org.apache.velocity</groupId><artifactId>velocity</artifactId><version>${velocity.version}</version> </dependency> <dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-tools</artifactId><version>${velocity.tools.version}</version> </dependency>
  • 配置DispatcherServlet(web.xml)
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0"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/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"><display-name>MVC</display-name><!-- 配置SpringMVC --><servlet><servlet-name>mvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><!-- contextConfigLocation: 指定MVC配置文件位置 --><param-name>contextConfigLocation</param-name><param-value>classpath:spring/mvc-servlet.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><!-- 攔截所有以.do結(jié)尾的URL --><servlet-name>mvc</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping> </web-app>
  • 配置HandlerMapping/HandlerAdapter(mvc-servlet.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"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 處理器映射器 --><bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/><!-- 處理器適配器 --><bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> </beans>
  • Controller
/*** @author jifang* @since 16/3/15 下午4:40.*/ public class UserController implements Controller {@Overridepublic ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {List<User> users = new ArrayList<>();users.add(new User(1, "翡青", new Date(), 1, "浙江-杭州"));users.add(new User(2, "小芳", new Date(), 2, "山東-青島"));ModelAndView result = new ModelAndView();result.addObject("users", users);result.setViewName("users");return result;} } <!-- 裝配 Controller --> <bean name="/mvc/users.do" class="com.fq.mvc.controller.UserController"/>
  • 配置ViewResolver(mvc-servlet.xml)
    由于我們視圖選用的是Velocity,因此配置VelocityViewResolver:
<!-- 配置視圖解析器 --> <bean id="viewResolver"class="org.springframework.web.servlet.view.velocity.VelocityViewResolver"><property name="suffix" value=".vm"/><property name="contentType" value="text/html;charset=UTF-8"/><property name="dateToolAttribute" value="dateTool"/><property name="numberToolAttribute" value="numberTool"/><property name="exposeRequestAttributes" value="false"/><property name="exposeSessionAttributes" value="true"/> </bean><!-- 配置Velocity --> <bean id="velocityConfigurer"class="org.springframework.web.servlet.view.velocity.VelocityConfigurer"><!-- 設(shè)置VM模板放置位置--><property name="resourceLoaderPath" value="views"/><!-- 防止亂碼 --><property name="velocityProperties"><props><prop key="input.encoding">UTF-8</prop><prop key="output.encoding">UTF-8</prop></props></property> </bean>
  • View(/views/users.vm)
<html> <head><title>用戶列表</title><link rel="stylesheet" href="/css/main.css"><meta http-equiv="content-type" content="text/html; charset=UTF-8"/> </head> <body> <div id="global"><fieldset><legend>用戶列表:</legend><table width="100%" border=0><tr><td>ID</td><td>username</td><td>birthday</td><td>sex</td><td>address</td></tr>#foreach($user in $users)<tr><td>${user.id}</td><td>${user.name}</td><td>${user.birthday}</td>#if(${user.sex} == 1)<td></td>#else<td></td>#end<td>${user.address}</td></tr>#end</table></fieldset> </div> </body> </html>

參考: main.css地址:OSChina


小結(jié)

  • 前端控制器
    Spring MVC DispatcherServlet的url-pattern有兩種配置方式:

    • *.do: 攔截所有以.do結(jié)尾的URI.
    • / : 攔截 所有 URI.
  • 處理器映射器
    BeanNameUrlHandlerMapping指定將Bean的Name作為URI映射; Spring還提供了SimpleUrlHandlerMapping將URI和Controller的id統(tǒng)一映射配置.

  • 處理器適配器
    SimpleControllerHandlerAdapter對所有實現(xiàn)了Controller接口的JavaBean適配.Spring還提供HttpRequestHandlerAdapter對所有實現(xiàn)了HttpRequestHandler接口的JavaBean適配.

  • 視圖解析器
    前面使用Velocity作為視圖展示,如果使用的是JSP的話, 需要配置另一種視圖解析器InternalResourceViewResolver:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!-- "JstlView"表示可以在JSP頁面JSTL標(biāo)簽庫,所以需要在項目中添加JSTL依賴 --><property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/><property name="prefix" value="/views"/><property name="suffix" value=".jsp"/> </bean>

注解初步

從2.5版本開始, Spring引入了注解開發(fā):

  • 注解驅(qū)動(mvc-servlet.xml)
    • 從3.1版本開始,Spring MVC使用RequestMappingHandlerMapping 注解式處理器映射器 對標(biāo)有@ResquestMapping的方法進(jìn)行映射.
    • 從3.1版本開始,Spring MVC使用RequestMappingHandlerAdapter 注解式處理器適配器 對標(biāo)記有@ResquestMapping的方法進(jìn)行適配.
    • Spring MVC使用<mvc:annotation-driven/> 注解驅(qū)動自動加載RequestMappingHandlerMapping和RequestMappingHandlerAdapter及其他相關(guān)配置. 因此在mvc-servlet.xml最簡單有效的配置方式是使用<mvc:annotation-driven/>替代注解處理器和適配器:
<mvc:annotation-driven/>

盡管<mvc:annotation-driven/>很小, 但他具有足夠的威力, 它注冊了很多的特性, 包括對JSR-303校驗、信息轉(zhuǎn)換以及對域格式化的支持.

  • 組件掃描(mvc-servlet.xml):
    使用Spring的組件掃描來省去為每個Controller注冊的麻煩:
<context:component-scan base-package="com.fq.mvc.controller"/>
  • 注解Controller
@Controller @RequestMapping("/mvc") public class UserController {@RequestMapping("/users.do")public ModelAndView users() {List<User> users = new ArrayList<>();users.add(new User(1, "翡青", new Date(), 1, "浙江-杭州"));users.add(new User(2, "小芳", new Date(), 2, "山東-青島"));ModelAndView result = new ModelAndView();result.addObject("users", users);result.setViewName("users");return result;} } 使用基于注解的`Controller`有以下優(yōu)點:- 基于注解的`Controller`請求映射關(guān)系不存儲在配置文件中,使用`@RequestMappeing`便可以對一個方法進(jìn)行映射.- 一個`Controller`內(nèi)可以有多個處理方法,可以響應(yīng)多個動作,這樣就允許將同一模塊的多個操作寫在同一個`Controller`里面,便于模塊劃分,且減少類的數(shù)量.

集成MyBatis

  • 通過Spring將各層整合:
    • 持久層DAO(MyBatis的Mapper)注冊到Spring容器中.
    • 業(yè)務(wù)層Service/Manager從Spring容器中拿到DAO接口, 并注冊Service服務(wù).
    • 表現(xiàn)層Controller從Spring容器中拿到Service接口, 通過Spring MVC進(jìn)行數(shù)據(jù)展示.
需求: 展示所有用戶數(shù)據(jù)(由于數(shù)據(jù)模型較簡單, 因此從DAO到Controller只使用一個DO對象-User).
  • 依賴管理
<!-- Spring --> <dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version> </dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version> </dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${spring.version}</version> </dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${spring.version}</version> </dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>${spring.version}</version> </dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring.version}</version> </dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring.version}</version> </dependency><!-- AOP --> <dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>${spring.version}</version> </dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>${spring.version}</version> </dependency><!-- WEB --> <dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>${servlet.version}</version> </dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version> </dependency><!-- Velocity --> <dependency><groupId>org.apache.velocity</groupId><artifactId>velocity</artifactId><version>${velocity.version}</version> </dependency> <dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-tools</artifactId><version>${velocity.tools.version}</version> </dependency><!-- DB --> <dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.3.0</version> </dependency> <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version> </dependency> <dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId><version>${hikaricp.version}</version> </dependency><!-- Spring DB支持 --> <dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version> </dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>${spring.version}</version> </dependency> <dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>${mybatis.spring.version}</version> </dependency><!-- log --> <dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>${logback.version}</version> </dependency>

集成MyBatis

  • mybatis-configuration.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration><mappers><mapper resource="mybatis/mapper/UserDAO.xml"/></mappers> </configuration>
  • domain: User
/*** @author jifang.* @since 2016/5/26 11:16.*/ public class User {private int id;private String name;private Date birthday;private int sex;private String address;public User() {}public User(int id, String name, Date birthday, int sex, String address) {this.id = id;this.name = name;this.birthday = birthday;this.sex = sex;this.address = address;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public int getSex() {return sex;}public void setSex(int sex) {this.sex = sex;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;} }
  • UserDAO
/*** @author jifang* @since 16/3/20 下午5:47.*/ public interface UserDAO {List<User> selectAllUsers(); } <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.fq.mvc.dao.UserDAO"><select id="selectAllUsers" resultType="com.fq.mvc.domain.User">SELECT *FROM user;</select></mapper>
  • applicationContext-datasource.xml(配置數(shù)據(jù)源)
<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"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><context:property-placeholder location="classpath:db.properties"/><!-- 配置數(shù)據(jù)源 --><bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig"><property name="driverClassName" value="${mysql.driver.class}"/><property name="jdbcUrl" value="${mysql.url}"/><property name="username" value="${mysql.user}"/><property name="password" value="${mysql.password}"/><property name="maximumPoolSize" value="5"/><property name="maxLifetime" value="700000"/><property name="idleTimeout" value="600000"/><property name="connectionTimeout" value="10000"/><property name="dataSourceProperties"><props><prop key="dataSourceClassName">com.mysql.jdbc.jdbc2.optional.MysqlDataSource</prop><prop key="cachePrepStmts">true</prop><prop key="prepStmtCacheSize">250</prop><prop key="prepStmtCacheSqlLimit">2048</prop></props></property></bean><bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close"><constructor-arg ref="hikariConfig"/></bean><!-- 配置SqlSessionFactory --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/><property name="configLocation" value="classpath:mybatis/mybatis-configuration.xml"/></bean><!-- 基于包掃描的mapper配置 --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.fq.mvc.dao"/><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/></bean><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean></beans>
  • db.properties
## Data Source mysql.driver.class=com.mysql.jdbc.Driver mysql.url=jdbc:mysql://host:port/db?characterEncoding=utf-8 mysql.user=user mysql.password=password

集成Service

public interface UserService {List<User> getAllUsers(); } @Service public class UserServiceImpl implements UserService {@Autowiredprivate UserDAO dao;@Overridepublic List<User> getAllUsers() {return dao.selectAllUsers();} }
  • applicationContext.xml(配置組件掃描與事務(wù)控制)
<?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:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><import resource="applicationContext-datasource.xml"/><context:component-scan base-package="com.fq.mvc.service"/><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="select*" timeout="-1" propagation="REQUIRED" read-only="true"/></tx:attributes></tx:advice><aop:config><aop:advisor advice-ref="txAdvice" pointcut="execution(* com.fq.mvc.service.impl.UserServiceImpl.*(..))"/></aop:config></beans>

集成MVC

  • Controller
@Controller @RequestMapping("/mvc") public class UserController {@Autowiredprivate UserService service;@RequestMapping(value = "/user.do")public ModelAndView users() {List<User> users = service.getAllUsers();return new ModelAndView("users", "users", users);} }
  • mvc-servlet.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:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><mvc:annotation-driven/><context:component-scan base-package="com.fq.mvc.controller"/><!-- 配置視圖解析器 --><bean id="viewResolver"class="org.springframework.web.servlet.view.velocity.VelocityViewResolver"><property name="suffix" value=".vm"/><property name="contentType" value="text/html;charset=UTF-8"/><property name="dateToolAttribute" value="dateTool"/><property name="numberToolAttribute" value="numberTool"/><property name="exposeRequestAttributes" value="false"/><property name="exposeSessionAttributes" value="true"/></bean><!-- 配置Velocity --><bean id="velocityConfigurer"class="org.springframework.web.servlet.view.velocity.VelocityConfigurer"><!-- 設(shè)置VM模板放置位置--><property name="resourceLoaderPath" value="views"/><!-- 防止亂碼 --><property name="velocityProperties"><props><prop key="input.encoding">UTF-8</prop><prop key="output.encoding">UTF-8</prop></props></property></bean> </beans>
  • web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0"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/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"><display-name>MVC</display-name><!-- 加載Spring --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring/applicationContext.xml</param-value></context-param><!-- 加載SpringMVC --><servlet><servlet-name>mvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring/mvc-servlet.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>mvc</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping> </web-app>
  • View視圖同前

集成log

為了能夠看到Spring MVC的運行時信息, 最好在應(yīng)用中集成一種Log實現(xiàn), 在此選用LogBack:

  • logback.xml
<configuration><property name="log_root_dir" value="/data/logs/mvc/"/><property name="log_pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{0} - %msg%n"/><appender name="STD_OUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>${log_pattern}</pattern></encoder></appender><appender name="FILE_OUT" class="ch.qos.logback.core.rolling.RollingFileAppender"><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${log_root_dir}/mvc-server.%d{YY-MM-dd}.log</fileNamePattern><maxHistory>7</maxHistory></rollingPolicy><encoder><pattern>${log_pattern}</pattern></encoder></appender><root level="DEBUG"><appender-ref ref="STD_OUT"/><appender-ref ref="FILE_OUT"/></root></configuration>

注解開發(fā)

需求: 實現(xiàn)User添加.
  • add_user.vm
<html> <head><title>用戶添加</title><link rel="stylesheet" href="/css/main.css"><meta http-equiv="content-type" content="text/html; charset=UTF-8"/> </head> <body> <div id="global"><fieldset><legend>Add a User</legend><form action="/mvc/add_user.do" method="post"><p><label for="name">username: </label><input type="text" name="name" tabindex="1"></p><p><label for="birthday">birthday: </label><input type="text" name="birthday" tabindex="2"/></p><p><label for="sex">sex: </label><select name="sex" tabindex="3"><option value="1"></option><option value="2"></option></select></p><p><label form="address">address: </label><input type="text" name="address" tabindex="4"></p><p id="buttons"><input type="reset" tabindex="5"><input type="submit" tabindex="6" value="Add User"></p></form></fieldset> </div> </body> </html>
  • Controller
@RequestMapping("/add_user.do") public String addUser(User user){service.addUser(user);return "redirect: users.do"; }
  • Service/DAO實現(xiàn)簡單,不再贅述.

請求參數(shù)解析

在傳統(tǒng)的Servlet編程中, 可以使用HttpServletRequest的getParameter()方法來獲取請求參數(shù)值, 而在Spring MVC中, 它會調(diào)用請求參數(shù)解析組件將客戶端傳過來的String字符串解析為指定的Java對象并傳遞給Controller, 這個過程稱為請求參數(shù)解析.

Spring MVC默認(rèn)提供了很多參數(shù)解析組件, 因此Controller的請求處理方法默認(rèn)就可以接收很多不同類型:

JavaEEJavaSESpring
ServletRequest / HttpServletRequestInputStream / ReaderWebRequest / NativeWebRequest
ServletResponse / HttpServletResponseOutputStream / WriterModel / ModelMap
HttpSession命令或表單對象 (如String / Integer / User)RedirectAttributes
HttpEntity<?>Array / List / MapErrors / BindingResult
帶@PathVariable / @MatrixVariable注解的對象@RequestParam / @RequestHeader / @RequestBody / @RequestPart
Principal / LocaleSessionStatus
UriComponentsBuilder

注:
1. 如果Controller形參名與URI中name不一致, 可使用@RequestParam注解對其進(jìn)行修飾.
2. Spring MVC還支持路徑變量映射(路徑變量類似于請求參數(shù), 但沒有key部分, 只是一個值, 詳細(xì)可參考博客Spring MVC URL 路徑映射).


ModelAttribute

Spring MVC會在每次調(diào)用請求處理方法時都創(chuàng)建一個Model對象, 若打算使用該實例, 則可以在方法的形參添加一個Model形參. 其實還可以使用@ModelAttribute注解來訪問Model實例: 使用@ModelAttribute注解標(biāo)注參數(shù)或方法,該方法會將其輸入的或創(chuàng)建的參數(shù)對象添加到Model對象中:

  • @ModelAttribute標(biāo)注形參
@RequestMapping("/check_id.do") public String checkId(@ModelAttribute("id") String id, Model model){return "check_id"; }

String實例將以id做key添加到Model對象中(如果key未命名,則默認(rèn)使用類型的名稱(如string)做key).

  • @ModelAttribute標(biāo)注方法
    @ModelAttribute的第二個用途是標(biāo)注一個非請求處理方法: 被@ModelAttribute標(biāo)注的方法會在每次調(diào)用Controller的請求處理方法時調(diào)用.該方法可以返回對象或void:

如果返回對象, 該對象會自動添加到Model中:

@ModelAttribute private List<User> addUser() {return service.getAllUsers(); }

若返回void, 則必須添加一個Model類型參數(shù), 自行將實例添加到Model中:

@ModelAttribute private void addUser(Model model) {model.addAttribute("users", service.getAllUsers()); }

重定向與Flash屬性

使用重定向的一個重要場景是避免用戶重新加載頁面再次調(diào)用相同動作. 比如add_user.do: 當(dāng)用戶提交表單時會將用戶信息插入數(shù)據(jù)庫. 但如果在提交表單后重新加載頁面, add_user.do會被再次調(diào)用, 相同的用戶可能會被再次添加.為了避免這種情況, 最好的辦法是在提交表單后將用戶重定向到一個不同的頁面,這個頁面任意重新加載都沒有副作用.

但使用重定向的一個不便之處在于: 無法輕松的給目標(biāo)頁面?zhèn)髦?/strong>. 如果采用轉(zhuǎn)發(fā), 可屬性添加到Model, 使得目標(biāo)視圖可以輕松訪問. 但用戶重定向需要經(jīng)過客戶端, 所以Model的一切內(nèi)容都會在重定向中丟失. 幸運的是, 在Spring 3.1之后,可以通過Flash屬性提供重定向傳值的方法:

要使用Flash屬性, 必須要有<annotation-driven/>注解驅(qū)動支持, 然后在方法上添加一個新的參數(shù)類型RedirectAttributes:

@RequestMapping("/add_user.do") public String addUser(User user, RedirectAttributes attributes){service.addUser(user);attributes.addAttribute("message", "new user has been saved to DB.");return "redirect: /views/message.vm"; }

Controller返回值

應(yīng)用了@Controller與@RequestMapping注解之后,Controller不再需要implements特定的接口, 因此Controller的返回值也變得多種多樣:

返回值描述
ModelAndView包含視圖名與Model數(shù)據(jù)
Model
Map包含模型的屬性
View
String代表邏輯視圖名
void可以在參數(shù)中傳入request/response完成對參數(shù)的解析, 對客戶端的響應(yīng)
HttpEntity/ResponseEntity提供對Servlet的訪問, 以響應(yīng)HTTP頭部和內(nèi)容
Callable
DeferredResult
其他任意類型常與響應(yīng)JSON/XML結(jié)合

新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎!定制產(chǎn)品紅包拿不停!

總結(jié)

以上是生活随笔為你收集整理的Spring MVC 实践 - Base的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。