创业过程中的63个技术问题



1.Eclipse Marketplace搜索Hibernate,比较靠前的位置有“Hibernate Tools”,使用代码自动生成,提高开发效率!
需要选择正确的版本,我用的是Indigo!


Eclipse插件:Hibernate Tools安装之后,没有找到自动生成代码的菜单。
只好在Myeclipse下使用,然后再拷贝到工程中。
遇到一个问题,创建工程时,需要先“增加对Hibernate的支持”,然后才能生成代码,要不然无法选择SrcFolder!


2.把Java Web项目部署到Tomcat的根目录。
 项目--右键--属性--项目属性里面找到一个 web project setttings选项菜单,里面有一个context root可以设置``````




3.
<!-- Properties文件读取配置,*.properties -->
<context:property-placeholder location="classpath*:*.properties" />




<!-- <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
<property name="locations"> <list> <value>classpath:*.properties</value> 
</list> </property> </bean> -->


<!-- <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
<property name="locations"> <list> <value>classpath*:*.properties</value> 
</list> </property> </bean> -->




4.SpringMVC后端只能接收到get方式发送的请求参数,无法接收到post。
 @RequestParam
 @RequestBody
  
5.调整iframe高度
<iframe id="frm_footer" name="frm" src="<s:url value='/common/footer.jsp'/> "
frameborder="0" height="750px" scrolling="no" width="100%"  style="height:750px;"></iframe>
ie8和Firefox怎么都不支持iframe的height字段???


通过style="height:700px"设置有效。


6.$.ajax({
            url : this.dataSource,
                data : this.params && JSON.stringify(this.params),
                contentType : "application/json",
                type : this.method || 'POST',
                dataType : 'json',
                context : this,
                success : function(data){fill(that, data);},
                error : this.onerror
            }); 
设置了   contentType : "application/json",使用SpringMVC的@RequestBody才能接收到参数,而不是@RequestParam。


不设置这个参数,使用@RequestParam。


7.直接使用addEntity(java.util.Map.class)


使用的原生sql查询
SQLQuery sqlQuery = doCreateSQLQuery(sql);
if (clazz != null) {
sqlQuery.addEntity(clazz);
}
无法查询

通过下面的方式是可以的sqlQuery.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);


这种方法为什么不行呢?? 
sqlQuery.setResultTransformer(Transformers.aliasToBean(clazz));


String sql = "select count(*) as count,create_time as createTime from " + tableName
+ " group by create_time order by create_time desc";
return getDao().sqlList(sql, Fans.class);


public class Fans {
private Integer count;//必须定义为“BigInteger”,否则会报错(太难发现了啊)


private Date createTime;


org.hibernate.PropertyAccessException: IllegalArgumentException occurred while calling setter of cn.coderzone.admin.Fans.count
at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:128)
at org.hibernate.transform.AliasToBeanResultTransformer.transformTuple(AliasToBeanResultTransformer.java:91)
at org.hibernate.hql.HolderInstantiator.instantiate(HolderInstantiator.java:96)
at org.hibernate.loader.custom.CustomLoader.getResultList(CustomLoader.java:361)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276)
at org.hibernate.loader.Loader.list(Loader.java:2271)
at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:316)
at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1842)
at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165)
at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:157)
at cn.coderzone.admin.dao.base.BaseHqlDao.doQuery(BaseHqlDao.java:280)
at cn.coderzone.admin.dao.base.BaseDao.sqlList(BaseDao.java:23)
at cn.coderzone.admin.service.BaseService.countByDay(BaseService.java:117)
at cn.coderzone.admin.service.BaseService$$FastClassByCGLIB$$55a6ed4c.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:698)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631)
at cn.coderzone.admin.service.ArticleService$$EnhancerByCGLIB$$39dcde90.countByDay(<generated>)
at cn.coderzone.admin.test.service.ArticleServiceTest.testArticleCountByDay(ArticleServiceTest.java:33)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.IllegalArgumentException: argument type mismatch
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:66)
... 51 more





8.HQL语句无法执行更新,但是可以执行查询!!
update Article  set status=:status and updateTime=:updateTime where id=:id


Spring和Hibernate注解、事务等配置项,顺序不对,导致无法执行,但是具体为啥不对,却不知道。
又一个坑爹的问题!
  
9.在Hibernate中可以利用@DynamicInsert和@DynamicUpdate生成动态SQL语句,即在插入和修改数据的时候,语句中只包括要插入或者修改的字段。


10.为了减少代码重复率,st-grid默认按照id降序。
但是有的统计页面,根本不存在id字段,必须手动指定排序字段,“覆盖默认的”!
这种统计页面必须指定“排序字段”,挺奇怪的。
最终改为,在前端指定排序字段。


11.JavaScript写的代码,经常会遇到浏览器兼容性问题。
  还是应该用Jquery等第三方框架比较合适!


12.JQuery与JavaScript。


   a.2个相同的jquery对象,直接使用 == ,返回false。
     用attr('id')比较,比较合适。
 ul.children('li').each(function(i){
if($(this).attr('id')==id){
//这里的this应该也是JavaScript对象,使用$之后是Jquery对象
$(this).css("background-color","black");
}else{

}
});
b.区分Jquery对象和JavaScript对象
    var liList=ul.children('li');
for ( var i = 0; i < liList.length; i++) {
//导致liList[i]元素是JavaScript对象,而不是jquery对象,没有attr方法
var li = $(liList[i]);

}


13.联表查询时参数的冲突应该由前端来设置!!!(前端就和业务紧密相联)


14.64位JDK,64位Eclipse
http://aquilo.diandian.com/post/2012-05-27/21832516


15.nodejs的文件编码为GBK,导致Express接收的参数为乱码。


16.mysql的配置,charset设置为“utf8”会报错。
  nodejs中的mysql连接参数中,编码参数与 Java中的mysql不一样。
  “ charset : The charset for the connection. (Default:  'UTF8_GENERAL_CI' . Value needs to be all in upper case letters!)”
  mysqldb:{
  username:"root",
  password:"lw198962",
    database:"itfriend",
    host:"192.168.0.12",
  port:3306
  },
 
  https://github.com/felixge/node-mysql
  
17.nodejs运行过程中,不能使用SmartSVN等SVN软件进行更新,会报错。


18.有的政府网站非常坑爹,注册表单的验证码区分大小写。


19.百度加速乐真心不给力
使用之后,域名经常无法解析。
阿里云频繁发出 监控报警,1天要收到好几条短信。
“您的域名无法访问,您的域名恢复了”。
烦死了!


20.update article_category set name =:name, update_time =now() where id=:id


 错误的写法:update article_category set name =:name and update_time =now() where id=:id
 让人蛋疼的是,上面的update方法不会报错,只是没有更新成功而已
 
21.JS中,0也为false。
期待结果:如果status的值为null,或者status未定义,修改status的值。
//有问题
var data={status:0}; data.status=data.status||1;
//正确
var data={}; (data.status== null)&&(data.status=1)


22.nodejs 查询方法,至少返回{}数组,增加方法返回insertId


23.Nodejs批量插入
 insert into article_tag(name)
  values("tag"),("tag2");
  
  拼接values值
  MySQL支持,其它数据库不一定支持“非标准”SQL语法。
  
  async each
   tags =[{userId:article.userId,articleId:result.insertId,name:"tag5"}];
async.each(tags, ArticleTagDao.add, function(err){
       // if any of the saves produced an error, err would equal that error


   });
  
24.级联查询1篇文章的“评论数”、“赞数”、“踩数”
select * from
(select a.*,count(ac.article_id) as commentCount from article a left join article_comment ac
 on a.id = ac.article_id 
 where a.user_id=1
group by a.id)
A


left join 
(select a.id,count(am.type) as likeMarkCount from article a left join article_mark am on a.id = am.article_id 
where type = 1 group by a.id)
 B on A.id = B.id
 
left join
(select a.id,count(am.type) as unlikeMarkCount from article a left join article_mark am on a.id = am.article_id 
where type = 2 group by a.id)
C on C.id = A.id
limit 0,10


25.偷懒,不记住URL,总指望着复制-粘贴,QQ发送
  
26.sql-count的 indexOf(' from '),from的左右必须有1个空格。
  var fromIndex = sql.indexOf(' from ');
  var countSql = 'select count(*) as totalCount' + sql.substring(fromIndex);
  普通的sql语句
  var sql="select * from article";一定可以
  子查询sql右边,可以不要空格,为了使用Pager组件,增加空格
  var sql ="select * from(select id,title,create_time from topic) A ";
  
27.app.use(express.session({
        cookie:{
            maxAge  :  2*60*1000(2分钟,而不是20分钟,cookie的单位是毫秒)
        },
        store:redisStore,
        secret:settings.cookieSecret
    }));


28.result为[]空数组,result[0]不会报错,但是在使用result[0].password会报错
UserDao.getByEmailAndAccount(data,function(err,result){
console.log(JSON.stringify(result));
if(err) return callback(err);
callback(err,result[0]);

-------------优化工作-------
查询有必要查询的字段,而不是select * 
var finalResult=result[0] || {};(null值判断)


var db = null;
var dbConfig = settings.mongodb;
var uri = 'mongodb://' + dbConfig.host + ':' + dbConfig.port + '/' + dbConfig.database
db = mongoose.createConnection(uri,{server:{poolSize:dbConfig.poolSize}});
db.on('error',function(err){
winston.error("mongodb connection,error");
});
(使用连接池和不使用连接池,绑定事件的对象不一样,不使用连接池的方式mongoose.connection.on('error',fun)


Mongodb防火墙,导致无法远程访问


29.JS只有函数作用域,没有块作用域!!!
变量重名,容易被“覆盖”!


30.routes里,不应该直接用 字符串保存json,而是用var json={},而不是 var json="";
jquery的post“很慢”,局域网发送需要1125ms,使用自己写的JS封装的POST组件,只需要215ms。


31.立即返回结果。消息通知继续执行,不需要等待其返回。
exports.add=function(data,callback){
    MessageDao.add(data,function(err,result){
        callback && callback(err,result);
        if(err)return;
        
        var notify=[];
        //通知空间作者
        if(data.fromUserId != data.toUserId){
          var notifyUser={fromUserId:data.fromUserId,toUserId:data.toUserId,type:NotifyType.MESSAGE,resourceId:data.topId,title:data.title};
          notify.push(notifyUser);
        }
        //通知被回复的人
        if(data.refUserId && data.refUserId != -1 && data.refUserId != data.fromUserId){
           var notifyRefUser={fromUserId:data.fromUserId,toUserId:data.refUserId,type:NotifyType.MESSAGE_COMMENT,resourceId:data.topId,title:data.title};
           notify.push(notifyRefUser);
        }
        NotifyDao.batchAdd(notify);
    });
};
32.重复的get函数,下面的会覆盖上面的。


33.    //1.统计积分
    caculateScore(function(err,scoreArray){
    //new Date() == 2014-04-25 09:11:00 765512 (带上了毫秒)
         var currentTime = DateUtils.toYMDHDS(new Date());


         //2.保存新的积分
         ScoreUpdate.insertScore(scoreArray,function(err,result){
          var deleteOldScoreSql ="update user_score_grade set status =:status,delete_time = now() where create_time < :currentTime";
          var data ={status:Status.DELETED,currentTime:currentTime};
          //3.删除旧的积分
          BaseDao.queryWithTransaction(deleteOldScoreSql,data,function(err,result){
             callback&&callback(err,result);
          });
           
         });
     });


   当前时间:2014-04-25 09:11:00 765512

新插入积分的时间是:currentTime 2014-04-25 09:11:00
需要删除的积分时间:create_time 小于 currentTime

insertScore方法执行的时候,create_time应该已经大于currentTime,不会被删除。
由于insertScore的时间是 2014-04-25 09:11:00(如果带上毫秒,应该是2014-04-25 09:11:00 800)
没有毫秒,所以 2014-04-25 09:11:00 <2014-04-25 09:11:00 765


这个问题,在数据量很小,执行速度非常快的时候,会出现。

解决方法:时间格式统一,都不要毫秒。

34. 数据库id起始大小
    alter table zone AUTO_INCREMENT=100001;


35. Bootstrap的Modal对话框组件,与form一起使用的时候,按Enter会导致页面刷新,Bug!


36. 互动百科PHP兼容性
http://kaiyuan.hudong.com/bbs/viewthread.php?tid=116485&extra=&page=1


controlindex.php文件的开头,找到类似的代码,修改对应的代码为描红部分,即:
将$this->base( & $get, &$post);  修改为$this->base(  $get,$post);


37.延迟初始化和初始化此次,节省时间!
JavaWeb开发,Spring框架,默认是@Service和@Repository默认都是单例并且立即初始化。
但是我发现构造函数执行了2次。
根据我的理解,如果ArticleService不使用接口的方式,那么需要CGLIB的库,生成1个增强的类。
因此,执行2次。


如果有接口ArticleService implements IArticleService;
@Autowired
private IArticleService articleService;


没有接口
@Autowired
private ArticleService articleService;




@Service
@Lazy(true)
public class ArticleService {}
使用@Lazy(true)可以延迟初始化1个类。


Java程序,尤其是Spring最麻烦的地方是,系统启动时间实在是太长了,Tomcat部署初始化之类的过程,至少要10s。
平均在20s。
而node.js只需要2s。


延迟初始化的坏处是,系统启动的时候,有的错误不能及时发现。




Dao无论是否延迟初始化,都初始化了1次,难道是Dao,无论是否使用接口,都不需要使用CGLIB增强。


如果所有的Service都使用了延迟初始化,Dao不设置,那么使用@Repository标记的Dao,还是会初始化,
除非也使用@Lazy(true)标记。




Service和Dao全部使用延迟初始化后,发现启动时间减小了不到1s,唉,大部分时间还是花在了部署上了。
还是去掉@Lazy(true),只当是研究1个问题了。


38. JQuery根据元素的class选择至少有2种方法
$("div.page-node").remove();
$("div[class='page-node show']").remove();

<div class="page-node show"></div>
使用div[class='page-node show'],必须是“全等”,如果只是class='page-node',是选择不到的。

39. Mysql备份。
  以前,使用Windows系统,每次更换数据库,都是mysqldump数据库成sql文件备份,
  现在其实有更好的方法,把Mysql的数据目录,迁移到D盘,下次更换数据库,只需要更换mysql数据库的datadir配置就好了。


40.Spring中的一些提醒
  私有方法,没有执行sql语句,事务没有起作用。
  下面这篇总结很好。
  参考资料:http://hi.baidu.com/coolwork/item/593855c6131a0bcf994aa0ff
  
41.Mysql无法启动或者经常挂。
阿里云服务器512MB内存(为了省钱,内存很低)
默认情况下,mysql的max_connections是150,导致需要的内存非常高。
当mysql占居内存达到80%左右的时候,会被操作系统kill。
下面是个好网站:http://www.mysqlcalculator.com/
计算mysql需要使用多少内存,真是先进呀


42.X-UA-Compatible
http://www.cnblogs.com/nidilzhang/archive/2010/01/09/1642887.html


43.textarea设置值
<textarea id="remark" style="100%" placeholder="写几句,介绍下自己吧"  maxlength="250"><%= user.remark != null?user.remark:''%></textarea>
textarea没有value属性
Eclipse下编辑有警告,而Sublime没有。


44.QQ浏览器下-上传头像,会出现下载对话框
返回数据不能用JSON。
res.set('Content-Type', 'text/plain');


45.目录和文件取名的不同
 Linux下,这是一个文件
 scoreTmpFile:"/var/www/scoregrade/upload/score",
 而Windows下C:/upload/score是一个目录,有个后缀就是文件了C:/upload/score.txt
 
47.
如果在启动warning: World-writable config file /home/mysql/my.cnf is ignored
 原因:my.cnf的读取权限进行了设置,不允许World-writable(字面意思是全世界都可读写)
 解决方法:
 sudo chmod 644 /home/mysql/my.cnf
 参考资料:http://www.cnblogs.com/ylan2009/archive/2012/02/25/2368027.html
 
48.Ubuntu下彻底卸载mysql 
sudo apt-get autoremove --purge mysql-server-5.0
sudo apt-get remove mysql-server
sudo apt-get autoremove mysql-server
sudo apt-get remove mysql-common (非常重要)


49.
又拍云配置图片白名单:www.itfriend.cn会导致不带www访问,itfriend.cn的图片无法打开,403forbidden。


50.网上下载的Placeholder插件不给力。


/*;(function($) {
  $.fn.extend({
    placeholder: function() {
      if ('placeholder' in document.createElement('input')) {
        return this
      } else {
        return this.each(function() {
          var that = $(this);
          var thatPlaceholder = that.attr('placeholder');
          if(thatPlaceholder){
            that.val(thatPlaceholder).focus(function() {
              if (that.val() === thatPlaceholder) {
                  if(that.attr('realType')=='password'){
                      that.attr('type','password');
                  }
                  that.val('');
              }
            }).blur(function() {
              if (that.val().length === 0) {
                  that.val(thatPlaceholder);
                 if(that.attr('realType')=='password'){
                      that.attr('type','text');
                  }
              }
            });
            if(that.attr('type') == 'password'){
               that.attr('type','text');
               that.attr('realType','password');
            }
          }
        })
      }
    }
  })
})(jQuery);
$("input[type=text]").placeholder();
$("input[type=password]").placeholder();
$("textarea").placeholder();*/


下面这个还不错,问题也是有的,我们进行了定制和修复。
http://www.ifrans.cn/placehoder/




51.修改头像失败
Z.getXiuXiuUploadUrl = function(){
var url= "http://localhost/data/user/modifyImg";
//一定要带www
//path = "http://www.itfriend.cn/data/user/modifyImg";
return url;
};


错误症状:如果域名中,带有www,QQ浏览器可以修改头像,chrome失败;
不带www,QQ和chrome都成功。

最终诊断出原因:"http://www.itfriend.cn/data/user/modifyImg";这个url如果不带www,
就有可能不能修改头像,出现403之类的错误。
这个可能和浏览器也存在一定的关系。


解决方案就是,这个url一定带上www,无论url的访问路径是否带了www。

52.图片无法访问。
http://www.itfriend.cn/user/fansunion/photo


fansunion小写,访问不到又拍云的图片。


FansUnion大写才行。
hname应该使用数据库中保存的user.name,而不是从url参数中解析出来的name。


53.展示html的需要xss,
展示纯文本的需要转义。




54.ueditor修改编辑器的默认字体大小
//ueditor.all.js 6708行
     //设置默认字体和字号
//font-family不能呢随便改,在safari下fillchar会有解析问题
'body{margin:8px;font-family:sans-serif;font-size:14px;}' +

55.为防止xss攻击,对html内容进行了处理。
  结果,把某个合法的内容给过滤了。
  
56.查看自己的积分排名。
转化下:有多少个人的分数大于等于自己的分数,就是自己的排名。
select name,nickname,image,total_score,(
select count(*) from user_score_grade where total_score>= (select total_score from user_score_grade where user_id = 16 and status=0 order by total_score desc limit 1)
 and status=0) as rank 
from user_score_grade usg
left join user u on u.id = usg.user_id
where user_id = 16 and status =0;


57.nodejs中"__dirname"是当前文件所在的目录。
exports.croosdomain = function(req, res, next) {
res.sendfile(__dirname+'/crossdomain.xml');
};


上传图片需要配置跨域文件。


58.部署方式:源程序A,复制一份为B,覆盖B程序,把B作为A,减少系统“停机”时间。
(这种,会不会出现不一致的情况,在A运行的时候,产生了新的内容)


59.百度Social_uid值很大,int11位不够存储,改为bigint40。


60.发一份邮件,打印以下,至少知道哪些发送成功了。
emailSender.sendEmail(l, subject, content);
System.out.println("mail:"+mail);
需要捕捉异常。

61.
  var sql="select u.id,name,image,email,remark,nickname,industry,company,career,school,major,degree_id,sex,usg.grade_num from user u "+
    " left join user_score_grade usg on (usg.user_id=u.id and usg.status=:status) "+
    " where u.id =:userId ";

 var sql="select u.id,name,image,email,remark,nickname,industry,company,career,school,major,degree_id,sex,usg.grade_num from user u "+
    " left join user_score_grade usg on (usg.user_id=u.id ) "+
    " where u.id =:userId and usg.status=:status";

“and usg.status=:status”放在 on后面和where后面,效果是不一样的。
如果在where后面,如果usg没有这个用户,会找不到结果

62.停用百度跟踪,注重个人隐私
http://www.baidu.com/duty/safe_control.html


63.!important声明的样式优先级最高,如果冲突再进行计算。font-size:20px !important; 
原文地址:https://www.cnblogs.com/qitian1/p/6463190.html