Rsync服务器架设 - 一树清劲 - 51CTO技术博客
[root@sqing25 ~]# vi /etc/rsyncd.conf
内容如下:
uid = root
gid = root
use chroot = no
strict modes = yes
address = 10.8.5.25 //指定本机IP地址,可以不设
port = 873 //指定rsync服务端口,默认是873
max connections = 10 //最大连接数
pid file = /var/run/rsyncd.pid //告诉进程,写到/var/run/rsyncd.pid中
motd file=/etc/rsyncd.motd //服务器信息文件,需算自行创建,可不设
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
[home] //模块名称,即同步或备份的目录,客户端用这个关键字连接
path=/home //指定文件目录所在位置
comment = this is a test
ignore errors //忽略IO错误
read only = yes //只读,不让客户端上传文件到服务器端
list = no
auth users = root //登录用户,必须是服务器上存在的真实用户,多个用户用逗号隔开
secrets file = /etc/rsyncd.pas //密码文件,需自行创建
hosts allow = 10.8.5.24 //允许访问的客户端
hosts deny=* //禁止访问的客户端
2、rsyncd.pas
新建并编辑rsyncd.pas文件,用于存放登录用户的登录密码,文件的属性需是属主可读,为安全起见,一般不把系统用户的密码写在这里,而是另外设置密码。密码格式为“用户名:密码”,其中用户是rsyncd.conf中的auth users指定的用户,若是多个用户,要在多行中输入“用户名:密码”。
[root@sqing25 ~]# vi /etc/rsyncd.pas
内容如下:
root:123456
[root@sqing25 ~]# chmod 600 /etc/rsyncd.pas
将其权限修改为600,这一步很重要,要是不修改,客户端尝试连接时会出现类似如下的报错:
@ERROR: auth failed on module home
rsync error: error starting client-server protocol (code 5) at main.c(1296) [receiver=2.6.8]
nginx做反向代理proxy_pass,proxy_redirect的使用 - Snooda - Snooda's Blog
今天用nginx作为trac的反代,发现一个问题,就是登入登出跳转的时候是白页,看了下网页相应内容,发现相应的location是空的。查了一下发现是只单纯用了proxy_pass,没有使用proxy_redirect.
假设前端url是example.com。后端server域名是in.com,那么后端server在返回refresh或location的时候,host为in.com,显然这个信息直接返回给客户端是不行的,需要nginx做转换,这时可以设置:
proxy_redirect http://in.com /
nginx会将host及port部分替换成自身的server_name及listen port。不过这种配置对server_name有多个值的情况下支持不好。
我们可以用nginx内部变量来解决这一问题:
proxy_redirect http://in.com http://$host:$server_port
如果nginx的监听端口不是默认的80端口,改为其他端口如81端口。
后端服务器中request.getServerPort()无法获得正确的端口,返回的仍然是80;
在response.sendRedirect()时,客户端可能无法获得正确的重定向url。
正确的配置方法为
在 $host之后加上端口号,如$host:81
server {
listen 83;
server_name localhost;
location / {
proxy_pass http://147.16.24.175:9500 ;
proxy_set_header Host $host:83;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Via "nginx";
}
}
weblogic性能调优 - rznice的专栏 - 博客频道 - CSDN.NET
注:在下面做的介绍都是以Weblogic8.1为例的,其它版本的Weblogic可能会有些许不同。
1) 设置JAVA参数;
a) 编辑Weblogic Server启动脚本文件;
BEA_HOME\user_projects\domains\domain-name\startWebLogic.cmd(startWebLogic.sh on Unix)
BEA_HOME\user_projects\domains\domain-name\startManagedWebLogic.cmd(startManagedWebLogic.sh on Unix) --这个是做集群的时候用的
b) 编辑set JAVA_OPTIONS命令,如:set JAVA_OPTIONS=-Xms256m CXmx256m;
(在UNIX下把MEM_ARGS="-Xms1024m -Xmx1024m -Xmn128m"加到上述两个.sh文件中即可)
c) 保存,重启即可。
注:在WebLogic中,为了获得更好的性能,BEA公司推荐最小Java堆等于最大Java堆。
(这个偶们的设置都是1024M的,反正偶们内存大大的4G呢)
2) 开发模式 vs. 产品模式;
开发模式和产品模式的一些参数的默认值不同,可能会对性能造成影响,下面是对性能有影响的参数列表:
参数 开发模式默认值 产品模式默认值
Execute Queue: Thread Count 15 threads 25 threads
JDBC Connection Pool: MaxCapacity 15 connnections 25 connections
通过启动管理控制台,在域(如:mydomain)> 配置 > 常规选择产品模式。
(这个在创建weblogic的domain的时候是有选择的,选择“产品”模式就可以了,如果后期需要修改,可以按照上面的方法修改)
3) 尽量开启本地I/O;
通过启动管理控制台,在域(如:mydomain)> 服务器 > server实例(如:myserver)> 配置 > 调整选择启用本地I/O。
注:此值也可通过手动的修改config.xml配置文件。
(这个没有试验过,不晓得有什么效果和好处,知道的告诉偶下下。)
4) 调优执行队列线程;
a) 修改默认执行线程数
在这里,执行队列的线程数表示执行队列能够同时执行的操作的数量。但此值不是设的越大越好,应该恰到好处的去设置它,太小了,执行队列中将会积累很多待处理的任务,太大了,则会消耗大量的系统资源从而影响整体的性能。在产品模式下默认为25个执行线程。
(点:一般来说,其上限是每个CPU对应50个线程,其按照CPU个数线性增长.)
为了设置理想的执行队列的线程数,我们可以启动管理控制台,在域(如:mydomain)> 服务器 > server实例(如:myserver)> 监视 > 性能中监控最大负载时执行队列的吞吐量和队列中的等待请求数,据此确定理想的数值。
理想的默认执行线程数是由多方面的因素决定的,比如机器CPU性能、总体体系架构、I/O、操作系统的进程调度机制、JVM的线程调度机制。随着CPU个数的增加,WebLogic可以近乎线性地提高线程数。线程数越多,花费在线程切换的时间也就越多;线程数越小,CPU可能无法得到充分的利用。为获取一个理想的线程数,需要经过反复的测试。在测试中,可以以25*CPU个数为基准进行调整。当空闲线程较少,CPU利用率较低时,可以适当增加线程数的大小(每五个递增)。对于PC Server和Windows 2000,则最好每个CPU小于50个线程,以CPU利用率为90%左右为最佳。
通过启动管理控制台,在域(如:mydomain)> 服务器 > server实例(如:myserver)> Execute Queue > weblogic.kernel.Defalt > 配置中修改线程计数。
b) 设定执行队列的溢出条件;
Weblogic Server提供给默认的执行队列或用户自定义的执行队列自定义溢出条件的功能,当满足此溢出条件时,服务器改变其状态为“警告”状态,并且额外的再分配一些线程去处理在队列中的请求,而达到降低队列长度的目的。
通过启动管理控制台,在域(如:mydomain)> 服务器 > server实例(如:myserver)> Execute Queue > weblogic.kernel.Defalt > 配置下面几项:
●队列长度:此值表示执行队列中可容纳的最大请求数,默认值是65536,最后不要手动改变此值。
●队列长度阈值百分比:此值表示溢出条件,在此服务器指出队列溢出之前可以达到的队列长度大小的百分比。
●线程数增加:当检测到溢出条件时,将增加到执行队列中的线程数量。如果CPU和内存不是足够的高,尽量不要改变默认值“0”。因为Weblogic一旦增加后不会自动缩减,虽然最终可能确实起到了降低请求的作用,但在将来的运行中将影响程序的性能。
●最大线程数:为了防止创建过多的线程数量,可以通过设定最大的线程数进行控制。
在实际的应用场景中,应根据具体情况适当的调整以上参数。
c) 设定执行队列监测行为
Weblogic Server能够自动监测到当一个执行线程变为“阻塞”。变为“阻塞”状态的执行线程将无法完成当前的工作,也无法再执行新请求。如果执行队列中的所有执行线程都变为“阻塞”状态,Weblogic server可能改变状态为“警告”或“严重”状态。如果Weblogic server变为“严重”状态,可以通过Node Manager来自动关闭此服务器并重新启动它。具体请参考:Node Manager Capabilities文档。
通过启动管理控制台,在域(如:mydomain)> 服务器 > server实例(如:myserver)>配置 > 调整下可配置下面几项:
●阻塞线程最长时间:在此服务器将线程诊断为阻塞线程之前,线程必须连续工作的时间长度(秒)。默认情况下,WebLogic Server 认为线程在连续工作 600 秒后成为阻塞线程。
●阻塞线程计时器间隔:WebLogic Server 定期扫描线程以查看它们是否已经连续工作了 "阻塞线程最长时间" 字段中指定的时间长度的间隔时间(秒)。默认情况下,WebLogic Server 将此时间间隔设置为 600 秒。
5) 调优TCP连接缓存数;
WebLogic Server用Accept Backlog参数规定服务器向操作系统请求的队列大小,默认值为50。当系统重载负荷时,这个值可能过小,日志中报Connection Refused,导致有效连接请求遭到拒绝,此时可以提高Accept Backlog 25%直到连接拒绝错误消失。对于Portal类型的应用,默认值往往是不够的。
Login Timeout和SSL Login Timeout参数表示普通连接和SSL连接的超时时间,如果客户连接被服务器中断或者SSL容量大,可以尝试增加该值。
通过启动管理控制台,在域(如:mydomain)> 服务器 > server实例(如:myserver)>配置 > 调整下可配置“接受预备连接”。
6) 改变Java编译器;
标准的Java编译器是javac,但编译JSP servlets速度太慢,为了提高编译速度,可以使用sj或jikes编译器取代javac编译器。下面说说更改Java编译器:
通过启动管理控制台,在域(如:mydomain)> 服务器 > server实例(如:myserver)>配置 > 常规下改变Java 编译器,默认为javac。输入完整路径,如:c:\visualcafe31\bin\sj.exe。然后打开高级选项,在预规划到类路径填写编译 Java 代码时为 Java 编译器类路径预规划的选项,如:BEA_HOME\jdk141_02\jre\lib\rt.jar。
7) 使用Webogic Server集群提高性能;
具体关于如何配置Weblogic集群,我就不细说了。详情可参考:Introduction to WebLogic Server Clustering。
8) Weblogic EJB调优
由于EJB2.0已经很少项目在用了,EJB3.0再成熟一点,我再补充这一部分吧!
9) JDBC应用调优
JDBC Connection Pool的调优受制于WebLogic Server线程数的设置和数据库进程数,游标的大小。通常我们在一个线程中使用一个连接,所以连接数并不是越多越好,为避免两边的资源消耗,建议设置连接池的最大值等于或者略小于线程数。同时为了减少新建连接的开销,将最小值和最大值设为一致。
增加Statement Cache Size对于大量使用PreparedStatement对象的应用程序很有帮助,WebLogic能够为每一个连接缓存这些对象,此值默认为10。在保证数据库游标大小足够的前提下,可以根据需要提高Statement Cache Size。比如当你设置连接数为25,Cache Size为10时,数据库可能需要打开25*10=250个游标。不幸的是,当遇到与PreparedStatement Cache有关的应用程序错误时,你需要将Cache Size设置为0。
尽管JDBC Connection Pool提供了很多高级参数,在开发模式下比较有用,但大部分在生产环境下不需调整。这里建议最好不要设置测试表, 同时Test Reserved Connections和Test Released Connections也无需勾上。 当然如果你的数据库不稳定,时断时续,你就可能需要上述的参数打开。
最后提一下驱动程序类型的选择,以Oracle为例,Oracle提供thin驱动和oci驱动,从性能上来讲,oci驱动强于thin驱动,特别是大数据量的操作。但在简单的数据库操作中,性能相差不大,随着thin驱动的不断改进,这一弱势将得到弥补。而thin驱动的移植性明显强于oci驱动。所以在通常情况下建议使用thin驱动。而最新驱动器由于WebLogic server/bin目录下的类包可能不是最新的,请以Oracle网站为准: http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/jdbc9201.html。
10) JSP调优
设置jsp-param pageCheckSeconds=-1;
设置serlet-reload-check=-1或ServletReloadCheckSecs=-1;
设置jsp-param precompile=true,关闭JSP预编译选项。
Tags: weblogic, java, 性能调优
一个牛人给出的参考:
系统的线程池配置考虑以下因素:
1, 机器的计算能力;
2, 子系统每个线程的计算复杂性;
3, 整个系统的均衡性。
因此,建议设定一个标准范围,例如(举例说明,具体数值根据情况斟酌):
机型:DL380G4/2*3G/4G,线程池大小范围:80-120(无特殊情况一般设为100);
机型:DL380G5/2*2G/4G,线程池大小范围:100-120(无特殊情况一般设为110);
机型:BL460C/2*3G/4G,线程池大小范围:100-120(无特殊情况一般设为110);
Post by iceskysl on 2007, September 18, 11:50 AM #1
系统文件描述符数目不足
Log中有“too many open files”的错误
表示达到了系统对一个进程能同时打开的文件数的限制
ulimit Ca CH 可以查看当前限制
ulimit Cn number可以来更改当前环境的设置,建议至少设到4096
Solaris上可以通过/usr/proc/bin/pfiles pid来查看指定进程的限制和当前使用的file descriptor数目
Solaris上root用户可以通过/usr/proc/bin/plimit -n soft,hard pid 来动态更改进程的文件描述符的限制
Post by iceskysl on 2007, September 18, 11:55 AM #2
系统内存不足
JVM的heap区大小
通过java命令行中的-Xms,-Xmx指定,建议最小值和最大值设成一样
可以通过weblogic console上server/monitor/performance来观察其使用情况
建议生产系统最少256M,一般情况下可以设置为系统剩余物理内存的80%
Post by iceskysl on 2007, September 18, 11:57 AM #3
failureException: Error initializing Embedded LDAP Server - with nested exception: [java.lang.ClassCastException] java.lang.ClassCastException at weblogic.ldap.EmbeddedLDAP.initialize(EmbeddedLDAP.java:266)
改权限chown -R weblogic.weblogic /home/webogic
Post by iceskysl on 2007, September 18, 4:37 PM #4
修改文件句柄数:
1、修改/etc/security/limits.conf,需要root权限
vi /etc/security/limits.conf
# 确认包含下面的内容:
* soft nofile 8192
* hard nofile 8192
修改后,su到目标用户,用ulimit CHn和ulimit CSn确认修改已生效
2、修改startManagedWebLogic.sh,找到resetFD那行,注释掉。然后在脚本最后启动JAVA进程的前面加上下面的内容,检查系统文件句柄数是否修改:
echo
echo "-----------------------------------------------"
echo "Begin to check the file descriptor limit"
fd=`ulimit -n`
if [ $fd -lt 8192 ];
then
echo "Fatal Error!"
echo "The file descriptor limit is only '"$fd"'!"
echo "Please make it more than 8192!"
exit
fi
echo "OK, the file descriptor limit is" $fd
echo "-----------------------------------------------"
echo
echo
Post by iceskysl on 2007, September 18, 5:26 PM #5
查看文件句柄数:
/usr/sbin/lsof -n|awk '{print $2}'|sort|uniq -c |sort -nr|more
Post by iceskysl on 2007, September 20, 10:53 AM #6
我遇到的weblogic运行600秒超时主要有两个原因:
1)SQL语句运行时线程阻塞
2)out.println语句运行时线程阻塞
第一种问题的解决办法,编写一个java桌面应用,测试运行的SQL语句是否可以正常运行,并返还正确结果。若无法正常运行,就需要通过视图或其他的方式调整和优化SQL语句。
这里需要注意:数据库的不同版本可能需要相应版本的数据库驱动。SQL语句不能正常运行,通常都是由驱动引起的。
第二种情况的解决办法,weblogic或其他的中间件产品,服务端大多都会使用缓冲发送数据机制,当数据量大的时候会分批发送出去,若数据中出现过多的回车(\n或直接的回车)就会有一定的几率出线线程阻塞的情况,解决办法就是消除回车符,尽量使输出的数据是连续的字符流。
Post by iceskysl on 2007, September 22, 9:39 PM #7
分析线程堆栈:
http://bbs.sinoweb.com.cn/archiver/tid-405.html
Post by iceskysl on 2007, September 23, 2:13 AM #8
http://www.cntesting.com/portal/html/testing-technique/load-test/20070509/178.html
Post by iceskysl on 2007, September 23, 2:25 AM #9
最近生产环境下的系统经常出现以下的错误提示,
####<2007-7-2 下午04时07分20秒 CST> <Error> <WebLogicServer> <gis> <portalServer> <weblogic.health.CoreHealthMonitor> <<WLS Kernel>> <> <BEA-000337> <ExecuteThread: '5' for queue: 'default' has been busy for "1,165" seconds working on the request "Http Request: /tzzmWeb/saye/regie/census/customertoMtn/custcheckout.do", which is more than the configured time (StuckThreadMaxTime) of "600" seconds.>
该问题是由于处理custcheckout.do请求超时引起的,系统配置的处理时间是600s,但是该线程处理了1165s后,仍然没将请求释放,所以报了这个错误。如果发送该请求较多,很有可能会导致weblogic的线程阻塞,严重会引起weblogic挂起现象。
可以通过以下几种方法解决:
1)修改StuckThreadMaxTime参数,将默认的600s改成1200s,或者其它适合的值。
2)增大线程数,防止线程阻塞问题。
3)优化程序,减少处理时间。
如何修改weblogic默认线程池大小?
weblogic 9开始使用了线程自调优技术。通过以下方法设置,可以指定默认线程的最大最小值。
方法一:修改启动脚本参数
在启动脚本中,增加如下参数
%JAVA_HOME%\bin\java %JAVA_VM% %MEM_ARGS% %JAVA_OPTIONS%
-Dweblogic.Name=%SERVER_NAME% -Djava.security.policy=%WL_HOME%\server\lib\weblogic.policy
-Dweblogic.threadpool.MinPoolSize=100 -Dweblogic.threadpool.MaxPoolSize=500
%PROXY_SETTINGS% %SERVER_CLASS%
方法二:修改config.xml
在config.xml中,增加如下参数
<server>
<name>AdminServer</name>
<self-tuning-thread-pool-size-min>100</self-tuning-thread-pool-size-min>
<self-tuning-thread-pool-size-max>500</self-tuning-thread-pool-size-max>
<listen-port>7923</listen-port>
<listen-address></listen-address>
</server>
经过测试,以上两种方法适合weblogic9,10,11g
如何在一周内摸清一个行业?
在和咨询、投行、投资、猎头这些行业的人聊天的时候,我反复听到“一周”这个时间,于是我也开始好奇:你们是在什么情况下需要在一个星期之内了解一个行业?你们都是如何做到在一个星期之内摸清一个行业的?
在一周之内“摸清”一个行业依然不可能成为这个行业的顶尖专家,也不可能成为这个行业的一个高管。但是,你能了解一个行业的全局,现今状况、过去、未来一段时间内可能的发展趋势,熟悉那个行业的行话,拿捏这个行业的基本信息。
这有什么用?
你能和那个行业内的人自如对话,你能站在局外人的角度结合你自己的知识和经验看到新的机遇,你能在你的客户面前让他刮目相看,你还能拿到一份好工作,了解你的上司在做决策的时候会考虑什么...
所以我们微信公共账号“改变自己”邀请了三个嘉宾来和我们说,他们是如何做到在一周之内摸清一个行业的。
—————————— 第一期 咨询公司的人如何在一周内摸清一个行业——————————
有一个咨询公司的创始人招聘员工时,布置了这样一份任务——一周之内给我一份某一个行业的报告。来投简历并写报告书的不乏国内外名校的学生,可是他失望的发现没有一个应聘者达标了,他收到的那些报告书都没有一个亮点。
一个星期之内如何摸清一个行业的情况呢?让他来和我们说说吧。
一默是恒嘉智略咨询有限公司的创始人,《销售无处不在》的作者。
他说:
“了解一个行业”这件事本身不太可能快速完成。不过,如果我们只是想摸清楚最基本的情况,我们可以通过问对几个关键问题着手。这些关键问题围绕着一个根本问题:这个行业的链条是如何运转起来的?
1 这个行业的存在是因为它提供了什么价值?
2 这个行业从源头到终点都有哪些环节?
3 这个行业的终端产品售价都由谁分享?
4 每个环节凭借什么关键因素,创造了什么价值获得他所应得的利益?
5 谁掌握产业链的定价权?
6 这个行业的市场集中度如何?
而信息获取的渠道,则包括:
1 金融投资机构的行业报告;
2 咨询公司的分析报告;
3 行业交流网站或论坛的热门帖子;
4 业内企业的培训课件;
5 参加行业展会或者论坛;
6 从业者的私下交流。
其中1-4,都可以通过网络搜索获得。
——————————第二期 IT咨询公司的人如何在一周之内摸清一个行业——————————
有一个IT界的小牛,在IT咨询公司工作。
我问他:“做咨询是不是经常要在短时间内摸清一个行业啊?”
他说:“是啊。”
“要多久?”
“一个星期吧。”
“哈哈,一个星期就可以?能打败那个行业的多少人? ”
"90%吧。"
他就是我们今天的嘉宾,熊节。他在IT咨询公司ThoughtWorks已经工作8年了,也是《重构》的译者,看看他的经验之谈吧:
五天之内,三步读懂一个行业
作为职业咨询师,在很短时间内熟悉一个行业,是我经常要面对的工作内容,我也很愿意分享自己的心得。根据我的经验,对于掌握了基本商业知识的咨询师而言,一个星期之内熟悉一个之前陌生的行业并非难事。当然一个星期不会让一个新鲜人成为行业专家,但是足以让一名咨询师在这个行业里顺利开展工作。
这有限的五个工作日,必须高效地利用。我的建议是分三步走:首先,确保自己不会乱开黄腔;其次,让自己进入这个行业的对话;第三,争取提出令人眼前一亮的观点。
* 第一步:首先不要开黄腔
进入一个新的行业,首先应该了解这个行业里的领导企业——很可能正是你马上需要去服务的企业。了解一个领导企业最直接的方式,就是读它的财务报表。上市企业的财务报表都是公开的,并且通常会附上很有用的董事长致投资者函。阅读一份财报,就可以了解很多基本的信息:这家企业的所有权性质、主要业务、主要客户、收入结构、成本结构、员工规模、人才结构、战略方向、主要风险……即便你真正想了解的企业是非上市企业(比如华为),它也必定与其最主要的竞争对手(比如中兴)有很多相似之处。所以阅读财报可以让你对这个行业里的主要玩家有一个基本的了解,不至于提一些太离谱的问题或者建议。
如何阅读财务报表,一个比较常用的分析方法是杜邦分析法。我有一篇文章介绍过如何用杜邦分析法来解读一家知名上市企业(中兴通讯)的财务报表和企业经营状况,(文章见此)在我做了这个练习一年后,中兴通讯2012年中期财报报出巨亏,利润率持续走低正是导致该企业及其几家主要竞争对手从2012年起开始大幅裁员的直接原因之一。
花一天时间读完一两家企业的财报之后,接着就得下点死工夫,读一本这个行业的综述性书籍,例如对于保险行业我推荐《风险管理与保险》。读这样一本书的目的,第一是更深入地理解这个行业的商业模式和惯例,比如你得知道财产险和寿险存在一些根本性的差异所以它们的经营也会很不同;第二是掌握一些行业里的“黑话”,比如当你听到“承保”、“核保”时你得知道这都是指什么。我个人而言,读这本书是用业余时间,加起来用了8小时左右。
* 第二步:进入行业对话
做到了不开黄腔也还不足以跟行业里的CxO们展开对话,因为大家平时不会谈论那些最基本的东西。要进入一个行业的对话,你得了解这个行业当下的趋势。有些人会推荐跟行业里的朋友去聊天。但作为一个时间紧迫的内向型人,我个人更愿意以研究材料为主,与朋友聊天为辅。
行业趋势的最佳来源是麦肯锡之类管理咨询公司做的行业分析。我个人尤其推荐麦肯锡季刊(McKinsey Quarterly,http://www.mckinseyquarterly.com)发布的研究报告,以及经济学人(The Economist,http://www.economist.com/)的行业分析。从这两个网站搜出最近五年所有与你关注的行业相关的文章,花一到两天时间全部通读一遍,你应该就能把握住这个行业的脉搏。
在中国市场上工作,我们会担心来自麦肯锡和经济学人的分析不够“中国特色”。我的经验是,一方面可以适当补充一些本土内容;另一方面,中国各行各业的发展基本上与世界先进水平保持3~5年的差距,也就是说欧美发达国家在三五年前发生过的应该就是中国当前正在发生的,欧美发达国家一两年前发生过的应该会在一两年后在中国发生。比起“中国特色”,很多时候简单的市场规律和时间差更有效。
与此同时,在这整个一周时间里,你要让自己浸泡到这个行业的上下文中。办法很简单:订阅一堆与这个行业、与你想要针对的目标企业直接相关的新闻RSS,把其他的RSS频道都暂时屏蔽,在地铁上、咖啡馆里、床头上、马桶上……所有的空闲时间都用来看这个行业、这家企业最近发生了什么。比如我在关注澳洲保险行业的阶段,就订阅了Google News的“australia insurance”关键字和我客户公司的名字,客户公司出什么重大理赔案或是高层人事变动,我能比客户的大多数员工还先知道消息,于是就有了很多可以谈论的话题。
* 第三步:以我为主,提出观点
开始这个连载的时候彭萦讲了一个故事,说某咨询公司的创始人要应聘者一周内给出一份行业报告,但回头他发现这些名校毕业生做的报告都没有一个亮点。且不论这个故事是真是假,在我看来,“没有亮点”的症结恐怕就在于应聘者是“毕业生”:虽然是研究另一个行业,其实“亮点”的关键不在对那个行业研究得多好,而在研究者自身的专业技能。所谓“功夫在诗外”,就是这个道理。
举个例子来说。如果你看麦肯锡去年所做的中国寿险行业分析,首先你会发现它遵循了前面说的两步:数据详实,术语准确,而且把握住了行业脉搏。但它的亮点在于它指出了中国寿险行业的几大痛点,并且从战略和管理的角度提出了对应的解决方案。归根到底这才是行业里的CxO们期望你作为一个专业人士拿出来的东西,也是你之所以要去快速了解这个行业的根本目的:快速了解一个行业不是为了显示自己的学习能力,而是为了使自己的专业技能在这个行业中得到运用。
所以关键在于把你自己的专业、技能、知识、经验和这个行业的情况相结合,提出一点别人没有提过的东西。
所以,在做了前两步功课之后,你至少应该给自己留出一整天的时间来回答这样三个问题:
1. 这个行业所面临的痛点有哪些?
2. 哪些痛点对于业内人士是最紧迫的?
3. 如何把自己的专业技能与这些痛点结合起来?
其中前两个问题的答案应该是相对客观的。也就是说,你大可以把麦肯锡的寿险行业分析打印出来,扔掉最后的“解决方案”部分,然后结合自己的专业领域,来尝试给它所列举的几大痛点寻找解决方案。如何用IT手段改善寿险销售?寿险行业需要何种人力资源战略?甚至何种MBTI人格更适合从事高水平的寿险服务?凡此种种不一而足。提出观点这部分,就是专业人士站在自己专业领域的命题作文,能不能讲出亮点,第一靠快速理解目标行业的小聪明,最重要的还是看在自己专业领域里的造诣。
——————————第三期 一个猎头来和我们说如何在一周之内摸清一个行业——————————
今天我们请来了一个猎头来和我们说说这个话题。 Chris给自己的介绍是——混迹于职场,狩猎于城市。城市猎头人。
听听他为什么要在一个星期之内摸清一个行业吧:
在动手写这篇文章之前,我从未如此定量地思考过这个问题,现在回想起猎头工作中的很多Case,其实都做到了一周内摸清一个行业。
在阐述如何做到这一点之前,我先要作个说明:每个行业都包含了多个维度的内容,如行业历史、现状及未来、市场容量、消费规模、与经济、政治的相互影响方式和程度、行业内企业的生存状况、行业人才的分布及动态等等,当我们需要短期内摸清某一行业时,都是基于当前工作的实际需求来进行的。因此,下文主要是从一个猎头的角度来说明如何做到一周内摸清一个行业。
猎头的工作流程一般如下:
客户提出招聘需求 —— 猎头进行职位分析 —— 确定匹配人才来源(行业/企业) —— 设定人才搜寻计划(即如何接触到目标人选) —— 评估潜在人选 —— 推荐匹配人选面试 —— ... —— 合格人选入职
通常,从猎头接到一个新的职位委托到推荐第一批匹配人选给客户所需时间为7-10天,这就要求做单的猎头顾问,在一周之内摸清一个或两三个行业,挖掘客户需要的人才并对其进行综合评价。对于今天这个话题,我们只要讨论到猎头工作的“与目标人选沟通”这一环节就可以了,其实现的整体思路和操作可简述如下:
1、圈定对应行业,或拓展至相关行业。
a. 客户提供行业基本信息,如竞争对手;
b. 咨询相关行业内朋友;
c. 通过互联网、行业杂志、产业报告等,了解行业上下游企业的产品/服务/业务模式等。
2、确定行业内TOP5或TOP10企业名单,并关注名单排序的标准,及近几年排名变化。
a. 咨询行业内朋友;
b. 参考每年的 Fortune Top 500;可适当拓展了解近3-5年排名变化情况;
c. 通过互联网、行业协会、上市公司信息披露等渠道查询企业排名(如销售额、增长率、零售终端数等),同时关注企业的战略调整、市场布局、新产品发布、收并购信息等;
d. 查阅PE/VC、证券等金融机构的行业/企业分析、案例分析、产品分析、行业预测等报告。
3、锁定所列企业组织架构中的对应岗位的目标人选,通过各种渠道接触到目标人选。
a. 联系/咨询行业/企业内的朋友,或朋友的朋友;(人脉资源)
b. 搜索猎头公司自身数据库人才资源;
c. 第三方人才库资源(如 linkedin、微博等);
d. Cold Call (陌生电话)
重点:
a. 联系到的每一个人,都详细沟通,最大限度地通过这些人挖掘其所属企业、竞争对手的具体岗位/员工/业务/产品/服务等的数据和信息;
b. 及时转化吸收所得信息,并用于此后所联系到的人,同时相互印证这些信息的准确度、可靠性。
当做到第2点的时候,其实已经可以了解到一个行业的70-80% (笔者凭经验估计)甚至更多,而大多数人可能会觉得第3 点的实现有些困难,其实情况并没有你想象得糟,因为你有很多的朋友,而你的朋友又有很多朋友,更别说“六度分割理论”带给你的无限人脉资源,只要你想挖掘,你现有的人脉资源带给你的信息就能使你在已有的70-80%的基础上增加10-20%,保守地说,这个时候你已经是这个行业的半个专家了。
举一个例子来说明。
我曾经做过一个Case,为一家国际Top 3的糖业集团寻找South China GM的人选。刚接触这个职位时,我对糖业完全是个门外汉,只知道日常生活中接触到的蔗糖、白砂糖、红糖这些概念,及各种果汁、咖啡、饼干中添加的糖之类的,对其他一概不知,更别说去挖人并评估其是否胜任了。
启动项目后,按照上述的方法。我们按照客户的要求,根据职位的任职资格,进行如下操作:
1、圈定行业
首先在网上搜索“制糖 企业”、“糖业 排名”之类的关键词,从搜索结果中了解到国内制糖企业几乎为本土民企和国企,并分为以蔗糖为主的南方和以甜菊糖为主的北方制糖企业。
其次,从“制糖 行业 分析”、“糖业 研究报告”的搜索结果中,了解到糖业在中国的产业布局、优势省份、产品特色、产业上下游产品等,了解到糖业上游的种植(甘蔗、甜叶菊的种植)、中游的制造(榨糖厂、渣料处理等)、下游的分销(食品加工企业、饮料生产商、食品添加剂公司等、现货/期货市场等)。
最后,拓展到产业上下游相关联的国际集团在华开展相应业务的公司,如国际食品集团、国际四大粮商、雀巢、百事、正大饲料等企业所属的行业。
2、确定行业内企业名单
a. 国内糖业公司:洋浦南华、广西农垦、贵糖、东亚糖业、南宁糖业、凤糖、英茂糖业等;
b. 国际四大粮商ABCD、国内的中粮;
c. 根据Fortune Top 500,根据企业产品分类,确定其中的食品制造或零售企业名单:Nestlé、Pepsi、Kraft、Coca-Cola、AB InBev、Tyson等;
3、根据企业名单摸排对应岗位的目标人选,并最大限度获取企业/行业信息,丰富前两步的内容。
因本文主要以摸清行业为目标,故第3步不再赘述。通过前1、2步的信息收集、整理、分析,加上第3步的信息细化及相互印证(亦可称之为人脉资源利用),我已经在不到一周的时间内摸清了一个行业,甚至相关行业的情况,并基于此,完成客户的委托。
以上,是一个猎头从业者分享给大家的方法。
android布局技巧:创建高效布局 - yohunl的专栏 - 博客频道 - CSDN.NET
让我们看一个非常简单且常见的布局例子:一个列表项,左边是一个图标,右边是标题和描述,上方是标题,下方是可选的描述。列表项可能看起来如下图:

为了清楚地认识View之间(一个ImageView和两个TextView)的相对位置,下图是使用HierarchyViewer抓获的布局剪影:

实现这个布局,直接使用LinearLayout就可以了。列表项本身是一个水平的LinearLayout,里面有一个ImageView和一个垂直的LinearLayout,垂直的LinearLayout里包含两个TextView。以下是这个布局的源代码:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:padding="6dip">
<ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_marginRight="6dip"
android:src="@drawable/icon" />
<LinearLayout
android:orientation="vertical"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="fill_parent">
<TextView
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:gravity="center_vertical"
android:text="My Application" />
<TextView
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:singleLine="true"
android:ellipsize="marquee"
android:text="Simple application that shows how to use RelativeLayout" />
</LinearLayout>
</LinearLayout>
如果你将它作为ListView的item,它能正常工作,但却是相当浪费的。相同的布局可以使用RelativeLayout进行重写,相对于每个列表项来说,可以节省一个View,且View层级上更好,只有一层。使用RelativeLayout也很简单:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:padding="6dip">
<ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_alignParentTop="true"
android:layout_alignParentBottom="true"
android:layout_marginRight="6dip"
android:src="@drawable/icon" />
<TextView
android:id="@+id/secondLine"
android:layout_width="fill_parent"
android:layout_height="26dip"
android:layout_toRightOf="@id/icon"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:singleLine="true"
android:ellipsize="marquee"
android:text="Simple application that shows how to use RelativeLayout" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/icon"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_above="@id/secondLine"
android:layout_alignWithParentIfMissing="true"
android:gravity="center_vertical"
android:text="My Application" />
</RelativeLayout>
谈谈android 布局 的优化 - youxiachai - 博客园
案例一:做一个带箭头的返回按钮
经理:那个小与啊,你根据这设计图搞一个按钮
小与:这还不简单三分钟搞定
于是小于程序猿,敲下了如下代码
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center" >
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/btn_headtita"
android:textColor="#ffffff"
android:text="@string/back" />
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:src="@drawable/header_back" />
</RelativeLayout>
看代码多累啊,我们用刚刚介绍的hierarchyviewer来分析一下,这个按钮有什么问题!
我们从这个图中,我们可以看到,为了这么一个按钮我们用了view的三个节点去完成!假设,我们的一个view 有三个类似的按钮就意味着我们要用9个节点去完成,我们可以简单得出这是一个3N级的复杂度布局,我们可以尝试去优化吗?
技巧一:熟读官方的API文档!
个人建议,常用的Widget的所有参数都尽量了解一遍!在阅读官方文档的时候我们发现了Button,有一个可以把图绘制在左边的参数:android:drawableLeft
于是,我们优化了一下小与的代码
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/btn_headtita"
android:drawableLeft="@drawable/header_back"
android:gravity="center"
android:padding="10dp"
android:text="@string/back"
android:textColor="#ffffff" />
用hierarchyviewer来分析一下
Nginx 配置 SSL 证书 + HTTPS 站点小记 - 走点路博客
1、Nginx 配置 ssl 模块
默认 Nginx 是没有 ssl 模块的,而我的 VPS 默认装的是 Nginx 0.7.63 ,顺带把 Nginx 升级到 0.7.64 并且 配置 ssl 模块方法如下:
下载 Nginx 0.7.64 版本,解压 进入解压目录:
tar zxvf nginx-0.7.64.tar.gz
cd nginx-0.7.64
2、使用 OpenSSL 生成证书
①、生成RSA密钥的方法
有的证书要 1024 的,所以得:
②、生成一个证书请求
会提示输入省份、城市、域名信息等,重要的是,email 一定要是你的域名后缀的,比如[email protected] 并且能接受邮件!
这样就有一个 csr 文件了,提交给 ssl 提供商的时候就是这个 csr 文件
(来源:http://www.lsproc.com/blog/nginx_ssl_config/)
直接 cat cert.csr
得到一大串字符,比如这样:
MIIBsTCCARoCAQAwcTELMAkGA1UEBhMCQ04xCzAJBgNVBAgTAkhCMQwwCgYDVQQH
EwNTSloxDzANBgNVBAoTBkZhbmZvdTESMBAGA1UEAxMJZzFuZm91LmRlMSIwIAYJ
KoZIhvcNAQkBFhN3ZWJtYXN0ZXJAZmFuZm91LmRlMIGfMA0GCSqGSIb3DQEBAQUA
A4GNADCBiQKBgQC5l4PmZg6TCIpduefxq5gsLXN1JeQdBmUs+pEApeHmNoxE+R4k
VkQUJzLj5o3ltQGJzYrcIfru8NryQSxaT/5IjeFwS7nIMsx8KPkQQ71BJazsiZj+
CdLDRJj1m/SrjTsNrfYj4rFFS1FXq7uEDyreUx7fyAljx70jPSsGBOGwRQIDAQAB
oAAwDQYJKoZIhvcNAQEFBQADgYEACKCBQcnCq5yE3GFyN3NyxCQEvnspkIv9AqI4
FcwqyHPZWkupp3wfubHY80IwtfjlGlTSynzE7FZLVpcbNfKLnAYlYEwDY7NukJNy
pCbyqpJJXdAl3Jcun0NlLtSxTQpR+abO8va/BAO5Hp9h1rpSRtTdSJd2fC/owRV1
BfRuJnA=
-----END CERTIFICATE REQUEST-----
提交给你的 ssl 提供商即可,一般半个钟头到一天时间就会发给你证书,如图:
把所有文件全部上传到一个特定的目录,比如我是上传到 /root/zoulu/
这里,zoulukey.pem 和 zoulucert.csr 是自己在 VPS 生成的,剩下的都是证书签发机构颁发的。
一般情况下,直接用证书签发机构颁发的 crt 文件即可,比如 zou_lu.crt ,但是有很多证书签发机构默认在 Firefox 中文版下是不会信任的,经过仔细研究,终于发现,原来得把证书签发机构办法给你的 crt 文件也放入才行。
方法如下:
合并 PositiveSSLCA.crt (证书签发机构的 crt) 和 zou_lu.crt (自己域名的 crt)
cat zou_lu.crt >> PositiveSSLCA.crt
mv PositiveSSLCA.crt zou_lu.crt
或者直接用记事本打开,然后复制 PositiveSSLCA.crt 里面所有的内容到 zou_lu.crt 最下方即可。
(来源:http://www.lsproc.com/blog/nginx_ssl_config/)
③、修改 Nginx 配置
listen 443;
server_name zou.lu;
index index.html index.htm index.php;
root /home/zoulu;
error_page 404 403 http://zou.lu;
ssl on;
ssl_certificate /root/zoulu/zou_lu.crt;
ssl_certificate_key /root/zoulu/zoulukey.pem;
其他的配置信息和一般站点的一样,不再重复。
nginx设置SSL反向代理 - NginxApache - freemouse-笔记-感悟-成长
Nginx的反向代理通常用来映射内网中提供的Apache、IIS、Lighttpd服务,以实现负载均衡;同时,由于动态服务程序运行在内网,服务器的整体安全性也有所提高,那么怎样用nginx设置SSL的反向代理呢?
使用nginx设置SSL的优点不少:
- 易用性:nginx安装、升级简单,nginx的平滑升级使得网站服务器不需要重启就可以完成升级任务。
- 安全性:nginx对于代理是透明的,因此,相当于为放置在代理后的Apache等服务器提供一道安全屏障、可以抵御一些基本web的攻击。
- 低负载:负载低是nginx的另一大优点。可以在nginx代理后配置多个apache服务器以满足不同需求
- 缓存:可以将除动态文件以外的文件,如css、js、静态html页直接交给nginx处理,以进一步降低负载
- 文件压缩:nginx可以优化并减小文件传输尺寸,缩短文件读取时间。
说了一大堆优点,相信诸位看官该跃跃欲试了吧,闲话少提^_^,下面给出配置实例:
由于,下面的代码只是用来演示整个配置过程,因此,我使用的SSL安全证书是自己签名的,如果需要能够通过验证的SSL安全证书,请到CAs自我了断^_^(网站地址:www.verisign.com)。
一、生成SSL安全证书
在nginx的配置目录下新建一个文件夹用以存放证书
# cd /usr/local/nginx/conf
# mkdir ssl
# cd ssl
生成一个私有key
# openssl genrsa -des3 -out nixcraft.in.key 1024

生成CSR(Certificate Signing Request)文件:
# openssl req -new -key nixcraft.in.key -out nixcraft.in.csr

请输入自己的证书域名。上图红框的部分
二、配置SSL反向代理
编辑nginx的配置文件
#vi /usr/local/ngnix/conf/nginx.conf
添加如下代码:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
server { ### server port and name ### listen 443 ssl; server_name nixcraft.in; ### SSL log files ### access_log logs/ssl-access.log; error_log logs/ssl-error.log; ### SSL cert files ### ssl_certificate ssl/nixcraft.in.crt; ssl_certificate_key ssl/nixcraft.in.key; ### Add SSL specific settings here ### keepalive_timeout 60; ### Limiting Ciphers ######################## # Uncomment as per your setup #ssl_ciphers HIGH:!ADH; #ssl_perfer_server_ciphers on; #ssl_protocols SSLv3; ############################################## ### We want full access to SSL via backend ### location / { proxy_pass http://nixcraft; ### force timeouts if one of backend is died ## proxy_next_upstream error timeout invalid_header http_500 http_502 http_503; ### Set headers #### proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ### Most PHP, Python, Rails, Java App can use this header ### proxy_set_header X-Forwarded-Proto https; ### By default we don't want to redirect it #### proxy_redirect off; } |
保存、并重新加载配置文件
# /usr/local/nginx/sbin/nginx -t
# /usr/local/nginx/sbin/nginx -s reload
查看是否配置成功:
# netstat -tulpn | grep :443
SSL配置大功告成了
android开发 Json解析种类大全 - Return_Code的专栏 - 博客频道 - CSDN.NET
- /**
- * 对MapString类型数据进行解析
- * @param json
- * @return
- */
- public static Map<String, String> getMapStr(String json){
- Map<String, String> mapStr = new HashMap<String, String>();
- try {
- mapStr = JSON.parseObject(json, new TypeReference<Map<String, String>>(){});
- } catch (Exception e) {
- e.printStackTrace();
- }
- return mapStr;
- }
- /**
- * 对MapObject类型数据进行解析
- * @param json
- * @return
- */
- public static Map<String, Object> getMapObj(String json){
- Map<String, Object> mapStr = new HashMap<String, Object>();
- try {
- mapStr = JSON.parseObject(json, new TypeReference<Map<String, Object>>(){});
- } catch (Exception e) {
- e.printStackTrace();
- }
- return mapStr;
- }
- /**
- * 对listmap类型进行解析
- * @param json
- * @return
- */
- public static List<Map<String, Object>> getListMap(String json){
- List<Map<String, Object>> list = new ArrayList<Map<String,Object>>();
- try {
- list = JSON.parseObject(json,new TypeReference<List<Map<String, Object>>>(){});
- } catch (Exception e) {
- e.printStackTrace();
- }
- return list;
- }
- }
判定文件编码或文本流编码的方法
如果项目对要判定的文本文件编码不可控(比如用户上传的一些HTML、XML等文本),可以采用一个现成的开源项目:cpdetector,它所在的网址是:http://cpdetector.sourceforge.net/。它的类库很小,只有500K左右,利用该类库判定文本文件的代码如下:
- /*------------------------------------------------------------------------
- detector是探测器,它把探测任务交给具体的探测实现类的实例完成。
- cpDetector内置了一些常用的探测实现类,这些探测实现类的实例可以通过add方法
- 加进来,如ParsingDetector、 JChardetFacade、ASCIIDetector、UnicodeDetector。
- detector按照“谁最先返回非空的探测结果,就以该结果为准”的原则返回探测到的
- 字符集编码。
- --------------------------------------------------------------------------*/
- cpdetector.io.CodepageDetectorProxy detector =
- cpdetector.io.CodepageDetectorProxy.getInstance();
- /*-------------------------------------------------------------------------
- ParsingDetector可用于检查HTML、XML等文件或字符流的编码,构造方法中的参数用于
- 指示是否显示探测过程的详细信息,为false不显示。
- ---------------------------------------------------------------------------*/
- detector.add(new cpdetector.io.ParsingDetector(false));
- /*--------------------------------------------------------------------------
- JChardetFacade封装了由Mozilla组织提供的JChardet,它可以完成大多数文件的编码
- 测定。所以,一般有了这个探测器就可满足大多数项目的要求,如果你还不放心,可以
- 再多加几个探测器,比如下面的ASCIIDetector、UnicodeDetector等。
- ---------------------------------------------------------------------------*/
- detector.add(cpdetector.io.JChardetFacade.getInstance());
- //ASCIIDetector用于ASCII编码测定
- detector.add(cpdetector.io.ASCIIDetector.getInstance());
- //UnicodeDetector用于Unicode家族编码的测定
- detector.add(cpdetector.io.UnicodeDetector.getInstance());
- java.nio.charset.Charset charset = null;
- File f=new File("待测的文本文件名");
- try {
- charset = detector.detectCodepage(f.toURL());
- } catch (Exception ex) {ex.printStackTrace();}
- if(charset!=null){
- System.out.println(f.getName()+"编码是:"+charset.name());
- }else
- System.out.println(f.getName()+"未知");
hibernate中SQLQuery的addEntity()和setResultTransformer方法
如果使用原生sql语句进行query查询时,hibernate是不会自动把结果包装成实体的。所以要手动调用addEntity(Class class)等一系列方法。
如session.createSQLQuery(sql).addEntity(Class class);注意hibernate3.0.5不支持,单个参数的addEntity方法
另外,hibernate3.2可以对原生sql 查询使用ResultTransformer。这会返回不受Hibernate管理的实体。
session.createSQLQuery("SELECT NAME, BIRTHDATE FROM CATS")
.setResultTransformer(Transformers.aliasToBean(CatDTO.class))
或setResultTransformer(new AliasToBeanResultTransformer (CatDTO.class))
上面的查询将会返回CatDTO的列表,它将被实例化并且将NAME和BIRTHDAY的值注射入对应的属性或者字段。
http://bbs.xml.org.cn/blog/more.asp?name=lhwork&id=15351
但必须注意,对每一个列都必须addScalar("列名")
既然如此,
那么setResultTransformer与addEntity的区别是什么呢?一个区别是前者支持查任意的列,后者必须用select * from users的形式或select {a.*},{b.*} from a,b where ....。
String hql = "select {cdc.*} " +
"from ta_car_dept cd," +
"ta_cardept_desc cdc " +
"where cd.s_code in ( "+sCode+" )" +
" and cd.type = 1" +
" and cdc.lan_id = 1" +
" and cd.auto_type_id = cdc.auto_type_id ";
List list = session.createSQLQuery(hql).addEntity("cdc", TaCarDeptDesc.class).list();
===========
String hql = "select cd.s_code ,cdc.auto_name " +
"from ta_car_dept cd," +
"ta_cardept_desc cdc " +
"where cd.s_code in ( "+sCode+" )" +
" and cd.type = 1" +
" and cdc.lan_id = 1" +
" and cd.auto_type_id = cdc.auto_type_id ";
List list = session.createSQLQuery(hql).addScalar("s_code", Hibernate.STRING).addScalar("auto_name", Hibernate.STRING).list();
Spring MVC and AJAX with JSON
You can use json-lib-ext-spring. There are other libs, this is the one I found. If you know or use another one, please leave a comment with the library name. ![]()
Do not forget to download Json-lib and its dependencies.
Now you have to configure your XML files:
Create a views.xml file under WEB-INF folder and paste the following code into it:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<?xml version="1.0" encoding="UTF-8"?> xsi:schemaLocation= "http://www.springframework.org/schema/beans <bean name="jsonView" class="net.sf.json.spring.web.servlet.view.JsonView" /></beans> |
Add this config to you spring configuration file:
|
1
2
3
4
5
6
7
8
9
|
<!-- json --><bean id="xmlFileViewResolver" class="org.springframework.web.servlet.view.XmlViewResolver"> <property name="location"> <value>/WEB-INF/views.xml</value> </property> <property name="order"> <value>1</value> </property></bean> |
Make sure to set the order if you are using any other view resolvers.
Now you just have to use “jsonView” as the viewname and the model will be converted to JSONbefore being sent back to the client:
|
1
|
return new ModelAndView("jsonView", modelMap); |
Here is an example:
|
1
2
3
4
5
6
7
8
|
public ModelAndView getColumnsJson(HttpServletRequest request, HttpServletResponse response) throws Exception { Map<String,Object> modelMap = new HashMap<String,Object>(2); modelMap.put("rows", service.generateColumns()); return new ModelAndView("jsonView", modelMap); } |
Happy coding!
Spring MVC 整合 JSON 视图
Jackson转换Java对象
1、 jackson有专门的视图MappingJacksonJsonView,只需用配置这个视图就可以完成转换json了。使用jackson需要添加如下jar包:
如果你对Jackson转换Java对象还没有什么了解的话,你可以参考:
For cnblogs:http://www.cnblogs.com/hoojo/archive/2011/04/22/2024628.html
For csdn:http://blog.csdn.net/IBM_hoojo/archive/2011/04/22/6340762.aspx
2、 然后需要在dispatcher.xml中添加视图配置,配置如下:
<bean name="jsonView" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
<property name="encoding">
<value type="org.codehaus.jackson.JsonEncoding">UTF8value>
property>
<property name="contentType" value="text/html;charset=UTF-8"/>
bean>
3、 将Java对象转换JSON
package com.hoo.controller;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.hoo.entity.Account;
import com.hoo.entity.Brithday;
import com.hoo.entity.User;
/**
* function:用MappingJacksonJsonView视图和Jackson转换Json
* @author hoojo
* @createDate 2011-4-28 下午04:52:23
* @file JacksonJsonViewController.java
* @package com.hoo.controller
* @project SpringMVC4View
* @blog http://blog.csdn.net/IBM_hoojo
* @email [email protected]
* @version 1.0
*/
@Controller
@RequestMapping("/jackson/view")
public class JacksonJsonViewController {
/**
* function:转换普通Java对象
* @author hoojo
* @createDate 2011-4-28 下午05:14:18
* @return
*/
@RequestMapping("/doBeanJsonView")
public ModelAndView doBeanJsonView() {
System.out.println("#################ViewController doBeanJsonView##################");
ModelAndView mav = new ModelAndView("jsonView");
User user = new User();
user.setAddress("china GuangZhou");
user.setAge(23);
user.setBrithday(new Date());
user.setName("jack");
user.setSex(true);
Account bean = new Account();
bean.setAddress("北京");
bean.setEmail("email");
bean.setId(1);
bean.setName("haha");
Brithday day = new Brithday();
day.setBrithday("2010-11-22");
bean.setBrithday(day);
mav.addObject(bean);
return mav;
}
}
上面使用了刚才我们配置的jsonView视图,通过这个视图就可以将ModelAndView中的数据转换成JSON数据。
在浏览器中请求:http://localhost:8080/SpringMVC4View/jackson/view/doBeanJsonView.do
结果如下:
{"account":{"address":"北京","name":"haha","id":1,"email":"email","brithday":{"brithday":"2010-11-22"}}}
4、 转换Map到JSON
/**
* function:转换Map集合
* @author hoojo
* @createDate 2011-4-28 下午05:14:33
* @return
*/
@RequestMapping("/doMapJsonView")
public ModelAndView doMapJsonView() {
System.out.println("#################ViewController doBeanJsonView##################");
ModelAndView mav = new ModelAndView("jsonView");
User user = new User();
user.setAddress("china GuangZhou");
user.setAge(23);
user.setBrithday(new Date());
user.setName("jack");
user.setSex(true);
Map
map.put("user", user);
map.put("success", true);
mav.addObject(map);
mav.addObject("title", "ViewController doBeanJsonView");
return mav;
}
在WebBrowser中请求:http://localhost:8080/SpringMVC4View/jackson/view/doMapJsonView.do
结果如下:
{"hashMap":{"success":true,"user":{"address":"china GuangZhou","name":"jack","age":23,"sex":true,"brithday":1303982296953}},
"title":"ViewController doBeanJsonView"}
5、 转换List到JSON
/**
* function:转换List集合
* @author hoojo
* @createDate 2011-4-28 下午05:14:54
* @return
*/
@RequestMapping("/doListJsonView")
public ModelAndView doListJsonView() {
System.out.println("#################ViewController doBeanJsonView##################");
ModelAndView mav = new ModelAndView("jsonView");
List<User> list = new ArrayList<User>();
for (int i = 0; i < 3; i++) {
User user = new User();
user.setAddress("china GuangZhou#" + i);
user.setAge(23 + i);
user.setBrithday(new Date());
user.setName("jack_" + i);
user.setSex(true);
list.add(user);
}
mav.addObject(list);
return mav;
}
在浏览器中请求http://localhost:8080/SpringMVC4View/jackson/view/doListJsonView.do
结果如下:
{"userList":[{"address":"china GuangZhou#0","name":"jack_0","age":23,"sex":true,"brithday":1303982399265},
{"address":"china GuangZhou#1","name":"jack_1","age":24,"sex":true,"brithday":1303982399265},
{"address":"china GuangZhou#2","name":"jack_2","age":25,"sex":true,"brithday":1303982399265}]}
总结,spring对jackson提供了专门的视图,整合起来也比较方便。而且jackson也比较简单易用。
七、 JSON-lib转换Java到JSON
1、 Spring没有提供JSON-lib的view视图,不过没有关系。我们可以自己扩展一个,只需用继承AbstractView类,实现里面的方法就可以了。首先你需要了解JSON-lib,如果你还不了解JSON-lib的话,建议阅读:
For cnblogs: http://www.cnblogs.com/hoojo/archive/2011/04/21/2023805.html
For csdn: http://blog.csdn.net/IBM_hoojo/archive/2011/04/21/6339246.aspx
然后你需要在工程中添加如下jar文件:
2、 因为Spring没有提供view,我们需要自己实现一个。代码如下:
package com.hoo.veiw.xml;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.json.JSONSerializer;
import net.sf.json.JsonConfig;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.BindingResult;
import org.springframework.web.servlet.view.AbstractView;
/**
* function:扩展AbstractView 实现JSON-lib视图
* @author hoojo
* @createDate 2011-4-28 下午05:26:43
* @file MappingJsonlibVeiw.java
* @package com.hoo.veiw.xml
* @project SpringMVC4View
* @blog http://blog.csdn.net/IBM_hoojo
* @email [email protected]
* @version 1.0
*/
public class MappingJsonlibVeiw extends AbstractView {
public static final String DEFAULT_CONTENT_TYPE = "application/json";
public static final String DEFAULT_CHAR_ENCODING = "UTF-8";
private String encodeing = DEFAULT_CHAR_ENCODING;
public void setEncodeing(String encodeing) {
this.encodeing = encodeing;
}
private Set renderedAttributes;
private JsonConfig cfg = null;
public void setCfg(JsonConfig cfg) {
this.cfg = cfg;
}
public MappingJsonlibVeiw() {
setContentType(DEFAULT_CONTENT_TYPE);
}
@Override
protected void renderMergedOutputModel(Map
HttpServletResponse response) throws Exception {
model = filterModel(model);
response.setCharacterEncoding(encodeing);
PrintWriter out = response.getWriter();
if (cfg == null) {
out.print(JSONSerializer.toJSON(model));
} else {
out.print(JSONSerializer.toJSON(model, cfg));
}
}
/**
* Filters out undesired attributes from the given model.
* Default implementation removes {@link BindingResult} instances and entries not included in the {@link
* #setRenderedAttributes(Set) renderedAttributes} property.
*/
protected Map
Map
Set renderedAttributes =
!CollectionUtils.isEmpty(this.renderedAttributes) ? this.renderedAttributes : model.keySet();
for (Map.Entry
if (!(entry.getValue() instanceof BindingResult) && renderedAttributes.contains(entry.getKey())) {
result.put(entry.getKey(), entry.getValue());
}
}
return result;
}
}
上面的代码不是很复杂,首先我们设置contentType,这个属性在AbstractView这个父类中有setter方法可以完成设置。
然后就是默认的编码格式,这个编码格式设置到response上。默认UTF-8编码。在renderMergedOutputModel方法中可以看到设置。
第三就是filterModule方法,这个方法是得到ModelAndView中我们添加对象,过滤掉BindingResult的信息。
最后就是renderMergedOutputModel方法,这个方法最为核心,但也很简单。过滤model获得要转换的model数据,设置response编码格式。利用response的Writer输出JSON信息,通过JSONSerializer转换Java到JSON。
3、 在dispatcher.xml中配置jsonlibView这个视图
<-- 自定义JSONlib的json视图 -->
<bean name="jsonlibView" class="com.hoo.veiw.xml.MappingJsonlibVeiw">
<property name="contentType" value="text/html;charset=UTF-8"/>
<property name="encodeing" value="gbk"/>
bean>
4、 转换普通Java对象
package com.hoo.controller;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.hoo.entity.Account;
import com.hoo.entity.Brithday;
import com.hoo.entity.User;
/**
* function:
* @author hoojo
* @createDate 2011-4-28 下午05:58:02
* @file JsonlibMappingViewController.java
* @package com.hoo.controller
* @project SpringMVC4View
* @blog http://blog.csdn.net/IBM_hoojo
* @email [email protected]
* @version 1.0
*/
@Controller
@RequestMapping("/jsonlib/view")
public class JsonlibMappingViewController {
/**
* function:转换普通Java对象
* @author hoojo
* @createDate 2011-4-28 下午05:14:18
* @return
*/
@RequestMapping("/doBeanJsonView")
public ModelAndView doBeanJsonView() {
System.out.println("#################ViewController doBeanJsonView##################");
ModelAndView mav = new ModelAndView("jsonlibView");
User user = new User();
user.setAddress("china GuangZhou");
user.setAge(23);
user.setBrithday(new Date());
user.setName("jack");
user.setSex(true);
Account bean = new Account();
bean.setAddress("北京");
bean.setEmail("email");
bean.setId(1);
bean.setName("haha");
Brithday day = new Brithday();
day.setBrithday("2010-11-22");
bean.setBrithday(day);
mav.addObject(bean);
return mav;
}
}
在WebBrowser中请求http://localhost:8080/SpringMVC4View/jsonlib/view/doBeanJsonView.do
结果如下:
{"account":{"address":"北京","brithday":{"brithday":"2010-11-22"},"email":"email","id":1,"name":"haha"}}
5、 转换Map到JSON
/**
* function:转换Map集合
* @author hoojo
* @createDate 2011-4-28 下午05:14:33
* @return
*/
@RequestMapping("/doMapJsonView")
public ModelAndView doMapJsonView() {
System.out.println("#################ViewController doBeanJsonView##################");
ModelAndView mav = new ModelAndView("jsonlibView");
User user = new User();
user.setAddress("china GuangZhou");
user.setAge(23);
user.setBrithday(new Date());
user.setName("jack");
user.setSex(true);
Map
map.put("user", user);
map.put("success", true);
mav.addObject(map);
mav.addObject("title", "ViewController doBeanJsonView");
return mav;
}
在WebBrowser中请求http://localhost:8080/SpringMVC4View/jsonlib/view/doMapJsonView.do
结果如下:
{"hashMap":{"success":true,"user":{"address":"china GuangZhou","age":23,
"brithday":{"date":28,"day":4,"hours":18,"minutes":20,"month":3,"seconds":8,
"time":1303986008703,"timezoneOffset":-480,"year":111},"name":"jack","sex":true}},
"title":"ViewController doBeanJsonView"}
发现时间被分解成一个对象了,这里需要用JSONConfig的JsonValueProcessor将brithday过滤下,然后用SimpleDateFormate进行格式转换。
6、 转换List集合
/**
* function:转换List集合
* @author hoojo
* @createDate 2011-4-28 下午05:14:54
* @return
*/
@RequestMapping("/doListJsonView")
public ModelAndView doListJsonView() {
System.out.println("#################ViewController doBeanJsonView##################");
ModelAndView mav = new ModelAndView("jsonlibView");
List<User> list = new ArrayList<User>();
for (int i = 0; i < 3; i++) {
User user = new User();
user.setAddress("china GuangZhou#" + i);
user.setAge(23 + i);
user.setBrithday(new Date());
user.setName("jack_" + i);
user.setSex(true);
list.add(user);
}
mav.addObject(list);
return mav;
}
在浏览器中请求http://localhost:8080/SpringMVC4View/jsonlib/view/doListJsonView.do
结果如下:
{"userList":[{"address":"china GuangZhou#0","age":23,"brithday":{"date":28,"day":4,"hours":19,"minutes":2,"month":3,"seconds":54,
"time":1303988574328,"timezoneOffset":-480,"year":111},"name":"jack_0","sex":true},
{"address":"china GuangZhou#1","age":24,"brithday":{"date":28,"day":4,"hours":19,"minutes":2,"month":3,"seconds":54,
"time":1303988574328,"timezoneOffset":-480,"year":111},"name":"jack_1","sex":true},{"address":"china GuangZhou#2","age":25,
"brithday":{"date":28,"day":4,"hours":19,"minutes":2,"month":3,"seconds":54,"time":1303988574328,"timezoneOffset":-480,"year":111},
"name":"jack_2","sex":true}]}
Hibernate的dynamic-insert与dynamic-update - 虫二的专栏~~在路上~~~ - 博客频道 - CSDN.NET
1)<property>元素 insert属性:设置为false,在insert语句中不包含这个字段,表示永远不会被插入,默认true
2)<property>元素 update属性:设置为false,在update语句中不包含这个字段,表示永远不会被修改,默认true
3)<class>元素 mutable属性:设置为false就是把所有的<property>元素的update属性设置为了false,说明这个对象不会被更新,默认true
4)<property>元素 dynamic-insert属性:设置为true,表示insert对象的时候,生成动态的insert语句,如果这个字段的值是null就不会加入到insert语句当中.默认false
5)<property>元素 dynamic-update属性,设置为true,表示update对象的时候,生成动态的update语句,如果这个字段的值是null就不会被加入到update语句中,默认false
6)<class>元素 dynamic-insert属性:设置为true,表示把所有的<property>元素的dynamic-insert属性设置为true,默认false
7)<class>元素 dynamic-update属性:设置为true,表示把所有的<property>元素的dynamic-update属性设置为true,默认false



