框架与框架模式
框架模式:解决某一类问题的思维模式方法论
框架:在框架模式方法论之上实现的一套成熟的一组组件,供选用完成自己的系统
MVC:全称Model-View-Controller是模型-视图-控制器,MVC是一种框架模式,GOF把MVC看做三种设计模式:观察者模式、策略模式与组合模式
比较常见的框架
- C++:MFC、gtk
- java: SSH、SSM、SpringMvc
- python:django
MVC优点-缺点
- 对于开发和维护来说成本低,易于维护与修改
- 耦合性不高,层层之间相互分离各司其职,对开发来说便于扩展
MVC缺点
- 层层严格分离对调试带来一定的困难
- 对于特别小的项目,mvc反而会带来更大的工作量以及复杂性
SpringMVC框架
简介
springMVC框架是基于Java的实现了MVC框架模式的请求驱动类型的轻量级框架。
SpringMvc 请求大致流程图
spring mvc九大组件
- HandlerMappings URL和controller对应关系的保存
- HandlerAdapters 适配器参数转换
- HandlerExceptionResolvers 用来处理异常产生之后的转化器
- ViewResolvers 视图解析器
- RequestToViewNameTranslator 从request中获取viewName
- LocaleResolver 从request中解析出来的locale
- ThemeResolver 解析主题
- MultipartResolver 多组件文件上传
- FlashMapManager 闪存
Spring MVC执行时序图
https://www.processon.com/diagraming/5fc3306df346fb646a5cafe6
Spring Mvc常用注解
@Controller
控制器,负责处理由DispatcherServlet分发用户请求由HandlerMapping处理url与Controller中Method一一对应找到对应暴露出去的处理器方法,处理用户请求数据再经过业务处理层处理后封装返回一个Model,然后该Model返回相应的View进行显示
@RequestMapping
@RequestMapping是一个用来处理请求地址映射的注解,可以作用于类或者方法。该注解包含6个属性
value:指定请求的实际地址,指定的地址可以是URL Template模式;
method:指定请求的方法类型;
consumes:指定请求提交的内容类型(Content-Type),例如application/json,text/html;
produces:指定返回的内容类型,仅当请求头部中Accept包含指定类型时方法才进行处理;
params:请求中必须包含某些参数时,方法才进行处理;
headers:请求header中必须包含某些指定的header值,方法才进行处理;
@Resource和@Autowired
@Resource和@Autowired都是bean注入时使用,但是其实@Resource并不是spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入;
@Resource和@Autowired的共同点:两者都可以使用在字段或者setter方法上,如果使用在了字段上,那么就不再需要setter方法。
@Resource和@Autowired的不同点:
@Autowired注解是由spring提供的,需要导入org.springframework.beans.factory.annotation.Autowired,只按照byType进行注入。在默认情况下,它要求依赖的对象必须存在,如果允许null,可以通过属性required设置为false进行设置。如果我们需要辅助通过byName进行装配bean,我们可以结合@Qualifier注解一起使用。
@Resource注解默认是按照byName进行装配bean,由J2EE提供,需要导入javax.annotion.Resource。@Resource注解包含两个重要的属性: name和type,Spring将@Resource注解中的name属性解析为bean的名字,将type属性解析为bean的类型。
当@Resource注解的name属性时,Spring将按照byName方式进行bean注入,找不到将会抛出异常;
当使用type属性时,将按照byType方式进行bean注入,找不到或者找到多个将会抛出异常;
如果同时使用了这两个属性,那么将会从Spring上下文中查找指定类型指定名字bean进行装配,找不到将会抛出异常;
如果两个属性都没有使用,那么将会按照默认方式byName进行bean注入。
@ModelAttribute
@ModelAttribute注解有两种用法:一种是用在拥有返回值的方法上,方法的返回值将会作为Model中指定属性的值;另一种是用在请求处理方法参数上,方法参数将会从Model的属性列表中获取指定属性的值。通过@ModelAttribute(“xxxx”)可以指定属性的名称。在Controller的请求处理方法调用之前,@ModelAttribute注解的方法都会被首先执行。
@SessionAttributes
@SessionAttibutes注解只能用在类上,不能使用在方法上。该注解将Model属性列表中指定的一些属性保存到Session对象中
@PathVariable
该注解用于将请求URL的模板变量提取出来,应用到请求处理方法参数中
@RequestParam
@RequestParam主要用于SpringMVC后台请求处理方法中获取参数,类似与request.getParameter(“name”), 该注解包含三个属性:required, defaultValue, value,其中required表示请求中是否必须包含该参数,defaultValue表示请求中没有包含该参数时的默认值,value表示传入的参数的名称
@ResponseBody
该注解用于将Controller请求处理方法返回的对象,通过适当的HttpMessageConverter转换为指定的格式,保存到Response对象的body区
@Component
相当于通用的注解
@Repository
用于注解DAO层
一个简单的SpringMVC项目
项目结构图
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>springMVC1</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>springMVC</servlet-name>
<!-- 请求触发器 -->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMVC-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup><!-- 提前启动 -->
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
<!-- 或*.action -->
</servlet-mapping>
<!-- 解决springMVC的post乱码 -->
<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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
springMVC-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 配置controller层路径扫描 com.qfedu.springmvc.controller -->
<context:component-scan base-package="com.springmvc.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>
Controller
@Controller
public class HelloWorld {
@Resource
private ISysMonitorService sysMonitorService;
@RequestMapping("/hello")
public String helloworld() {
return sysMonitorService.query();
}
}
Service
public abstract interface ISysMonitorService {
String query();
}
@Service
public abstract class SysMonitorServiceImpl implements ISysMonitorService {
@Autowired
private ISysMonitorDao iSysMonitorDao;
public String query() {
return iSysMonitorDao.query();
}
}
Dao
public interface interface ISysMonitorDao{
String query();
}
@Repository
public interface SysMonitorDaoImpl implements ISysMonitorDao{
public String query() {
// 数据库查询调用
return "Hello World";
}
}