搭建SpringMVC框架-HelloWord
一、目录结构
①通过maven创建web项目。
②补全web框架的目录结构
二、配置xml文件
编写pom.xml文件,添加SpringMVC框架需要的依赖、servlet依赖、thymeleaf依赖、日志依赖,maven工具导入相关jar包。
tips:https://mvnrepository.com/ 查找相关jar包的依赖代码,推荐使用最新或使用最多的jar包。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.12.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
三、配置SpringMVC的DispatcherServlet前端控制器
首先在tomcat例子中找到安装版本的web.xml文件,复制到当前项目中。然后配置前端控制器、代码过滤器。
<filter>
<filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<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:springmvc_config.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>
四、编写配置文件
编写spring配置文件springmvc_config.xml,实现自动导入与thymeleaf试图解析器配置。
<!--base-package是存储前端控制器(@Controller)的基目录-->
<context:component-scan base-package="com.fang.mvc"></context:component-scan>
<!--配置视图解析器:把handler方法返回值解析为实际的物理视图-->
<bean id="ViewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
<property name="order" value="1"/>
<property name="characterEncoding" value="UTF-8"/>
<property name="templateEngine">
<bean class="org.thymeleaf.spring5.SpringTemplateEngine">
<property name="templateResolver">
<bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
<property name="prefix" value="/WEB-INF/templates/"/>
<property name="suffix" value=".html"/>
<property name="templateMode" value="HTML5"/>
<property name="characterEncoding" value="UTF-8"/>
</bean>
</property>
</bean>
</property>
</bean>
五、配置.html
WEB-INF文件夹下新建一个tenolates文件夹,用以存放.html文件,创建index.html作为主页面。
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
Hello SpringMVC<br>
</body>
</html>
六、编写源文件
使用@Controller注解与@RequsetMapping注解
@Controller
public class TestScope {
@RequestMapping("/")
public String index(){
return "index"; //这里使用thymeleaf的命名规范,前缀为目录路径,后缀为.html
}
}
七、配置tomcat服务器
下载并在idea中配置tomcat,运行实例。
SpringMVC常用注解
@Controller
@RequestMapping
@RequestParam
@PathVariable
@RequestParam
@CookieValue
@Autowired
@Resource
@Repository
@Mapper
@ResponseBody()
@RequestBody(RequestEntity)
SpringMVC的视图
springmvc的视图就是View接口,视图的作用渲染数据,将模型Model中的数据展示给用户。分为转发视图(InternalResourceView)与重定向视图(RedirectView).
当工程中引入jstl的依赖,转发视图会自动转换为jstlView。
若使用Thymeleaf的视图技术,在SpringMVC的配置文件中配置了Thymeleaf的视图解析器,由此视图解析器解析之后所得到的是ThymeleafView。
一、SpringMVC访问静态资源的过程(删除过程中用到)
在xml配置文件中添加<mvc:default-servlet-handler/> 开放静态资源的访问。tomcat下的web.xml和项目中的web.xml在作用域上属于从属关系,当两者冲突时,采用就近原则,沿用工程的web.xml。当请求静态资源时,tomcat中web.xml的DefultServlet与项目中的DispatcherServlet冲突,以后者为准,但是后者没有配置静态资源访问,所以之有开放静态资源访问是才可以。
获取表单元素->将触发点击事件的超链接的herf属性赋值给表单的action->提交表单->取消超链接的默认行为。
webapp文件夹下创建static文件夹存放js文件。最后maven->Lifecycle->package重新打包,编译运行。
配置文件配置<mvc:annotation-driven/>。功能为请求在DispatcherServlet处理不了时,调用DefaultServlet进行处理。
HttpMessageConverter
报文信息转换器,将请求报文转换为java对象,或将java对象转换为相应报文。
@Controller
/**
* @RestController注解
* 该注解为SpringMVC提供的符合注解,首先该注解包括@Controller注解,然后该注解修饰的类为其中的每一个方法提供一个@ReponseBody注解
*/
public class TestMessageConverter {
@RequestMapping("/")
public String testindex(){
return "index";
}
/**
* test @RequestBody 获取请求体
* @param str
* @return
*/
@RequestMapping(value = "/testrequestbody",method = RequestMethod.POST)
public String testRequestBody(@RequestBody String str){
System.out.println("RequestBody:"+str);
return "index";
}
/**
* test RequestEntity(完整的请求报文转换为java对象)
* @param requestEntity
* @return
*/
@RequestMapping(value = "/testrequestentity")
public String testRequestEntity(RequestEntity<String> requestEntity){
System.out.println("请求头:"+requestEntity.getHeaders());
System.out.println("请求体:"+requestEntity.getBody());
return "index";
}
/**
* test ResponseBody
* 如果返回值是对象。需要导入jackson依赖,转换为json格式的字符串,因为http无法直接解析java对象
*
* 1、导入依赖
* 2、打开mvc注解
* 3、在处理器方法上使用@ResponseBody标识
* 4、java对象直接作为控制器方法的返回值,就会自动转换为Json格式的字符串
*
* @return 需显示的内容
*/
@RequestMapping("/testresponsebody")
@ResponseBody //方法的返回值,就是显示的数据
public String testResponseBody(){
return "index";
}
SpringMVC的执行流程
一、MVC常用组件
· DispatcherServlet:前端控制器,不需要工程师开发由框架提供
作用:统一处理请求和相应,整个流程控制的中心,由它调用其他组件处理用户的请求。
· HandlerMapping :处理器映射器,不需要工程师提供由框架提供
作用:根据请求的Url、method等信息查找Handler,即控制器方法
· Handler :处理器,由工程师开发
作用:在DispatcherServlet控制下,handler处理具体的用户请求
· HandlerAdapter : 处理器适配器 ,不与要工程师开发,由框架提供
作用: 通过HandlerAdapter对handler进行执行
ViewResolver : 视图解析器 不需要工程师开发,由框架提供
作用:进行视图解析得到相应的视图,例如:Thymeleafview、InternalResourceView、RedirectView
View:视图 不需要工程师开发,由框架提供
作用:将模型数据通过页面展示给用户。
二、DispatcherServlet的执行过程
Servlet的生命周期:完整的servlet生命周期流程:
1.加载web.xml文件。
2.通过构造函数创建servlet对象。
3.通过init方法初始化servlet。
4.通过service,或者doGet、doPost提供服务。
5.在重启或关闭时自动对servlet进行销毁。
DispatcherServlet的执行过程:
1、用户向服务器发送请求,请求被SpringMVC前端控制器DispatcherServlet捕获。
2、DispatcherServlet对请求URL进行解析,得到请求资源标识符(URL),判断请求URL对应的映射(handlerMapping)。
a)不存在
i:再判断是否配置了mvc:defaul-servlet-handler
ii:如果没配置:则控制台报没找到映射,报404错误。
iii:如果有配置,则访问目标资源(一般为静态资源),找不到客户端也会报404错误。
b)存在则执行下列流程
3、根据该URL,调用HandlerMapping获得该handler配置的所有相关对象(handler和拦截器),最后一handlerExecutionChain执行链对象的形式返回。
4、为前端控制器获得的handler,选择一个合适的HandlerAdapter。
5、handlerAdapter成功获得,则执行拦截器的preHandler方法(正向)。
6、提取request中的Model,填充handler方法传参,执行handler方法。Spring会帮你做一些额外的工作。
a)HttpMessageConveter:将消息(Json,xml等数据)转换为一个对象,将对象转换为指定的响应信息。
b)数据转换:对请求消息进行数据转换,String转换为Integer,Double等。
c)数据格式化:对请求消息进行数据格式化,将字符串转换成格式化数字和格式化日期等。
d)数据验证:验证数据有效性(长度、格式),验证结果存储到BuildingResult或error中。
7、Handler执行完之后,向DispatcherServlet返回一个modelAndView。
8、此视将开始执行拦截器的postHandler方法(逆向)
9、根据返回的ModleAndView(此时会判断是否存在异常,如果存在异常,调用HandlerExceptionResolver进行异常处理),选择有个合适的ViewResolver,进行视图解析,根据Model和View来渲染视图。
10、视图渲染完毕,将执行拦截器的afterCompletion方法(逆向)。
11、将渲染结果返回给客户端。