目录
1.什么是MVC
MVC是一种设计模式。
M即model模型是指模型表示业务规则。在MVC的三个部件中,模型拥有最多的处理任务。被模型返回的数据是中立的,模型与数据格式无关,这样一个模型能为多个视图提供数据,由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。
V即View视图是指用户看到并与之交互的界面。比如由html元素组成的网页界面,或者软件的客户端界面。MVC的好处之一在于它能为应用程序处理很多不同的视图。在视图中其实没有真正的处理发生,它只是作为一种输出数据并允许用户操作的方式。
C即controller控制器是指控制器接受用户的输入并调用模型和视图去完成用户的需求,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示返回的数据。
它强制性地使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。最典型的MVC就是JSP + servlet + javabean的模式
优点
1.耦合性低
2.重用性高
3.部署快,生命周期成本低
4.可维护性高
2. 什么是SpringMVC
springMVC它是spring框架的一个分支,该springMVC框架主要完成的功能是:接收浏览器的请求响应,对数据进行处理,然后返回页面进行显示,可以把它理解为和Servlet干的工作是一样的。
优点
用 springmvc 比原本 servlet 方便快捷,开发效率高,springmvv 通过前端控制器拦截所有请求,然后下发给控制器映射器,通过它找到处理链,然后返回给前端控制器,前端控制器继续下发给控制器执行器,控制器执行器找到执行前面找到执行链,然后返回给控制器执行,然后再次返回前端控制器,前端控制器将再次下发给视图解析器,视图解析器渲染视图,最后通过前端控制器返回给前端,使用 mvc 开发人员只需要专心写业务,不需要关系其他东西,这样大大提高开发效率。
3. 如何使用SpringMVC
(1)创建maven-web工程
(2)修改web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
</web-app>
(3) 引入SpringMVC依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.15.RELEASE</version>
</dependency>
</dependencies>
(4) 在web.xml配置文件中注册DIspatcherServlet
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!--classpath:表示编译后的路径-->
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
(5)在Resources下创建springmvc配置文件
其中 <context:component-scan base-package="com.lcy.controller"/>
是为了springmvc能够扫描创建到controller文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--包扫描-->
<context:component-scan base-package="com.lcy.controller"/>
</beans>
(6) 创建controller
@Controller //该注解标记该类为处理层类---类似@WebServlet
public class HelloController {
@RequestMapping(value = "/login") //把请求路径映射到该方法上。
public String login(){
System.out.println("登陆处理");
return "mian.jsp"; //处理后相应页面
}
}
对以上SpringMVC运行流程进行分析
1、客户端发送请求访问login页面
2、dispatcherServlet接受请求
3、查询在controller中是否存在匹配的@RequestMapping
4、若存在,则执行controller中处理内容,最后返回结果(上面返回的是一个网页)
5、找到对应网页,选然后返回给客户
4. controller接受请求参数
在以往接受请求参数时,使用的request.getParamter("参数名")这种方式,但是这种方式是比较麻烦的,因为接收后的参数都是String类型,需要我们手动转型。
4.1 接收参数
在SpringMVC中则简单很多
(1)接受少量参数
@RequestMapping("login")
public String login(String username, String password){
system.out.println("username=" + username);
system.out.println("password=" + passwrod);
return "main.jsp"
}
在controller接参的时候指定类型和参数名(参数名必须保持一致)即可。
(2)接受大量参数
可以封装到一个实体类中接收参数
4.2 参数乱码问题
在接受参数时,不可避免会出现参数值乱码情况,在以往我们可以添加编码过滤器,但现在SpringMVC中提供了一个。
1. 自己手动创建编码过滤器
public class MyEncodingFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setCharacterEncoding("utf-8");
filterChain.doFilter(servletRequest,servletResponse);
}
public void destroy() {
}
}
然后在web.xml中进行映射配置即可(也可使用注解)
<filter>
<filter-name>encodingfilter</filter-name>
<filter-class>com.lcy.filter.MyEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>encodingfilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
(2)使用SpringMVC提供的编码过滤器,直接在web.xml中进行映射配置
<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>
</filter>
<filter-mapping>
<filter-name>encodingfilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4.3 接收含有日期类型的参数
(1)在时间类型的属性上添加注解@DateTimeFormat(pattern="yyyy-MM-dd")
pattern 指定时间格式
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;//出生日期
·(2) 在SpringMVC配置文件中开启注解驱动
<mvc:annotation-driven/>
5. 静态资源处理
DispatcherServlet核心功能大致有
1、文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析;
2、通过HandlerMapping,将请求映射到处理器;
3、通过HandlerAdapter支持多种类型的处理器;
4、通过ViewResolver解析逻辑视图名到具体视图实现;
5、本地化解析;
6、渲染具体的视图等;
7、如果执行过程中遇到异常将交给HandlerExceptionResolver来解析。
但是DispatcherServlet也会把静态资源进行拦截(例如css img js html)等
这时需要我们放行静态资源,在springmvc配置文件中进行配置
<mvc:default-servlet-handler/>