MVC三层架构
- MVC三层架构前面也都了解过了,在这里想说的是,在实际的开发中Model层可能有dao、service、pojo(entity),但是pojo也有可能会被细分为dto、vo,vo就是向视图层传输必要的数据,比如用户表中有用户名、密码、爱好、生日...,但是在登录的时候,视图层就只需要用户名和密码,如果把整个用户表封装为对象传过去会浪费资源,所有就使用了vo,只传输必要的数据,一些项目的源码都有这个。
SpringMVC框架要做哪些事?
- 1.将URL映射到java类或java类的方法。
- 2.封装用户提交的数据。
- 3.处理请求、调用相关的业务、封装响应数据。
- 4.将响应的数据进行渲染 .jsp/html等表示层数据。
SpringMVC中的DispatchServlet
- 相当于在以前的servlet加了一层,以前每访问一个页面都要注册servlet,而现在用了DispatchServlet就只用配置一次,每个URL地址都会有DispatchServlet来处理,更加方便了。
SpringMVC执行原理
mvc.png- 1.DispatchServlet表示前置控制器,是SpringMVC的控制中心。用户发出请求,DispatchServlet接受请求并拦截请求。
- 假设我们请求的url为:http://loaclhost:8080/springmvc/hello(这里的springmvc不是我们在代码中写的url,而是在Tomcat中配置的站点!)
- http://localhost:8080 为服务器域名,springmvc为部署在服务器上的站点。
- hello 就可表示为控制器,由此分析,此url为:请求位于服务器localhost:8080上的springmvc站点的hello控制器。
- 2.HandlerMapping为处理映射器。DispatchServlet调用HandlerMapping,HandlerMapping在根据url查找Handler。
- 3.HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器。如上,被查找到的控制器为hello。
- 4.HandlerExecution将解析后的信息传递给DispatchServlet,DispatchServlet再让HandlerAdapter(处理器适配器)去执行Handler。
- 5.Handler在让具体的Controller执行。
- 6.Controller执行完后再讲返回的信息传给HandlerAdapter,如ModelAndView。
- 7.HandlerAdapter在将试图逻辑名或模型传给DispatchServlet,DispatchServlet再调用ViewResolver(视图解析器)来解析逻辑试图名。
- 8.ViewResolver再将解析出来的结果传给DispatchServlet,DispatchServlet最后再调用具体的试图,最终呈现给用户。
配置SpringMVC的DispatchServlet
- 在web.xml中配置DispatchServlet,以前我们一个页面需要配置一个servlet,现在只用配置一个DispatchServlet,让它管理所有的servlet。(用架构的话来说就是加了一层)
<!--配置SpringMVC的核心:DispatchServlet,请求分发器或前端控制器-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatchServlet</servlet-class>
<!--DispatchServlet要绑定Spring的配置文件-->
<!--classpath:就是resources文件下的路径-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<!--启动级别:1-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--Servlet的请求路径-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern><!--这是请求的路径,所有请求都会被它拦截-->
</servlet-mapping>
Tips:这里的请求路径不要写成 /* ,因为 /* 会匹配所有请求,包括jsp页面,而 / 则不会匹配jsp页面。
spring-mvc.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"
xmlns:aop="http://www.springframework.org/schema/aop"
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
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
">
<!-- 扫描controller的注解,别的不扫描 -->
<context:component-scan base-package="com.jxlg.controller">
</context:component-scan>
<!-- 配置视图解析器,这个可以改变,到使用springboot时可以改为thymeleaf模板引擎 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- JSP文件所在的目录,前缀 -->
<property name="prefix" value="/pages/" />
<!-- 文件的后缀名 ,后缀-->
<property name="suffix" value=".jsp" />
</bean>
<!-- 设置静态资源不过滤 -->
<mvc:resources location="/css/" mapping="/css/**" />
<mvc:resources location="/img/" mapping="/img/**" />
<mvc:resources location="/js/" mapping="/js/**" />
<mvc:resources location="/plugins/" mapping="/plugins/**" />
<!-- 开启对SpringMVC注解的支持,并且自动注入了处理器映射器和处理器适配器 -->
<mvc:annotation-driven />
</beans>
Tips:页面 = 试图解析器前缀 + 返回的值(return "xxx") + 试图解析器后缀
RestFul风格
- 传统的风格传参是:http://localhost:8080/add?a=1&b=2
- RestFul风格传参数是:http://localhost:8080/add/1/2
相对应的Controller代码:
@Controller
public class test{
@ResquestMapping("/add/{a}/{b}")
public void add(@PathVariable int a,@PathVariable int b,Model model){
int res=a+b;
model.addAtribute("msg","结果为"+res);
return "add";
}
}
【总结】:主要是要利用@PathVariable
注解进行传值。
- RestFul风格还有多种提交方式:
- GetMapping
- DeleteMapping
- PutMapping
- PostMapping
- PatchMapping
Tips:
@RestController
是只返回字符串,不会走视图解析器,@ResponseBody
也是直接返回字符串不会走试图解析器。
解决springmvc中文乱码问题
- 在web.xml中配置filter过滤器
<!--利用springMvc帮我们写好的过滤器来解决中文乱码问题-->
<filter>
<filter-name>ecoding</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>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
了解JSON
- 什么是JSON:json只是一种格式。在前后端分离时代,后端就复责给前端一个接口,但是后端传给前端的值必须要是json的格式,前端才能识别使用,所以我们要将数据转换为json格式,可以使用Jackson架包将数据转为json格式,要导入Jackson依赖。
- JSON中文乱码的问题:自己百度,就是在applicationContext.xml中配置。
- FastJson:阿里巴巴的一个工具包,也可以将数据转为json格式,简单好用 QuickStart
SpringMVC拦截器
- SpringMVC的处理器拦截器类似于Servlet中的Filter过滤器,用于处理器进行预处理和后处理。
- 过滤器和拦截器的区别:拦截器是利用AOP的思想,对代码进行横切进去的。拦截器只能拦截访问控制器的方法,如果访问的是静态资源文件则不会被拦截。
- 自定义拦截器:实现HandlerInterceptor接口。
Tips:在WEB-INF目录下的页面或者文件都不能直接访问,必须通过Controller或者Servlet进行访问!
网友评论