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