学习总结与错误记录

错误记录和总结笔记

2018年:

10-21: spring-security框架配置跳转路径错误

  • spring-security框架配置中:配置默认跳转的路径 必须和 前台页面中写的路劲保持完全一致,(一个点儿都不能少)

<!-- 定义跳转的具体的页面 -->
<security:form-login
        login-page="/pages/login.jsp"
        login-processing-url="/login.do"
        default-target-url="/index.jsp"
        authentication-failure-url="/pages/failer.jsp"
        authentication-success-forward-url="/index.jsp"
/>

这前台和后台的配置指向的路径要完全一致,不然就会出现无法跳转的异常.

<form action="${pageContext.request.contextPath}/login.do" method="post">

10-23: mybatis在dao层方法的多参数注入错误

  • mybatis框架注解开发时,或者xml映射文件配置时,若dao层的方法参数列表只有一个参数(无论是基本参数类型还是引用数据类型),可以不加@Param注解,,但是当出现多个参数时就要加@Param注解了

    不然会 报 类似: org.mybatis.spring.MyBatisSystemException:Parameter 'userId' not found. 的异常(--详情请百度"@Param注解的用法")

    @Insert("insert into users_role(userId,roleId) values(#{userId},#{roleId})")
    void addRoleToUser(@Param("userId")String userId, @Param("roleId")String roleId);

10-24: 关于a++ 自增的java基础语法错误

  • java基础:a++自增问题(a--自减问题同上), 我们知道a++自增是 先运算,后自增,,所谓的先运算只管它之后的一次运算,一次运算之后就会执行自增了,若后面又多次运算,他只管第一次;自身忽略括号,(a++)和a++是一样的,不会先执行自增的;

    如下题:

    int a=8; int b=10;
    System.out.print(a*b+a+++b);//98
    System.out.print(a*b+(a++)+b);//98
    System.out.print(a*b+b+(a++));//98
    System.out.print(a+++b+a*b);//108
    System.out.print((a++)+b+a*b);//108

10-27: lucene全文检索技术的原理分析

  • 对于结构化数据的查询一般用于数据库中的查询,格式固定,查询时用于比对的元素是不重复的,因此计算机扫描时采用"全等"的策略,一旦找到要查的结果,就直接返回了,而对于非结构化数据来说,格式不固定,内容也可能有很多重复的地方,计算机查询的时候需要采用 "顺序扫描"的方式,对数据与查询条件做"包含"的运算,这种运算和"全等"相比,本身就会加大计算成本,而且顺序扫描的话,在数据量庞大的情况下,花费的时间会非常多,而且计算机为了确保能找到所有"包含" 查询条件的数据,必须把所有数据遍历一遍,这样会非常耗时间!,,,,,,,,,,,,,,,,,,,,,而采用lucene全文检索技术则是:==先建立索引库,然后对索引库进行查询==,建立索引库的过程就是将 每一条数据的通用信息提取出来,保存到通用的字段空间下,如每一个文件都会具有:文件名,文件内容,文件大小,文件路径(或url网络路径)等通用信息,先将每个文件这些信息提取出来放入一个文档对象中(也就是说一条文档对象就包含一个文件的所有提取出来的信息),并且在创建文档对象的过程中还进行了 分词处理,一个文件或多个文件之间可能有大量重复元素,若将这个大整体分解成一个个独立的元素那么肯定能减少数据的复杂度(参考数以万计的单词,拆分开来也就仅仅是26个英文字母组成的而已),分词就是这么回事,,分开的词与所属的文档对象保持着引用的关系,而这种引用关系和分出的词的整体就称为索引,而对于"关键词"来说,去掉重复的,所剩余的那部分的总体就组成了索引库,这索引库和原始数据相比数据量就非常小了,之后的查询 只需要使用关键词查询,然后拿着查询条件里的 关键词和 索引库里保存的词单元做遍历 "全等"比较,找到就立马跳出循环(这一过程由于数据量不大,并且计算机的计算能力非常强,一般所花费的时间非常少),然后再根据此关键词与索引之间的引用关系 快速确定要搜索的那些文档对象,,再将这些文档对象里保存的字段信息,返回给用户,由于这信息结构固定,所以展示也很容易,之后用户只需要查看展示的信息,选择那一条是自己想查的数据,再根据此信息中的路径快速找到想要找的文件!

10-28:ElasticSearch有关操作总结

  • ElasticSearch简称es,它的核心在于他的查询方面,官方人员也说了,虽然es结构与数据库类似,并且查询性能比数据库高,但是es在保存数据方面可能存在着数据丢失的问题,并且在索引库和类型,字段等的增删改方面表现的并不好,关键是还不支持事务,它专注的是查询方法,所以并不能代替数据库..

  • es的索引库的增删以及类型和字段的确定:

    • [put] http://[ip地址]:9200/[索引库名].....请求体里面写json语法: {json语句}

    • [delete] http://[ip地址]:9200/[索引库名]

  • 文档的增删改查

    • 增 [put/post] http://[ip地址]:9200/[索引库名]/[type名]/[id]-->id可写可不写,写的话即手动指定Id,不写则自定生成id..

    • 删 [delete] http://[ip地址]:9200/[索引库名]/[type名]/[id]-->删除指定id的文档对象

    • 改 和增一样,,id不重复则为增,id重复则为覆盖

    • 查 (一般会安装IK-analyzer中文分词器)

      根据id查询: [get] http://[IP地址]:9200/[索引库名]/[type名]/id

      根据关键词查询: [post] http://[IP地址]:9200/[索引库名]/[type名]/_seqrch (其中type名可以不指定,这样范围大些)

      {
          "query":{
              "term":{
                  "字段名":"关键词"
              }
          }
      }

      根据长句(字符串)查询:[post] http://[IP地址]:9200/[索引库名]/[type名]/_seqrch (其中type名可以不指定,这样范围大些)

      {
          "query":{
              "query_string":{
                  "default_field":"字段名",
                  "query":"xxxxxxx...."
              }
          }
      }

10-29: Java代码操作elasticsearch的错误

  • 使用Java代码写json数据时,适用对象调方法的流式编程方式,,只需要写 type名后跟properties属性再接字段属性,不需要像直接写json数据一样 还需要拼上 mapping这个属性.

 

10-31: 线程安全的单例模式实现

/**
 * 线程安全的单例模式实现,
 * 实现了不同线程之间对象不同,同一线程之中对象一致!
 */
class Kun {
    int i;
    private static ThreadLocal<Kun> kunThreadLocal=null;
    private Kun(){}
    public static Kun getKunInstance(){
        if (kunThreadLocal==null) {
            //说明是第一次获取对象
            kunThreadLocal = new ThreadLocal<>();
        }
        if (kunThreadLocal.get()==null) {
            kunThreadLocal.set(new Kun());
        }
        return kunThreadLocal.get();
    }
}
/**
 * 实现了所有情况下都只能获取到单一对象的情况
 */
public class Kun{
    //私有构造
    private Kun(){}
    //创建私有静态内部类创建本类对象
    private static class KunInstance{
        private static final Kun instance = new Kun();
    }
    public Kun getInstance(){
        return KunInstance.instance;
    }
}
​
/**
 * 双重校验锁机制的单例模式
 */
public class Kun{
    //私有构造
    private Kun(){}
    //定义好单例对象
    private static final volatile Kun kunInstance=null;
    
    private static synchronized createInstance(){
        if(kunInstance==null){
            kunInstance = new Kun();
        }
    } 
    
    public static Kun getInstance(){
        if(kunInstance==null){
            createInstance();
        }
        return kunInstance;
    }
}
  • 查看HashSet源码发现,hashSet是基于HashMap实现的,基本上每个方法都需要调用HashMap中的方法才能实现!------>(猜想)说明HashMap集合实现的时间比HashSet早!

 

11-3: maven在执行install命令时报: zip Header not found 错误

  • 经过不懈努力的查找,终于发现,当maven仓库里所依赖的jar包出现异常(或者说"损坏")时,会报这个错误!

    解决方法就是,找到仓库中这个jar包的位置,把他干掉,让maven重新下载即可!

    • 另外还有一个小错误就是:如果执行install命令是通过plugin插件执行的话,可能会抛出jar包找不到的异常,尽量使用生命周期里面的执行命令!

 

11-4: 前端JS框架的常用指令

  • 表达式写法: {{变量}},,配合指令:ng-app 一起使用

  • $sce : 过滤器服务 $sce.trustAsHtml(data); 传入的数据当作html解析

  • 动态绑定: ng-model="变量"

  • 初始化指令: ng-init="变量='value'"

  • 定义模型: angular.module("模块名",[所依赖的模块])

  • 定义控制器: 模块.controller("控制器名",function($scope){ ....... })

  • 点击事件指令: ng-click

  • 循环指令: ng-repeat="entity in list "

  • 判断指令: ng-if :

  • 增强下拉列表指令: select2 , <input select2 select2-model="" config="" mudlble="" />

    其中: select2指的是: 指令,声明这是个下拉框;

    select2-model指的是:选择的数据存贮 数据格式:{"id":1,"text":"xxx"}

    config指的是:数据来源,读取的数据格式为: {data:[{"id":1,"text":"xxx"},{"id":1,"text":"xxx"}]}

    mudible指的是 是否为多选,true为多选,false为单选

  • 下拉列表指令: ng-options=" entity.id as entity.name for entity in list ";用于select下拉框中

  • 变量监控: $watch("被监控的变量", function( ){ }) 被检控的变量值发生变化时,会触发 函数的执行

  • 地址栏参数监控: $location 在当前页面的controller控制器中注入此变量,可以获取跳转到此页面时地址中带有的参数列表! $location.search()获取包含所有参数的json对象, 前提是地址栏参数列表是 #? 开始的才可以获取!

 

11-4: 使用springMVC框架时,设置拦截路径"/"和"*.do"的区别

"/"是静态资源页面,和class访问路径全都拦截," *.do"是只拦截以此结尾的路径,而这个也只能用于class路径上,所以为了实际好应用,建议所有class路径都以" *.do"结尾,

 

11-9: SpringMVC的执行流程

  • 首先客户端浏览器发送请求给服务器,前端控制器获取到请求,调用处理器映射器,处理器映射器根据url生成相应的处理器对象,然后前端控制器调取处理器适配器,将具体的处理器对象传递给处理器适配器,然后处理器适配器通过处理器对象对请求信息处理之后,返回ModelAndView对象,前端控制器获取到ModelAndView对象之后,将其传递给视图解析器,返回得到相应的view,之后前端控制器将数据填充到view中得到最终的静态资源,然后响应给客户端浏览器!

 

11-9: ==有关复制pdf文档上的内容的问题,,,,千万别直接往代码里面贴,里面又看不见的字符导致各种问题! 切记切记!==

 

11-10: Spring-Security框架常见错误

  • 若与spring整合时版本不符可能会报错,导依赖时,security的依赖之间版本要统一

  • spring-secuity版本在5.0版本之后必须声明加入passwordEncoding加密类,不然就会报错,想不加的话,可以在密码前面加上 {noop}声明!

 

11-10: angularJS前端框架前台 ng-click 指令使用错误

ng-click指令只能用来调方法,不能直接在里面写执行的代码, 写了也不会执行! 可以一次性调取多个方法,中间用分号隔开.

 

11-13: angularJS前端框架 在引入goodsController.js控制器时报错:无法注入参数值

当几个页面共用一个controller.js时,某些页面注了很多$xxx 等自带的值, 但是在另外一个页面不需要这些值时,直接引用此controller.js文件就会报此错,你需要把能注入此值的其他js文件也引入进来,即使你不用! 或者不共用此controller.js,自己在写一个也行!

 

11-18: JS原生关键词: delete 作用: 删除一个js对象中的一个属性

  • 用法: person: {name: "江昆",age: 20}, 删除name 属性, delete person.name; 就可以删除掉name属性!

11-22:freemarker使用输出流乱码问题

  • 一般使用的FileWirter()输出流是默认采用系统字符集进行编码输出,可能会造成乱码问题, 此时应该采用可以手动设置字符集的输出流 FileOutputStream 代替:

    OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(pageDir+id+".html"), "UTF-8");
    ​

2019年:

3-4: oracle数据库sql递归语法

SELECT * FROM SYS_AREABASE
START WITH areacode='433127'
CONNECT BY PRIOR areacode=PARENTcode

树结构的描述:

树结构的数据存放在表中,数据之间的层次关系即父子关系,通过表中的列与列间的关系来描述,如EMP表中的EMPNO和MGR。EMPNO表示该雇员的编号,MGR表示领导该雇员的人的编号,即子节点的MGR值等于父节点的EMPNO值。在表的每一行中都有一个表示父节点的MGR(除根节点外),通过每个节点的父节点,就可以确定整个树结构。

其中:CONNECT BY子句说明每行数据将是按层次顺序检索,并规定将表中的数据连入树型结构的关系中。PRIOR运算符必须放置在连接关系的两列中某一个的前面。对于节点间的父子关系,PRIOR运算符在一侧表示父节点,在另一侧表示子节点,从而确定查找树结构是的顺序是自顶向下还是自底向上

在连接关系中,除了可以使用列名外,还允许使用列表达式。START WITH 子句为可选项,用来标识哪个节点作为查找树型结构的根节点。若该子句被省略,则表示所有满足查询条件的行作为根节点。 ​ START WITH:不但可以指定一个根节点,还可以指定多个根节点。

参考链接:https://www.cnblogs.com/zhjx0521/p/7338876.html

4-1: 今日学习mybatis总结

  1. 公司的分页插件触发条件是:dao层方法传入inDTO对象,若不想分页的话则不要传入inDTO对象,直接传入Map对象即可!

  2. mybatis能够根据 sql标签中的databaseId属性区分不同数据库厂商的sql语句, 若相同的sql语句有多条, 则只会加载带有databaseId属性的sql,,另外需要在著配置文件里面声明DatabaseIdProvider标签

  3. mybatis给参数赋值有两个方式: #{} 是预编译方式填值,参数需要经过转义; ${}是 字符串拼接方式,参数不会经过转义! 有这个区别之后,正常安全 赋值可以继续使用 #{} ; 在有一些特别的需求时 要灵活利用${} 拼接字符串的方式会节省时间和避免冗余的代码!

  4. where 元素标签只会在至少有一个子元素标签的条件返回 SQL 子句的情况下才去插入“WHERE”子句。而且,若语句的开头为“AND”或“OR”,where 元素标签也会将它们去除。

4-11: maven工程引入本地jar包,并需要将之打进war包中的做法及 注意的问题;

  1. 如果使用<scope>system</scope><systemPath>//*//</systemPath>这个作用域可以实现在 编译期从本地jar包引入,但是在打成war包时不会 将之打入进去!

  2. 如果引用了本地jar包并且需要打进war包时,需要在第 1 条的基础上 再在 项目的依赖方的pom文件中配置插件:

    设置maven-war-plugin打包插件,让maven在导出war包时把设置好的路径下的文件打进war包

                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                    <configuration>
                        <webResources>
                            <resource>
                                <directory>${project.basedir}/libs</directory>
                                <targetPath>WEB-INF/libs</targetPath>
                                <filtering>true</filtering>
                                <includes>
                                    <include>**/*.jar</include>
                                </includes>
                            </resource>
                        </webResources>
                    </configuration>
                </plugin>

    设置好后再执行mvn clean package命令就会将指定路径下的文件打进war包

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值