SpringMVC之入门(一)

JavaEE体系结构

这里写图片描述

什么是MVC

model1

这里写图片描述

model2

这里写图片描述

Springmvc是什么?

Springmvc是一个web层mvc框架,类似struts2.

Springmvc和Spring?

这里写图片描述

结论:Springmvc是Spring的部分。

Springmvc执行流程

这里写图片描述
步骤:

  1. 发起请求到前端控制器(DispatcherServlet)
  2. 前端控制器请求处理器映射器(HandlerMapping)查找Handler(可根据xml配置、注解进行查找)
  3. 处理器映射器(HandlerMapping)向前端控制器返回Handler
  4. 前端控制器调用处理器适配器(HandlerAdapter)执行Handler
  5. 处理器适配器(HandlerAdapter)去执行Handler
  6. Handler执行完,给适配器返回ModelAndView(Springmvc框架的一个底层对象)
  7. 处理器适配器(HandlerAdapter)向前端控制器返回ModelAndView
  8. 前端控制器(DispatcherServlet)请求视图解析器(ViewResolver)进行视图解析,根据逻辑视图名解析成真正的视图(jsp)
  9. 视图解析器(ViewResolver)向前端控制器(DispatcherServlet)返回View
  10. 前端控制器进行视图渲染,即将模型数据(在ModelAndView对象中)填充到request域
  11. 前端控制器向用户响应结果

三种处理器映射器(HandlerMapping)

BeanNameUrlHandlerMapping
功能:寻找Controller
根据url请求去匹配bean的name属性url,从而获取Controller

SimpleUrlHandlerMaping
功能:寻找Controller
根据url请求匹配简单url的key,然后根据与key相对应的Controller的id找到Controller

ControllerClassNameHandlerMapping
功能:寻找Controller
根据类名(MyController)类名.do来访问,类名首字母小写

问题:映射器之间能不能共存?
3个处理器映射器可以共存。

两种处理器适配器(HandlerAdapter)

SimpleControllerHandlerAdapter
功能:执行controller
调用controller里面方法,返回modelAndView

HttpRequestHandlerAdapter
功能:执行controller,类似于Struts2的action

问题:2个处理器适配器能不能共存?
可以共存


入门示例

创建Web项目,导入jar包

这里写图片描述

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>Springmvc01</display-name>

  <filter>
    <filter-name>characterEncoding</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
  </filter>

  <filter-mapping>
    <filter-name>characterEncoding</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 默认加载方式
       默认加载必须规范:
       * 文件命名:servlet-name-servlet.xml====springmvc-servlet.xml
       * 路径规范:必须在WEB-INF目录下面
    -->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc.xml</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

springmvc.xml

<?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:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.2.xsd 
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 
        http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">

    <!-- 配置处理器映射器,三个,互不冲突 -->
    <!-- BeanNameUrlHandlerMapping(默认):根据bean(自定义Controler)的name属性的url去寻找hanler(Action:Controller) -->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
    <!-- SimpleUrlHandlerMapping:把Url进行集中配置,根据bean(自定义Controler)的id属性去寻找handler -->
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="a.do">myController</prop>
                <prop key="b.do">myHttpController</prop>
            </props>
        </property>
    </bean>
    <!-- ControllerClassNameHandlerMapping:通过 类名.do 形式来访问Controller -->
    <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"></bean>

    <!-- 配置处理器适配器,两个,互不冲突 -->
    <!-- SimpleControllerHandlerAdapter(默认)负责执行实现接口Controller的后端控制器  -->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
    <!-- HttpRequestHandlerAdapter负责执行实现接口HttpRequestHandler的后端控制器  -->
    <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>

    <!-- 配置自定义Controler -->
    <bean id="myController" name="/hello.do" class="com.zyj.springmvc.controller.MyController"></bean>
    <bean id="myHttpController" class="com.zyj.springmvc.controller.MyHttpController"></bean>

    <!-- 配置视图解析器 
        后台返回逻辑试图:index
        视图解析器解析出真正物理视图:前缀+逻辑试图+后缀====/WEB-INF/jsps/index.jsp
    -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsps/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

</beans>

MyController.java

public class MyController implements Controller {

    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        // 接受请求,接受参数,验证参数
        //封装参数,调用业务方法
        //返回视图
        ModelAndView mv = new ModelAndView();
        //设置页面回显数据
        mv.addObject("hello", "MyController");

        //指定跳转的视图
        //返回物理视图
        //mv.setViewName("/WEB-INF/jsps/index.jsp");
        //返回逻辑视图
        mv.setViewName("index");

        return mv;
    }
}

MyHttpController.java

public class MyHttpController implements HttpRequestHandler {

    @Override
    public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //给Request设置值,在页面进行回显
        request.setAttribute("hello", "MyHttpController");
        //跳转页面
        request.getRequestDispatcher("/WEB-INF/jsps/index.jsp").forward(request, response);
    }
}

测试

1.配置了三个处理器映射器,所以有三种方式访问Controller

这里写图片描述

2.配置了两个处理器适配器,所以可以访问两种Controller


有了struts2,为什么还需要Springmvc?

实现机制:

Struts2是基于过滤器Filter实现的,而Filter即基于Servlet的。
Springmvc基于Servlet实现。Servlet比Filter快。

运行速度:

Struts2是多例
客户端发送请求以后,struts2创建多少个对象:
ActionContext,valuestack,UserAction,ActionSuport,ModelDriven
userAction里面属性:User对象,userList集合等
Springmvc是单例

参数封装:

Struts基于属性进行封装。
Springmvc基于方法封装。

猜你喜欢

转载自blog.csdn.net/code_shadow/article/details/80628079