发表于: 2017-12-04 23:18:50
1 766
今天完成的事情:
准备小课堂,这次准备分享拦截器过滤器和监听器,这方面比较薄弱,.
然后做了一个任务总结..
任务一到任务九知识点总结.
任务一
任务一步骤1,实际是对业务模型的分析,在做项目的过程中,改动表结构是很麻烦的一件事,在方案评审时就应该将表设计好.
数据库表中基本字段, long类型的自增ID, long类型create_at,和update_at,自增ID若ID出现中断情况,ID不会补上,create_at和update_at时段是从1970年0点开始以秒为单位计时.这里计算的是秒数为防止地域不统一出现时差等情况.
步骤6到7这里学习sql语句的基本语法增删改查.步骤8则是备份和备份恢复..
步骤9,10,28,则是对索引的理解,唯一索引数据不会出现重复,且我们需要对常用的查询字段简历普通索引以提高查询速度.
步骤12是了解JDK,JRE.JVM. JRE是java运行环境. JDK则是JAVA核心,它包括JRE, JVM是java虚拟机.
步骤13到步骤16是maven学习安装配置,maven是项目管理工具,它的生命周期clean(构建之前清理工作),default(构建核心部分,编译测试打包部署),site(生成项目报告,站点,发布站点),我们常用的有clean,install,package和deploy. 另外一个maven的特点约定大于配置,也就是项目目录构造.Java目录放编译类,配置文件放resource,测试类放test等.
步骤17到步骤20则是对数据库进行操作.jdbcPreparedStatment通过Connection连接数据库,Class.forName初始化驱动,通过sql语句进行增删改查,记得在最后关闭数据库连接.. JdbcTemplate则是Spring对jdbc的封装,在applicationContext.xml配置数据库的连接信息dataSource,,将dataSource作为数据源属性装配在封装好的jdbcTemplate当中,将sql语句作为参数通过调用jdbcTemplate内的方法对数据库进行操作.
Mybatis在mapper.xml里面设置sql语句,注意resultMap和parameterType.各种标签中的id属性必须和接口中的方法名相同.若需要设置驼峰命名,可以自定一个resultMap的结果集.在config.xml里面配置数据源,扫描与接口的配置文件,使用Mybatis提供的Resource类加载mybatis的配置文件config.xml. 使用sqlSessionFactory构建sqlSession工厂.然后将mapper类入参即可.
SpringMybatis是重点,它使用了spring依赖注入和控制反转的特点,将dataSource和sqlSessionFactory,作为bean属性配置在MapperFactoryBean里面,使用ApplicationContext提供的ClassPathXmlApplicationContext加载applicationContext.xml的作为配置使用,其getBean方法加载所需要的Bean.其余则和Mybatis差不多.
我们通常将接口和实现类分开写,达到解耦的目的,省去维护代码的成本和时间
步骤18是学会写单元测试,在实现方法之前通过写测试类来检验此方法是否正确.
步骤21是Debug模式调试,单步执行时的变量传递可以很快的定位bug出错的地方,这个功能在后面改BUG过程中会领悟到好处与强大.
步骤22-24是在服务器上配置环境,包括JAVA,Maven,mysql等, unbantu和centOS有些是可以一键安装节约很多时间,
步骤25,连接池常用的有阿里的druid和C3p0两种,分别引入jar包,在applicationContext.xml里面配置即可.当连接达到上限时,访问数据库会变得卡顿,甚至卡死.
步骤26是通过TryCatch抓取错误异常,并使程序正常运行下去.
步骤27属于查漏补缺,代码是否符合规范,DB设计是否合理.
步骤28拼接sql语句使用事物提交的方法快速一次提交多条数据.达到批量插入的目的,也有一种直接生成sql文件的方法,体会在大量数据之下索引带来的效率差别.
任务二步骤1.通过rest风格定义接口可以清楚直观的通过Url就知道这个接口的功能快速定位资源,使用HTTP动词(Get,post,put,post)来实现资源的操作,
步骤2-步骤4则是SpringMVC(model,view,Controller)的学习和使用,也是在之前的SpringMybatis加上springMVC.
用于扫描Pojo包 <context:component-scan base-package=""/>
<mvc:default-servlet-handler/>负责整个mvc的配置,
<context:annotation-config/>负责启动spring的注解.
<context:component-scan base-package=””>自动扫描Controller.
<!--静态资源映射-->
<!--本项目把静态资源放在了webapp的statics目录下,资源映射如下-->
<mvc:default-servlet-handler/>
<mvc:resources mapping="/css/**" location="/statics/css/"/>
<!-- 定义跳转的文件的前后缀,视图模式配置 -->
<!-- 对模型视图名称的解析,即在模型视图名称添加前后缀(如果最后一个还是表示文件夹,则最后的斜杠不要漏了) 使用JSP-->
<!-- 默认的视图解析器 在上边的解析错误时使用 (默认使用html)- -->
还有一个springAOP的使用,通过在applicationContext.xml配置切点和环绕类.使用
这一步骤完成之后可以将整个SSM(spring,mybatis,springMVC)框架实现为4个层级,
持久层DAO(mapper)层也可称作底层,主要是做数据持久层工作,负责对数据的操作.业务逻辑代码不要写在这一次,
业务层service层.主要负责业务模块的逻辑应用设计,,业务逻辑等操作全部写在这一层,封装Service层的业务逻辑有利于通用的业务逻辑的独立性和重复利用性,程序显得非常简洁.
表现层Controller层,负责业务模块流程的控制,针对具体的业务流程,会有不同的控制,在设计过程中可以将流程进行抽象归纳,设计出可以重复利用的子单元流程模块,这样不仅使程序结构变得清晰,也大大减少了代码量.
还有一个View层.负责前台Jsp页面的显示.
步骤5则是配置使用web容器来启动项目.目前有三个web容器,jetty,tomcat,resin,其中tomcat是属于重量级的,resin中等,jetty轻量,一般jetty足以支撑中小网站.它也在逐渐完善功能..
步骤6是使用postMan测试接口.在没有前端页面的情况下,使用postMan来测试,postMan可以发送几乎所有类型的HTTP请求,当我们发送put,post请求时可以通过json形式的数据来发送,
任务3步骤1-4是在服务器上面部署项目,通过在服务器上面安装web容器部署项目,这里也牵扯到Linux的命令的学习,ls,cd,mkdir,cat,mv,rm,whereis,vim,grep,top,ps,kill,tar,reboot,shutdown, grep| ,q,wq,!q,chmod等,我们一般讲web项目配置在各个web容器的webapp目录下,如果出现项目静态资源无法加载的情况和访问时需要加载项目名称的情况tomcat需要在配置文件里面加上<Context path="" docBase="项目路径" />.而jetty将项目war包名称改为Root即可
步骤5-9是学习配置Nginx,反向代理,Nginx在nginx.conf里面配置
server {
#监听80端口,80端口是知名端口号,用于HTTP协议
listen 80;
#定义使用www.xx.com访问
server_name www.helloworld.com;
#反向代理的路径(和upstream绑定),location 后面设置映射的路径
location / {
proxy_pass http://.....;
}
并编写一个简单的shell脚本.然后通过脚本统计出各环节处理时间,使用TOP命令查看服务器的使用情况,用到的awk分割日志然后进行数据抓取,awk分割时是以空格为一个区间分割的.使用tail来获取日志倒数行数数据.
任务四正式将view层加入项目当中,步骤1将静态变为动态,通过使用C标签,EL表达式将后端数据库内容展示在前端页面当中,通过model.addAttribute声明名称和值映射到jsp页面所对应的变量.
步骤2-3是使用Tiles对网站页面除body的footer,menu,header进行复用,
在tiles.xml基础模板里面配置拆分好的footer,menu,header.在使用时声明命名空间
<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %>,然后通过<tiles:insertDefinition name="test-header"/>分别放入使用就可以,另外需要在spring-servlet里面配置tiles视图解析器和tiles.xml才可以使用
使用taglib对传入的long类型时间变为现在系统时间.然后将项目部署到服务器上面.
任务五步骤1和2. 牵扯到Cookie,Session.对用户信息进行储存,cookie是在本地存储,session是储存在服务器. 使用DES和MD5加盐对用户信息进行加密,
这里牵扯到一个Base64编码,是把数据流转换为系统可识别的二进制流进行传输,使用SpringInterceptor通过Cookie中Token的有效性,来判断用户是否登录.通过拦截器对前面加/u/的URL进行登录拦截,SpringInterceptor的preHandle是在访问url之前进行拦截,postHandle是对jsp页面处理之前进行拦截,afterCompletion是对jsp页面处理之后进行拦截,还需要在spring-servlet里面配置拦截器及拦截的url.
任务六步骤1学习使用Jemeter对jsp和Json页面进行压力测试,通过查看TPS,90%Line,和吞吐量对接口性能进行测试.json页面的接口性能比较强,所以我们传输单纯的数据时可以使用json格式,一般情况下90%Line接口为200ms以内最佳.
步骤2-步骤4是数据缓存,memcached和redis对数据进行缓存,加上缓存和Nginx负载均衡之后对接口进行压力测试,并生成压测报告.同样也是需要在配置文件里面配置redis和memcached的属性,比较倾向于redis,它可以缓存的格式比较多,在储存数据的时候它将数据在内存中存储的方法更为节省空间,另外它可以存储快照,也就是持久化,它的监听模式和事物处理的原子化模式应用更广.从压测报告可以看出缓存对数据的提示不止一点,
任务7步骤1是在数据库里面添加漏掉的字段,也是重温一下之前的任务.
步骤2-步骤3主要是为了学习第三方API文档,第三方文档的差异化比较大,主要看demo和错误码对应的情况,将第三方API接入项目当中.这里有一点是将经常用到的常量配置在配置文件当中,使用seter注入的方式,以便后期的维护,
步骤4是做好异常处理,,每个接口的官方文档都有异常码对应的错误.异常处理就是在第三方文档出现问题的时候抓取这个异常码,处理错误日志,查看第三方接口的情况,
步骤5.是编写图片迁移程序.实际是将第三方存储的内容转移到另外一个第三方存储空间,当中牵扯到了序列化,将数据转换为数据流的形式进行传输,可以通过阿里的fastJson进行序列化, 这列还是用到了分割数据的方式 String[] array = mes.split(":"). 然后通过URL拼接的方式直接对存储空间进行上传,
任务8步骤1-步骤4是将Service变为远程方法调用的Service,将Service部署为两个,在配置文件里面配置注册端口服务端口,服务名称一定要与client里面的服务名称接口一致,这里还用到了一个锁机制, synchronized (lock){lock.wait(); client里面除了配置Service的注册端口和服务名称外,还需要配置一个随机访问的serviceUtil.如果一个service出现问题,就跳转到另外一个Service,
Controller分离之后不存在任何逻辑代码,业务逻辑代码一般放在service里面,通过Nginx配置两个web容器随机访问,俩个web可以随机访问这两个Service.
任务9步骤1-步骤4是把service组件化,将多个service拼接在一起实现模块化管理,在spring配置文件里面声明sca<sca:service name="" target="实现" />需要在service上面加上注解@Remotable, 在Calculator.composite里面声明 <component name="ServiceComponent">然后 Node node = NodeFactory.newInstance().createNode("Calculator.composite");使用即可.client与任务8不变,注意端口号和服务名称一致
明天计划完成的事情:
准备小课堂,明天讲.
完善思维导图,和任务总结,
总结深度思考.
遇到的困难:,
这两天没有实质性的代码.没有遇到什么困难.
收获:
回顾了一下任务中的卡点和知识点,
.
任务进度:任务10
任务开始时间:2017-12-1
预计demo时间:2017-12-31
是否有延期风险:暂无
禅道:,http://task.ptteng.com/zentao/task-view-14508.html
评论