SpringMVC学习笔记

概念

SpringMVC是Spring框架的一个模块,是一个基于MVC的web框架。

原理

1.用户发起请求到前端控制器(DispatcherServlet)

2.前端控制器(DispatcherServlet)请求处理器映射器(HandlerMapping)查找处理器(Handler),可以根据xml配置或者注解方式进行查找

3.处理器映射器(HandlerMapping)向前端控制器(DispatcherServlet)返回一个封装Handler的执行链,执行链中还包含一个或者多个拦截器(HandlerInterceptor)

4.前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)去执行Handler

5.处理器适配器(HandlerAdapter)执行Handler

6.Handler执行完成向处理器适配器(HandlerAdapter)返回一个ModelAndView

7.处理器适配器(HandlerAdapter)向前端控制器(DispatcherServlet)返回该ModelAndView

8.前端控制器(DispatcherServlet)请求视图解析器(ViewResolver)进行视图解析,视图解析器(ViewResolver)根据逻辑视图名解析成真正的视图(jsp)

9.视图解析器(ViewResolver)向前端控制器(DispatcherServlet)返回View

10.前端控制器(DispatcherServlet)进行视图渲染,将视图渲染模型数据(在ModelAndView对象中)填充到request域

11.前端控制器(DispatcherServlet)向用户响应结果

相关组件

1.前端控制器(DispatcherServlet)

作用:用于接收用户请求,响应结果,相当于转发器,有了DispatcherServlet减少其他组件之前的耦合度

2.处理器映射器(HandlerMapping)

作用:根据请求的url查找Handler

3.处理器(Handler)

4.处理器适配器(HandlerAdapter)

作用:按照特定规则(HandlerAdapter要求的规则)执行Handler,Handler需按照HandlerAdapter的要求编写,HandlerAdapter才能正确执行

5.视图解析器(ViewResolver)

作用:进行视图解析,根据逻辑视图名解析成真正的视图(View)

6.视图(View)

View是一个接口,它的实现类支持不同的View类型(jsp、freemarker、pdf...)

入门程序(非注解方式)

先上项目结构图

SpringMVC学习笔记

1.配置前端控制器(在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_2_5.xsd"
         version="2.5">

    <!--               SpringMVC的前端控制器配置           -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--contextConfigLocation配置springmvc加载的配置文件(配置文件中配置映射器适配器等)-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:Config/springmvc.xml</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!--url-pattern的两种配置, 一、*.action,以.action结尾都由DispatchaerServlet进行解析
            二、 /,所有访问地址都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析,此种方法可以实现restful的url-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>
2.在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:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       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.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--配置处理器映射器  将Bean的name作为url进行查找,需要在配置Handler时指定Benaname(就是url)-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

    <!--配置Handler-->
    <bean name="/lala" class="Controller.HelloController"/>

    <!--配置处理器适配器  适配器要求所执行的Handler实现Controller接口-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

    <!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>

</beans>

3.编写Controller

package Controller;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloController implements Controller{

    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("message","Hello SpringMVC!!!!!!!!");
        modelAndView.setViewName("WEB-INF/page/lala.jsp");    /*这里写加载的Jsp文件路径*/
        return modelAndView;
    }
}               /*编写好的Handler需要在Spring容器中通过Bean进行加载*/

4.编写jsp页面

<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  $END$
  ${message}
  </body>
</html>

5.访问  localhost:8080/lala

SpringMVC学习笔记

以上为非注解方式实现入门程序,下面再介绍几个非注解的适配器和映射器配置

1.简单的处理器映射器配置

<!--简单的处理器映射器配置-->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <prop key="/lulu">controller1</prop>            <!--key为url地址,内容写Controller的Bean id-->
        </props>
    </property>
</bean>

<!--配置Handler-->
<bean id="controller1" name="/lala" class="Controller.HelloController"/>

2.另外一种处理器适配器配置

<!--另外一种处理器适配器,要求Handler实现HttpRequestHandler接口-->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>

该适配器要求Handler实现HttpRequestHandler接口

package Controller;

import org.springframework.web.HttpRequestHandler;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class Controller1 implements HttpRequestHandler {
    @Override
    public void handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
        httpServletRequest.setAttribute("message","lalalalalaal");
        httpServletRequest.getRequestDispatcher("WEB-INF/page/lala.jsp").forward(httpServletRequest,httpServletResponse);
    }
}


注解方式配置

1.在web.xml文件中配置前端控制器DispatcherServlet

2.在SpringMVC.xml配置文件中配置注解处理器适配器和处理器映射器

<!--需要在Spring容器中加载Handller,这里采用扫描包的方式进行-->
<context:component-scan base-package="Controller"/>

<!--注解的处理器适配器配置-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

<!--注解的处理器映射器配置-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>

<!--配置MVC的注解驱动,代替上面两个配置
    该注解驱动还默认加载了很多参数绑定的方法,比如json转换解析器就默认加载了,实际开发中使用-->
<mvc:annotation-driven/>

<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!--通过Property标签,可以设置前缀和后缀省略-->
    <property name="prefix" value="WEB-INF/page/"/>
    <property name="suffix" value=".jsp"/>
</bean>

2.编写Handler

package Controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller    /*这里的Controller表示用注解方式声明这是一个Controller*/
public class Controller2 {
    @RequestMapping("/Controller2")       /*这个注解可以用来设置Url*/
    public ModelAndView lala()throws Exception{
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("message","这是注解开发的Handller");
        modelAndView.setViewName("lala");
        return modelAndView;
    }
}


3.在Spring容器中加载Handller,用扫描包的方式

<!--需要在Spring容器中加载Handller,这里采用扫描包的方式进行-->
<context:component-scan base-package="Controller"/>

4.运行

SpringMVC学习笔记

完结。