springmvc工作流程及实例Demo
一、Spring工作流程描述
1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;
2. DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;
3. DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)
4. 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
5. Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;
6. 根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;
7. ViewResolver 结合Model和View,来渲染视图
8. 将渲染结果返回给客户端。
Spring工作流程描述
为什么Spring只使用一个Servlet(DispatcherServlet)来处理所有请求?
详细见J2EE设计模式-前端控制模式
Spring为什么要结合使用HandlerMapping以及HandlerAdapter来处理Handler?
符合面向对象中的单一职责原则,代码架构清晰,便于维护,最重要的是代码可复用性高。如HandlerAdapter可能会被用于处理多种Handler。
二、springMVC DEMO
1、所需要的jar包------->spring-framework-4.1.6.RELEASE+commons.logging-1.2.jar。
2、创建一个web项目TestspringMvc,在web.xml中添加关于如下配置:
<servlet> <servlet-name>springmvc</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/xml/spring/spring-mvc.xml</param-value> </init-param> <!-- <load-on-startup>1</load-on-startup> --> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.do</url-pattern> //匹配全部do结尾的请求 </servlet-mapping>
url-pattern还有一种写法是<url-pattern>/*</url-pattern>,这种写法的意思是匹配根路径下的全部请求。这里配置的是前置控制器DispatcherServlet,其功能是
拦截匹配的请求,Servlet拦截匹配规则要自已定义,把拦截下来的请求,依据相应的规则分发到目标Controller来处理。
3、在src下添加spring-mvc.xml:
<span style="font-family:SimSun;"><?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:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd"> <!—扫描包和子包--> <context:component-scan base-package="test.SpringMVC"/> //base-package有多种写法 <!—不处理静态资源--> <mvc:default-servlet-handler /> <!--如果你使用注解后必须配置,<mvc:annotation-driven /> 会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter 两个bean,是spring MVC为@Controllers分发请求所必须的--> <mvc:annotation-driven /> //注解意义详见:http://kingliu.iteye.com/blog/1972973 <!-- 配置<span style="color:#555555;">视图名称解析器</span>--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <!-- 前缀 --> <property name="prefix" value="/WEB-INF/jsp/" /> <!-- 后缀 --> <property name="suffix" value=".jsp" /> </bean> </beans> </span>
4、在WEB-INF文件夹下创建名为jsp的文件夹,用来存放jsp视图。创建一个hello.jsp,在body中添加“Hello World”。
5、编写controller代码:
@Controller @RequestMapping("/mvc") public class mvcController { @RequestMapping("/hello") public String hello(){ return "hello"; } }
Controller注解的作用是负责注册一个bean 到spring 上下文中,RequestMapping注解的作用是为控制器指定可以处理哪些 URL 请求。
6、http://localhost:8080/TestspringMvc/mvc/hello。
三、常用注解
@ResponseBody:该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区;
@RequestParam:在处理方法入参处使用 @RequestParam 可以把请求参 数传递给请求方法;
四、springMVC之参数应用
1、自动匹配基类类型的参数
@RequestMapping("/person") public String toPerson(String name,double age){ System.out.println(name+" "+age); return "hello"; }
2、自动装箱
//编写一个Person实体类 public class Person { public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } private String name; private int age; }
//controller @RequestMapping("/person1") public String toPerson(Person p){ System.out.println(p.getName()+" "+p.getAge()); return "hello"; }
3、使用InitBinder来处理Date类型的参数
//参数在initBinder时被转化 @RequestMapping("/date") public String date(Date date){ System.out.println(date); return "hello"; } //初始化的时候,将类型“字符串”类型“日期” @InitBinder public void initBinder(ServletRequestDataBinder binder){ binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true)); }4、向前台传递数据
@RequestMapping("/show") public String showPerson(Map<String,Object> map){ Person p =new Person(); map.put("p", p); p.setAge(20); p.setName("jayjay"); return "show"; }
5使用ajax调用
//使用ajax的方式传递参数到前台 @RequestMapping("/getPerson") public void getPerson(String name,PrintWriter pw){ pw.write("hello,"+name); } @RequestMapping("/name") public String sayHello(){ return "name"; } //前台用下面的Jquery代码调用 $(function(){ $("#btn").click(function(){ $.post("mvc/getPerson",{name:$("#name").val()},function(data){ alert(data); }); }); });6、返回json格式的字符串(需要导入jar包:jackson-annotations.jar;jackson-core.jar;jackson-databind.jar)
@Controller @RequestMapping("/json") public class jsonController { @ResponseBody @RequestMapping("/user") public User get(){ User u = new User(); u.setId(1); u.setName("jayjay"); u.setBirth(new Date()); return u; } }
- 了解SpringMVC框架及基本工作流程
- 笔记:SpringMVC的工作流程
- 【SpringMVC架构】SpringMVC入门实例,解析工作原理(二)
- Spring(7):Mybatis 与 Spring 整合小结与实例分析--从Log分析Spring的工作流程(下)
- 浅谈SpringMVC工作流程
- springmvc的工作流程
- SpringMVC的工作流程
- SpringMVC工作流程
- SpringMVC简介、工作流程、配置
- springMVC框架及基本工作流程
- SpringMVC的工作流程。(java后台开发面试必问)
- SpringMvc工作流程及常用配置
- SpringMVC的工作流程
- 浅谈SpringMVC之架构与工作流程
- springMVC、struts1工作流程
- SpringMVC-DispatcherServlet工作流程及web.xml配置
- svn经典工作流程实例模拟
- SSM框架_SpringMVC框架_SpringMVC工作流程图文详解***
- SpringMVC的整体工作流程
- J2EE进阶(六)SSH框架工作流程项目整合实例讲解