一.认识springMVC框架
1.MVC概念
是一种设计思想,将一个应用分成3个基本部分,分别代表着Web应用程序中的3种职责 Model(模型):用于存储数据和完成业务逻辑处理,一个或多个JavaBean对象(数据访问对象和业务逻辑对象)。
Spring MVC的模型是应用程序的数据结构和业务逻辑。在Spring MVC中,模型通常由JavaBean或普通的Java类实现。模型类可以包含属性、getter和setter方法以及任何其他必要的业务逻辑方法。在控制器中,可以使用ModelMap对象将模型数据添加到模型中,以便在视图中呈现。
View(视图):用于显示数据和向控制器提交数据请求,一个或多个JSP页面,用于展示数据和提交表单请求。
Spring MVC的视图是用户界面,可以是HTML、JSP、Thymeleaf等任何支持的技术。视图可以使用JSP、FreeMarker等模板引擎来呈现动态数据。在Spring MVC中,视图可以通过使用视图解析器来呈现数据。视图解析器可以使用XML配置文件或注解来声明。
Controller(控制器):根据视图请求调用Model完成业务处理,将处理后的结果交由View进行展示,一个或多个Servlet对象,接收视图请求并交由Model处理,将处理结果输出给View显示。
Spring MVC的控制器是处理用户请求的组件。控制器可以使用注解或XML配置文件来声明。常用的注解包括@Controller、@RequestMapping和@RequestParam等。@Controller注解用于标识控制器类,@RequestMapping注解用于指定处理哪些请求,@RequestParam注解用于获取请求参数。
SpringMVC是Spring框架提供的构建Web应用程序的全功能MVC模块。
2.搭建SpringMVC项目
整体步骤:
1>创建Web工程
2>引入Jar包
3>配置文件(web.xml和spring-mvc.xml)
SpringMVC是基于Servlet的框架,DispatcherServlet是整个SpringMVC框架的核心 DispatcherServlet主要职责是接收所有用户请求,并将其分派给相应的Controller来处理
<!-- 配置DispatcherServlet -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 配置DispatcherServlet接受所有URL请求 -->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
注:url-pattern是”/”,千万不能写成”/*”
说明:
1、load-on-startup: (1)当值为0或者大于0时,表示tomcat在应用启动时就加载这个servlet (2)当是一个负数时或者没有指定时,则表示第一次URL请求的时候加载该servlet
2、servlet-mapping用于配置servlet接受哪些URL请求,<url-pattern>/</url-pattern>表示接受所有请求,注意,千万不要写成<url-pattern>/*</url-pattern>
<!-- 编码过滤器,解决中文乱码问题 -->
<!--在 web.xml添加 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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4>设计Controller、View和Model
以下是一个简单的控制器示例:
@Controller
@RequestMapping("/hello")
public class HelloController {
@RequestMapping(method = RequestMethod.GET)
public String printHello(ModelMap model) {
model.addAttribute("message", "Hello Spring MVC Framework!");
return "helloworld";
}
}
在上面的示例中,我们使用@Controller和@RequestMapping注解来声明一个控制器类。在printHello()方法中,我们接收一个ModelMap对象作为参数,并向其中添加一个message属性。最后,我们返回一个逻辑视图名称"helloworld",该名称将被解析为实际的视图实现。
定义视图解析器
在Spring MVC中,视图解析器用于将逻辑视图名称解析为实际的视图实现。以下是一个简单的视图解析器示例:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
在上面的配置中,我们定义了一个InternalResourceViewResolver类作为视图解析器,并指定了前缀和后缀。这意味着当控制器返回一个逻辑视图名称时,视图解析器将在/WEB-INF/views/目录下查找与该名称匹配的JSP文件。
表单处理和数据绑定
Spring MVC提供了强大的表单处理和数据绑定功能。以下是一个处理用户注册的表单提交示例:
在控制器中处理表单提交:
@Controller
@RequestMapping("/register")
public class RegisterController {
@RequestMapping(method = RequestMethod.POST)
public String registerUser(@ModelAttribute("user") User user, BindingResult result) {
if (result.hasErrors()) {
return "register"; // 返回注册页面,显示错误信息
} else {
// 注册逻辑代码...
return "success"; // 注册成功页面
}
}
}
在上面的示例中,我们使用@ModelAttribute注解将表单提交的数据绑定到一个User对象上。如果数据验证失败,我们将返回注册页面并显示错误信息;否则,我们将执行注册逻辑并返回成功页面。 还需要定义一个User类,包含需要绑定的属性和getter/setter方法。在视图中呈现表单:在JSP文件中,可以使用Spring标签库来呈现表单并绑定数据。以下是一个简单的注册页面示例:在HTML页面中使用form标签提交表单,使用input标签接收用户输入的值,并使用Spring标签库中的form标签绑定数据。例如:
<form:input path="username" />
其中path属性指定要绑定的属性名称。这样,当用户提交表单时,Spring MVC会自动将数据绑定到User对象上并执行相应的逻辑。
异常处理在Spring MVC中,可以使用@ExceptionHandler注解来处理应用程序中发生的异常。以下是一个简单的异常处理示例:在控制器类中添加一个方法来处理特定类型的异常,并使用@ExceptionHandler注解来声明该方法用于处理异常。例如:
@ControllerAdvice public class GlobalExceptionHandler {
@ExceptionHandler(value = Exception.class) public ResponseEntity<Object> exception(Exception exception) {
// 处理异常的逻辑代码
return new ResponseEntity<>("发生异常:" + exception.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); } }
在上面的示例中,我们定义了一个GlobalExceptionHandler类来处理所有的异常。在exception()方法中,我们接收一个Exception对象作为参数并执行相应的处理逻辑。
说明:
1、@Controller注解标识该类为控制器
2、@RequestMapping("/hello")注解表示用户请求访问hello方法的映射路径url
3、控制器中的方法我们称为Action
二.SpringMVC工作原理
(1)用户发送请求至前端控制器DispatcherServlet
(2)DispatcherServlet收到请求调用HandlerMapping处理器映射器。
(3)处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
(4)DispatcherServlet调用HandlerAdapter处理器适配器。
(5)HandlerAdapter经过适配调用具体的Handler处理器(Controller,也叫后端控制器)。Controller执行完成返回ModelAndView。
(6)HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet。
(7)DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
(8)ViewReslover解析后返回具体View视图。
(9)DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
(10)DispatcherServlet根据View和Model渲染视图响应给客户端。
三.SpringMVC特点
Spring框架的一部分,无缝集成Spring框架 分离了控制器、模型对象、分派器以及处理程序对象的角色,更容易定制 支持注解驱动、数据验证等功能 高度可配置,支持多种视图技术,而不仅仅局限于JSP 采用松耦合可插入组件结构,比其他MVC框架更具备扩展灵活性。
四.注意事项
在使用Spring MVC时,需要注意以下几个关键知识。
-
控制器类 控制器类是Spring MVC中最重要的组件之一,它负责接收请求并处理请求。在控制器类中,需要使用@RequestMapping注解来指定处理哪些URL请求。同时,控制器类还可以使用@ModelAttribute注解来将表单数据绑定到模型对象中,方便处理业务逻辑。
-
视图解析器 Spring MVC采用视图解析器来将模型对象渲染为HTML或其他格式的响应。在Spring MVC中,可使用多种类型的视图解析器,如InternalResourceViewResolver、JstlView等。
-
拦截器 拦截器是Spring MVC中的另一个重要组件,它用于拦截请求并在请求处理前后执行一些操作,如记录日志、验证用户权限等。在Spring MVC中,可使用HandlerInterceptor接口来定义和实现拦截器。
-
表单处理 在处理表单时,Spring MVC提供了多种方式来绑定表单数据和模型对象。其中,最常用的方式是使用@ModelAttribute注解和BindingResult参数来将表单数据绑定到模型对象中,并进行数据校验。在控制器中,可以使用@RequestMapping注解来指定处理表单提交的请求,并使用@RequestParam注解来获取表单中的输入值。如果表单验证失败,可以将错误信息添加到Model中,以便在视图中呈现。如果表单验证成功,可以将模型数据添加到Model中,以便在视图中呈现表单提交的结果。
-
异常处理 在Web开发中,异常处理是一个非常重要的话题。在Spring MVC中,可使用@ControllerAdvice注解和@ExceptionHandler注解来处理异常。通过定义全局异常处理类,并使用@ExceptionHandler注解来捕获特定类型的异常,可以实现全局异常处理的功能。Spring MVC提供了异常处理功能,可以捕获应用程序中发生的异常并生成相应的HTTP响应。在控制器中,可以使用try-catch块捕获异常并生成HTTP响应。在生成的HTTP响应中,可以包含异常信息或其他必要的信息。