springmvc学习笔记(一):第一个 springmvc 程序,以及 springmvc 的工作流程


什么是 springmvc,他与 spring 有什么关系?

springmvc 属于 spring 框架的后续产品,用在基于 mvc 的表现层开发,类似于 struts2 框架;

springmvc 有的地方也叫 spring web mvc,他是 spring 整个框架中的一个部分;

因此 springmvc 也要依赖于 IOC 容器;

 

项目结构:

springmvc 的开发步骤:

1、导入相关的 jar 包:

*      commons-logging.jar
*      org.springframework.asm-3.0.5.RELEASE.jar
*      org.springframework.beans-3.0.5.RELEASE.jar
*      org.springframework.context-3.0.5.RELEASE.jar
*      org.springframework.core-3.0.5.RELEASE.jar
*      org.springframework.expression-3.0.5.RELEASE.jar    --以上是 spring 核心 jar 包

*      org.springframework.web.servlet-3.0.5.RELEASE.jar   --springmvc 的 jar 包
*      org.springframework.web-3.0.5.RELEASE.jar           --springweb 的 jar 包

2、在 web.xml 中配置 springmvc 核心控制器:

注意:这样配置默认情况下会自动到 WEB-INF 目录下查找 <servlet-name>-servlet.xml 的配置文件;

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!-- 注册 springmvc 核心控制器(DispatcherServlet) -->
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

3、创建 HelloAction.java 控制器:实现 Controller 接口,重写接口中的 handleRequest 方法,并在此方法中封装数据和路径

package com.springmvc.demo;

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 HelloAction implements Controller {

    // 构造:从输出信息可以看出来,springmvc 的控制器是单例的,只在服务器启动的时候创建对象;
    public HelloAction(){
        System.out.println("HelloAction()::" + this.hashCode());
    }

    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest,
                                      HttpServletResponse httpServletResponse) throws Exception {

        System.out.println("HelloAction::handleRequest()");

        // ModelAndView 用于向视图封装数据和路径
        ModelAndView modelAndView = new ModelAndView();

        // 封装数据
        modelAndView.addObject("message", "hello springmvc");
        // 封装路径(绝对路径)
        modelAndView.setViewName("/index.jsp");

        return modelAndView;
    }
}

4、在 webroot 目录下创建 index.jsp,作为跳转目的页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
      <%-- 输出控制器中传过来的数据 --%>
      ${requestScope.message}
  </body>
</html>

5、在 WEB-INF 目录下创建配置文件,配置文件的头部信息和 spring 相同;

注意:配置文件的命名规则为 web.xml 中配置的 <servlet-name>的值-servlet.xml,

即 DispatcherServlet-servlet.xml,并在配置文件中配置 action;

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

    <!--
        注册 Action:
            name:表示请求的路径;
            class:表示处理类的全名(含包名);
    -->
    <bean name="/hello" class="com.springmvc.demo.HelloAction"></bean>

</beans>

6、部署到服务器测试结果如下:

 

注意:在 web.xml 中配置 springmvc 核心控制器的时候,<url-pattern> 里写的是 /,而不能写成 /*,否则会出现如下错误:

在网上查了下,原因如下:https://www.iteye.com/problems/36433

 

springmvc 的工作流程:

1、根据配置文件中配置的 action 的 name 属性(<bean name="/hello" class="com.springmvc.demo.HelloAction"></bean>),

在地址栏输入:http://localhost:8080/springmvc01/hello,将请求交给 springmvc 的核心控制器 DispatcherServlet 处理;

注意:springmvc 并不是直接将请求交给 action 进行处理;

将请求发送到 action,中间要经过 映射器和适配器;

2、DispatcherServlet 接收到请求以后,先把请求交给 映射器(handler) 进行处理;

springmvc 默认使用的映射器为:BeanNameUrlHandlerMapping;

该映射器表示将 bean 标签的 name 属性作为 url 请求(<bean name="/hello" >);

3、映射器(handler)处理完后,再将请求交给 适配器(adapter)进行处理;

springmvc 默认使用的适配器为:SimpleControllerHandlerAdapter;

该适配器用来寻找实现了 Controller 接口的 action 类,将请求交给该类处理;

4、通过适配器找到处理请求的 action 类以后,在 action 的 handleRequest 方法中进行业务处理;

5、action 类处理完业务之后,将结果封装到一个 ModelAndView 对象中,并将该对象交给 视图解析器 进行处理;

springmvc 默认使用的 视图解析器为:InternalResourceViewResolver;

视图解析器解析出 ModelAndView 中的数据,然后再交给 springmvc 核心控制器(DispatcherServlet ),

最后,核心控制器将结果传输到 jsp 页面中;

映射器、适配器、视图解析器都可以在 DispatcherServlet-servlet.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"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
            http://www.springframework.org/schema/mvc
            http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

    <!--
        注册 Action:
            name:表示请求的路径;
            class:表示处理类的全名(含包名);
    -->
    <bean name="/hello" class="com.springmvc.demo.HelloAction"></bean>

    <!-- 配置映射器:
        BeanNameUrlHandlerMapping:表示将 bean 标签的 name 属性作为 url 请求(默认配置,不写也行);
    -->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

    <!-- 配置适配器
        SimpleControllerHandlerAdapter:用于寻找实现了 Controller 接口的 action 类(默认配置,不写也行);
    -->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

    <!-- 配置视图解析器
        InternalResourceViewResolver:表示通过 ModelAndView 对象中封装的视图名找到真正的页面(默认配置,不写也行);
    -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>

</beans>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值