需求分析html
1 用例图java
系统设计web
包及全局配置spring
数据库设计数据库
工具类编程
具体功能实现架构
1 dao层功能实现app
2 编码过滤器及登录拦截器框架
3 单元测试webapp
遇到的问题总结
1 新建一个Modul不会打开新页面
2 导入依赖时标红
3 Resources中文件名称有点但不意味着分层
4 不一样模块输出的日志不一样
5 ${catalina.base}位置在何处
6 /* 和 / 的区别
7 设置页面的根URL并统一导入
1 用例图
用例图是由产品经理产生的,主要是从用户的角度分析产品的功能和动态行为
上图主要是从人员的角度来分析整个系统。这个系统最重要的步骤就是处理报销单,那么处理报销单的流程以下图所示
对于整个系统采用SSM框架,并采用三层架构的方式 :持久层——Mybatis、表现层——Spring MVC、业务层——JavaBean。每层分别对应的列名为oa_dao、oa_web、oa_biz。
对于配置这一点其实在一开的阶段并无办法作到面面俱到,只能规定一些命名规范。对于全局的配置能够参考注释。
根据用例的分析,和项目的需求应该设计出整体的数据库
在编程中经常须要一些辅助类来帮助实现功能,所以有了工具类,可是这些工具类可能一开始并不肯定有哪些,所以工具类下的各类类是随着代码的需求变化的。
1 dao层功能实现
部门管理
部门与员工相似都须要增删改查操做,可是部门更的属性跟简单一点,所以先写部门管理,代码的具体实现流程为:
实体类——dao接口——mapper映射方法——biz层接口——biz层实现接口——表现层实现
在部门里具体编写代码时就是按照常规的CRUD进行的,具体代码的分析能够参考源代码中注释。其余模块的功能是相似的,只要分析一下源码就能够了
2 编码过滤器及登录拦截器
这两个功能在oa_web中global包下,是比较经常使用的功能,具体分析能够参考代码注释。
3 单元测试
当写完功能代码后须要进行单元测试,具体的单元测试代码能够查看源码及注释。下面只是给出所用到的依赖
<!-- 单元测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <!-- Spring test --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency>
具体的代码能够参考项目的源码
1 新建一个Modul不会打开新页面
由于想要在原有的project上要新建一个新的项目,所以直接按照以下操做,可是发现一只都是在原页面上打开的不会新建一个页面,后来发现这是我操做失误了。
正确操做:选择上面的Project,而后选择Maven建立一个新的空白项目就会打开一个新的页面。
2 导入依赖时标红
在pom.xml时导入依赖发现标红了以下图所示,后来发现是这是由于idea导入出现了问题的缘由,能够右键项目,选择Maven-Reimport。
当还不行时就把之前导入的所有删除再从新导入便可。
3 Resources中项目文件有点但不意味着分层
在dao层有两个名字同样的文件夹,可是所表示的意义是不一样的,在java中表示的包,采用com.imooc.oa会自动的在本地建立com\imooc\oa文件夹可是在resources中直接写com.imooc.oa.dao其实只会在本地中建立一个com.imooc.oa.dao的文件夹,并无层次目录结构的。一开始由于不清楚这个致使排查了很久的错误。
4 不一样模块输出的日志不一样
在测试logback时分别在oa_dao,oa_biz进行了日志测试,发如今oa_dao测试日志时并无任何新的文件产生,只是在控制台上有日志输出;在oa_biz时发如今该项目的路径下建立了一个新的文件夹catalina.base_IS_UNDEFINED而后在这个文件夹下面有日志记录。
这些问题产生的缘由是由于配置文件的设置,这些问题其实本质上而言都是正常的,在配置中有日志设置:${catalina.base}/logs/webapps可是在biz中并无配置Tomcat有到哪里去找Tomcat的文件目录那,所以在biz项目新建立了一个文件夹,文件名字其实已经说明问题了:is undefined 没有被定义。
注:其实在真实项目中应该只在oa_web中配置这个日志模块就能够了,在这里是为了学习,所以在每一个模块中都配置了一个logback.xml。
5 ${catalina.base}位置在何处
其实只要看控制台的输出就能够明白
此外控制台日志其实还有许多有效的信息能够查看的
而下面则是记录了寻找logback配置文件的过程
注:此处并非说必定要把全部的日志打印所有看懂,可是必定要明白这些日志记录的信息,其实好多问题的出现都是由于不了解内部工做。
6 /* 和 / 区别
在SpringMVC的配置中若是采用/*进行匹配的话就会形成每个页面都登陆不进去
<servlet-mapping> <servlet-name>SpringMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
< url-pattern > / </ url-pattern > 不会匹配到*.jsp,即:*.jsp不会进入spring的 DispatcherServlet类 。
< url-pattern > /* </ url-pattern > 会匹配*.jsp,会出现返回jsp视图时再次进入spring的DispatcherServlet 类,致使找不到对应的controller因此报404错。
总之,关于web.xml的url映射的小知识:
< url-pattern>/</url-pattern> 会匹配到/login这样的路径型url,不会匹配到模式为*.jsp这样的后缀型url
< url-pattern>/*</url-pattern> 会匹配全部url:路径型的和后缀型的url(包括/login,*.jsp,*.js和*.html等)
在这个项目中:由于用了/,不会拦截jsp文件,那么首先会打开index.jsp,在index.jsp中有一个路径跳转action那么这个action便会被拦截开始执行流程。
7 设置页面的根URL并统一导入
没有配置前,在Tomcat设置中只要一修改Application context中的名称就会形成项目崩溃。
后来发现缘由是由于整个项目路径是写死的,所以要把项目改为能够灵活配置的,下面的代码是获取到页面的根url。
<% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; request.setAttribute("ctx", basePath); %>
通常使用上述语句来获取当前页面的根url,在代码中使用${ctx}便可得到所配置的url
<!-- 为全部的页面都引入一个共同的页面 --> <jsp-config> <jsp-property-group> <!-- 全部的页面 --> <url-pattern>*.jsp</url-pattern> <!-- 待引入页面的jsp路径--> <include-prelude>/WEB-INF/路径</include-prelude> </jsp-property-group> </jsp-config>
通常设置根url的在index.jsp中或者某些公共的jsp文件中,能够在web.xml中配置让全部的jsp文件都导入这个只有根url的jsp文件,在其余jsp文件中只须要引入一个base便可。
<base href="value">
当引入公共的头部后还要在index.jsp重定向一次。
0