这是项目的一览

首先Web根目录。

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

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

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

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

<!-- 静态资源 -->
<mvc:resources mapping="/css/**" location="/css/" />
<mvc:resources mapping="/img/**" location="/img/" />
<mvc:resources mapping="/js/**" location="/js/" />
<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配置中的视图解析器前缀向呼应

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

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

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

<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的配置中被扫描,

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

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

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

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

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
<configuration>
<mappers>
<package name="io.deolin.mapper" />
</mappers>
</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. C# DataContractJsonSerializer

    DataContractJsonSerializer dataSerializer = new DataContractJsonSerializer(request.getBizContentClas ...

  2. Mysql的实现原理

    上篇文章已经简单介绍了Mysql索引的基本介绍,这篇文章主要讲解一下所以的实现原理.索引的定义其实非常复杂,严格的定义需要用到关系代数的概念,不在咱们讨论范围内,这里咱们只讨论mysql的常用的引擎的 ...

  3. 写给Web开发人员看的Nginx介绍

    译者注:不知道其他开发者是否和我一样,参与或者写了很多Web项目,但是却没有真正的去完整的部署应用,很多时候都是交给ops即运维的同学帮忙来做.而作为一个有节操的开发者,我认为了解一些服务器方面的知识 ...

  4. CCF 201709-1 打酱油

    CCF 2017-09-1 打酱油 题目 问题描述 小明带着N元钱去买酱油.酱油10块钱一瓶,商家进行促销,每买3瓶送1瓶,或者每买5瓶送2瓶.请问小明最多可以得到多少瓶酱油. 输入格式 输入的第一行 ...

  5. HTTP协议探究(五):H2中一些重要的概念

    一 复习与目标 1 复习 简单密码学.对称加密与非对称加密 数字签名.数字证书 SSL/TLS HTTPS = HTTP + SSL/TLS,SSL/TLS为HTTP提供了保密性.完整性和鉴别性 2 ...

  6. OutOfRangeError的解决办法

    自制TFRecord数据集,训练神经网络出现的一个问题,及解决办法.   错误现象: 数据训练完成后,测试数据集正确率时,运行mnist_test.py文件,出现错误代码 问题分析:显示需测试数据10 ...

  7. Trie树(字典树)-题解 P2580 【于是他错误的点名开始了】

    此题可以用STL中的map做,但是了解一下Trie树这个数据结构也是必须的. Trie树(又称字典树)有以下特点: 根节点不包含字符,除它之外的每一个节点都包含一个字符. 从根节点到某一节点,路径上经 ...

  8. LeetCode 【2】 Reverse Integer --007

    六月箴言 万物之中,希望最美:最美之物,永不凋零.—— 斯蒂芬·金 第二周算法记录 007 -- Reverse Integer (整数反转) 题干英文版: Given a 32-bit signed ...

  9. php使用播放插件播放m3u8,mp4,flv格式的视频

    一.这里我主要是播放m3u8的视频,有两款比较好的插件,swise和ckpalyer,我介绍的是ckplayer,这是在pc端播放的,并且是需要flash支持的,不过现在的最新浏览器都是默认安装的 二 ...

  10. python采集websocket实时数据

    之前大部分的数据采集基本都是http的,也一直对如何采集websocket的实时数据有疑问,不知道入从哪里入手,一筹莫展,今天在知乎上看到了一篇采集websocket的文章,讲的很透彻 终于把这个疑问 ...