一. web的流程
web项目的运行流程,需求是怎么实现的,数据怎么请求,怎么存储,怎么改变。数据库怎么修改。怎么查询数据库
1.启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点: <listener></listener> 和 <context-param></context-param>
<!-- 配置加载类路径的配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext.xml</param-value>
</context-param>
<!-- 配置监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<!-- 解决中文乱码过滤器 -->
<filter>
<filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 前端控制器(加载classpath:spring-mvc.xml 服务器启动创建servlet) -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置初始化参数,创建完DispatcherServlet对象,加载springmvc.xml配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<!-- 服务器启动的时候,让DispatcherServlet对象创建 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
2.紧接着,容器创建一个ServletContext(上下文),这个WEB项目所有部分都将共享这个上下文.
3.容器将<context-param></context-param>转化为键值对,并交给ServletContext.
4.容器创建<listener></listener>中的类实例,即创建监听(通过contextInitialized(ServletContextEvent args)这个方法). listener的类实例需要实现 javax.servlet.ServletContextListener接口。
5.容器初始化<filter></filter>。filter的类实例需要实现 javax.servlet.Filter接口
6.容器加载<load-on-startup>的<serlvet/>。 servlet实现javax.servlet.Servlet接口
7.容器销毁时,按照servlet-->filter-->listener的顺序销毁servlet、filter和listener
二,Spring的运行流程
第一步:加载配置文件ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
,ApplicationContext接口,它由BeanFactory接口派生而来,因而提供了BeanFactory所有的功能。配置文件中的bean的信息是被加载在HashMap中的,一个bean通常包括,id,class,property等,bean的id对应HashMap中的key,value呢就是bean
第二步:调用getBean方法,getBean是用来获取applicationContext.xml文件里bean的,()写的是bean的id。一般情况都会强转成我们对应的业务层(接口)。例如SpringService springService =(SpringService)ac.getBean("Service");
第三步:这样我们就可以调用业务层(接口实现)的方法。
二、Spring MVC部分
1、Spring MVC的运行流程
- springMVC框架
框架执行流程(面试必问)
1、用户发送请求至前端控制器DispatcherServlet
2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
5、执行处理器(Controller,也叫后端控制器)。
6、Controller执行完成返回ModelAndView
7、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9、ViewReslover解析后返回具体View
10、DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
11、DispatcherServlet响应用户
- 前端控制器DispatcherServlet(不需要程序员开发)
作用接收请求,响应结果,相当于转发器,中央处理器。有了DispatcherServlet减少了其它组件之间的耦合度。
处理器映射器HandlerMapping(不需要程序员开发)
作用:根据请求的url查找Handler
处理器适配器HandlerAdapter
作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler
处理器Handler (需要程序员开发)
注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler
视图解析器View resolver(不需要程序员开发)
作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)
视图View (需要程序员开发)
View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf…)
四、Mybatis部分
1、Mybatis的运行流程
- Mybatis运行流程图:
<!-- 3.配置SqlSessionFactory对象 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入数据库连接池 -->
<property name="dataSource" ref="dataSource"/>
<!-- 扫描bean包 使用别名 -->
<property name="typeAliasesPackage" value="com.txb.bean"></property>
<!--配置加载映射文件 UserMapper.xml-->
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
</bean>
<!-- 自动生成dao,mapper-->
<!-- 4.配置扫描Dao接口包,动态实现Dao接口,注入到spring容器中 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 给出需要扫描Dao接口包 -->
<property name="basePackage" value="com.txb.dao"/>
<!-- 注入sqlSessionFactory -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
- 第二步:加载我们的xml文件
第三步:创建SqlSessionFactoryBuilder
第四步:创建SqlSessionFactory
第五步:调用openSession(),开启sqlSession
第六步:getMapper()来获取我们的mapper(接口),mapper对应的映射文件,在加载mybatis.xml时就会加载
第七步:使用我们自己的mapper和它对应的xml来完成我们和数据库交互。即增删改查。
第八步:提交session,关闭session。
2.SSM中各层作用及关系
1.持久层:DAO层(mapper层)(属于mybatis模块)
-
DAO层:主要负责与数据库进行交互设计,用来处理数据的持久化工作。
-
DAO层的设计首先是设计DAO的接口,也就是项目中你看到的Dao包。
-
然后在Spring的xml配置文件中定义此接口的实现类,就可在其他模块中调用此接口来进行数据业务的处理,而不用关心接口的具体实现类是哪个类,这里往往用到的就是反射机制,DAO层的jdbc.properties数据源配置,以及有 关数据库连接的参数都在Spring的配置文件中进行配置。
- ps:(有的项目里面Dao层,写成mapper,当成一个意思理解。)
2.业务层:Service层(属于spring模块)
-
Service层:主要负责业务模块的逻辑应用设计。也就是项目中你看到的Service包。
-
Service层的设计首先是设计接口,再设计其实现的类。也就是项目中你看到的service+impl包。
-
接着再在Spring的xml配置文件中配置其实现的关联。这样我们就可以在应用中调用Service接口来进行业务处理。
-
最后通过调用DAO层已定义的接口,去实现Service具体的实现类。
-
ps:(Service层的业务实现,具体要调用到已定义的DAO层的接口.)
3.控制层/表现层:Controller层(Handler层) (属于springMVC模块)
-
Controller层:主要负责具体的业务模块流程控制,也就是你看到的controller包。
-
Controller层通过要调用Service层的接口来控制业务流程,控制的配置也同样是在Spring的xml配置文件里面,针对具体的业务流程,会有不同的控制器。
4.View层 (属于springMVC模块)
-
负责前台jsp页面的展示,此层需要与Controller层结合起来开发。
-
Jsp发送请求,controller接收请求,处理,返回,jsp回显数据。
3.三层架构运行流程
4.各层之间的联系
-
DAO层,Service层这两个层次可以单独开发,互相的耦合度很低。
-
Controller,View层耦合度比较高,因而要结合在一起开发。也可以听当做两层来开发,这样,在层与层之前我们只需要知道接口的定义,调用接口即可完成所需要的逻辑单元应用,项目会显得清晰简单。
- 值得注意的是,Service逻辑层设计:
- Service层是建立在DAO层之上的,在Controller层之下。因而Service层应该既调用DAO层的接口,又提供接口给Controller层的类来进行调用,它处于一个中间层的位置。每个模型都有一个Service接口,每个接口分别封装各自的业务处理方法。
- Service层是建立在DAO层之上的,在Controller层之下。因而Service层应该既调用DAO层的接口,又提供接口给Controller层的类来进行调用,它处于一个中间层的位置。每个模型都有一个Service接口,每个接口分别封装各自的业务处理方法。
4.SSM框架实现一个web程序主要使用到如下三个技术:
-
Spring:用到注解和自动装配,就是Spring的两个精髓IOC(反向控制)和 AOP(面向切面编程)。
-
SpringMVC:用到了MVC模型,将流程控制代码放到Controller层处理,将业务逻辑代码放到Service层处理。
-
Mybatis:用到了与数据库打交道的层面,dao(mapper)层,放在所有的逻辑之后,处理与数据库的CRUD相关的操作。
比如你开发项目的时候,需要完成一个功能模块:
-
先写实体类entity,定义对象的属性,(可以参照数据库中表的字段来设置,数据库的设计应该在所有编码开始之前)。
-
写Mapper.xml(Mybatis),其中定义你的功能,对应要对数据库进行的那些操作,比如 insert、selectAll、selectByKey、delete、update等。
-
写Mapper.java/Dao.java,将Mapper.xml中的操作按照id映射成Java函数。实际上就是Dao接口,二者选一即可。
-
写Service.java,为控制层提供服务,接受控制层的参数,完成相应的功能,并返回给控制层。
-
写Controller.java,连接页面请求和服务层,获取页面请求的参数,通过自动装配,映射不同的URL到相应的处理函数,并获取参数,对参数进行处理,之后传给服务层。
-
写JSP页面调用,请求哪些参数,需要获取什么数据。