您的位置:首页 > 编程语言 > Java开发

springmvc工作流程及实例Demo

2016-08-05 15:43 411 查看


一、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;
}
}




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: