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>

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

  1. 2014年工作中遇到的20个问题:1-20

    1.面对问题的心态.  有的时候,突然遇到问题的时候,很是着急,以致方寸大乱.  不能够静下心来去系统思考问题发生的原因和可能的解决方案.    比如Linux系统MySQL无法启动,因为第一次遇到, ...

  2. 2014年工作中遇到的20个问题:120-140

    2019独角兽企业重金招聘Python工程师标准>>> 121.Tomcat增加JVM启动参数. set JAVA_OPTS=%JAVA_OPTS% %LOGGING_MANAGER ...

  3. 2014年工作中遇到的20个问题:81-100

    81.MySQL执行sql命令的时候,总是报一个陈旧的sql脚本错误.只要一致性,就崩溃,搞的我也要崩溃了. 先后尝试了 重新安装MySQL-Front,完全清除MySQL-Front再重新安装,都不 ...

  4. 2013年工作中遇到的20个问题:181-200

    每个人在工作中遇到的问题,很多都是类似的.了解别人遇到的问题,自己遇到的时候就可以很快地解决它. 很多人不屑于这种"细节问题",但我想说,掌握这些细节问题一次可能只能帮你节省1s的 ...

  5. 2013年工作中遇到的20个问题:241-260

    2019独角兽企业重金招聘Python工程师标准>>> 241.DAO层很多代码都是重复的. 分页:记录列表,多少条记录: 是否授权:授权的,没授权的. 一定要写一个功能强大的高度复 ...

  6. 读书、学习、工作和生活中收集的20条经典语录:1-20

    以下经典语录来自我的生活.工作感悟,来自我读过的书,来自互联网的文章,也有很多来自CSDN的博客和论坛. 在成长的过程中,在毕业后的工作中,在思考人生和未来之路中,在娱乐休闲中,我略有所思,不断总结. ...

  7. 2013年工作中遇到的20个问题:261-280

    最近遇到的20个问题,大多比较常见,很有学习价值. 有几个是第1次遇到,大部分都解决了,挺给力的. 个别问题,可能难以找到根本原因. 有兴趣的,来瞧瞧吧! 261.字符串处理最常见的bug.  不能仅 ...

  8. 2013年工作中遇到的20个问题(Bug):161-180

    161.用户表和超级用户分成2个表,很不合理,查询的时候,非常复杂. 162.left join还是很有"市场"的. 机构表Org连接User时,想获得user的名字,可能存在,也 ...

  9. 2014年工作中遇到的10个问题:221-230

    2019独角兽企业重金招聘Python工程师标准>>>  221.新建Maven项目的2种方式. a.新建Dynamic Web Project,然后转换成Maven项目. b.新建 ...

最新文章

  1. 报错——StackOverflowError
  2. python开源代码-mtcnn python 开源代码详细图解
  3. GVIM的使用(动图指导,全网首发)
  4. OpenCV亚像素角点检测
  5. Caffe: gflag编译出现问题汇总
  6. Spring Boot 与消息 (JMS、AMQP、RabbitMQ)
  7. python程序文件是什么_.py文件是什么?
  8. CentOs上docker安装nginx、tomcat、redis
  9. 小D课堂 - 新版本微服务springcloud+Docker教程_6-06 zuul微服务网关集群搭建
  10. codeIgniter3 学习笔记四(文件上传)
  11. 360无线网卡驱动服务器,360无线网卡驱动
  12. 解决在使用rtx2060跑算法时遇到显存不足的问题
  13. 来吧,我和你聊聊操作系统
  14. axio并发请求示例
  15. Jenkins | 搭建你第一个Jenkins应用
  16. mapgis考试11
  17. 处理ArchLinux上各软件屏幕卡顿与显示问题(chrome浏览器,微信开发者工具wxdt,vscode移动慢问题)
  18. Show一下拿的奖杯
  19. arcgis弧段怎么加很多点_关于ArcGIS的这62个常用技巧,你造吗?
  20. 软件测试行业的现状和前景

热门文章

  1. 台球给我的一点“触动”
  2. LOJ #10172. 「一本通 5.4 练习 1」涂抹果酱
  3. 【epoll】形象的解释epoll|一句话讲透epoll
  4. 数据中心制冷系统设计40个问题!
  5. Foundations of Machine Learning 2nd——第一章 机器学习预备知识
  6. SuperMap iMobile 8C 技术文档 ——加载倾斜摄影模型
  7. 【多媒体课件制作软件】Focusky教程 | 巧用转体强调动画效果
  8. 《c语言入门题目6》存入本金,根据银行年利率算钱
  9. 智慧城市井盖监测系统中的RTU应用
  10. 关于shift-jis编码转换utf-8