- SpringMVC
- SSM:Mybatis + Spring + SpringMVC
- MVC
MVC 是模型 (Model), 视图(View), 控制器(Controller) 的简写, 是一种软件设计规范.
是将业务逻辑, 数据, 显示分离的方法来组织代码
MVC 主要作用是降低了视图与业务逻辑间的双向耦合
MVC 不是设计模式, 是一种架构模式. 不同的 MVC 存在差异
**Model(模型):** 数据模型, 提供要展示的数据, 因此包含数据和行为, 可以认为是领域模型或 JavaBean 组件 (包含数据和行为), 不过现在一般都分离开来: Value Object(数据 Dao) 和服务层(行为 Service). 也就是模型提供了模型数据查询和模型数据的状态更新等功能, 包括数据和业务.
**View(视图):** 负责进行模型的展示, 一般就是我们见到的用户界面, 客户想看到的东西.
**Colltroller(控制器):** 接收用户请求, 委托给模型进行处理(状态改变), 处理完毕后把返回代数据模型数据返回给视图, 由视图负责展示. 也就是说是控制器做了个调度员的工作
三层架构:
表现层, 业务层, 持久层
表现层(SpringMVC):
一般指 web 层. 负责接收客户端请求, 向客户端相应结果
表现层包括展示层和控制层!(控制层负责接收请求, 展示层负责结果的展示)
表现层依赖于业务层, 接收到客户端请求一般会调用业务层进行业务处理, 并将结果返回给客户端.
表现层的设计一般使用 MVC 模型.(MVC 是表现层的设计模型, 和其他层没有关系)
业务层(Spring 框架):
一般指 service 层, 负责业务逻辑处理
表现层依赖业务层, 但是业务层不依赖表现层
业务层在业务处理时, 可能会依赖持久层, 如果要对数据持久化需要保证事务一致性.
持久层(Mybatis 框架):
一般指 dao 层, 负责数据持久化
持久层包括数据库和数据访问层(数据库是载体, 数据访问层是业务层和持久层交互的接口)
业务层通过数据访问层将数据持久化到数据库中.
比较典型的 MVC 模式: JSP+Servlet+JavaBean
MVC: 模型 (dao,service) 视图 (jsp) 控制器(Servlet)
职责分析
controller: 控制器
获得表单数据
调用业务逻辑
转向指定的页面
Model: 模型
业务逻辑
保存数据的状态
View: 视图
显示页面
MVC 框架做的事情
将 url 映射到 Java 类或 Java 类的方法
封装用户提交的数据
处理请求 -- 调用相关的业务处理 -- 封装相应数据
将相应的数据进行渲染 .jso /html 等表示层数据
SpringMVC
SpringMVC 是 Spring Framework 的一部分, 是基于 Java 实现的 MVC 的轻量级 Web 框架
特点:
轻量级, 简单易学
高效, 基于请求相应的 MVC 框架
与 Spring 兼容性好, 无缝结合
约定大于配置
功能强大: RESTful, 数据验证, 格式化, 本地化, 主题等
灵活
Spring 的 Web 框架围绕 DispatcherServlet[调度 Servlet]设计.
DispatcherServlet 的作用是将请求分发到不同的处理器.
SpringMVC 框架以请求为驱动, 围绕一个中心 Servlet 分派请求及提供其他功能, DispatcherServlet 是一个实际的 Servlet(他继承自 HttpServlet 基类)
SpringMVC 原理
发起请求时, 被前置的控制器拦截到请求, 根据请求参数生成代理请求, 找到请求对应的实际控制器, 控制器处理请求, 创建数据模型, 访问数据库, 将模型响应给中心处理器, 控制器使用模型与视图渲染图结果, 将结果返回给中心控制器, 再将结果返回给请求者.
入门程序
搭建环境
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <maven.compiler.source>1.8</maven.compiler.source>
- <maven.compiler.target>1.8</maven.compiler.target>
- <spring.version>5.0.2.RELEASE</spring.version>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-context</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-Web</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-webmvc</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-API</artifactId>
- <version>2.5</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>javax.servlet.jsp</groupId>
- <artifactId>jsp-API</artifactId>
- <version>2.0</version>
- <scope>provided</scope>
- </dependency>
- </dependencies>
- <servlet>
- <servlet-name>dispatcherServlet</servlet-name>
- <servlet-class>org.springframework.Web.servlet.DispatcherServlet</servlet-class>
- <!-- 加载 Spring 的配置文件 -->
- <init-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:springmvc.xml</param-value>
- </init-param>
- <!-- -->
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>dispatcherServlet</servlet-name>
- <!-- 发送任何请求都会经过 Servlet-->
- <url-pattern>/</url-pattern>
- </servlet-mapping>
- <!-- springMVC 自带过滤器 -->
- <filter>
- <filter-name>encoding</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>
- <?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"
- 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">
- </beans>
- <!-- 开启注解扫描 -->
- <context:component-scan base-package="cn.imut"/>
- <!-- 视图解析器 -->
- <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <!-- 文件所在目录 -->
- <property name="prefix" value="/WEB-INF/jsp/"/>
- <!-- 文件的后缀名 -->
- <property name="suffix" value=".jsp"/>
- </bean>
- <!-- 开启 SpringMVC 注解支持 -->
- <mvc:annotation-driven/>
- <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
- <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
编写程序
- // 控制器
- @Controller
- public class HelloController {
- @RequestMapping(path = "/hello")
- public String sayHello() {
- System.out.println("Hello StringMVC!");
- return null;
- }
- }
使用 springMVC 必须配置的三大件:
处理器映射器, 处理器适配器, 视图解析器
通常, 我们只需要手动配置视图解析器, 而处理器映射器和处理器适配器只需要开启注解驱动即可, 而省去了大段的 xml 配置
过程
启动服务器, 加载配置文件
DispatcherServlet 对象被创建
springmvc.xml 被加载
HelloController 被创建成对象
发送请求, 后台处理请求
组件:
SpringMVC 框架基于组件方式执行流程
@RequestMapping
@RequestMapping 注解用于映射 url 到控制器类或一个特定的处理程序方法. 可用于类或方法上. 用于类上, 表示类中的所有响应请求的方法都是以该地址作为父路径.
属性:
value: 用于指定请求的 URL. 他和 path 属性的作用时一样的
method: 用于指定请求的方式
params: 用于指定限制请求参数的条件
控制器 Controller:
控制器提供访问应用程序的行为, 通常通过接口定义或者注解定义两种方式实现
控制器负责解析用户的请求并将其转换为一个模型
一个控制器可以包含多个方法
实现 Controller 接口
- // 定义控制器
- // 注意点: 不要导错包, 实现 Controller 接口, 重写方法;
- public class ControllerTest1 implements Controller {
- public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
- // 返回一个模型视图对象
- ModelAndView mv = new ModelAndView();
- mv.addObject("msg","Test1Controller");
- mv.setViewName("test");
- return mv;
- }
- }
- <bean name="/t1" class="com.kuang.controller.ControllerTest1"/>
注解
@Controller 注解类型用于声明 Spring 类的实例是一个控制器
Spring 可以使用扫描机制来找到应用程序中所有基于注解的控制器类, 为了保证 Spring 能找到你的控制器, 需要在配置文件中声明组件扫描.
- <!-- 自动扫描指定的包, 下面所有注解类交给 IOC 容器管理 -->
- <context:component-scan base-package="com.kuang.controller"/>
- //@Controller 注解的类会自动添加到 Spring 上下文中
- @Controller
- public class ControllerTest2{
- // 映射访问路径
- @RequestMapping("/t2")
- public String index(Model model){
- //Spring MVC 会自动实例化一个 Model 对象用于向视图中传值
- model.addAttribute("msg", "ControllerTest2");
- // 返回视图位置
- return "test";
- }
- }
RestFul 风格
概念
Restful 就是一个资源定位及资源操作的风格. 不是标准也不是协议, 只是一种风格. 基于这个风格设计的软件更简洁, 更有层次, 更易于实现缓存等机制.
功能
资源: 互联网所有事物都可以被抽象为资源
资源操作: 使用 POST,DELETE,PUT,GET, 使用不同的方法对资源进行操作
分别对应 添加, 删除, 修改, 查询.
传统方式操作资源: 通过不同的参数来实现不同的效果! 方法单一, post 和 get
http://127.0.0.1/item/queryltem.action?id=1 查询, GET
http://127.0.0.1/item/saveltem.action 新增, POST
http://127.0.0.1/item/updateItem.action 更新, POST
http://127.0.0.1/item/deleteItem.action?id=1 删除, GET 或 POST
使用 RESTful 操作资源: 可以通过不同的请求方式来实现不同的效果! 如下: 请求地址一样, 但功能可以不同
http://127.0.0.1/item/1 查询, GET
http://127.0.0.1/item/1 新增, POST
http://127.0.0.1/item/1 更新, PUT
http://127.0.0.1/item/1 删除, DELETE
请求转发 forward
- @Controller
- public class ModelTest {
- @RequestMapping(path = "/m1/t1")
- public String test(Model model) {
- model.addAttribute("msg","ModelTest");
- return "forward:/WEB-INF/jsp/test.jsp";
- }
- }
重定向 redirect
- @Controller
- public class ModelTest {
- @RequestMapping(path = "/m1/t1")
- public String test(Model model) {
- model.addAttribute("msg","ModelTest");
- return "redirect:/index.jsp";
- }
- }
数据处理
处理提交数据
提交的域名称和处理方法的参数名一致
提交的域名称和处理方法的参数名不一致
- @GetMapping("/t1")
- public String test1(@RequestParam("name1") String name, Model model) {
- //1. 接收前端参数
- System.out.println("接收到前端的参数为:" + name);
- //2. 将返回代结果传递给前端
- model.addAttribute("msg",name);
- //3. 跳转视图
- return "test";
- }
提交的是一个对象
- @GetMapping("/t2")
- public String test2(User user) {
- System.out.println(user);
- return "test";
- }
- http://localhost:8080/springmvc_03_servlet_war_exploded/user/t2?id=1&name=q&age=1
Model,ModelMap,ModeAndView 的区别
Model 只有个别方法, 适合存储数据, 简化
ModelMap 继承了 LinkedMap, 除了实现自身方法, 还可以使用 LinkedMap 的方法与特性
ModelAndView 可以在存储数据的同时, 进行设置返回的逻辑视图, 进行控制展示层的跳转
乱码问题
解决方案一, 过滤器
- public class EncodingFilter implements Filter {
- @Override
- public void init(FilterConfig filterConfig) throws ServletException {
- }
- @Override
- public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
- servletRequest.setCharacterEncoding("utf-8");
- servletResponse.setCharacterEncoding("utf-8");
- filterChain.doFilter(servletRequest,servletResponse);
- }
- @Override
- public void destroy() {
- }
- }
- <filter>
- <filter-name>encoding</filter-name>
- <filter-class>cn.imut.filter.EncodingFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>encoding</filter-name>
- <!-- 过滤所有的请求 -->
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- @Controller
- public class EncodingController {
- // 过滤器解决乱码
- @PostMapping("/e/t1")
- public String test1(String name, Model model) {
- model.addAttribute("msg",name);
- return "test";
- }
- }
解决方案二, SpringMVC 自带过滤器
- <!-- springMVC 自带过滤器 -->
- <filter>
- <filter-name>encoding</filter-name>
- <filter-class>org.springframework.Web.filter.CharacterEncodingFilter</filter-class>
- <init-param>
- <param-name>eccoding</param-name>
- <param-value>utf-8</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>encoding</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
来源: http://www.bubuko.com/infodetail-3475113.html