由于前两天有意外情况,Spring学习不得不停止两天。
1.SpringMVC概念
Spring MVC是Spring提供的一个实现了Web MVC设计模式的轻量级Web框架。具有以下特点:
1.是Spring框架的一部分
2.灵活性强
3.提供了一个前端控制器DispatcherServlet
4.可自动绑定用户输入
5.内置了常见的校验器,可以校验用户输入
2.SpringMVC快速入门
需求:客户端发起请求,服务器端接收请求,执行逻辑并进行视图跳转。
开发步骤:
① 导入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>
② 在web.xml中配置SpringMVC核心控制器DispathcerServlet
<!--配置SpringMVC的前端控制器-->
<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>
<!--表示容器在启动时立即加载Servlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<!--元素中的"/"会将所有URL拦截并交由DispatcherServlet处理-->
<url-pattern>/</url-pattern>
</servlet-mapping>
③ 创建Controller类和视图页面
public class QuickController {
public String quickMethod(){
System.out.println("quickMethod running.....");
return "index";
}
}
在webapp文件夹下创建index.jsp
<html>
<body>
<h2>Hello SpringMVC!</h2>
</body>
</html>
④ 使用注解配置Controller类中业务方法的映射地址
@Controller
public class QuickController {
@RequestMapping("/quick")
public String quickMethod(){
System.out.println("quickMethod running.....");
return "index";
}
}
⑤ 配置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.itheima"/>
</beans>
⑥ 客户端发起请求测试
3.SpringMVC流程图
SpringMVC组件解析
1. 前端控制器:DispatcherServlet
用户请求到达前端控制器,它就相当于 MVC 模式中的 C,DispatcherServlet 是整个流程控制的中心,由它调用其它组件处理用户的请求,DispatcherServlet 的存在降低了组件之间的耦合性。
2. 处理器映射器:HandlerMapping
HandlerMapping 负责根据用户请求找到 Handler 即处理器,SpringMVC 提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
3. 处理器适配器:HandlerAdapter
通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
4. 处理器:Handler
它就是我们开发中要编写的具体业务控制器。由 DispatcherServlet 把用户请求转发到 Handler。由Handler 对具体的用户请求进行处理。
5. 视图解析器:View Resolver
View Resolver 负责将处理结果生成 View 视图,View Resolver 首先根据逻辑视图名解析成物理视图名,即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。
6. 视图:View
SpringMVC 框架提供了很多的 View 视图类型的支持,包括:jstlView、freemarkerView、pdfView等。最常用的视图就是 jsp。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。
5.SpringMVC注解解析
@RequestMapping
作用:用于建立请求 URL 和处理请求方法之间的对应关系
位置:
类上,请求URL 的第一级访问目录。此处不写的话,就相当于应用的根目录
方法上,请求 URL 的第二级访问目录,与类上的使用@ReqquestMapping标注的一级目录一起组成访问虚拟路径
属性:
value :用于指定请求的URL。它和path属性的作用是一样的
method :用于指定请求的方式
params :用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的key和value必须和配置的一模一样
例如:
params = {"accountName"} ,表示请求参数必须有accountName
params = {"moeny!100"} ,表示请求参数中money不能是100
使用注解开发时应注意:
1.在Spring-mvc.xml配置文件中引入mvc命名空间(在mvc入门已经引入):
命名空间: xmlns: context ="http://www.springframework.org/schema/context"
xmlns: mvc ="http://www.springframework.org/schema/mvc"
约束地址: http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
2.配置组件扫描(base-package后跟需要扫描的有注解的包,只有被扫描后注解才会生效):
<context:component-scan base-package=“com.itheima.controller"/>
视图解析器的配置(在Spring-mvc.xml中配置):
<!--配置内部资源视图解析器-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- /jsp/success.jsp (1name-》前缀 2name-》后缀)-->
<property name="prefix" value="/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
设置后入门中的QuickController类返回的字符串会自动在头和尾加上前缀和后缀,组成"/jsp/index.jsp"。如果将QuickController类返回值改为“redirect:index”,则程序将重定向至index.jsp,而将返回值设为“forward:index”,则程序将转发至index.jsp(默认为forward)。
6.SpringMVC的数据响应方式
1) 页面跳转
-直接返回字符串
-通过ModelAndView对象返回
向request域存储数据(两种形式):
通过SpringMVC框架注入的request对象setAttribute()方法设置
- -2.通过ModelAndView的addObject()方法设置
2) 回写数据
-直接返回字符串
通过SpringMVC框架注入的response对象
- -2. 将需要回写的字符串直接返回,但此时需要通过 @ResponseBody 注解告知SpringMVC框架,方法 返回的字符串不是跳转是直接在http响应体中返回。
- -3.在异步项目中,客户端与服务器端往往要进行json格式字符串交互,此时我们可以
- 手动拼接json字符串返回。
- 使用json转换工具jackson进行转换,导入jackson坐标:
<!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
通过jackson转换json格式字符串,回写字符串。
@RequestMapping("/quick7")
@ResponseBody
public String quickMethod7() throws IOException {
User user = new User();
user.setUsername("zhangsan");
user.setAge(18);
ObjectMapper objectMapper = new ObjectMapper();
String s = objectMapper.writeValueAsString(user);
return s;
}
-返回对象或集合
- -1.通过SpringMVC帮助我们对对象或集合进行json字符串的转换并回写,为处理器适配器配置消息转换参数,指定使用jackson进行对象或集合的转换,因此需要在spring-mvc.xml中进行如下配置:
<bean class="org.springframework.web.servlet.mvc.method.annotation
.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json
.MappingJackson2HttpMessageConverter">
</bean>
</list>
</property>
</bean>
@RequestMapping("/quick8")
@ResponseBody
public User quickMethod8() throws IOException {
User user = new User();
user.setUsername("zhangsan");
user.setAge(18);
return user;
}
2.在方法上添加@ResponseBody就可以返回json格式的字符串,但是这样配置比较麻烦,配置的代码比较多, 因此,我们可以使用mvc的注解驱动代替上述配置。
<!--注解驱动,以使得访问路径与方法的匹配可以通过注解配置-->
<mvc:annotation-driven/>
使用<mvc:annotation-driven>默认底层就会集成jackson进行对象或集合的json格式字符串的转换。并且可在Spring-xml.xml配置文件中使用<mvc:annotation-driven>替代注解处理器和适配器的配置。