SpringMVC学习[01]:【介绍、工作流程、搭建、值传递】

2,844 阅读6分钟

内容

1.SpringMVC的介绍
2.SpringMVC的工作流程
3.SpringMVC的搭建以及配置文件说明
4.SpringMVC值传递的方式

SpringMVC的介绍

SpringMVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring框架提供了构建Web应用程序的全功能MVC模块。使用Spring可插入的MVC架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或者集成其他的MVC开发框架,如Struts1(现在不用),Structs2(一般老项目使用)等。

特点:

1.SpringMVC是Spring的后续产品。
2.控制层的框架(Servlet的封装)
3.基于MVC的设计模式
 M:实体,dao,service
 V:HTML,Jsp,velocity
 C:控制层,SpringMVC,Struts2

SpringMVC工作流程

  工作原理图:

   图片来源:ProcessOn用户:小熊VIP

  工作原理文字说明 :

 1、用户发送请求至前端控制器DispatcherServlet。
 2、DispatcherServlet 收到请求调用HandlerMapping处理器映射器。
 3、处理器映射器找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
 4、DispatcherServlet 调用HandlerAdapter处理器适配器。
 5、HandlerAdapter 经过适配调用具体的处理器(Controller,也叫后端控制器)方法。
 6、处理器执行完成返回ModelAndView给HandlerAdapter。
 7、HandlerAdapter 将处理器执行结果ModelAndView返回给DispatcherServlet。
 8、DispatcherServlet 将ModelAndView传给ViewReslover 视图解析器。
 9、ViewReslover 解析后返回具体View给DispatcherServlet。
 10、DispatcherServlet 调用视图解析器根据View进行渲染视图(即将模型数据填充至视图  中)。
 11、将渲染后的页面返回到前端控制器DispatcherServlet。
 12、DispatcherServlet 将渲染后的页面响应到客户端。

  名词解释:

 1.DispatcherServlet(前端控制器):核心组件,协调调用其他组件。
 2.HandlerMapping(映射处理器):根据请求查找处理该请求的处理器(Handler)。
 3.Handler:处理请求的方法。
 4.HandlerAdapter(处理器适配器):适配参数以及调用执行处理器方法。
 5.ModelAndView:封装跳转的页面以及向页面传递的参数。
 6.ViewResolver(视图解析器):查找跳转的页面并将数据解析到该页面。

SpringMVC的搭建

 1.创建Web项目依赖架包:

 2.在Web.xml中配置前端控制器:

<!--    前端控制器-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
<!--        前端控制类-->
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--        指定springmvc配置文件路径,默认路径WEB-INF/servlet-name+"-"servlet.xml(springmvc-servlet.xml)-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
<!--        “/”代表的是所有格式的请求,或者*.do,不可以*.*-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

  3.编写SpringMVC的配置文件:

    (其他非默认的映射处理器和处理器适配器以及自定义的视图解析器,和以bean节点的方式完成请求和处理器的对应关系)

<?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.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!--请求为"/login",由LoginController处理请求-->
    <bean id="/login" class="com.springmvc.controller.LoginController"/>
</beans>

  4.自定义处理器类(实现接口):

  LoginController类实现Controller接口:

public class LoginController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView mv=new ModelAndView();
        mv.setViewName("index");
        mv.addObject("msg","登陆成功");
        System.out.println(1111111);
        return mv;
    }
}

  5.测试:

  直接在浏览器地址栏输入:项目网址/login

     SpringMVC配置文件补充说明:

<!--    实例化非默认的映射处理器-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

<!--    实例化非默认的适配处理器-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!--    定义视图解析器的前后缀,这样return "直接写网页名"不用再带后缀.jsp了-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

 自定义处理器类(注解方式):

 1.在spring的配置文件中开启注解扫描和启用MVC的注解驱动:

<!--    扫包-->
    <context:component-scan base-package="com.springmvc.controller"/>
<!--    开启MVC注解驱动-->
    <mvc:annotation-driven conversion-service="myConverter"/>

 2.通过注解定义处理器类

这里我新建一个RegController.java文件:

@Controller//实例化次Controller类
public class RegController {

    @RequestMapping("reg")//这个注解是为例映射匹配的请求"reg"
    public ModelAndView reg(){
        ModelAndView mv=new ModelAndView();
        mv.setViewName("index");
        mv.addObject("msg","注册1");
        return mv;
    }
    
}

说明
@RequestMapping("请求名"):匹配请求,可以加在类上或者方法上,注解里的请求名是可以省略的。

注意
1、类上可以不写@RequestMapping注解,但是类中的方法要作为一个处理器方法就必须写该注解。
2、如果类上和方法上都有该注解,同时注解里的请求名都省略了,这时,这个方法为一个默认请求的方法。即在访问http://locathost:8080/springmvc01/时,默认优先访问静态首页,如果没有静态首页则访问后台的默认请求。

SpringMVC值传递方式

后台传前端

 1.通过(Model,ModelAndView,Map,ModelMap),request请求:

案例说明

  返回类型是String,默认将String类型作为视图名;处理器方法中的类类型参数会自动实例化。

@Controller
public class RegController {

    @RequestMapping("reg")
    public ModelAndView reg(){//ModelAndView传值
        ModelAndView mv=new ModelAndView();
        mv.setViewName("index");
        mv.addObject("msg","注册1");
        return mv;
    }

    @RequestMapping("reg1")//返回类型是String类型作为视图名;处理器中的类类型参数会自动实例化
    public String reg1(Model m){//Model传值
        m.addAttribute("msg","通过model将数据传到前端页面");
        return "index";
    }

    @RequestMapping("reg2")
    public String reg2(Map m){//Map传值
        m.put("msg","通过map将数据传到前端页面");
        return "index";
    }

    @RequestMapping("reg3")
    public String reg3(ModelMap m){//ModelMap传值
        m.put("msg","通过ModelMap 将数据传到前端页面");
        return "index";
    }

    @RequestMapping("reg4")
    public String reg4(){//返回类型是String类型作为视图名;处理器中的类类型参数会自动实例化
        return "index";
    }
    
}

 2.通过Session传值:

    @RequestMapping("reg5")
    public String reg5(HttpSession session){
        session.setAttribute("msg","通过session将数据传输到前端页面");
        return "index";
    }

  前端jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

  响应:${msg}

${uid}
</body>
</html>

前端数据传输到后台中

 1.后台通过int,String等类型接收页面传输的数据:

   前端jsp页面

 <a href="user/getUById?uid=1&uname=lkk">编辑</a>
 <%--如果链接上加上user表示对应的类中加上了注解@RequestMapping("user"),
 再访问处理器方法"getUById",表示是一个二级请求,
 在这里我选用了一级请求:直接访问处理器方法。如下:--%>
  <a href="getUById?uid=1&uname=lkk">编辑</a>

   后台通过int,String接收页面的数据

@RequestMapping("getUById")
	public String getUById(Model m,int uid,String uname) {
		m.addAttribute("msg", u);
		return "main";
	}

 2.后台通过自定义类中接收页面传输的数据:

   后台User实体类

public Class User{
    private int uid;
    private String uname;
}

   通过自定义类型User接收页面提交的数据

@RequestMapping("getUById")
	public String getUById(Model m,User u) {
		m.addAttribute("msg", u);
		return "index";
	}

  刚刚入门的开发者可以看一下这个教程,希望对你的学习有所帮助!