SpringMVC(学习记录)

本文详细介绍了SpringMVC框架,包括其设计理念、主要特点(如MVC分离、非侵入式、REST支持等)、执行流程、核心组件和快速入门步骤。还探讨了视图解析器、拦截器和依赖注入在框架中的作用。
摘要由CSDN通过智能技术生成

什么是springmvc?

        Spring MVC 是 Spring Framework 提供的一个流行的“Model-View-Controller” 的轻量级的web 开发框架。

SpringMVC的主要特点和作用

1.基于MVC设计模式:

Spring MVC遵循松耦合的MVC设计理念,将程序逻辑、数据和界面分离,易于开发和测试。

2.非侵入式设计:

它只是一组Java类,不依赖任何容器和框架。几乎不需要任何配置就可以实现MVC功能。

3.RESTful支持:

内置映射URL到控制器方法的功能,方便实现增删改查等REST操作。

4.强大的数据处理功能:

内置数据绑定、格式化、验证功能,自动将请求参数映射到Java对象或直接使用。

5.视图技术独立:

采用松耦合的方式,支持各种视图技术如JSP、Freemarker、Thymeleaf等。

6.拦截器支持:

通过拦截器机制支持日志、安全、认证等系统服务,为请求处理提供动态扩展点。

7.依赖注入与 IoC:

结合Spring IOC容器,使用依赖注入实现组件解耦合。

8.AOP支持:

可以对Controller进行权限、事务等切面操作的应用。

9.部署自动配置:

简化部署配置,部署Spring MVC应用只需几个配置文件的支持。

10.REST API 开发:

支持前后端分离模式下的API开发,利用其HTTP请求映射功能。

SpringMVC的执行流程

  1. 用户发送请求至前端控制器DispatcherServlet。
  2. DispatcherServlet收到请求后,将提交的信息交给处理器映射器HandlerMapping。
  3. HandlerMapping根据用户的url请求,匹配该url的Handler (Controller),并返回一个执行链。
  4. DispatcherServlet调用处理器适配器HandlerAdapter。
  5. HandlerAdapter经过适配调用具体的处理器 (Controller)。
  6. Controller处理完成后返回一个ModelAndView。
  7. HandlerAdapter将Controller处理结果 (ModelAndView)返回给DispatcherServlet。
  8. DispatcherServlet将ModelAndView请求视图解析器 (ViewReslover)进行解析。
  9. ViewReslover解析后返回具体的View。
  10. DispatcherServlet将view进行渲染视图 (即将模型数据填充到视图中)。
  11. DispatcherServlet将页面响应给用户。

主要组件

  1. 前端控制器(DispatcherServlet):接收请求、响应结果,相当于转发器,它是SpringMVC框架最核心的组件,有了它就能减少其他组件之间的耦合度。
  2. 处理器映射器(HandlerMapping):根据请求的URL找到具体的处理器。
  3. 处理器适配器(HandlerAdapter):适配调用具体的处理器,并且执行处理器中处理请求的方法,执行完毕之后返回一个ModelAndView对象。
  4. 处理器(Handler):处理具体的用户请求,涉及到具体的用户业务请求,所以一般情况需要工程师根据业务需求开发Handler。
  5. 视图解析器(ViewResolver):会根据传递过来的ModelAndView对象进行视图解析,解析完成之后就会返回一个具体的视图View给前端控制器。
  6. 视图(View):View是一个接口,它的实现类支持不同类型的视图。

快速入门

1.导入坐标

<dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.8</version>
        </dependency>
    </dependencies>

2.配置web.xml或配置类

<servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
package org.example.config;

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;

public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
    @Override
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringMvcConfig.class);
        return ctx;
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }
}

使用注解时要写SpringConfig配置类

package org.example.config;

import org.example.entity.Phone;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.*;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.mvc.Controller;
import org.springframework.web.servlet.view.InternalResourceViewResolver;


import javax.sql.DataSource;

@Configuration
@ComponentScan("org.example")
@EnableAspectJAutoProxy
@EnableTransactionManagement

@ComponentScan(value = "org.example",
        excludeFilters = @ComponentScan.Filter(
                type = FilterType.ANNOTATION,
                classes = Controller.class
        )
)
public class SpringConfiguration {


  

}

3.写一个Contrlloer类

@Controller
public class HeroController {
    @RequestMapping("/hello")
    public String hello(){
        System.out.println("这是SpringMVC");
        return "hello.jsp";//这里返回的是你的页面的名称,注意要放在WEB-INF之外才能找到

    }
}

@RequestMapping是Spring MVC中的一个注解,它的主要作用是将HTTP请求映射到控制器的处理方法上。以下是其主要功能以及一些示例:

主要功能

  1. 请求映射@RequestMapping可以将特定的HTTP请求映射到控制器类或特定的处理程序方法上。
  2. 指定请求的URL@RequestMapping注解可以用于指定请求的URL。
  3. 指定请求的方式@RequestMapping注解可以用于指定请求的方式。
  4. 指定请求参数的条件@RequestMapping注解可以用于指定限制请求参数的条件。
  5. 指定处理的HTTP请求头@RequestMapping注解可以用于指定处理的HTTP请求头。
  6. 指定处理的请求提交内容类型(Content-Type)@RequestMapping注解可以用于指定处理的请求提交内容类型。
  7. 指定返回的内容类型@RequestMapping注解可以用于指定返回的内容类型。

例子:

@Controller
@RequestMapping("/home")
public class HomeController {

    @RequestMapping(method = RequestMethod.GET)
    public String home() {
        return "homePage";
    }

    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
    public String view(@PathVariable("id") Long id) {
        // 处理代码
        return "viewPage";
    }

    @RequestMapping(value = "/{id}", method = RequestMethod.POST)
    public String edit(@PathVariable("id") Long id, @RequestParam("name") String name) {
        // 处理代码
        return "editPage";
    }
}

配置视图解析器

创建spring-mvc的配置文件,并在其中注入视图解析器

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<property name="prefix" value="/WEB-INF/views/"></property>
	<property name="suffix" value=".jsp"></property>
</bean>

因为将jsp文件放在WEB-INF文件夹外时不安全的,所以,一般要放在WEB-INF文件夹里面,所以为了更方便书写和能够访问到WEB-INF文件夹下面的页面,需要配置视图解析器,也可以使用配置类

package org.example.config;

import org.example.aop.LoginIntercepter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@ComponentScan("org.example.controller")
@EnableWebMvc
public class SpringMvcConfig implements WebMvcConfigurer {

    @Bean
    public ViewResolver getViewResolver(){
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/views/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }
   
}

配置拦截器

拦截器与过滤器

拦截器(Interceptor): 拦截器是Spring MVC框架的一部分,它的生命周期由Spring MVC容器管理。拦截器主要用于处理Spring MVC的控制器(Controller)的请求。例如,您可以使用拦截器来进行权限验证,判断用户是否登录,或者是进行一些通用的功能,如请求日志打印等。拦截器可以访问action上下文、值栈里的对象,因此它可以使用Spring MVC的各种特性,如依赖注入等。

过滤器(Filter): 过滤器是Servlet规范的一部分,它的生命周期由Servlet容器管理。过滤器可以对所有的请求进行过滤,包括对静态资源的请求。过滤器基于函数回调,但是它不能访问Spring MVC的上下文,因此它不能使用Spring MVC的特性,如依赖注入等。

主要区别

  1. 生命周期和依赖性:过滤器的生命周期由Servlet容器管理,而拦截器的生命周期由Spring MVC容器管理。过滤器是Servlet规范的一部分,依赖于Servlet容器。而拦截器是Spring MVC框架的一部分,不依赖于Servlet容器。
  2. 拦截范围:过滤器可以对所有请求进行过滤,而拦截器只能对Controller的请求进行拦截。
  3. 深度:拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
  4. 执行顺序:过滤器在拦截器之前执行。

创建拦截器的接口

public class MyIntercepter implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("目标方法执行之前执行···");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("目标方法执行之后,视图对象返回之前执行···");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("流程都执行完毕之后执行···");
    }
}

注入拦截器

<mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/hero/*"/>
            <bean class="com.cqgcxy.interceptor.MyIntercepter"></bean>
        </mvc:interceptor>
    </mvc:interceptors>
@Autowired
    private MyIntercepter myIntercepter;
    
   

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myIntercepter).addPathPatterns("/hero","/hero/**");
        registry.addInterceptor(loginIntercepter).addPathPatterns("/hero","/hero/**").excludePathPatterns("/hero/login");
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值