SpringMVC学习~

1、回顾MVC
1.1、什么是MVC

(1)M(model):数据模型,提供要展示的数据,包括数据和行为,可以认为是Javabean。
包括Value Object(数据dao层) 服务层(Service)
(2)V(view):jsp(向控制器中提交数据,显示模型中的数 据)一把就是我们见到的用户界面,客户想看到的东西
(3)C(controller):servlet(接受用户请求,委托给模型进行处理,处理完毕后把数据模型返回给视图,由视图进行展示)
是一种软件设计规范!
(4)MVC主要作用是降低了视图与业务逻辑间的双向耦合
(5)MVC不是一种设计模式,而是一种架构模式。

1.2、MVC框架要做哪些事情
(1)将url映射到java类或java类的方法
(2)封装用户提交的数据
(3)处理请求-调用相关的业务处理-封装响应数据
(4)将响应的数据进行渲染。jsp/html等表示层数据

2、什么是SpringMVC
2.1、概述:SpringMVC是spring framework的一部分,是基于java实现MVC的轻量级web框架

2.2、中心控制器
-SpringMVC框架是围绕dispatcherServlet设计。他的作用是把请求分发到不同的处理器。可以用controller注解的声明方式,dispatcherServlet是一个实际的servlet,

2.3、springMVC的原理
(1)当用户发起请求时被前置的控制器拦截到请求,根据请求参数生成代理请求,根据请求的参数找到实际控制器,控制器处理请求,创建数据模型,访问数据库,将模型响应给中心控制器,控制器使用模型与视图渲染视图结果,将结果返回给中心控制器,再将结果返回给请求者。
(2)从“Request请求”开始,依次进入“dispatcherServlet(核心分发器)”–“HandlerMapping(处理器映射)”–“Controller(控制器)”–“ModelAndView(模型和视图)”–“ViewResolver(视图解析器)”–“View(视图)”–“Response(响应)”结束,其中dispatcherServlet,HandlerMapping,ViewResolver只需要在xml文件中配置即可,从而大大提高了开发效率。
(3)HandlerMapping(处理器映射):通过映射来找到哪个控制器的哪个方法
@RequestMapping(path=""),在通过HandlerAdapter适配器执行方法
在这里插入图片描述

简要分析执行流程:
1、DispatcherServlet表示前置控制器,是整SpringMVC的控制中心,用户发出请求,DispatcherServlet接受并且拦截请求。
–我们假设请求的url为 http://localhost:8080/SpringMVC/hello
–http://localhost:8080 为服务器域名
–SpringMVC:部署在服务器上的web站点
–hello:表示控制器
2、HandlerMapping:映射处理器,DispatcherServlet调用HandlerMapping,而他根据url查询handler。
3、HandlerExecution:表示具体的handler,作用是根据url查找控制器,如url被查找的控制器hello
4、HandlerExecution将解析后的信息传递给DispatcherServlet。
5、HandlerAdapter:表示处理器适配器,按照特定的规则执行handler
6、handler让具体的Controller执行
7、Controller将具体的执行信息返回给处理器适配器,如ModerlAndView
8、处理器适配器把视图逻辑或模型传递给前置控制器
9、前置控制器调用视图解析器来解析处理器适配器传递的逻辑视图名。
10、视图解析器把解析的逻辑视图名传递给前置控制器
11、前置控制器根据视图解析器解析的视图结果,调用具体的视图
12,、最终视图呈现给用户

3、第一个MVC程序

3.1、配置版
(1)新建一个Moudle,springmvc-02-hello,添加web的支持
(2)确定导入了SpringMVC依赖
(3)配置web.xml,注册DispatcherServlet前置控制器

<?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">

   <!--1.注册DispatcherServlet-->
   <servlet>
       <servlet-name>springmvc</servlet-name>
       <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
       <!--关联一个springmvc的配置文件:【servlet-name】-servlet.xml-->
       <init-param>
           <param-name>contextConfigLocation</param-name>
           <param-value>classpath:springmvc-servlet.xml</param-value>
       </init-param>
       <!--启动级别-1-->
       <load-on-startup>1</load-on-startup>
   </servlet>

   <!--/ 匹配所有的请求;(不包括.jsp)-->
   <!--/* 匹配所有的请求;(包括.jsp)-->
   <servlet-mapping>
       <servlet-name>springmvc</servlet-name>
       <url-pattern>/</url-pattern>
   </servlet-mapping>

</web-app>

4、编写springmvc-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"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

</beans>

5.、添加 处理器映射(可省略)

<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

6、添加 处理器适配器(可省略)

<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>


7、添加 视图解析器

<!--视图解析器:DispatcherServlet给他的ModelAndView-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>

8、编写要操作业务的Controller,要么实现controller接口,要么注解,需要返回一个mv来装数据,封视图。

package kuang.controller;

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

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

//注意:这里我们先导入Controller接口
public class HelloController implements Controller {

    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        //ModelAndView 模型和视图
        ModelAndView mv = new ModelAndView();

        //封装对象,放在ModelAndView中。Model
        mv.addObject("msg","HelloSpringMVC!");
        //封装要跳转的视图,放在ModelAndView中
        mv.setViewName("hello"); //: /WEB-INF/jsp/hello.jsp
        return mv;
    }
}

9、将自己的类交给springIOC容器,注册bean

</bean>
    <bean id="/hello" class="kuang.controller.HelloController"></bean>

10、写要跳转的jsp页面,显示ModelandView存放的数据,以及我们看到的页面。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>你好啊</title>
</head>
<body>
${msg}
</body>
</html>

11、配置Tomcat启动测试,要记得把jar包存放到lib中

3.2、注解版
1、新建moudle
2、继续配置maven的pom,

<build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>

3、配置web.xml
和以前的一样

4、添加springMVC配置文件:springmvc-servlet.xml
在resource目录下添加配置文件,与spring容器配置类似,为了支持基于注解的IOC,设置了自动导包功能。

    <!--自动扫描包,让指定包下的注解生效,交给IOC管理-->
    <context:component-scan base-package="kuang.controller"/>
    <!--在springmvc中一般使用@RequestMapping注解来完成映射关系,
    就必须有下面这两个-->
    <mvc:default-servlet-handler />
    <mvc:annotation-driven />
    <!--然后就只有视图解析器就好了,不用适配器和映射器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          id="internalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>

在视图解析器,我们把所有视图都存放到WEB-INF目录下,这样客户端不能直接访问,可以保证视图安全。

5、创建Controller,编写一个控制类

@Controller
//为了让IOC容器初始化的时候,自动扫描到
public class HelloController {
    @RequestMapping("/he")
    //RequestMapping是为了映射请求路径,
    public String hello(Model model){
        //向模型中添加msg属性值,可以再jsp页面中取出并且渲染
        model.addAttribute("msg","hello,springmvc-annotation");
        //WEB-INF/jsp/hello.jsp
        return "hello"; //会被视图解析器处理
    }
}

注意点:
(1)@Controller是为了让Spring IOC容器初始化时扫描到
(2)@RequestMapping是为了映射请求路径。
(3)方法返回的结果是视图名称hello,加上配置文件中的前后缀变为WEB-INF/jsp/hello.jsp

6、创建视图层
在WEB-ING/jsp目录中创建hello.jsp,视图可以直接取出并展示从controller带回的信息,
可以表示出Model中存放的对象或者值。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>ccc冲冲冲</title>
</head>
<body>
${msg}
</body>
</html>

小结:实现步骤
1、新建一个web项目
2、导入相关jar包和依赖
3、编写web.xml配置文件,注册DispatherServlet,绑定spring的配置文件,设置启动级别,然后匹配请求的格式
4、编写springmvc-servlet.xml配置文件
5、接下来就是创建对应的controller控制类
6、最后完善前段视图和controller之间的对应

使用springMVC必须配置的三大件
处理器映射器、处理器适配器、视图解析器
通常,只需要手动配置视图解析器,处理器映射器,处理器适配器只需要开启注解驱动即可。

4、RestFul和控制器
4.1、使用注解@Controller
-spring可以使用扫描机制来找到应用程序中所有基于注解的控制器类,为了保证spring容器可以找到控制器,需要在配置文件中声明组件扫描。

<!--自动扫描包,让指定包下的注解生效,交给IOC管理-->
    <context:component-scan base-package="kuang.controller"/>

4.2、RequestMapping
-@RequestMapping注解用于映射url到控制器类,可以用于类或方法上

@Controller
@RequestMapping("da")
public class ModelTest {
    @RequestMapping("/r1/t1")
    public String test(Model model){
        model.addAttribute("msg","aaadasdas");
        return "redirect:/index.jsp";
    }
}

放到类上的时候,在网址上就要先打da/r1/t1

4.3RestFul风格
4.1(1)在springMVC中,可以使用@PathVariable注解,使方法参数的值对应绑定到一个URL模板变量上

@Controller
public class ControllerTest3 {
    @GetMapping("/add/{a}/{b}")
    public String test3(@PathVariable int a, @PathVariable int b, Model model){
        int result = a + b;
        model.addAttribute("msg","结果为:" + result);
        return "test";
    }
}

4.2、使用method属性指定请求类型

//映射访问路径,必须是Get请求
@RequestMapping(value = "/hello",method = {RequestMethod.GET})
public String index2(Model model){
   model.addAttribute("msg", "hello!");
   return "test";
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值