这是项目的一览

首先Web根目录。

除了WEB-INF以外,还有css,img,js,lib目录,这四者都是静态资源。

由于客户端无法访问WEB-INF下的内容,所以将它们放置在了Web根目录下。

而且,很显然,需要在SpringMVC的配置文件中声明它们,

以防DispatcherServlet认为,诸如/img/logo.gif的URL是希望去访问映射到这个URL的控制器请求方法

  1. <!-- 静态资源 -->
  2. <mvc:resources mapping="/css/**" location="/css/" />
  3. <mvc:resources mapping="/img/**" location="/img/" />
  4. <mvc:resources mapping="/js/**" location="/js/" />
  5. <mvc:resources mapping="/lib/**" location="/lib/" />

这四个目录的前三者,已经用目录名自解释了自己存放了哪些文件,只有lib目录比较特殊。

设计lib目录的目的是为外部js和外部UI框架安排存放位置,从而与项目自身的js和css文件区分开来

如Bootstrap和JQuery.js都会统一的放在lib目录下。

接着是WEB-INF目录,这个目录下除了为Web容器提供的classes(eclipse中没有显示)、lib(这个目录放的是jar文件)、web.xml以外,还有taglib.tld文件和jsp目录,

其中taglib.tld声明的是自定义jsp标签,目的是辅助渲染视图,减少jsp中出现诸如

<i class="uk-icon-plus uk-icon-justify"></i>

<i class="uk-icon-circle uk-icon-justify"></i>

标签,而是用

<tag:ico value="plus" />

<tag:ico value="circle" />

来代替,解决了代码重复过多的问题。

jsp目录下存放的是jsp文件,Deolin将jsp安排成了两类,

第一类是将会被在请求方法的最后被转发的目标jsp,这类jsp被放在jsp的根目录下,与SpringMVC配置中的视图解析器前缀向呼应

  1. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  2. <property name="prefix" value="/WEB-INF/jsp/" />

第二类是不会被转发的jsp,这类jsp全是从第一类jsp中提取出来的共通jsp,提取这些jsp片段的目的是减少重复代码,

这些jsp被统一的放在jsp目录下的com目录下,最终这类jsp会被这样引用到第一类jsp中

  1. <jsp:include page="/WEB-INF/jsp/com/Navigation.jsp" />

Web根目录结束了,接下来是配置文件,也就是一览中的“src/main/resources”目录,

这个目录是Maven项目所自带的,Deolin仅仅是在目录下为每个框架都建立一个专门的包。

属于某个框架的配置,无论是properties文件还是xml文件,都统一放在对应的包之下,

比如说,db.properties和mappers.xml都将被置于mybatis包之中。

特别地,spring.xml和spring-webmvc-servlet.xml被放置在了一起,

因为根据Spring官网来看,SpringMVC也是通过PROJECTS下的SPRING FRAMEWORK进入的,

所以它也并放在了springframework包下,仅仅是这个原因。

最后是“src/main/java”目录,Java源码存放的路径。

util包和tagimpl包可能是相对独立的两个包了,

前者放的是工具类,后者放的是前面taglib.tld文件声明标签的具体实现,

前者为几乎为所有的其他类服务,但不依赖任何类,后者仅仅为taglib.tld服务。

controller, service, mapper, vo分别代表的是控制层,业务层,持久层,视图层。

控制层在SpringMVC的配置中被扫描,

  1. <mvc:annotation-driven />
  2. <context:component-scan base-package="io.deolin.controller" />

业务层在Spring的“事务管理”模块被扫描,service包内仅仅是用于抽象的接口,具体实现需要通过service.impl包

  1. <tx:annotation-driven transaction-manager="transactionManager" />
  2. <context:component-scan base-package="io.deolin.service" />

持久层在Spring的“整合Mybatis”模块以及Mybatis的配置文件——mappers.xml中被扫描,

  1. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  2. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
  3. </bean>
  1. <configuration>
  2. <mappers>
  3. <package name="io.deolin.mapper" />
  4. </mappers>
  5. </configuration>

视图层里全是JavaBeans,这些类一一映射了jsp文件,所以命名上遵循了以下规则

Navigation.jsp  >>  NavagationVo.java

其中,vo在这里定义成View Object,用于封装渲染视图用的数据,

如果数据结构比较复杂,那还需要vo.entity包的支持,entity用于封装更具体的实体,

使vo内数据层次能与视图的表现层次一致。

这四个层次的工作大致是这样安排的。

1、控制层中的控制器请求方法接受到请求

(如果是带有表单的请求,需要借助SpringMVC的数据绑定,这还需要form包的支持,form类中的私有域需要与对应form标签中的input标签name属性相一致),

2、基于请求不断调用业务层的具体业务,将细节全部交给业务层,一个业务方法处理一个细节,对控制层负责,

处理完毕后需要展示出来的数据会在请求方法中被一一传值到vo类对象中。

3、请求方法的最后,被传值完毕vo对象会以addAttribute()的形式传到SpringMVC的Model对象(它以方法参数的形式出现在请求方法中)中,

然后请求方法返回需要转发的jsp文件名。

4、业务层虽然会处理业务细节,但是访问数据库的工作交给了持久层。

举例说明一下4个层次的依赖关系

Fltiss项目的架构、包名的定义和类的划分的更多相关文章

  1. Android Studio上修改项目(module)的包名(Package Name)

    当你对着包名右击,查找Refactor(重构)下的Rename(快捷键:SHIFT+F6)时,弹出来的仅仅是包名最后一个路径的名称,如下图: 但你往往希望修改整个包名,比如exmple,所以你需要以下 ...

  2. Android Studio修改项目中整体包名

    莫名的需求,要把之前的apk分成三个不同的apk,还要在应用市场能够上线,麻麻滴这样一听那还不要各个apk包的包名不同以及apk签名文件也不同嘛(签名文件一般也用不同,为防止上线冲突嘛).所以就亲自尝 ...

  3. maven项目导入,包名出现异常-多出一个java的前缀

    maven工程导入项目的时候,整个结构出现混乱,如下图所示,包名前面莫名其妙的出现了java的前缀: 原因是导入错误,重新导入即可.

  4. 【Android Studio安装部署系列】二十七、Android studio修改项目名称和包名

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 实际项目开发中可能碰到项目名称写错了或者需要修改,而且包名可能也想要修改,那么如何操作呢. 本文是在Android Studio3. ...

  5. eclipse Java项目如何修改包名

    选中你的包名右键-->Refactor -->Rename -->勾选以下两个选项(必须选两个,只选第一个,是新增包) 修改以后,同时要修改.xml..properties文件内的引 ...

  6. 随机获得MySQL数据库中100条数据方法 驾照题库项目 MVC架构 biz业务层的实现类 根据考试类型rand或order通过dao数据访问层接口得到数据库中100或全部数据

    package com.swift.jztk.biz; import java.util.Collections; import java.util.Comparator; import java.u ...

  7. Android Studio修改项目名和包名

    为了提高开发效率,有时候需要使用现有的一些开源项目,记录一下自己修改项目名和包名的方法. 1.首先,修改包名(清单文件里找), ①展开所有包 ②选中想要修改的包,shift+F6(也可右键Refact ...

  8. Android 更改项目包名的方法

    修改APP包名,即APP的唯一标识. 1.在项目上右键,选择android tools->rename application package,输入需要改为的名称,然后选择需要改的包,有部分包可 ...

  9. AndroidStudio一步步教你修改项目包名(最详细,最易懂)

    如果你看了很多篇博文还是修改不了包名,我相信这篇可以帮你解决修改包名的问题 修改项目包名,实现不覆盖安装(如果只是想不覆盖安装,更改build.gradle里面的包名就OK了,那这篇博文到这里就可以结 ...

随机推荐

  1. 面试经典算法:马拉松算法,最长回文子串Golang实现

    求一个字符串中最长的回文子串. package main import "fmt" /* 马拉松算法,求最长回文子串,时间复杂度:线性 */ func main() { // 回文 ...

  2. ASP.NET 使用 SyndicationFeed 输出 Rss

    以前生成 RSS 都是使用拼接 Xml 的方式生成的,不仅麻烦而且还不规范. #region 输出指定分类编号的消息源内容... /// <summary> /// 输出指定分类编号的消息 ...

  3. 2019年Java后端工程师常见面试题和感想

    来新公司有5个月了,从第二个月开始就参与公司后端工程师的面试工作了,包括校招在内,面试超过100个(包括40个校招的终面)应聘者了,应聘者中有超过10年的技术经理,有6年以上的高级开发,有3到5年的中 ...

  4. 美团Java工程师面试题(2018秋招)

    第一次面试 1.小数是怎么存的 2.算法题:N二进制有多少个1 3.Linux命令(不熟悉 4.JVM垃圾回收算法 5.C或者伪代码实现复制算法 6.volatile 7.树的先序中序后序以及应用场景 ...

  5. 【leetcode】575. Distribute Candies

    原题 Given an integer array with even length, where different numbers in this array represent differen ...

  6. .Net IOC 框架

    CastleWindsor 参见:CastleWindsor | .Net IOC 框架 AutoFace 参见:AutoFace | .Net IOC 框架 Unity 参见:Unity | .Ne ...

  7. Kinect for Windows SDK开发入门(三):基础知识 下

    原文来自:http://www.cnblogs.com/yangecnu/archive/2012/04/02/KinectSDK_Application_Fundamentals_Part2.htm ...

  8. NLP传统基础(3)---潜在语义分析LSA主题模型---SVD得到降维矩阵

    https://www.jianshu.com/p/9fe0a7004560 一.简单介绍 LSA和传统向量空间模型(vector space model)一样使用向量来表示词(terms)和文档(d ...

  9. WCF Endpoint分类

    WCF中可以为一个Service配置多个Endpoint 这些Endpoint的分类方法有下面3中 1.全局就一个endpoint,一个接口公开所有的方法,这适合简单的业务场景 2.将endpoint ...

  10. 【转】Golang汇编命令解读

    原文: https://www.cnblogs.com/yjf512/p/6132868.html ------------------------------------------------- ...