java web系列:spring mvc基础-亚博电竞手机版

1.web mvc基础

mvc的本质是表现层模式,我们以视图模型为中心,将视图和控制器分离出来。就如同分层模式一样,我们以业务逻辑为中心,把表现层和数据访问层代码分离出来是一样的方法。框架只能在技术层面上给我们帮助,无法在思考和过程上帮助我们,而我们很多人都不喜欢思考和尝试。

2.实现web mvc的基础

实现web mvc基础可以概括为1个前段控制器和2个映射。

(1)前端控制器frontcontroller

asp.net和jsp都是以page路径和url一一对应,web mvc要通过url映射controller和view,就需要一个前端控制器统一接收和解析请求,再根据的url将请求分发到controller。由于asp.net和java分别以ihttphandler和servlet作为核心,因此asp.net mvc和spring mvc分别使用实现了对应接口的mvchandler和dispatcherservlet作为前段控制器。

asp.net中通过httpmodule的实现类处理url映射,urlroutingmodule根据url将请求转发给前端控制器mvchandler。spring mvc中,则根据url的配置,直接将请求转发给前端控制器dispatcherservlet。

(2)url和contrller的映射

asp.net mvc将url和controller的映射规则存储在routecollection中,前端控制器mvchandler通过icontroller接口查找控制器。spring mvc则通过requestmapping和controller注解标识映射规则,无需通过接口依赖实现控制i器。

(3)url和view的映射

asp.net mvc 默认通过razorviewengine来根据url和视图名称查找视图,核心接口是iviewengine。spring mvc 通过internalresourceviewresolver根据url和视图名称查找视图,核心接口是viewresolver。

3.spring mvc的基础配置

(1)前端控制器dispatcherservlet初始化:abstractannotationconfigdispatcherservletinitializer

asp.net mvc初始化需要我们在httpapplication.application_start方法中注册默认的url和controller规则,spring mvc由于采用注解映射url和controller,因此没有对应的步骤。asp.net在根web.config中配置了urlroutingmodule可以将请求转发给mvchandler,spring mvc我们需要我们配置dispatcherservlet以及其对应的url来达到接管所有请求的目的,spring已经利用servlet3.0定义的servletcontainerinitializer机制,为我们提供了内置的abstractannotationconfigdispatcherservletinitializer,只要只需要像继承httpapplication的mvcapplication一样,写一个mvcinitializer。

package s4s;  import org.springframework.web.servlet.support.abstractannotationconfigdispatcherservletinitializer;  public class mvcinitializer extends abstractannotationconfigdispatcherservletinitializer {      @override     protected class[] getrootconfigclasses() {         return new class[] { };     }      @override     protected class[] getservletconfigclasses() {         return new class[] { mvcconfig.class };     }      @override     protected string[] getservletmappings() {         return new string[] { "/" };     }  }

(2)url和view的映射:webmvcconfigureradapter

asp.net的razorviewengine内置了view的path和扩展名.cshtml的规则。spring mvc的internalresourceviewresolver没有提供默认值,一般我们会指定将view放置在统一的视图目录中,使用特定的扩展名。spring同样提供了内置的webmvcconfigureradapter,我们只需写一个自己的mvcconfig继承它,重写configureviewresolvers方法即可。

package s4s;  import org.springframework.context.annotation.componentscan; import org.springframework.context.annotation.configuration; import org.springframework.web.servlet.config.annotation.enablewebmvc; import org.springframework.web.servlet.config.annotation.viewresolverregistry; import org.springframework.web.servlet.config.annotation.webmvcconfigureradapter; import org.springframework.web.servlet.view.internalresourceviewresolver;  @enablewebmvc @componentscan @configuration public class mvcconfig extends webmvcconfigureradapter {      @override     public void configureviewresolvers(viewresolverregistry registry) {         internalresourceviewresolver viewresolver = new internalresourceviewresolver();         viewresolver.setprefix("/web-inf/views/");         viewresolver.setsuffix(".jsp");         registry.viewresolver(viewresolver);     } }

4.spring mvc的controller、model和view

(1)url和controller的映射:

spring mvc和asp.net mvc的不同,不通过icontroller接口标识controller,也不通过routecollection定义url和controller,取而代之的是两个注解:controller和requestmapping。因此我们在普通的pojo类上应用@controller和@requestmapping即可。

package s4s;  import javax.validation.valid; import org.springframework.security.access.prepost.preauthorize; import org.springframework.security.core.context.securitycontextholder; import org.springframework.stereotype.controller; import org.springframework.validation.bindingresult; import org.springframework.web.bind.annotation.modelattribute; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.requestmethod; import org.springframework.web.bind.annotation.requestparam; import org.springframework.web.bind.annotation.responsebody;  @controller public class mycontroller {      @responsebody     @requestmapping(value = "/")     public string home() {         return "home";     }      @requestmapping(value = "/register")     public string register(@modelattribute("model") registerusermodel model) {         return "register";     }      @requestmapping(value = "/register", method = requestmethod.post)     public string register(@modelattribute("model") @valid registerusermodel model, bindingresult result) {         if (!result.haserrors()) {             return "redirect:/account";         }         return "register";     } }

(2)model:

通过使用@modelattribute、@valid和bindingresult参数,我们可以指定model的name是否参与验证并获取验证结果。为在model上使用注解验证,还需要引入validation-api和hibernate-validator。

asp.net将视图最终编译为webviewpage

网站地图