文档章节

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

jtn
 jtn
发布于 2015/04/13 15:08
字数 2297
阅读 2
收藏 0

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>


© 著作权归作者所有

jtn

jtn

粉丝 12
博文 879
码字总数 879609
作品 0
武汉
程序员
私信 提问
CCNP精粹系列之十八--路由映射实战二,博主推荐文章

路由映射实战二 本篇博文和上一篇是紧密结合的,只是在上个试验的基础上作了改动,达到其他的试验效果。 试验二: 在R1上增加一个网段,并发布路由。这里采用三种方法。 如下是第一种,是在试...

技术小胖子
2017/11/07
0
0
sqlserver datetime转换成带格式的字符串

sqlserver datetime转换成带格式的字符串,sqlserver datetime转换成固定格式的字符串,sqlserver datetime转换成字符串,sqlserver 时间类型与字符串之间的转换 我们在项目开发中经常用到sqlse...

憨豆1号
2013/03/06
301
0
CCNP系列三十四--- Bgp的本地优先属性

Bgp的本地优先属性 Router#config t Router(config)#host R2 R2(config)#int s1/1 R2(config-if)#ip addr 202.110.101.1 255.255.255.0 R2(config-if)#encap hdlc R2(config-if)#clock rate......

技术小胖子
2017/11/07
0
0
CCNP精粹系列之三十一--BGP源地址问题二,推荐

源地址 -------不同自治系统间 试验环境: 试验环境: R1:lo0 192.168.10.1 255.255.255.0 lo1 172.16.10.1 255.255.0.0 S1/0 202.110.100.1 255.255.255.0 S1/1 202.110.101.1 255.255.255.......

技术小胖子
2017/11/08
0
0
基本类型包装型的缓存值cache

1.基本类型包装类型的缓存值 基本类型不包括:float,double bool缓存值:true,false char缓存值:0~127,故ASSII码里面的字符都有缓存 其它范围:-128~127 特殊的int:上限默认为127,但...

caoxiaohong1005
2018/04/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot + Mybatis-Plus 集成与使用(二)

前言: 本章节介绍MyBatis-Puls的CRUD使用。在开始之前,先简单讲解下上章节关于Spring Boot是如何自动配置MyBatis-Plus。 一、自动配置 当Spring Boot应用从主方法main()启动后,首先加载S...

伴学编程
昨天
7
0
用最通俗的方法讲spring [一] ──── AOP

@[TOC](用最通俗的方法讲spring [一] ──── AOP) 写这个系列的目的(可以跳过不看) 自己写这个系列的目的,是因为自己是个比较笨的人,我曾一度怀疑自己的智商不适合干编程这个行业.因为在我...

小贼贼子
昨天
7
0
Flutter系列之在 macOS 上安装和配置 Flutter 开发环境

本文为Flutter开发环境在macOS下安装全过程: 一、系统配置要求 想要安装并运行 Flutter,你的开发环境需要最低满足以下要求: 操作系统:macOS(64位) 磁盘空间:700 MB(不包含 IDE 或其余...

過愙
昨天
6
0
OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
昨天
2.7K
16
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
昨天
42
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部