zoukankan      html  css  js  c++  java
  • 2014年工作中遇到的20个问题:101-120

    101.Freemarker页面渲染与include引入4个相关问题。


    <bean id="freemarkerConfig"

            class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">

            <property name="templateLoaderPath" value="${p2p.config_path}/ftl/" />

    </bean>

     <bean id="viewResolver"

            class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">

            <property name="viewClass" value="com.p2p.base.web.freemarker.BaseFreeMarkerView" />

            <property name="cache" value="true" />

            <property name="order" value="0"/>

            <property name="prefix" value="/user/" />

            <property name="suffix" value=".ftl" />

        </bean>

        

    a.

    某个Controller方法:

      @RequestMapping("/auth/index")

      public String index() {

    return "auth/index";

    }

    //渲染页面的时候,是根据freemarkerConfig这个bean配置的templateLoaderPath和viewResolver的prefix寻找视图文件的,路径是${p2p.config_path}/ftl/。


       //在使用include的时候,比如

        <#include "/user/account/funds.ftl" />

    相对的路径是freemarkerConfig的templateLoaderPath,与viewResolver的prefix没有任何关系。

    这是非常重要的不同之处。

       b.

    另外需要特别说明的是,Freemarker的include语法,总是相对于templateLoaderPath的,

    <#include "/user/account/funds.ftl" />的实际路径是“${p2p.config_path}/ftl/user/account/funds.ftl”。

    即Freemarker的include相对路径与 JSP的include、html的url等地方的“相对路径语法”是不同的,不要搞错了。

       c.Freemarker与SiteMesh结合的时候,

     <head>

        ${head}

    </head>

    <body>

    <#include "common/header.ftl" />

    ${body}

    <#include "common/footer.ftl" />

    </body>

    sitemesh会把我们自己的FTL页面中的<head></head>之间的部分放到${head}这里,

    <body></body>之间的部分放到${body}这里。

    如果我们定义的标题等头部内容没有放在<head></head>,比如<html>title<body>body</body></html>

    或者我们定义的主体没有放在<body></body>,比如<html><head><title>title</title>body</html>,

    那么内容就不会被SiteMesh正确处理。

    根据结果分析,SiteMesh只处理html页面中的<head></head>和<body></body>之间的。

    d.sitemesh的配置页面,"<#include "common/header.ftl" />" include的路径是sitemesh和Freemarker配置的servlet等共同决定的位置,

    与SpringMVC-Freemarker配置的那个templateLoaderPath不是同一个地方。


    <decorators defaultdir="/WEB-INF/decoractors">

    <decorator name="layout" page="ftl/layout.dec">

    </decorator>

    </decorators>


      根据我自己的理解,"<#include "common/header.ftl" />"是相对defaultdir+page,即“/WEB-INF/decoractorsftl/layout.dec”。

      layout.dec的同级目录common下,有header.ftl和footer.ftl。

      

      上面4个问题不太好懂,网上给的大多是入门的例子,实际项目中配置多了,会遇到很多疑惑,

      只有自己去实际解决了,才会增长经验。

      

    102.Mybatis的批量查询。

    <select id="batchList" resultType="java.util.Map">

    select * from p2p_loan_info where lid in

     <foreach item="item" index="index" collection="list" open="(" separator="," close=")">  

         #{item.lid}  

     

    如果传入的list为null,或者没有元素,那么 in语句就会报错。

    只能在dao的调用方法里,进行参数检查。

    List<Map<String, Object>> list = tenderDao.userLoanList(form);

    List<Map<String, Object>> loanList = loanInfoService.batchList(list);

    merge(list, loanList);

    注意:

    @Select("select * from p2p_tender order by lid desc")

    List<Map<String,Object>> userLoanList(PageVo form);

    如果没有查询到数据,返回的list不会null,而是“空集合”。

    //在xml文件写sql,必须指定resultType="java.util.Map"


         <select id="userLoanList">

    select * from p2p_tender

    order by lid desc

    </select>

    否则报错:It's likely that neither a Result Type nor a Result Map was specified.

    而通过注解@Select就不需要再次指定@ResultType

    简单的sql通过注解更方便快速。

    因此,正确的写法为:

    List<Map<String, Object>> list = tenderDao.userLoanList(form);

    if (list != null && list.size()>0) {

    List<Map<String, Object>> loanList = loanInfoService

    .batchList(list);

    merge(list, loanList);

    form.setList(list);

    }

    写程序,果然比较需要“逻辑思维”额,所有的情况都要考虑。

    预期之外的情况和预期之内的情况,工作量差不多。

    103.日期条件查询。

    数据库的时间是bigint类型的,存储的是创建时间的毫秒数,Calendar.getInstance().getTimeInMillis(),这个时间单位是微妙。

    Web前端穿的是“2014-11-11”这样的日期字符串,转换成java.util.Date,然后date.getTime(),这个时间单位是毫秒。

    因此 between .. and ..总是失败,需要把date*1000。


    上述问题有个“坑爹的地方”,Calendar.getInstance().getTimeInMillis()其实返回的是“毫秒数”。

    所以,就不需要画蛇添足乘以1000了。

    微秒的英语单词是:microsecond,英语太差就是这个结果。囧啊~


    但是让然无法查询到数据,最后发现2014-11-11 使用“yyyy-MM-dd”转换的时候,时分秒都是按0计算的。

    如果是 截止时间,就少了将近1天。


    用户输入2014-11-11,程序自动给开始时间加上“ 00:00:00”,结束时间加上“ 23:59:59”。


    104.表格Table分页组件。

    前端可以选择用JS控制,也可以每一次分页都发送新的页面请求(当前页打开),后端只负责提供数据。

    前端AJAX,后端提供JSON格式的数据;前端打开新页面,后台直接渲染,对搜索引擎更加友好。

    前端AJAX,不需要维护查询条件,用来在页面重新显示;而打开新页面,必须记住当前的查询条件,在新页面要显示用户的查询条件。


    105.PDF实现水印,由于流没有close,导致文件打开显示损坏,实际上里面没有任何内容。

    文件内容为空,很大可能就是流没有关闭。


    106.iText生成PDF时,页数是从1开始的,而不是0。


    107.在使用百度分享组件的时候,分享到新浪微博、百度空间等都没有问题,分享到QQ空间不正常。

    针对这种情况,我觉得还是到线上部署后,再看情况处理。

    最终发现,线上是正常的。

    因此,我分析可能是QQ空间分享,有跨域之类的问题,或者是域名问题,不能用localhost。



    108.PDF的亚洲字体库,可以下载jar包,也可以配置Maven依赖。

    <dependency>

        <groupId>com.itextpdf</groupId>

        <artifactId>itext-asian</artifactId>

        <version>5.2.0</version>

        </dependency>


    109.坑爹啊,太坑了。复制粘贴的代码,突然发现文章查询,把内容content也给查询出来了。这是要多耗费内存和带宽。妈蛋~☺


    110.Element org.dom4j.Element.addText(String text)

     Dom4J的这个方法,text不能为null,否则报错。


    111.由于使用Cookie实现的Session,需要绑定域名,本地配置了hosts域名ip映射。

    项目中动态服务走一个域名y.com,静态服务中走另外一个域名,static.y.com。

    后来搞起less,结果会跨域,浏览器无法跨域获得less文件。


    为了解决跨域问题,把静态文件也使用了y.com,结果在本地跑程序的时候,y.com映射的是本地,获取图片也会走本地,

    而不是走远程的。


    最终方案是,静态存储走单独域名static.y.com,动态服务走y.com。

    Less属于测试,单独再部署一台服务器。



    112.关于接口与实现类。

    许多文章中以及一些实际项目中,喜欢同时建立接口和实现类。但是我发现,大部分的项目,真心没有必要定义接口。

    每次修改接口的一个参数,实现类也要跟着改,特别麻烦。


    113.FreeMarker <#if>标签 大于号。

    两种方法:

    1 用符号代替,> gt, >=  gte ,< lt , <= lte

    2 加括号 <#if(x>y)>


    114.项目中同时配置了log4j.xml和log4j.properties,发现log4j.xml被使用了,log4j.properties没有被使用。


    115.百度UEditor上传组件。


     "imageUrlPrefix": "", /* 图片访问路径前缀 */

      "imagePathFormat": "/ueditor/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */

    我的个人官网直接部署在根目录,“http://localhost:8080/”或“http://fansunion.cn”


    上面的imageUrlPrefix前缀设置的是空,百度UEditor自动把图片路径设置为"http://fansunion.cn//ueditor/upload"


    我们公司的后台管理项目,带上了项目名称,“http://localhost:8080/backend",

    这个时候需要配置imageUrlPreix,“http://localhost:8080/backend"。


    我表示,百度UEditor设计得还不错,只是在我们使用的过程中,不知道它的全部用法,只能逐步摸索。

    答案方法就在那里,等着你自己去实践,去验证。



    116.<mvc:resources location="${p2p.backend_page}/tpl/" mapping="/tpl/**" />

    一个请求:从哪到哪。把mappting写作前面,资源的位置location写在后面才是更加合理的吧。

    <mvc:resources  mapping="/tpl/**" location="${p2p.backend_page}/tpl/"/>


    117.Eclipse Git项目发生了冲突,Java视图能够看到冲突,但没有“Mark as merged”选项。

    去Team Synchronize视图,也没有发现有冲突的代码。

    最后,在工程->右键-Team->同步Workspace,最后同步了最新代码,然后找到了冲突,标记已解决,提交,ok。


    118.

    git reset –hard HEAD~3 回退到当前版本的前3个版本

    git reset –hard aa 回退到指定的某个版本

    git push -f 强制提交



    如果reset之后,再重新执行pull,会再次恢复到最新的版本。


    119.Tomcat响应静态资源请求,比如sitemap.xml文件。

    <servlet-mapping>

    <servlet-name>default</servlet-name>

    <url-pattern>/static/*</url-pattern>

    </servlet-mapping>

    <servlet-mapping>

    <servlet-name>default</servlet-name>

    <url-pattern>*.js</url-pattern>

    </servlet-mapping>

    <servlet-mapping>

    <servlet-name>default</servlet-name>

    <url-pattern>*.css</url-pattern>

    </servlet-mapping>

    <servlet-mapping>

    <servlet-name>default</servlet-name>

    <url-pattern>*.png</url-pattern>

    </servlet-mapping>

    <servlet-mapping>

    <servlet-name>default</servlet-name>

    <url-pattern>*.jpg</url-pattern>

    </servlet-mapping>

    <servlet-mapping>

    <servlet-name>default</servlet-name>

    <url-pattern>*.xml</url-pattern>

    </servlet-mapping>

    也可以在Nginx里配置,不过不想改。本地一般不启动Nginx,让Tomcat处理比较灵活。

    线上可以考虑配置Nginx拦截静态资源请求。


    120.Ueditor1.4.2中有如下代码:

    com.baidu.ueditor.upload.Base64Uploader{


    private static byte[] decode(String content) {

    return Base64.decodeBase64(content);

    }

    }


    结果报错,提示Base64.decodeBase64只能接收byte[]类型的参数,最初我以为是UEditor的代码有问题。

    后来发现是Commons-codec的版本不是UEditor依赖的1.9。

    Maven配置由

    <dependency>

    <groupId>commons-codec</groupId>

    <artifactId>commons-codec</artifactId>

    <version>20041127.091804</version>

    </dependency>

    改为

    <dependency>

    <groupId>commons-codec</groupId>

    <artifactId>commons-codec</artifactId>

    <version>1.9</version>

    </dependency>


  • 相关阅读:
    Goroutine被动调度之一(18)
    实战分析一个运行起来会卡死的Go程序
    Go语言调度器之盗取goroutine(17)
    第三章 Goroutine调度策略(16)
    非main goroutine的退出及调度循环(15)
    Go语言调度器之调度main goroutine(14)
    PHP经典面试题之 Redis 内存满了怎么办?
    【PHP】让新人快速理解ThinkPHP6中的事务操作
    面试官:说说swoole+PHP实现自动取消订单,还原库存等操作
    最新整理的PHP高级面试题来啦!【附答案】
  • 原文地址:https://www.cnblogs.com/qitian1/p/6463118.html
Copyright © 2011-2022 走看看