一、什么是Mvc框架
经典MVC模式中,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。其中,View的定义比较清晰,就是用户界面。
M即model模型是指模型表示业务规则。在MVC的三个部件中,模型拥有最多的处理任务。被模型返回的数据是中立的,模型与数据格式无关,这样一个模型能为多个视图提供数据,由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。
V即View视图是指用户看到并与之交互的界面。比如由html元素组成的网页界面,或者软件的客户端界面。MVC的好处之一在于它能为应用程序处理很多不同的视图。在视图中其实没有真正的处理发生,它只是作为一种输出数据并允许用户操作的方式。
C即controller控制器是指控制器接受用户的输入并调用模型和视图去完成用户的需求,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示返回的数据。
来源-------MVC架构 百度百科
- Model模型层,指工程中的javaBean,作用是处理数据。JavaBean分为两类:(1).实体类Bean:专门储存业务的数据。(2).业务处理Bean:如Service或Dao对象,专门用于处理业务逻辑喝数据访问
- View视图层,指工程中的html或jsp等页面,作用是与用户进行交互,展示数据
- Controller控制层,指工程中的Servlet,作用是接收请求和响应浏览器。
MVC的工作流程:
用户通过视图层发送请求到服务器,在服务器中请求被Controller接收,Controller调用相应的Model层处理请求,处理完毕将结果返回到Controller,Controller再根据请求处理的结果找到相应的View视图,渲染数据后最终响应给浏览器
二、什么是SpringMvc框架
SpringMVC它是spring框架的一个分支,该springMVC框架主要完成的功能是:接收浏览器的请求响应,对数据进行处理,然后返回页面进行显示== 可以把它理解为和Servlet干的工作是一样的。 一句话说就是,springMVC代替的就是我们之前的Servlet。
三、为什么要使用SpringMvc框架
我们之前在写servlet层代码时,就会发现有许多代码是重复书写的,就比如前端发送的请求包含参数,我们要想接到参数,就要用到request.getParamter("参数名")的方法。那么一个参数就要写一次这个代码,那要是有成千上百条,也要一个一个写的话很麻烦,而且把结果转换成json数据响应给用户时也非常麻烦。那么这时,springMVC框架的作用就体现出来了。
springMVC框架中的DispatcherServlet,可以帮我们自动接收请求参数,以及自动帮我们把结果转为json数据或做页面跳转。
四、SpringMvc的使用(基于idea)
(1)创建一个maven-web工程
注意:maven-web工程中的webapp下的WEB-INF下的web.xml版本(2.3版本)太低,可能会出现意料之外的错误,所以我们可以web.xml文件里面的内容全部替换成如下代码(4.0版本)
<?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>
(2)在pom.xml中引入springmvc的依赖 ,记得注册完后刷新pom
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.15.RELEASE</version>
</dependency>
</dependencies>
(3)注册DisparcherServlet 到web.xml文件上
我们之前在写servlet文件时,可以将servlet前加上注释来实现注册,也可以在web.xml文件中完成注册。同理,我们SpringMVC的DispatcherServlet也可以这样来实现注册。
<?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">
<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.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
(4) 在Rescourse中创建springMVC的配置文件
这里的命名没有硬性要求,可以命名为“springmvc.xml”。在springmvc.xml中加入包扫描的内容。相当于让springMVC找到我们的controller层在哪里。这里扫描的内容为你所写的当前包以及它的子包中的所有内容。base-packpage内就算写com.lrs也可以,因为他会扫描到该包下的所有子包。
<?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.lrs.controller"/>
</beans>
(5)在com.xxx.controller下创建一个Controller类。
例如我们下面就建立一个HelloController。
@Controller
public class HelloController {
@RequestMapping(value = "/hello")
public String hello(){
System.out.println("你好");
return "hello.jsp";
}
}
这里面需要解释的几个地方:
- @Controller:该注解标记该类为处理层类,相当于我们之前自己写Servlet时写的@WebServlet或者写过滤器时写的@WebFilter等等
- @RequsetMapping(value="/hello"):把请求的路径映射到该方法上。("/hello")相当于我们在浏览器的地址栏目输入的地址。代替了我们之前在servlet中写了一个参数名为method的东西来区分我们要做的业务处理
- 注意返回值类型为String。return后面的字符串内容为 要跳转到的页面名称。springMVC会自动帮我们拼接字符串地址,从而帮我们实现页面跳转。这个页面跳转相当于响应页面(区别于请求转发)。
**注意:这里有个坑的地方,我们的DispatcherServlet默认加载的springmvc配置文件目录为:WEB-INF/[servlet-name]-servlet.xml,除了将springmvc.xml放到这个路径下,我们也可以在web.xml中指定我们要加载的springmvc.xml配置文件。在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">
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 需要添加的内容。classpath:表示编译后的路径 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
五、springMvc的运行流程
- 1. 客户端发生请求http://localhost:8080/qy151_springmvc01/abc
- 来到tomcat服务器
- springmvc的前端控制器DipatcherServlet接受所有的请求
- 查看你的请求地址和哪个@RequestMaping匹配
- 执行对应的方法。方法会返回一个字符串。springmvc把该字符串解析为要转发的网页
- 把该字符串经过视图解析器拼接
- 把该字符串经过视图解析器拼接
- 渲染该网页给客户
六、Controller层接收参数
6.1 接收少量参数
例子:根据id删除。我们只需接收前端发送的一个id参数即可。
参数名必须一致! 否则浏览器就会报400的错误。
6.2 接收大量参数
例如:表单提交数据。
我们可以在com.xxx.entity下创建我们的实体类。将我们接参的类型改为你对应的实体类的类型,springMVC会自动将接收到的参数封装到我们的实体类中。
6.3 编码过滤器解决中文乱码问题
在我们接收到的参数中包含有中文时,可能会出现中文乱码的问题,这时就需要加我们的过滤器了。
(1)你可以自定义写编码过滤器。在pom.xml中加入servlet-api的依赖jar,然后在com.xxx.filter层下新建并编写你的编码过滤器EncodingFilter。注意,自己创建编码过滤器. jdk1.8一定要重写init和destory方法 1.9以后可以不写 。不然过滤器运行会报错。
EncodingFilter的代码:
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.lrs.filter.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>encodingfilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
(2)如果这种方法你不会,或者觉得这种方法比较麻烦,没关系,springMVC中有内置的编码过滤器。我们只需在web.xml中注册就好了
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>//类型为utf-8
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
6.4 日期类型参数的处理
日期类型的数据我们应该按照如下步骤进行处理:
(1)在实体类中的时间类型的属性上添加注解:@DateTimeFormat(pattern = "yyyy-MM-dd")
/**
* Created by Intellij IDEA
*
* @author 王俊凯
* @Date: 2022/6/8 8:45
* @Version 1.0
*/
package com.wjk.controller.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Studnet {
private Integer id;
private String name;
private Integer age;
private Integer sex;
private String address;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;
}
(2)在springmvc.xml配置文件中开启注解 驱动:
<!--开启注解驱动-->
<mvc:annotation-driven/>
注意:annotation-driven不要导错包了 !是后缀代mvc的这个driven。
七、处理静态资源
什么是静态资源?例如img下的图片,css样式,js,html等等,这些都属于静态资源。如果不处理这些静态资源,我们的springMVC中的前端控制器DispatcherServlet会把他们都拦截掉。如果被静态资源被拦截,我们的图片就加载不出来,样式也会无效。所以需要我们放行静态资源,
在springmvc.xml中放行静态资源,只需加一行代码即可。
<mvc:default-servlet-handler/>