springMVC是一个MVC框架,他控制着请求相应的整个流程,从请求一进入到应用服务器到相应离开,都离不开mvc框架

请求在应用服务器中

先说说请求相应在应用服务器的整个过程

  • DisptacherServlet接收到请求,并读取出请求中的数据
  • DisptacherServlet根据请求中的信息(url),去Handlermapping中查找url对应的资源(如果没有则报404)
  • 如果资源指向一个Controller,则将请求和请求数据发送给Controller
  • Controller处理请求(一般Controller将处理动作交给业务层处理),将处理好的数据和视图名返回给DisptacherServlet
  • DisptacherServlet根据视图名去查找ViewResolver视图解析器,将数据交给对应的视图处理
  • 视图(jsp,html等等)拿到数据后,渲染

清楚了请求在服务器中的流程后,知道了使用一个mvc框架我们要进行几步配置

  • 初始化DisptacherServlet(配置Handlermapping和Controller的位置)
  • 配置Handlermapping(ServletMapping)
  • 标识Controler,配置Controler要处理的url以及返回的视图名
  • 配置视图解析器

第二步和第三步是在一起的,因为Controler就是ServletHandlermapping和Controller的配置在web.xml中就相当于<servlet>和<servlet-mapping>DisptacherServlet需要从web.xml中拿关于springmvc的配置(servlel,servletmapping),才能调度整个流程

关于DisptacherServlet

(可以先跳过这部分,往后面看)DisptacherServlet是SpringMVC的调度中心,在这里请求会第一次进入到SpringMVCDisptacherServlet配置着SpringMVC运作的信息在以前,我们会在web.xml中配置SpringMVC,然后SpringMVC会根据web.xml中的配置初始化DisptacherServlet在servlet3.0之后,出现了ServletContainerInitializer,可以在项目启动最开始时,会自动扫描实现了ServletContainerInitializer接口的类,对Servlet、Listener、Filter进行动态注册,利用此技术,可以通过实现ServletContainerInitializer来配置DisptacherServlet(注册controller,ViewResolve),达到SpringMVC零配置的效果

关于ServletContainerInitializer

(可以先跳过这部分,往后面看)ServletContainerInitializer的作用和web.xml差不多,都是部署servlet,listener,filter,只是一个是用java代码配置,一个用xml配置在实现了ServletContainerInitializer接口的类上要注解上@HandlesTypes(//要动态注册的class,一定要是Servlet或者Listener或者Filter)ServletContainerInitializer接口中只有一个方法onStart(Set<Class>,ServletContext)当应用启动的时候,会调用onStart方法,参数Set<Class>就是@HandlesTypes中的类,意味着这些类可以被动态注册实现动态注册的核心方法:

  • addServlet(String name,Servlet servlet)
  • addFilter(String name,Filter filter)
  • addListener(Listener listener)

这些都是注册Servlet、listener、filter的方法显然还是有点麻烦,所以随着spring的发展,有更多简单的方法去配置现在最简单就是继承AbstractAnnotationConfigDispatcherServletInitializer,重写getServletConfigClasses、getServletMappings、getRootConfigClasses来配置DisptacherServlet

配置DisptacherServlet

这一步,跟配置web.xml作用差不多,就是要部署注册servlet在这里我们采用继承重写AbstractAnnotationConfigDispatcherServletInitializer的方法,来配置DisptacherServlet

public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer{

 //得到中间层(service、dao、aop、po等)的配置
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{DAOConf.class,ServiceConf.class,AOPConf.class};
} //得到controler和ViewResolver的配置
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConf.class};
} //标识哪些url要经过这个DisptacherServlet处理
@Override
protected String[] getServletMappings() {
return new String[]{"/"};//所有url都被DisptacherServlet处理
} }

SpringMVC配置

这一步是完成SpringMvcConf.class,这个类配置了一些controller和ViewResolver

@Configuration
@EnableWebMvc
//扫描控制器
@ComponentScan(includeFilters=@ComponentScan.Filter(type=FilterType.ANNOTATION,value=Controller.class))
public class SpringMvcConf extends WebMvcConfigurerAdapter { //配置视图解析器
//html解析
@Bean
public ViewResolver htmlResolver(){
InternalResourceViewResolver viewResolver=new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/view/");
viewResolver.setSuffix(".html");
return viewResolver;
}
//静态资源处理
//当DisptacherServlet接收到了他匹配的请求,但是找不到相应的Controller,就会把这个请求返回给默认的处理(比如交给tomcat处理)
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}

这里关键有几步:

  • @EnableWebMvc,开启springmvc
  • @ComponentScan开启自动扫包,扫描所有带有@Controller的Bean
  • 添加ViewResolver,这里的配置是使,视图路径为"/WEB-INF/view/"+Controller返回的视图名+".html"
  • 因为之前配置了所有路径都被DisptacherServlet接收,这会导致一些静态资源找不到controller去处理,结果出现404,configurer.enable()开启了之后,当springmvc不能处理的时候会交回给默认的处理

配置Controller

最简单配置

@Controller
public class IndexServlet {
@RequestMapping(value="/",method=RequestMethod.GET)//GET方法访问"/"的时候,调用此方法
public String get(Model model){
model.addAttribute("title","index");
return "index";
}
}

这是一个最简单的控制器,几个要点

  • 当类被@Controller注释时,该类就是一个控制器
  • 控制器中的方法被@RequestMapping标识,配置了这个方法访问的url和method
  • get方法有一个参数Model,这跟Request中的Attribute差不多,model.addAttribute就跟request.addAttribute一样

接收参数

接收参数形式有3种:?号传值,路径变量,提交表单

?号传值

访问形式:路径?参数名=值&参数名=值

 @RequestMapping(value="/login",method=RequestMethod.GET)
public String login(@RequestParam("username")String username,@RequestParam("password")String password){
return "login";
}

这样子就能拿到参数了

路径变量

这种也是用的比较多的,通过占位符来实现访问形式:路径/参数值

 @RequestMapping(value="/logout/{id}",method=RequestMethod.GET)
public String logout(@PathVariable("id")int id){
return "logout";
}

比如访问"/logout/123",123就是id参数

表单变量

当表单要上传一个对象的时候,这种方式就很好用了,springmvc会自动将读取表单数据然后实例化相应bean

 @RequestMapping(method=RequestMethod.POST,path="/user")
public String Post(User user){
return "post";
}

查看原文:http://zswlib.com/2016/07/15/springmvc%e5%9f%ba%e6%9c%ac%e4%bd%bf%e7%94%a8/

SpringMVC基本使用的更多相关文章

  1. 【分享】标准springMVC+mybatis项目maven搭建最精简教程

    文章由来:公司有个实习同学需要做毕业设计,不会搭建环境,我就代劳了,顺便分享给刚入门的小伙伴,我是自学的JAVA,所以我懂的.... (大图直接观看显示很模糊,请在图片上点击右键然后在新窗口打开看) ...

  2. Springmvc数据校验

    步骤一:导入四个jar包 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...

  3. 为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?

    今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架由struts2迁移到springMVC,我突然有了一个新的疑 ...

  4. 【SSM框架】Spring + Springmvc + Mybatis 基本框架搭建集成教程

    本文将讲解SSM框架的基本搭建集成,并有一个简单demo案例 说明:1.本文暂未使用maven集成,jar包需要手动导入. 2.本文为基础教程,大神切勿见笑. 3.如果对您学习有帮助,欢迎各种转载,注 ...

  5. 快速搭建springmvc+spring data jpa工程

    一.前言 这里简单讲述一下如何快速使用springmvc和spring data jpa搭建后台开发工程,并提供了一个简单的demo作为参考. 二.创建maven工程 http://www.cnblo ...

  6. redis集成到Springmvc中及使用实例

    redis是现在主流的缓存工具了,因为使用简单.高效且对服务器要求较小,用于大数据量下的缓存 spring也提供了对redis的支持: org.springframework.data.redis.c ...

  7. 流程开发Activiti 与SpringMVC整合实例

    流程(Activiti) 流程是完成一系列有序动作的概述.每一个节点动作的结果将对后面的具体操作步骤产生影响.信息化系统中流程的功能完全等同于纸上办公的层级审批,尤其在oa系统中各类电子流提现较为明显 ...

  8. springMVC学习笔记--知识点总结1

    以下是学习springmvc框架时的笔记整理: 结果跳转方式 1.设置ModelAndView,根据view的名称,和视图渲染器跳转到指定的页面. 比如jsp的视图渲染器是如下配置的: <!-- ...

  9. springMVC初探--环境搭建和第一个HelloWorld简单项目

    注:此篇为学习springMVC时,做的笔记整理. MVC框架要做哪些事情? a,将url映射到java类,或者java类的方法上 b,封装用户提交的数据 c,处理请求->调用相关的业务处理—& ...

  10. springmvc的拦截器

    什么是拦截器                                                         java里的拦截器是动态拦截action调用的对象.它提供了一种机制可以使 ...

随机推荐

  1. 开发该选择Blocks还是Delegates

    前文:网络上找了很多关于delegation和block的使用场景,发现没有很满意的解释,后来无意中在stablekernel找到了这篇文章,文中作者不仅仅是给出了解决方案,更值得我们深思的是作者独特 ...

  2. javascript 学习笔记

    本文主要记录在学习过程中遇到的JavaScript难点或者容易疏忽的细节,也方便自己日后翻阅学习. 1.arr.length === + arr.length arr.length === + arr ...

  3. 初学Python

    初学Python 1.Python初识 life is short you need python--龟叔名言 Python是一种简洁优美语法接近自然语言的一种全栈开发语言,由"龟叔&quo ...

  4. 前端MVVM框架设计及实现(一)

    最近抽出点时间想弄个dom模块化的模板引擎,不过现在这种都是MVVM自带的,索性就想自己造轮子写一个简单的MVVM框架了 借鉴的自然还是从正美的avalon开始了,我记得还是去年6月写过一个系列的av ...

  5. Android仿微信拍摄短视频

    近期做项目需要添加上传短视频功能,功能设置为类似于微信,点击开始拍摄,设置最长拍摄时间,经过研究最终实现了这个功能,下面就和大家分享一下,希望对你有帮助. 1.视频录制自定义控件: /** * 视频播 ...

  6. HTTP的长连接和短连接——Node上的测试

        本文主要从实践角度介绍长.短连接在TCP层面的表现,借助Node.JS搭建后台服务,使用WinHTTP.Ajax做客户端请求测试,最后简单涉及WebSocket.     关键字:长连接.短连 ...

  7. [Math] Backpropagation

    没啥自己的内容,推荐若干链接,这些是真爱,你值得拥有. Principles of training multi-layer neural network using backpropagation ...

  8. CSS3实现圆形进度条

    介绍 闲来无事,去了CSS3Plus网站逛了逛,发现了一个很有意思的实现--css3实现进度条.粗略看了下代码,发现原理其实很简单,不难理解. 现在在此讲述下原理并实现一个1s更新的进度条. 技术细节 ...

  9. js的并行加载以及顺序执行

    重新温习了下这段内容,发现各个浏览器的兼容性真的是搞大了头,处理起来很是麻烦. 现在现总结下并行加载多个js的方法: 1,对于动态createElement('script')的方式,对所有浏览器都是 ...

  10. 记录一则RMAN备份策略修正案例

    背景:在给某客户处理问题时,发现客户数据库的备份空间即将用尽,进一步查看发现是用户数据库的当前RMAN备份策略存在潜在问题,需要修改备份策略. 环境:SunOS 5.10 + Oracle 11.2. ...