spring mvc 框架及项目搭建流程

spring web MVC: 基于servlet 请求驱动的web框架 

spring web项目的配置文件:   

    web.xml:web项目的入口  配置DispatcherServlet,(配置全局servlet(DispatcherServlet)和监听器listener);

    applicationContest.xml:容器启动时加载(全局配置 classpath级别 )加载到内存,太多东西的话内存吃不消,如数据库连接池;

    spring-mvc.xml:基于servlet请求时响应 runtime 级别 运行时实例化处理器映射/视图解析 /controller的配置 /事务 /jdbc/ aop 文件上传和下载控制等等;

1.DispatcherServlet

       <1>.DispatcherServlet(继承httpservlet 将请求分发给各个控制器+与 IOC集成在一起 允许使用你spring的其他功能)

       <2>.定义在web.xml 中,其处理的请求必须在同一web.xml中使用url-mapping定义映射;

  DispatcherServlet读取配置文件 配置需要的其他bean可以在web-INF自己定义一个配置文件 继承了applicationContext.xml 他会覆盖原applicationContext.xml中配置的bean;DispatcherServlet 相当于 student 类,在applicationContext.xml中配置 相当于给类的属性赋值(setStuName(".."))

      <3>.DispatcherServlet 初始化:默认初始化为[servlet-name]-servlet.xml, 但是可以自定义配置一个自己的配置文件;


          

          将原来默认名为example-servlet.xml 的配置文件 自定义为/WEB-INF/spring-mvc.xml---用来配置运行时的bean

        

 

2.spring容器的特殊Bean:

(spring容器自己有bean)特殊bean也用于配置(即注入),与其他bean 配置方式相同

 

     1.控制器:继承类或者实现接口

               解析用户输入 并转换成合理的数据模型  由视图展现给用户-不关心业务逻辑(程序开发中的service层)

               应用程序的行为--接口,控制器使得用户可以访问应用所提供的服务。spring mvc有servlet的东西,struts么有;

              controller(即实现类):请求控制器是利用 处理器映射实现的;

    <1>.简单控制器:

     1.当从AbstractController继承时,只需要实现handleRequestInternal(HttpServletRequest, HttpServletResponse)抽象方法,该方法将用来实现自定义的逻辑,并返回一个ModelAndView对象;

      2.ParameterizableViewController基本上和上面例子中的一样,不同的是,可以在application context中指定返回的视图名称(从而 避免了在Java代码中的硬编码);

     3.MultiActionController来将多个请求处理方法合并在一个控制器里,这样可以把相关功能组合在一起。它可以定义页面请求到控制器方法名的映射, 然后在处理相应请求时调用该方法;

  <2>.命令行控制器

      可以将请求参数绑定到制定的命令对象 上(相当与表单处理)把参数绑定到属性或者对象。

  • AbstractCommandController:没有处理表单功能,但有验证功能;

  • AbstractFormController:支持表单提交;

  • SimpleFormController:实现类

2.处理器映射(handler mapping):

     (可自定义):控制入口--请求怎么找到控制器(将web请求映射到正确的处理器(handler)上)

    

   

  spring3.0以上用注解实现:加入注解驱动即可

                   

3. 视图解析器(ViewResolver

           控制出口 --怎么 出来 即展示视图

  

控制反转体现

  getBean() 就可以得到spring容器已经创建 new 好的实例  spring可以对bean 操作 管理他,

  只要引入某一个属性,就已经实现了实例化--- 自动实例化--需要依赖注入

3.dispatcherServlet (spring mvc)处理请求的过程:

servlet只是接受请求,spring容器默认是不接受请求的,所以需要配置一个全局的servlet;     

      1.找到配置文件 spring-mvc.xml,将其绑定到请求的一个属性上,以便控制器和处理器使用;

      2.将本地化解析器绑定到请求上,即找到properties 文件;

      3.将主题绑定到请求上;

      4.是否存在上传文件;

      5.找到合适处理器--执行执行链--以便为视图准备模型数据;

      6.如果模型数据返回--用配置在spring-mvx.xml中的视图解析器显示视图(C 处理完后页面去哪里)

 

4.spring web项目的搭建流程:

1.用maven构建一个web项目,并部署到服务器上

2.引入spring容器(就可以使用spring的IOC 以及依赖注入)---在web.xml 中引入容器(加listener 去监听容器 默认读WEN-INF下的应用文件 即applicationContext.xml ;

                                  

         一般人为将 applicationContext.xml放在classpath下去编译 通过一下配置(在所以地方找到配置文件)实现:                           

3.需要spring的mvc 才能将web 请求转发到页面(spring容器默认不接受请求),maven加入jar包+全局servlet(spring mvc 机制来处理请求)

spring-mvc.xml (默认找【servlet-name】-servlet.xml)为了减轻applicationContext.xml负担而创建的一个基于servlet作用域的配置文件,即请求servlet时才会加载该配置文件内容,类似懒加载,里面配置bean与applicationContext.xml中配置相同;

spring web mvc项目一定要在spring-mvc.xml中加入mvc的机制:

4.请求-->转发 的过程:视图映射器(找到controller) +控制器(业务处理)+视图解析器(跳转页面/返回json)(在3.0版本以前 需要在spring-mvc.xml配置处理器映射,3.0以后用注解 不需要配置处理器映射和控制器--@RequestMapping/@Controller  但还是需要配置视图解析器解析器)--上一篇博客中有相关详解

      

5.使用注解需要声明一个扫描器--去扫描所有有注解的类 即应该加载在内存里的bean--spring 容器的到这些信息才能给我们实例化让我们去用,去依赖;

6.加注解驱动 ;

  

7.配置完成,开始写controller;

简单的controller例子:

package com.spring.controller;

import com.spring.entry.Students;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

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

@Controller
@RequestMapping(value = "/user")
public class TestConterllor{

    @Autowired
    private Students students;

   //@RequestMapping("/name/{name}")
    @RequestMapping("/name")

    public ModelAndView   getString(HttpServletRequest request, HttpServletResponse responser,Model model,Students students) throws IOException {
       
        //单个参数传递
        System.out.println(request.getParameter("name"));

        students.setStuName("wxxxx");
        System.out.println(students.getStuName());

        //页面数据传输的两种方式
        request.setAttribute("sss","vvvvv");

        ModelAndView view=new ModelAndView("test");
        view.addObject("df","sdsds");

        //没有 @ResponseBody 时返回字符串的方法
        //1.写出给浏览器
        //responser.setCharacterEncoding("utf-8");
        //responser.setContentType("application/json");//json格式
        responser.getWriter().printf("sss","utf-8");

      // return "forward:/jsp/test.jsp";//请求转发
      //  return "redirect:/jsp/test.jsp";//请求重定向 url发生变化
        

        //return "test";//返回视图
        return view;
        //return new ModelAndView("test");
    }

猜你喜欢

转载自blog.csdn.net/weixin_42249629/article/details/81626221
今日推荐