转载

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

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工作流程

工作原理图:

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

图片来源: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项目依赖架包:

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

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";
	}
复制代码

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

原文  https://juejin.im/post/5daaa9c56fb9a04e3902f509
正文到此结束
Loading...