MVC处理过程
spring MVC架构模式都进行了分层设计如下
- 数据访问接口:DAO层
- 处理业务逻辑层:service层
- 数据实体:POJO
- 负责前端请求的接受并处理:servlet
- 负责前端页面展示:JSP
这种框架就是MVC设计模式,它是软件工程中的一种软件架构模式。它强制性地使软件系统的输入,处理和输出分开,把软件系统分为基本三个部分:
- 模型(model):模型对象拥有最多的处理任务,是应用程序的主题部分,它负责数据逻辑(业务规则)的处理和实现数据操作(即在数据库中存取数据)。对应组件:JavaBean
- 视图(view):负责格式化数据并把它们呈现给用户,包括数据展示,用户交互,数据验证,界面设计等功能。对应组件:JSP或者HTML文件
- 控制器(controller) :负责接收并转发请求,对请求进行处理指派视图并将响应结果发送到客户端。对应组件:servlet
MVC的优缺点
- 优点
- 多视图共享一个模型,大大提高代码的可重用性
- MVC三个模块相互独立,松耦合架构
- 控制器提高了应用程序的灵活和可配置性
- 有利于软件工程化管理
- 缺点
- 原理复杂
- 增加了系统结构和实现的复杂性
- 视图对模型数据的低效率访问
对于MVC来说,它并不适合小型甚至中型规模的项目,花费大量时间将MVC应用到规模并不是很大的应用程序通常得不偿失,所以要根据应用场景来决定
总之,MVC的设计模式最终可以打造出一个松耦合+高重用性+高可适用性的完美架构,当然这也是架构设计的目标之一。
spring MVC框架介绍
spring MVC是spring中用于web应用开发的一个模块,是spring提供额一个基于mvc设计模式的优秀web开发框架,它本质上相当于servlet。在MVC设计模式中
spring MVC作为控制器来建立模型与视图的数据交互,可称为一个典型的MVC框架,如下图
在spring mvc 框架中,controller替换servlet来负责控制器的职责,controller接受请求,调用相应的model进行处理,处理器完成业务处理后返回处理结果。
controller调用相应的view并对处理进行视图渲染,最终客户端得到响应消息。由于spring mvc的结构较为复杂,上述只是对其框架结构的一个简单介绍。下面
我们将搭建spring mvc环境,并实现简单的例子来体验spring mvc是如何使用的。
spring MVC环境搭建
在新建web Project后,搭建步骤如下:
- 引入jar文件
- spring MVC配置:
- 在web.xml中配置servlet,定义DispatcherServlet
- 创建Spring MVC的配置文件
- 创建controller(处理请求的控制器)
- 创建view
- 部署运行
所需的jar文件如图(log4J可以无视):
web.xml中配置servlet
Spring MVC是基于servlet的,dispatcherServlet是整个spring mvc框架的核心,它负责截获请求并将其分派给相应的处理器处理,那么必须配置时,
首先就要进行dispatcherServlet的配置,web.xml中配置关键代码如下:
<!-- 配置spring mvc的核心控制器DispatcherServlet --> <servlet> <servlet-name>srpingmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 初始化参数通过 DipatcherServlet 获取到初始化参数 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>srpingmvc</servlet-name> <!-- 注意这里我这里是懒得改了,此拦截路径最好不要使用 / 因为它会把所有请求拦截 最好是 *.啥 比如:*.do 就会拦截以 .do结尾的请求 --> <url-pattern>/</url-pattern> </servlet-mapping>
注意最好避免使用 / 如果使用那么很有可能你在引用外部文件的时候会出问题 如下
这个请求会被拦截导致404从而使用不了js,但是路径又没问题。所以注意了 最好避免使用 /
创建sprig MVC配置文件
<?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:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd "> <!-- 配置映射 自动扫描 cn包下面所有控制器(包括子包) --> <context:component-scan base-package="cn.controller"></context:component-scan> <!-- 与返回出的值添加 前后缀 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> </beans>
创建控制器
package cn.controller; import java.util.Map; import org.apache.log4j.Logger; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; @Controller @RequestMapping("/user") //要求路径前必须加上 user 比如要求路径是 index就需要写成 user/index public class IndexController { private Logger logger = Logger.getLogger(IndexController.class); //表示方法与那个请求URL对应(此处:”/index“) @RequestMapping("/index") public String index() { logger.info("hello,springMVC!"); return "index"; } }
测试运行
在web-INF下面建立一个index.jsp页面(直接运行会404),在浏览器中输入 http://localhost:8080/SpringMVC/user/index.html 即可
参数传递
那么如果要传入参数又该如何呢?只需添加上参数即可如下
@RequestMapping("/index") public String index(String name) { logger.info("hello,springMVC!:"+name); return "index"; }
传入的名称需要与参数名称相同如下
如果直接使用get方法进行访问那么获取 index()方法获取的中文将会是乱码。也可以指定访问方式如下
@RequestMapping(value= {"/index"},method=RequestMethod.POST) public String index(String name) { logger.info("hello,springMVC!:"+name); return "index"; }
访问结果如下说不能使用get方式进行访问
参数的类型有很多,如果你想使用某个sqlsession,或者request都可以添加进去,当然这些参数不需要手动的传入。
那么接受的参数又如何传递给页面呢?如下添加Model
@RequestMapping(value= {"/index"}) public String index(String name,Model model) { logger.info("hello,springMVC!:"+name); name="张三"; //保存 数据 model.addAttribute("name", name); return "index"; }
jsp页面代码如下
<body> <h1>hell springMVC</h1> <h1>userName-->${name}</h1> </body>
如果需要传递的参数对象呢?如下
@RequestMapping(value= {"/index"}) public String index(String name,Map<String, User> uList,Model model) { logger.info("hello,springMVC!:"+name); name="张三"; User u = new User(); u.setName("二狗子"); //保存 数据 model.addAttribute("name", name); model.addAttribute("username", u); model.addAttribute(u); //如果不给名称 默认访问名称为 user uList.put("u", u); return "index"; }
页面代码
<body> <h1>hell springMVC</h1> <h1>usernameName-->${username.name}</h1> <h1>mapU-->${u.name}</h1> <h1>User-->${user.name}</h1> </body>
如果还是不会可以去网盘下载我演示的项目:
链接:https://pan.baidu.com/s/1oYjZW0fpqXKcI3WXfIezxA
提取码:fdle
不会导入项目的可以去这里:https://www.cnblogs.com/hfx123/p/9745826.html