SpringMvc学习总结

SpringMvc学习总结

SpringMvc执行流程

img

SpringMvc有一个控制器DispatcherServlet,用户接收和处理请求,当用户发送一个请求时,DispatcherServlet会拦截用户发送的请求,再根据地址找到对应的控制器Controller进行业务处理。

springmvc提供了 前端控制器 DispatcherServlet,仅针对对客户端的请求和响应进行统一 处理(就是说封装了servlet),是个框架 。是针对三层架构的表述层(或表示层) 开发提供的框架 ,而mvc是一种思想。
对于原先的mvc思想来说,springmvc只是包含了mvc思想的一部分 Controller进行实现。

在mvc思想的实现中 分成了 Model{ Service DAO }, View{ html } , Controllor{ controllor }.

原先的Controller在实现本身的作用外 接收请求和响应浏览器外, 还需要调用View和Controller。耦合严重。

springmvc的出现取代了controller本身作用接收请求 并且实现了表示前台页面的调用, controllor变成了中间层 调用Model层和写明View层的名字留给springmvc去调用,所以 springmvc的出现是为了解耦。

SpringMvc开发步骤

  • 导入SpringMvc相关依赖
  • 配置SpringMVC核心控制器DispathcerServlet
  • 创建Controller类和视图页面
  • 使用注解配置Controller类中业务方法的映射地址
  • 配置SpringMVC核心文件 spring-mvc.xml
  • 客户端发起请求测试

导入SpringMvc相关依赖

<!--Spring依赖-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.0.5.RELEASE</version>
</dependency>
 
<!--SpringMVC依赖-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.0.5.RELEASE</version>
</dependency>
 
<!--Servlet依赖-->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
</dependency>
 
<!--Jsp依赖-->
<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.0</version>
</dependency>

配置SpringMVC核心控制器DispathcerServlet

<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:spring-mvc.xml</param-value>
    </init-param>
 <!--
        <load-on-startup>1</load-on-startup>的作用
        1)load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法)。
        2)它的值必须是一个整数,表示servlet应该被载入的顺序
        3)当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet;
        4)当值小于0或者没有指定时,则表示容器在该servlet被选择时才会去加载。
        5)正数的值越小,该servlet的优先级越高,应用启动时就越先加载。
        6)当值相同时,容器就会自己选择顺序来加载。
        -->
    <load-on-startup>1</load-on-startup>
</servlet>
 
<servlet-mapping>
    <servlet-name>DispatcherServlet</servlet-name>
    <!-- 此处必须为/,不然DispatcherServlet拦截将会出错-->
    <url-pattern>/</url-pattern>
</servlet-mapping>

创建Controller类和视图页面

@Controller//表示这是Controller层,自动注入bean
public class HelloController {
    @RequestMapping("/hello")//访问地址,可接受任何请求
	public String hello(){
    System.out.println("hello World!");
    return "index.jsp";
}
}

配置SpringMVC核心文件 spring-mvc.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    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
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">
 
    <!--配置注解扫描-->
    <context:component-scan base-package="com.xyj"/>
</beans>

SpringMvc常用注解解析

@RequestMapping

  • value:用于指定请求访问地址
  • method:用于指定接受请求访问类型,例如post,get,put,delete
  • params:用于接收请求参数的配置,用于参数上,值为前端传入的属性名,通常用于前端参数与控制器参数不一致的情况

@ResponseBody

  • 通常用在方法上,当你的方法想返回数据而非视图时,就可以使用该注解

@RequestBody

  • 通常用在参数上,表明参数值从请求中获取

@RequestParam

  • value:请求参数名称
  • required:此在指定的请求参数是否必须包括,默认是true,提交时如果没有此参数则报错
  • defaultValue:当没有指定请求参数时,则使用指定的默认值赋值

@PathVariable

  • 通常用在参数上,用于对应地址栏中的占位符

SpringMvc常用对象解析

ModelAndView

  • addObject:参数1:用于取值的key,参数2:保存的数据,用于保存数据,返回给前端
  • setViewName:参数:返回的视图
@RequestMapping(value="/hello1")
 //如果传有ModelAndView作为形参,MVC框架会帮你注入,那么MVC会将自动给你创建一个ModelAndView对象供你使用
    public ModelAndView hello1(ModelAndView modelAndView){
        modelAndView.addObject("username","哈哈哈");
        modelAndView.setViewName("hello1");
        return modelAndView;
    }

SpringMVC获得请求数据

  • 基本类型参数
  • POJO类型参数
  • 数组类型参数
  • 集合类型参数
//数组数据类型的获取
 
@RequestMapping("/hello2")
@ResponseBody
public void hello2(String[] strs) throws IOException {
    System.out.println(Arrays.asList(strs));
}
 
//POJO数据类型的获取
 
public class User {
private String username;
private int age;
getter/setter…
}
@RequestMapping("/hello3")
@ResponseBody
public void hello3(User user){
    System.out.println(user);
}
 
//基本数据类型的获取
 
@RequestMapping("/hello4")
@ResponseBody
public void hello4(String username,int age){
    System.out.println(username);
    System.out.println(age);
}

拦截器

拦截器的作用

  • Spring MVC 的****拦截器*类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。*

    将拦截器按一定的顺序联结成一条链,这条链称为拦截器链(Interceptor Chain)

  • 在访问被拦截的方 法或字段时,拦截器链中的 拦截器就会按其之前定义的顺序被调用。

  • 拦截器也是AOP思想的具体实现。

登录拦截器

  • 创建拦截器类实现HandlerInterceptor接口
  • 配置拦截器
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
 
public class MyInterceptor1 implements HandlerInterceptor {
    //在目标方法执行之前 执行
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {
      //设置需要的程序
        String authorization = request.getHeader("Authorization");
        if (ObjectUtils.isEmpty(authorization)) {
            response.setCharacterEncoding("utf-8");
            response.setContentType("application/json; charset=utf-8");
            response.getWriter().write("权限不足");
            return false;
        }
        HttpSession session = request.getSession();
        Object obj = session.getAttribute(authorization);
        if(ObjectUtils.isEmpty(obj)){
            response.getWriter().write("token已过期");
            return false;
        }
        return true;
    }
 
    //在目标方法执行之后 视图对象返回之前执行
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
         //设置需要的程序
    }
 
    //在流程都执行完毕后 执行
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
         //设置需要的程序
    }
}

常见问题解析

请求数据乱码问题

<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    </filter>
 
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

设置开放静态资源

<mvc:resources mapping="/js/**" location="/js/"/> 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值