Spring mvc 组件介绍

这篇具有很好参考价值的文章主要介绍了Spring mvc 组件介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 组件介绍

1.1 DispatcherServlet

统一收口,接收请求,响应结果,相当于转发器,中央处理器。
有了 DispatcherServlet 减少了其它组件之间的耦合度。

1.2 HandlerMapping-处理器映射器

根据请求的url查找Handler,既负责完成客户请求到 Controller 映射。
SpringMVC提供了不同的映射器实现不同的映射方式,
例如:配置文件方式、实现接口方式、注解方式等。

1.3 HandlerAdapter-处理器适配器

按照特定规则去执行Handler。

1.4 Handler-处理器 也叫 Controller

Handler 是继 DispatcherServlet 前端控制器的后端控制器,
在 DispatcherServlet 的控制下,Handler对具体的用户请求进行处理。

1.5 视图解析器ViewResolver

进行视图解析,根据逻辑视图名解析成真正的视图(view)

ViewResolver负责将处理结果生成View视图,ViewResolver首先根据逻辑视图名解析成物理视图名,即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面的展示给用户。
SpringMVC框架提供了很多View视图类型,
包括:JSTLView、freemarkerView、pdfView等等.

1.6 视图View

View是一个接口,实现类支持不同的View类型(jsp、freemarker…),
一般情况下需要通过页面标签或者页面模板技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。

总结: 需要我们开发的工作只有处理器 Handler 的编写以及视图比如JSP页面的编写。

2. 组件配置说明

2.1 配置前端控制器(DispatcherServlet)

在web project的web.xml中配置:

<!-- 配置前端控制器DispatcherServlet -->
<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--springmvc.xml 是自己创建的SpringMVC全局配置文件,用contextConfigLocation作为参数名来加载 
        如果不配置 contextConfigLocation,那么默认加载的是/WEB-INF/servlet名称-servlet.xml,在这里也就是 
        springmvc-servlet.xml 参数多个值使用逗号隔开,如:a.xml,b.xml -->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet><servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <!--第一种配置:*.do,还可以写*.action等等,表示以.do结尾的或者以.action结尾的URL都由前端控制器DispatcherServlet来解析 
        第二种配置:/,所有访问的 URL 都由DispatcherServlet来解析,但是这里最好配置静态文件不由DispatcherServlet来解析,需要对静态资源单独处理 
        错误配置:/*,注意这里是不能这样配置的,因为如果这样写,最后转发到 jsp 页面的时候,仍然会由DispatcherServlet进行解析, 而这时候会找不到对应的Handler,从而报404!!! -->
    <url-pattern>/</url-pattern>
</servlet-mapping>

2.2 配置处理器映射器(HandlerMapping)

在 springmvc.xml 文件中配置,是请求的 URL 怎么能被 SpringMVC 识别,从而去执行我们编写好的 Handler。

(1) 第一种方法

<!-- 配置Handler 通过name的值为url来请求-->   
<bean name="/hello2" class="com.beiyou.controller.HelloController2" />

//Handler
//我们的这个controller 就是一个Handler(执行器)
public class HelloWord2 implements Controller {
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView mv=new ModelAndView();
        //如果xml统一配置路径,可以简写程文件名
        mv.setViewName("success");
        mv.addObject("msg","今天天气很冷");
        return mv;
    }
}

这样配置的话,那么请求的 URL,必须为 http://ip:port/hello2

(2) 第二种方法

<!-- 配置Handler  通过key值做为url来访问对应的bean-->   
<bean id="hello2" class="com.beiyou.controller.HelloController2" />
<bean id="hello3" class="com.beiyou.controller.HelloController3" />
<!-- 简单URL配置处理器映射器 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <prop key="/hello2">hello2</prop>
            <prop key="/hello3">hello3</prop>
        </props>
    </property>
</bean>

这种配置请求的 URL可以为 http://ip:prot/项目名/hello,或者http://ip:port/项目名/hello2

2.3 配置处理器适配器(HandlerAdapter)

在 springmvc.xml 文件中配置,用来约束我们所需要编码的 Handler类。

第一种

编写 Handler 时必须要实现 Controller,否则不能被适配器解析。

<!-- 配置处理器适配器,所有适配器都得实现 HandlerAdapter接口 处理器必须实现controller接口的handler-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />

第二种

编写 Handler 时必须要实现 HttpRequestHandler

<!-- 配置处理器适配器第二种方法,这样配置所有Handler都必须实现 HttpRequestHandler接口-->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter" />

👋

1、如果没有指明,则可以同时处理实现Controller接口和HttpRequestHandler接口的handler。

2、如果指明其中一种,则要求所有的hander类都必须实现对应的接口,否则无法访问。

2.4 处理器(Handler,即我们的Controller)

在 springmvc.xml 文件中配置.,就是请求的 URL
到我们这里所编写的 Handler 类的某个方法进行一些业务逻辑处理。
两个处理器适配器来约束 Handler,通过上面两种配置分别编写两个 Handler:

(1) 第一种

实现Controller 接口

//Handler
//我们的这个controller 就是一个Handler(执行器)
public class HelloWord implements Controller {
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView mv=new ModelAndView();
        //如果xml统一配置路径,可以简写程文件名
        mv.setViewName("success");
        mv.addObject("msg","今天天气很冷");
        return mv;
    }
}

(2) 第二种 HttpRequestHandler

public class HelloController2 implements HttpRequestHandler {
    public void handleRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setAttribute("msg", "测试数据");
     request.getRequestDispatcher("/WEB-INF/success.jsp").forward(request, response);
    }
}

⏳ 通常我们使用第一种方式来编写 Handler ,但是第二种如果不需要渲染视图,我们可以通过 response 修改相应内容,比如返回 json 数据:如下图:

response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json字符串");
//controller示例
public class HelloWord2 implements HttpRequestHandler {
    @Override
    public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
​
        response.setCharacterEncoding("utf-8");
        response.setContentType("application/json;charset=utf-8");
        response.getWriter().write("json字符串");
    }
}

2.5 配置视图解析器(ViewResolver)

1.简单配置:

<!-- 配置视图解析器 进行jsp解析,默认使用jstl标签,classpath下得有jstl的包-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" />
<!--如果这样配,那么在 Handler 中返回的必须是完整路径(含完整文件名)。-->

2.完整配置:

<!--配置视图解析器  -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!-- 返回视图页面的前缀 -->
    <property name="prefix" value="/WEB-INF/jsp/"></property>
    <!-- 返回页面的后缀 -->
    <property name="suffix" value=".jsp"></property>
</bean>

如果这样配,那么在 Handler 中只需要返回在 pages 文件夹下的jsp 页面名称就可以了。

3. 基本配置

3.1 常规配置(Controller加载控制)

  • SpringMVC的处理器对应的bean必须按照规范格式开发,未避免加入无效的bean可通过bean加载过滤器进行包含设定或排除设定,表现层bean标注通常设定为@Controller

xml方式

<context:component-scan base-package="com.by">
        <!--指定包扫描的包含controller-->
    <context:include-filter
                            type="annotation"
                            expression="org.springframework.stereotype.Controller"/>
    <!--开启注解扫描-->
</context:component-scan>

context:include-filter有两个必须的属性:

type: 配置filter的类型,这个类型一共有以下五个值:

assignable — 指定扫描某个接口派生出来的类
annotation — 指定扫描使用某个注解的类
aspectj — 指定扫描AspectJ表达式相匹配的类
custom — 指定扫描自定义的实现了
expression: 根据type的不同,这个表达式的配置方式也不同。

1、assignable 的用法

创建接口类:

//标签
public interface Label {
}

Seller类: 注意,我们在Seller类上方添加了标准注解@Component,所以Seller类会被spring加载

//供应商
@Component
public class Seller {
}

ManuFacture类:ManuFacture类没有标注注解,理论上不会被Spring加载。但是ManuFacture类实现了接口Lable

//厂商
public class ManuFacture implements Label{
}

spring-mvc.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: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"><context:component-scan base-package="com.by.pojo">
        <!-- 通知spring将实现接口Label的类也加载进来 -->
        <context:include-filter type="assignable"
                                expression="com.by.pojo.Label"/>
    </context:component-scan>
    <!--开启注解扫描-->
    <mvc:annotation-driven/>
</beans>

测试类:

public class AppTest {public static void main(String[] args) {
        ApplicationContext ac=new ClassPathXmlApplicationContext("spring-mvc.xml");
        System.out.println(ac.getBean(Seller.class));
        System.out.println(ac.getBean(ManuFacture.class));
    }
}

加入servlet-api: 使用完删除

 <dependency>
      <groupId>tomcat</groupId>
      <artifactId>servlet-api</artifactId>
      <version>5.5.23</version>
    </dependency>

2、annotation — 指定扫描使用某个注解的类

创建一个注解接口类: 类似@Controller

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface DemoAnno {
   
}

ManuFacture加上我们配置的注解

@DemoAnno
public class ManuFacture {
}

spring-mvc.xml配置:

   <!-- 通知spring将有指定注解的类加载进来 -->
<context:include-filter type="annotation" expression="com.by.pojo.DemoAnno"/>

测试类不变:直接运行

**3、aspectj-**指定扫描AspectJ表达式相匹配的类:比如要求加载某个类的派生类

这里需要添加AspectJ的依赖:

 <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>5.3.20</version>
    </dependency>

我们添加一个新的CommBar类:

public class CommBar {
}

继续修改我们的ManuFacture类,不实现接口,不需要注解,只要继承CommBar类即可。

public class ManuFacture extends CommBar{
}

mvc.xml配置

<!-- 通知spring所有继承和扩展自指定类的类全部加载进来 -->
 <context:include-filter type="aspectj" expression="com.by.pojo.CommBar+"/>

直接测试运行

**4、custom—**指定扫描自定义的实现了org.springframework.core.type.filter.TypeFilter接口的类

继续修改我们的ManuFacture类,不实现接口,不需要注解,不继承任何类。

public class ManuFacture {
}

我们添加一个MyFilter实现TypeFilter接口:

public class MyFilter implements TypeFilter {
    @Override
    public boolean match(MetadataReader metadataReader,
                 MetadataReaderFactory metadataReaderFactory) throws IOException {
        //这里判断读取的类型是否是ManuFacture,如果是就返回true,否则返回false;
        // 返回true就会被spring加载,否则不加载
     if(metadataReader.getClassMetadata().getClassName().equals(ManuFacture.class.getName())){
          return true;
        }
        return false;
    }
}

mvc配置类:

 <!-- 通知spring根据我们配置的MyFilter类进行加载 这里的 expression要配置我们自己的MyFilter -->
  <context:include-filter type="custom" expression="com.by.pojo.MyFilter"/>

直接运行即可

回到之前的配置:

<context:component-scan base-package="com.by">
        <!--指定包扫描的包含controller-->
    <context:include-filter
                            type="annotation"
                            expression="org.springframework.stereotype.Controller"/>
    <!--开启注解扫描-->
</context:component-scan>

controller中编写:

@Controller
public class HelloWord2  {
    @RequestMapping("/hello2")
    public ModelAndView handleRequest() throws ServletException, IOException {
        ModelAndView mv=new ModelAndView();
        mv.setViewName("success");
        mv.addObject("msg","给不了的永远都是空的");
        return mv;
    }
}

使用 @EnableWebMvc 注解 代替配置

<mvc:annotation-driven> 和 @EnableWebMvc 解析
这两个起到的作用是类似的(避免重复注册,二选一即可), 都是注册了大部分spring mvc开发所需的bean(HandlerMapping,HandlerAdapter等等),
还有根据包存在添加messageConverter(例如jackson,以支持@ResponseBody).

配置类编写

@Configuration
//开启 Spring MVC注解驱动
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    /*
    配置视图解析器
    */
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        WebMvcConfigurer.super.configureViewResolvers(registry);
        //注册到视图配置中
        registry.viewResolver(resourceViewResolver());
    }
    /**
     * 配置请求视图映射
     */
    private InternalResourceViewResolver resourceViewResolver(){
        InternalResourceViewResolver viewResolver=new InternalResourceViewResolver();
        //请求视图的前缀
        viewResolver.setPrefix("/WEB-INF/");
        //请求视图的后缀
        viewResolver.setSuffix(".jsp");
        return  viewResolver;
    }
}

controller编写:文章来源地址https://www.toymoban.com/news/detail-538468.html

@Controller
public class HelloWord3  {
    @RequestMapping("/hello3")
    public ModelAndView query() {
        ModelAndView mv=new ModelAndView();
        //如果xml统一配置路径,可以简写程文件名
        mv.setViewName("success");
        mv.addObject("msg","使用配置类操作");
        return mv;
    }
}

到了这里,关于Spring mvc 组件介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【SpringMVC】基于 Spring 的 Web 层MVC 框架

    🎄欢迎来到@边境矢梦°的csdn博文🎄 🎄本文主要梳理SpringMVC : 基于 Spring 的 Web 层MVC 框架 🎄 🌈我是边境矢梦°,一个正在为秋招和算法竞赛做准备的学生🌈 🎆喜欢的朋友可以关注一下 🫰🫰🫰 ,下次更新不迷路🎆 Ps: 月亮越亮说明知识点越重要 (重要性或者难度越大

    2024年02月08日
    浏览(42)
  • SpringMVC-2-Spring MVC拦截器详解:从入门到精通

    能够编写拦截器并配置拦截器 1.1 拦截器概念和作用 拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行 作用: 在指定的方法调用前后执行预先设定的代码 阻止原始方法的执行 总结:增强 核心原理:AOP思想 1.2 拦截器和过滤器的区别

    2024年02月12日
    浏览(50)
  • SpringMVC-1-解密Spring MVC:构建优雅、灵活的Web应用的秘诀

    能够编写SpringMVC入门案例 了解SpringMVC原理 思考:SpringMVC框架有什么优点? SpringMVC是一种基于Java实现MVC模型的轻量级Web框架 优点 使用简单,开发便捷(相比于Servlet) 天然的与Spring框架集成(如IOC容器、AOP等) 请求处理简化:支持用户请求数据自动映射封装 响应处理简化:

    2024年02月12日
    浏览(45)
  • Spring MVC学习随笔-Spring MVC介绍

    学习视频:孙哥说SpringMVC:结合Thymeleaf,重塑你的MVC世界!|前所未有的Web开发探索之旅 概念: SpringMVC是基于Spring Framework衍生而来的MVC框架,主要解决了原有MVC框架开发过程中,控制器(Controller)的问题 SpringMVC是一个MVC框架 MVC是一个架构思想,在JavaEE开发中多用于Web开发

    2024年02月05日
    浏览(47)
  • Spring MVC组件

    用户请求到达前端控制器,它就相当于mvc模式中的c, dispatcherServlet 是整个流程控制的中心,由它调用其它组件处理用户的请求 ,dispatcherServlet 的存在降低了组件之间的耦合性。 HandlerMapping负责根据用户请求找到 Handler 即处理器 ,SpringMVC 提供了不同的映射器实现不同的映射

    2024年02月03日
    浏览(48)
  • 【Spring MVC】Spring MVC的功能使用和相关注解介绍

    Spring MVC主要有三个功能: 连接 获取参数 输出数据 对于 Spring MVC 来说,掌握了以上 3 个功能就相当于掌握了Spring MVC。 连接的功能:将⽤户(浏览器)和 Java 程序连接起来,也就是访问⼀个地址能够调⽤到我们的Spring 程序。 先创建一个SpringMVC项目,过程和SpringBoot项目创建相

    2024年02月16日
    浏览(46)
  • Spring MVC介绍

    MVC 模式,全称为 Model-View-Controller(模型-视图-控制器)模式,它是一种软件架构模式,其目标是将软件的用户界面(即前台页面)和业务逻辑分离,使代码具有更高的可扩展性、可复用性、可维护性以及灵活性。 通常情况下,一个完整的 Java Web 应用程序,其结构如下图Jav

    2024年02月10日
    浏览(34)
  • Spring MVC请求处理流程和九大组件

    需求:前端浏览器请求url: http://localhost:8080/demo/handle01,前端⻚⾯显示后台服务器的时间 开发过程 配置DispatcherServlet前端控制器 开发处理具体业务逻辑的Handler(@Controller、@RequestMapping) xml配置⽂件配置controller扫描,配置springmvc三⼤件 将xml⽂件路径告诉springmvc(DispatcherSer

    2024年02月07日
    浏览(50)
  • 73.是否可以把我们所需的Bean都放入Spring­mvc子容器里面来管理(springmvc的spring-servlet.xml中配置全局扫描)?

    可以 , 因为父容器的体现无非是为了获取子容器不包含的bean, 如果全部包含在子容器完全用不到父容器了, 所以是可以全部放在springmvc子容器来管理的。 虽然可以这么做不过一般应该是不推荐这么去做的,一般人也不会这么干的。如果你的项目里有用到事物、或者aop记得也

    2024年02月21日
    浏览(47)
  • JavaWeb框架:Spring MVC介绍

    MVC(Model View Controller,模型-视图-控制器) ,作为一种设计模式,用于应用程序的分层开发。 Spring MVC ,由 Spring 框架提供的基于 MVC 设计模式的一个轻量级 Web 开发框架。Spring MVC 提供了一个前端控制器 DispatcherServlet 来分派请求,然后通过配置处理程序映射、视图解析等,使

    2024年02月12日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包