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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值