现在的位置: 首页 > 综合 > 正文

2014年工作中遇到的20个问题:101-120

2016年07月21日 ⁄ 综合 ⁄ 共 6814字 ⁄ 字号 评论关闭

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>

抱歉!评论已关闭.