SpringMVC - 01SpringMVC入门
(1)SpringMVC概述
SpringMVC是一种基于Java的实现MVC设计模型的请求驱动类型的轻量级Web框架,属于SpringFrameWork的后续产品,已经融合到Spring Web Flow中。
SpringMVC已经成为目前最主流的MVC框架之一,随着Spring3.0的发布,全面超越Struts2,成为最优秀的MVC框架。
(2)SpringMVC快速入门
需求: 客户端发起请求,服务器端接收请求,执行逻辑并进行视图跳转。
(2.1)导入坐标
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.0.10.RELEASE</version> </dependency>
(2.2)web.xml配置SpringMVC核心控制器DispatcherServlet
<servlet> <servlet-name>DispatcherServlet</servlet-name> // 配置SpringMVC的前端控制器 <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> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>DispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
(2.3)创建Controller类和视图页面
public class UserController { public String save(){ System.out.println("Controller save running......"); return "success.jsp"; }
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <h1>成功!!!</h1> <hr/> </body> </html>
(2.4)使用注解配置Controller类中业务方法的映射地址
@Controller @RequestMapping("/user") public class UserController { // 请求地址: http://localhost:8080/user/quick?username=zhangsan @RequestMapping(value = "/quick", method=RequestMethod.GET, params = {"usernmae"}) public String save(){ System.out.println("Controller save running......"); return "success.jsp"; } }
(2.5)配置SpringMVC核心文件spring-mvc.xml
<!--Controller组件扫描--> <context:component-scan base-package="com.bearpx.spring.mvc"> // <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
// 在web.xml中加入spring-mvc.xml
(2.6)客户端发起请求测试
21-Nov-2020 17:34:26.815 璀﹀憡 [http-nio-8080-exec-6] org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException Resolved [org.springframework.web.bind.UnsatisfiedServletRequestParameterException: Parameter conditions "username" not met for actual request parameters: ] Controller save running......
(2.7)IDEA启动tomcat后console界面中文乱码
将IDEA常见配置都修改为UTF-8之后,不启作用。
(idea64.exe.vmoptions / EditConfigurations - TomcatServer / settings - FileEncoding / settings - Java Compiler )
修改本地tomcat文件夹下log.properties的java.util.logging.ConsoleHandler.encoding=GBK,原为UTF-8。成功!!!。
(3)SpringMVC执行流程
<1> 用户发送请求至前端控制器DispatcherServlet
<2> DispatcherServlet收到请求,调用HandlerMapping处理器映射器。
<3> 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
<4> DispatcherServlet调用HandlerAdapter处理器适配器。
<5> HandlerAdapter经过适配器调用具体的处理器(Controller,后端控制器)
<6> Controller执行完返回ModelAndView
<7> HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
<8> DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
<9> ViewReslover解析后返回具体View。
<10> DispatcherServlet根据View进行渲染视图(即将模型数据填充到视图中)。DispatcherServlet响应用户。
(4)SpringMVC初识
(4.1)注解: @RequestMapping
作用:用来建立请求URL和处理请求方法之间的对应关系
位置:
> 类上, 请求URL的第一级访问目录。 此处不写的话,相当于应用的根目录
> 方法上,请求URL的第二级访问目录。与类上的使用@RequestMapping标注的一级目录一起组成访问虚拟路径
属性:
> value: 用于指定请求的URL。它和path属性的作用是一样的。
> method:用于指定请求的方式。RequestMethod.GET/POST/ PUT/ HEAD/ PATCH/ DELETE/ OPTIONS/ TRACE。
> params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的key和value必须和配置的一模一样。
例如: params={"accountName"},表示请求参数必须有accountName; params={"money!100"},表示请求参数中money不能是100
21-Nov-2020 19:14:29.477 警告 [http-nio-8080-exec-5] org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException Resolved [org.springframework.web.bind.UnsatisfiedServletRequestParameterException: Parameter conditions "username" not met for actual request parameters: ]
(4.2)SpringMVC注解解析
> 引入mvc命名空间和约束地址 xmlns:context / xmlns:mvc="http://www.springframework.org/schema/mvc"
> 组件扫描:
SpringMVC基于Spring容器,在进行SpringMVC操作时,需要将Controller存储到Spring容器中。
如果使用@Controller注解标注的话,需要使用<context:component-scan base-package="com.bearpx.spring.mvc"/>进行组件扫描。
(4.3)视图解析器配置: forward和redirect
查看spring-webmvc-5.0.10.RELEASE.jar文件中org.springframework.web.servlet包下的DispatcherServlet.properties 文件org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver
> 使用forward 方式:
@RequestMapping(value = "/quick", method = RequestMethod.GET, params = {"username"}) public String save(){ System.out.println("Controller save running......"); return "forward:/success.jsp"; }
结果: 返回结果,网址未发生变化, 产生了一次请求
> 使用redirect方式:
@RequestMapping(value = "/quick", method = RequestMethod.GET, params = {"username"}) public String save(){ System.out.println("Controller save running......"); return "redirect:/success.jsp"; }
测试结果: 返回结果,网址发生变化, 产生了两次请求
> 设置视图前缀和后缀
将webapp/success.jsp 调整到 webapp/jsp/success.jsp, 修改代码,return "/jsp/success.jsp"报错。
设置web.xml 配置
<!--配置内部资源视图解析器--> // /jsp/success.jsp <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/jsp/"></property> <property name="suffix" value=".jsp"></property> </bean>