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

2021-08-18 15:44:46 浏览数 (1)

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
代码语言:javascript复制
 <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>

3. WEB-INF目录下创建DispatcherServlet-servlet.xml

代码语言:javascript复制
<?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>

4. 配置DispatcherServlet-servlet.xml

代码语言:javascript复制
<!-- 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>

5. 创建Controller

6. 创建页面

7. 运行项目,访问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乱码

代码语言:javascript复制
<!-- 配置编码过滤器  -->
  	<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
代码语言:javascript复制
 <!-- 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 登录拦截器

代码语言:javascript复制
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 人点赞