SpringMVC
MVC全名是Model View Controller 模型视图控制器,每个部分各司其职。
Model:数据模型,JavaBean的类,用来进行数据封装。
View:指JSP、HTML用来展示数据给用户
Controller:用来接收用户的请求,整个流程的控制器。用来进行数据校验等。
springMVC概述:
springmvc是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合。SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,属于Spring FrameWork 的后续产品,已经融合在 Spring Web Flow 里面。
springMVC入门案例:
1.在pom.xml文件中,添加jar包坐标,具体如下:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<!--锁定spring的版本-->
<spring.version>5.0.2.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
2.在工程的web.xml中配置SpringMVC的核心控制器DispatcherServlet
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<!--配置springMVC的核心控制器-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
3.在resources目录下创建springmvc.xml配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<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"></context:component-scan>
</beans>
4.在web.xml中添加配置,加载springmvc.xml配置文件
<!-- 配置SpringMVC的核心控制器-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--加载springmvc.xml配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- DispatcherServlet服务器开启的时候就创建这个servlet对象-->
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!-- /表示拦截所有请求-->
<url-pattern>/</url-pattern>
</servlet-mapping>
注:<load-on-startup>num</load-on-startup>
设置该servlet在加载时的优先级以及是否在容器中加载该servlet,num为数字,当为正值时,表示加载,且数字越小表示优先级越高;若为负数,则容器启动时不加载,只有该servlet被选中时才加载
5.创建处理请求的类
在com包下新建一个controller包,存放处理请求的所有类
@Controller//采用注解的方式把这个类交由Spring容器管理
public class HelloController {
// 配置请求的映射路径
@RequestMapping("/hello")//采用注解的方式把这个类交给spring容器管理
public String hello() {
System.out.println("请求来了");//配置请求的映射路径
return "success";//返回跳转到jsp页面的名称
}
}
注:在@RequestMapping注解中,属性有path和value,其值都代表映射路径,而且仅有一个属性时,可以省略不写。所以,括号中的完整写法是:value=“/hello"或path=”/hello"
6.在springmvc.xml配置文件中配置视图解析器 InternalResourceViewResolver,并开启spirngmvc的注解驱动
<!-- 配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="viewResolver">
<!--prefix 前缀 suffix 后缀 拼完成就是 /WEB-INF/success.jsp 因为我们返回的是一个success这个字符,然后再拼接上我们配置的前缀和后缀,就可以跳转到success.jsp这个页面-->
<property name="prefix" value="/WEB-INF/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 开启springmvc注解的驱动-->
<mvc:annotation-driven />
7.在WEB-INF目录下创建一个success.jsp页面
在上面配置的前后路径中,jsp文件存在/WEB-INF下,因此我们在其下建立一个成功页面,随便写一句话即可
8.在index.jsp中请求hello这个方法
<a href="${pageContext.request.contextPath}/hello">请求后台</a>
9.整体的文件目录如下:
10.发布项目,进行测试
入门案例的执行流程
- 当启动Tomcat服务器的时候,因为配置了load-on-startup标签,所以会创建DispatcherServlet对象,
就会加载springmvc.xml配置文件 - 开启了注解扫描,那么HelloController对象就会被创建
- 从index.jsp发送请求,请求会先到达DispatcherServlet核心控制器,根据配置@RequestMapping注解
找到执行的具体方法 - 根据执行方法的返回值,再根据配置的视图解析器,去指定的目录下查找指定名称的JSP文件
- Tomcat服务器渲染页面,做出响应
官方的详细流程图
基本组件的简单解释:
1.DispatcherServlet:前端控制器
用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,相当于是SpringMVC的大脑,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。
2.HandlerMapping:处理器映射器
HandlerMapping负责根据用户请求url找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
3.Handler:处理器
Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。这里所说的Handler就是我们自己编写的Controller
4.HandlAdapter:处理器适配器
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
5.ViewResolver:视图解析器
View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。
6.View:视图
springmvc框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。
在 SpringMVC 的各个组件中,处理器映射器、处理器适配器、视图解析器称为 SpringMVC 的三大组件。
表单提交数据是post请求方式时,中文会乱码的情况
在web.xml中配置一个SpringMVC提供的一个过滤器CharacterEncodingFilter,具体内容如下:<!-- 配置springmvc提供的一个过滤器解决中文乱码问题-->
<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>
SpringMVC常用注解:
RequestMapping注解的属性介绍作用:建立请求URL和处理方法之间的对应关系
作用对象:可以作用在方法和类上
作用在类上:第一级的访问目录
作用在方法上:第二级的访问目录
eg:
@RequestMapping(path = "/a") //一级路径
public class Hello {
@RequestMapping(value = "/b") //二级路径
public String hello() {
System.out.println("请求来了");
return "success";
}
}
//最终代表的路径就是:/a/b
//前台请求的路径也要跟着变:
<a href="${pageContext.request.contextPath}/a/b">请求后台</a>
RequestMapping的属性:
- path 配置请求路径
- value 配置请求路径
- mthod 配置介绍那种请求方式
eg:@RequestMapping(value="/hello",method ={RequestMethod.GET,RequestMethod.POST})
意思是接收get请求和post请求都可。
如果仅有一种请求方式的话,也可以换个注解,如get请求对应的就是@GetMapping(“/hello3”),相当于method属性融入@RequestMapping中了。类似的还有 @PostMapping,@PutMapping,@DeleteMapping
eg:@RequestMapping(value = "/hello2",method = {RequestMethod.GET})
上面的写法可以使用一个注解来代替:@GetMapping(value = “/hello2”)
4.params 指定限制请求参数的条件
@RequestMapping(value = "/hello",params ={"username"} )
表示请求的时候必须有请求参数username 当但是跟请求参数的值没关系
<a href="${pageContext.request.contextPath}/hello?username=zhangsan">请求后台</a>
如果配置了请求参数的名称和值,那么在请求时,必须保持一致
@RequestMapping(value = "/hello",params ={"username=zhangsan"} )
<a href="${pageContext.request.contextPath}/hello?username=zhangsan">请求后台</a>
请求时的参数名和值要和 @RequestMapping注解中配置的一致
RequestParam注解
作用:把请求中的指定名称的参数传递给控制器中的形参赋值,此注解用在形参上。
属性
1. value:请求参数中的名称 或者使用name属性 两个一样
2. required:请求参数中是否必须提供此参数,默认值是true,必须提供
3. defaultValue = “lisi” 参数的默认值
eg:
@RequestMapping("/testRequestParam")
public String testRequestParam(@RequestParam(value = "uname") String username){
System.out.println(username);
return "success";
}
RequestBody注解
作用:用于获取请求体的内容(注意:get方法不可以,因为get请求没有请求体),此注解用在方法的形参上
属性
required:是否必须有请求体,默认值是true
注:@ResponseBody 用于前后台异步交互,将Java对象转换成JSON字符串返回给前台,也可以使用在类上或方法上
使用在类上,那表示该类中的所有方法都返回JSON数据
使用在方法上,那表示该方法返回JSON数据
@RestController :
综合了@ResponseBody和@Controller
后台方法的返回值:
1.返回一个字符串
之前就是返回字符串,其实是跳转页面的名称
2.返回void
如果控制器的方法返回值编写成void,执行程序报404的异常,默认查找JSP页面没有找到。
如果返回void那么进行页面的跳转,就需要用原生的Servlet API 进行跳转。跳转路径需要自己编写,因为使用原生的Sevlet API 不会执行视图解析器
3.返回值是ModelAndView对象
ModelAndView对象是SpringMVC提供的一个对象,可以用来调整具体的JSP视图
使用ModelAndView可以把数据存到请求域中,还可以指定要跳转的视图
跳转页面的另一种方式forward(转发)和redirect(重定向):
- 转发:forward: 这个是固定写法,路径要写正确了,因为不走视图解析器
request.getRequestDispatcher(“/WEB-INF/pages/success.jsp”).forward(request, response); - 重定向: redirect: 固定写法 可以不用写项目路径,重定向不能访问WEB-INF目录下的资源
response.sendRedirect(request.getContextPath() + “/home.jsp”);
配置静态资源不被拦截
当前台用Jquery进行异步请求时,代码往往失效,因为放在服务器端的这些静态资源文件被SpringMVC的前端控制器拦截了,无法请求到相关静态资源。因此,需要在springmvc.xml下进行相关配置,让DispatcherServlet不要拦截静态资源配置方式1:
<!-- 设置静态资源不过滤 -->
<!-- 样式 -->
<mvc:resources location="/css/" mapping="/css/**"/>
<!-- 图片 -->
<mvc:resources location="/images/" mapping="/images/**"/>
<!-- javascript -->
<mvc:resources location="/js/" mapping="/js/**"/>
配置方式2:
<mvc:default-servlet-handler/>