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>
2014年工作中遇到的20个问题:101-120相关推荐
- 2014年工作中遇到的20个问题:1-20
1.面对问题的心态. 有的时候,突然遇到问题的时候,很是着急,以致方寸大乱. 不能够静下心来去系统思考问题发生的原因和可能的解决方案. 比如Linux系统MySQL无法启动,因为第一次遇到, ...
- 2014年工作中遇到的20个问题:120-140
2019独角兽企业重金招聘Python工程师标准>>> 121.Tomcat增加JVM启动参数. set JAVA_OPTS=%JAVA_OPTS% %LOGGING_MANAGER ...
- 2014年工作中遇到的20个问题:81-100
81.MySQL执行sql命令的时候,总是报一个陈旧的sql脚本错误.只要一致性,就崩溃,搞的我也要崩溃了. 先后尝试了 重新安装MySQL-Front,完全清除MySQL-Front再重新安装,都不 ...
- 2013年工作中遇到的20个问题:181-200
每个人在工作中遇到的问题,很多都是类似的.了解别人遇到的问题,自己遇到的时候就可以很快地解决它. 很多人不屑于这种"细节问题",但我想说,掌握这些细节问题一次可能只能帮你节省1s的 ...
- 2013年工作中遇到的20个问题:241-260
2019独角兽企业重金招聘Python工程师标准>>> 241.DAO层很多代码都是重复的. 分页:记录列表,多少条记录: 是否授权:授权的,没授权的. 一定要写一个功能强大的高度复 ...
- 读书、学习、工作和生活中收集的20条经典语录:1-20
以下经典语录来自我的生活.工作感悟,来自我读过的书,来自互联网的文章,也有很多来自CSDN的博客和论坛. 在成长的过程中,在毕业后的工作中,在思考人生和未来之路中,在娱乐休闲中,我略有所思,不断总结. ...
- 2013年工作中遇到的20个问题:261-280
最近遇到的20个问题,大多比较常见,很有学习价值. 有几个是第1次遇到,大部分都解决了,挺给力的. 个别问题,可能难以找到根本原因. 有兴趣的,来瞧瞧吧! 261.字符串处理最常见的bug. 不能仅 ...
- 2013年工作中遇到的20个问题(Bug):161-180
161.用户表和超级用户分成2个表,很不合理,查询的时候,非常复杂. 162.left join还是很有"市场"的. 机构表Org连接User时,想获得user的名字,可能存在,也 ...
- 2014年工作中遇到的10个问题:221-230
2019独角兽企业重金招聘Python工程师标准>>> 221.新建Maven项目的2种方式. a.新建Dynamic Web Project,然后转换成Maven项目. b.新建 ...
最新文章
- 报错——StackOverflowError
- python开源代码-mtcnn python 开源代码详细图解
- GVIM的使用(动图指导,全网首发)
- OpenCV亚像素角点检测
- Caffe: gflag编译出现问题汇总
- Spring Boot 与消息 (JMS、AMQP、RabbitMQ)
- python程序文件是什么_.py文件是什么?
- CentOs上docker安装nginx、tomcat、redis
- 小D课堂 - 新版本微服务springcloud+Docker教程_6-06 zuul微服务网关集群搭建
- codeIgniter3 学习笔记四(文件上传)
- 360无线网卡驱动服务器,360无线网卡驱动
- 解决在使用rtx2060跑算法时遇到显存不足的问题
- 来吧,我和你聊聊操作系统
- axio并发请求示例
- Jenkins | 搭建你第一个Jenkins应用
- mapgis考试11
- 处理ArchLinux上各软件屏幕卡顿与显示问题(chrome浏览器,微信开发者工具wxdt,vscode移动慢问题)
- Show一下拿的奖杯
- arcgis弧段怎么加很多点_关于ArcGIS的这62个常用技巧,你造吗?
- 软件测试行业的现状和前景
热门文章
- 台球给我的一点“触动”
- LOJ #10172. 「一本通 5.4 练习 1」涂抹果酱
- 【epoll】形象的解释epoll|一句话讲透epoll
- 数据中心制冷系统设计40个问题!
- Foundations of Machine Learning 2nd——第一章 机器学习预备知识
- SuperMap iMobile 8C 技术文档 ——加载倾斜摄影模型
- 【多媒体课件制作软件】Focusky教程 | 巧用转体强调动画效果
- 《c语言入门题目6》存入本金,根据银行年利率算钱
- 智慧城市井盖监测系统中的RTU应用
- 关于shift-jis编码转换utf-8