Model
)V(View
)C(Controller
),是一种软件设计规范
。将业务逻辑、数据、显示分离
的方式来组织代码。降低
了视图
与业务逻辑
间的双向耦合
。MVC
不是一种设计模式,而是一种架构模式
,当然不同的MVC存在差异
。设计模式
对在某种环境中反复出现的问题以及解决该问题的方案的描述,它比架构更抽象。架构模式
只是针对某一领域的具体实现,一个软件可能包含多种设计模式;而设计模式是一种思想,可适用于各种应用。Model (模型)
数据模型,提供要展示的数据,因此包含数据和行为。
可以认为是领域模型或JavaBean组件(包含数据和行为) 。
不过现在一般都分离开来:Value Object (数据Dao)和服务层(行为Service) 。
也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。
View (视图)
:
负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。
Controller (控制器)
:
接收用户请求,委托给模型进行处理(状态改变) ,处理完毕后把返回的模型数据返回给视图,由视图负责展示。也就是说控制器做了个调度员的工作。最典型的MVC就是JSP + servlet + javabean的模式。
缺点
:JSP职责不单一,职责过重,不便于维护
Model1虽已在一定程度上解耦,但JSP即要负责页面控制,又要负责逻辑处理,职责不单一。于是Model2应运而生,使得各个部分各司其职。 Model2基于MVC模式:
Controller:控制器
Model:模型
View:视图
缺点
:分层较多,不适合小型项目开发
区别
:
Model2 在 Model1 的基础上分离了控制,将JSP中的逻辑操作部分分离出来,这样做不仅减轻了JSP的职责,而且更有利于分工开发,耦合性降低。
Model2巧妙的将JSP中的业务逻辑部分分给了Servlet,使得页面控制与逻辑处理彻底分离,达到了部分解耦的目的。但我们现实项目开发中,
往往在Model2的基础上又进行了分层。将业务逻辑细分为业务逻辑和持久化逻辑两层。
往往使用一个Dao接口隐藏持久化操作的细节,业务对象不需要了解底层的数据库持久化知识。使得业务逻辑与持久化逻辑分离,
业务逻辑通常关系的是应用程序的核心流程和业务规则,持久化逻辑关注的是如何访问和操作持久化数据。
DispatcherServlet
。DispatcherServlet
收到请求调用HandlerMapping
处理器映射器。DispatcherServlet
。DispatcherServlet
调用HandlerAdapter
处理器适配器。HandlerAdapter
经过适配调用具体的处理器(Controller
,也叫后端控制器)。Controller
执行完成返回ModelAndView
。HandlerAdapter
将controller执行结果ModelAndView
返回给DispatcherServlet
。DispatcherServlet
将ModelAndView
传给ViewReslover
视图解析器。ViewReslover
解析后返回具体View.DispatcherServlet
根据View进行渲染视图
(即将模型数据填充至视图中)。DispatcherServlet响应用户
。<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webmvcartifactId>
<version>5.2.0.RELEASEversion>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>servlet-apiartifactId>
<version>2.5version>
dependency>
<dependency>
<groupId>javax.servlet.jspgroupId>
<artifactId>jsp-apiartifactId>
<version>2.2version>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>jstlartifactId>
<version>1.2version>
dependency>
<beans xmlns="http://www.springframework.org/schema/beans"
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">
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<bean id="/myController" class="com.qhit.controller.MyController"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
bean>
beans>
<servlet>
<servlet-name>dispatcherServletservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:springmvc-servlet.xmlparam-value>
init-param>
<load-on-startup>1load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>dispatcherServletservlet-name>
<url-pattern>/url-pattern>
servlet-mapping>
package com.qhit.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 返回一个ModelAndView对象给HandlerAdapter
ModelAndView mv = new ModelAndView();
// 调用service层
String result = "result";
// 封装执行结果
mv.addObject("result", result);
// 封装跳转地址
mv.setViewName("index");
return mv;
}
}
<bean id="myController" class="com.qhit.controller.MyController" />
3. 选中lib,点击+号,选择Library Files库文件,选中要添加的jar,确认
检查maven依赖
方案一:按快捷键 Ctrl+Shift+Esc 打开任务管理器,找到java.exe,然后点击“结束任务”即可!
方式二:这种方式适用于所有端口被占用的情况
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webmvcartifactId>
<version>5.2.0.RELEASEversion>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>jstlartifactId>
<version>1.2version>
dependency>
<dependency>
<groupId>javax.servlet.jspgroupId>
<artifactId>jsp-apiartifactId>
<version>2.2version>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>servlet-apiartifactId>
<version>2.5version>
dependency>
<servlet>
<servlet-name>dispatcherServletservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:springmvc.xmlparam-value>
init-param>
<load-on-startup>1load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>dispatcherServletservlet-name>
<url-pattern>/url-pattern>
servlet-mapping>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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/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">
<context:component-scan base-package="com.qhit.controller"/>
<mvc:default-servlet-handler/>
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
bean>
beans>
package com.qhit.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/hello") //访问地址:/项目名/hello
public class HelloController{
//访问地址:/项目名/hello/h1
@RequestMapping("/h1")
public String hello(Model model){/* model:向前端传递数据 */
model.addAttribute("msg", "hello, springmvc!");
return "hello"; //view名称,会被视图解析器解析
}
}
@RestController
修饰类,方法直接返回JSON数据,跳过视图解析器
@ResponseBody
将java对象转为json格式的数据。
@Controller
控制层类注解,声明一个类是bean,放入IOC容器,相当于@Component
@PathVariable
加在控制器入参上,用于接收Restful风格的参数。
//访问地址:/项目名/hello/h1
@RequestMapping(path = "/h1/{a}/{b}", method = RequestMethod.DELETE)
@GetMapping //简化
public String hello(@PathVariable int a,@PathVariable int b, Model model){/* model:向前端传递数据 */
model.addAttribute("msg", "hello, springmvc!");
return "hello"; //view名称,会被视图解析器解析
}
Restful就是一个资源定位及资源操作的风格。
不是标准也不是协议。
基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等。
对于 AJAX 应用程序来说,JSON 比 XML 更快更易使用:
使用 XML
使用 JSON
{
"sites": [
{ "name":"菜鸟教程" , "url":"www.runoob.com" },
{ "name":"google" , "url":"www.google.com" },
{ "name":"微博" , "url":"www.weibo.com" }
]
}
可以像这样访问 JavaScript 对象数组中的第一项(索引从 0 开始):
sites[0].name;
返回的内容是:
runoob
可以像这样修改数据:
sites[0].name="菜鸟教程";
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="utf-8"/>
bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
<property name="failOnEmptyBeans" value="false"/>
bean>
property>
bean>
mvc:message-converters>
mvc:annotation-driven>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-coreartifactId>
<version>2.9.0version>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-databindartifactId>
<version>2.9.0version>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-annotationsartifactId>
<version>2.9.0version>
dependency>
package com.qhit.controller;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.text.SimpleDateFormat;
import java.util.Date;
@RestController//Controller + ResponseBody
public class HelloController {
//访问地址:/项目名/hello/h1
@GetMapping(path = "/h1")
//@ResponseBody // 返回值不会经过视图解析器,会直接返回字符串
public String hello() throws JsonProcessingException {
return new ObjectMapper().writeValueAsString(new User("1", "Candy"));
}
@GetMapping("h2")
public String jsonDate() throws JsonProcessingException {
ObjectMapper om = new ObjectMapper();
//关闭时间戳(时间解析后的默认格式为:时间戳TimeStamp)
om.configure(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS, false);
//定义时间格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
om.setDateFormat(sdf);
return om.writeValueAsString(new Date());
}
}
<dependency>
<groupId>com.alibabagroupId>
<artifactId>fastjsonartifactId>
<version>1.2.60version>
dependency>
框架和设计模式的区别 忘崖
浅析Java开发模式—Model1、Model2和三层 想太多先森