Java学习笔记-全栈-web开发-16-SpringMVC


1. 入门

1.1 简介

MVC

  • M:Model
  • V:View
  • C:Controller - servlet/action/controller

Spring MVC是Spring提供的一个强大而灵活的web框架。借助于注解,Spring MVC提供了几乎是POJO的开发模式,使得控制器的开发和测试更加简单。这些控制器一般不直接处理请求,而是将其委托给Spring上下文中的其他bean,通过Spring的依赖注入功能,这些bean被注入到控制器中。

Spring MVC组成:

  • DispatcherServlet
  • 处理器映射【找控制器】
  • 适配器【调用控制器的方法】
  • 控制器【业务】
  • 视图解析器
  • 视图

1.2 入门案例

  1. 导入SpringMVC 依赖
  2. web.xml配置DispatcherServlet
 <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
  1. WEB-INF目录下创建DispatcherServlet-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" xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
		http://www.springframework.org/schema/mvc 
		http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
		http://www.springframework.org/schema/context 
		http://www.springframework.org/schema/context/spring-context-3.2.xsd 
		http://www.springframework.org/schema/aop 
		http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 
		http://www.springframework.org/schema/tx 
		http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
		
</beans>
  1. 配置DispatcherServlet-servlet.xml
<!-- 1. 配置处理器映射,springmvc默认的处理器映射器
			 BeanNameUrlHandlerMapping:根据bean的name属性的url去找handlerController -->
		<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
		<!-- 2. 配置处理器适配置器执行Controller -->
		<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
		<!-- 3.配置一个控制器 -->
		<bean name="/user.do" class="com.gyf.backoffice.web.controller.UserController"/>
		<!-- 4.配置springmvc视图解析器
			视图解析器解析的视频路径为:前缀 + 后缀 -->
		<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
			<property name="prefix" value="/WEB-INF/views"/>
			<property name="suffix" value=".jsp"/>
		</bean>
  1. 创建Controller
    在这里插入图片描述
  2. 创建页面
    在这里插入图片描述
  3. 运行项目,访问localhost:8080

1.3 SpringMVC执行流程

在这里插入图片描述

1.3.1 控制器映射

BeanNameUrlHandlerMapping
根据url请求去匹配bean的name属性,从而获取Controller
在这里插入图片描述SimpleUrlHandlerMapping
根据浏览器url匹配简单url的key,key就是Controller的id找到Controller
在这里插入图片描述

ControllerClassNameHandlerMapping
根据类名(MyController)类名.do来访问,类名首字母小写
在这里插入图片描述

小结

在这里插入图片描述

1.3.2 处理器适配器

SimpleControllerHandlerAdapter

在这里插入图片描述调用controller里面方法,返回modelAndView
在这里插入图片描述
HttpRequestHandlerAdapter
与上面的最大区别在于它没有返回值。
编码麻烦
执行控制器
负责调用实现HttpRequestHandler接口的控制器
在这里插入图片描述在这里插入图片描述
两种处理器适配器可以共存。

1.3.3 命令控制器(了解)

Springmvc通过命令设计模式接受页面参数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如果bean中配置name,都要加上/斜杠

在这里插入图片描述

1.4 解决乱码

POST乱码

<!-- 配置编码过滤器  -->
  	<filter>
  		<filter-name>EncodingFilter</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>EncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

GET乱码(Tomcat7才会)
在这里插入图片描述

2. SpringMVC注解开发(精髓)

2.1 尝试

  1. 修改DispatchServlet-Servlet.xml
 <!-- 1.配置注解扫描位置 -->
<context:component-scan base-package="com.gyf.backoffice.web.controller"/>
		
<!-- 2. 配置处理器映射,通过注解来查找 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!-- 3.配置注解处理适配器来执行控制器的方法 -->	
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
		
<!-- 配置springmvc视图解析器
			视图解析器解析的视频路径为:前缀 + 后缀 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<property name="prefix" value="/WEB-INF/views"/>
	<property name="suffix" value=".jsp"/>
</bean>
  1. 更改controller
    在这里插入图片描述

  2. 访问测试

  3. 简化xml文件
    在这里插入图片描述

2.2 RequestMapping(重点)

写法:
在这里插入图片描述

在类上面也可以写RequestMapping,表示所有方法访问的根路径

2.2.1 数据接收

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

2.2.2 小结

控制器中传参的类型,在表单中直接使用传参类型的属性即可。

比如:
传参为User,直接使用User中的username、
传参为UserExt,直接使用UserExt中的map(infos[‘key’])、list(userList[0])

2.3 RequestParam

用于获取前端传来的数据,相当于request.getparameter()

在这里插入图片描述

2.4 RequestBody 和 ResponseBody

@ResponseBody把后台pojo转换json对象,返回到页面。(用于java对象–>json
@RequestBody接受前台json数据,把json数据自动封装javaBean(用于json–>java对象

注意,使用上述注解之后,就不能跳转到模板引擎,所有的return值都封装到HTTPbody中传输。

@ResponseBody用的多,后台给前端json数据
但是@RequestBody用的少,前端不一定给后台json

3. SpringMVC拦截器

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

3.1 登录拦截器

public class LoginInterceptor implements HandlerInterceptor{
	//controller执行后且视图返回后调用此方法
	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
		System.out.println("返回视图前  后处理");
	}
	//controller执行后但未返回视图前调用此方法
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
			throws Exception {
		System.out.println("未返回视图前 后处理....");
	}

	// controller执行前调用此方法
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception {
		// TODO Auto-generated method stub
		System.out.println("预处理....");
		//如果是登录页面则放行
		if(request.getRequestURI().indexOf("login.do")>=0){
			return true;
		}
		HttpSession session = request.getSession();
		//如果用户已登录也放行
		if(session.getAttribute("user")!=null){
			return true;
		}
		//用户没有登录挑战到登录页面
		request.getRequestDispatcher("/WEB-INF/views/login.jsp").forward(request, response);
		
		return false;
	}
}

控制器
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

拦截所有的请求,使用/**,
如果拦截的路径在项目不存在,直接报错

前后端数据交互重要注解总结(重点)

@RequestMapping (包括GetMapping等衍生注解)

  • 控制器访问路由

@RequestParam

  • 参数传递

@PathVariable

  • 获取路径参数

@RequestBody

  • 获得json到javabean中

@ResponseBody

  • 将javabean传递为json
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值