wasw100's Blog
2012/02/23

Google AD

2010年03月4日

使用feedsky还是feedburner烧录自己的RSS?

最后决定使用 http://feeds2.feedburner.com/wasw100 作为自己RSS的烧录地址。具体理由:

1.google技术的强大,在大订阅量时稳定,举两个例子(订阅量都过万):
王建硕:http://feeds.feedburner.com/wangjianshuo
冯大辉(Fenng):http://feeds2.feedburner.com/webarch(fenng的订阅地址是http://www.dbanotes.net/index.xml,但是会302重定向到上面那个地址)

2.自己是一个G粉,可以和google的许多服务无缝集成,也可以在后面添加google adsense的广告。

直接使用feedburner地址,而不是像fenng那样通过自己的域名重定向?
可以方便转到第三方博客,缺点是可能被墙

使用feedburner注意的地方:
不要使用点击统计功能,可能出现点击文章开头出现404找不到的情况。去掉的方法:
a.登陆http://feedburner.google.com/
b.点击要修改的feedbuner标题,进入 Feed Stats Dashboard,点左面的Configure Stats链接,在右面出现配置界面,去掉Item link clicks 前面的“√”,点 save 按钮保存

补充:
在别人的博客上都有这么一个图片:

其实这个也很容易获取,登陆你的feedburner,进入你要显示的订阅地址,点上面publicize选项卡,在左侧再选FeedCount选项,剩下的就很简单了

–EOF–

获取google analytics统计代码

每次向博客添加Google Analytics代码时,因为对Google Analytics不熟悉,每次获取统计代码都需要很长时间,因此把获取Google Analytics统计代码的过程记录下来:

1.登陆Abalytics http://www.google.com/analytics/

2.进入管理界面后,你所有的统计代码都会显示在下面的一个表格(table)中去,点击需要获取的网站后面一个 Edit 的超链接后,进入 Profile Settings 页面。

3.在Profile Settings页面第一个表格的右上角有 Check Status 的超级链接,点击进入Tracking Code页面,我们所需要的js代码就在这里了,复制到我们的页面中就可以了

参考文章:http://hi.baidu.com/tom70/blog/item/91cae4d8e46eae2411df9b87.html

–EOF–

2010年03月3日

windows下apache支持wordpress的url rewrite

参考文章:http://sexywp.com/how-to-config-mod-rewrite-in-win.htm

在本地调试wordpress时apache服务器可能不支持url rewrite,可以根据如下步骤修改配置:

1.打开apache的配置文件:httpd.conf 搜索:LoadModule rewrite_module modules/mod_rewrite.so
把前面的#去掉

如果执行完第一步,重启服务器后,还是不支持url rewrite,那么执行第二步

2.在 httpd.conf 中存在下面格式的文字

<Directory "D:/tools/Apache2.2/htdocs">
    #
    # Possible values for the Options directive are "None", "All",
    # or any combination of:
    #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
    #
    # Note that "MultiViews" must be named *explicitly* --- "Options All"
    # doesn't give it to you.
    #
    # The Options directive is both complicated and important.  Please see
    # http://httpd.apache.org/docs/2.2/mod/core.html#options
    # for more information.
    #
    Options Indexes FollowSymLinks

    #
    # AllowOverride controls what directives may be placed in .htaccess files.
    # It can be "All", "None", or any combination of the keywords:
    #   Options FileInfo AuthConfig Limit
    #
    AllowOverride All

    #
    # Controls who can get stuff from this server.
    #
    Order allow,deny
    Allow from all

</Directory>

AllowOverride None 改为 AllowOverride All 就可以了。
(注意:可能有多个Directory标签,找到你wordpress所在目录的那个修改)

3.在要url重写的目录建立一个名为: .htaccess 的文件(worldpress在开启url重写后会自动生成)

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

4.重启apache,这样apache就支持url rewrite了

–EOF–

Hello world!

今天自己独立域名的博客终于诞生了–2010年3月3日,写点东西留做纪念。

1.自己的域名wasw100.com的排名目前是:Alexa Traffic Rank: 5,395,122 。第一个目标是进入前500万,应该不难

2.尽快把自己原来的博客(http://wasw100.javaeye.com/http://wanng.javaeye.com/)文章迁移到这个域名下

3.博客还需要完善,但一定要简介。为学习技术而写,同时希望google的广告够够博客和域名的费用。

–EOF–

2010年01月26日

jsp中导出word的一种实现

方式:

1.将原来的word另存为网页形式,把扩展名改成jsp,利用DreamWeaver的拆分模式在对应的位置填充jsp标签。

2.jsp的第一行:<%@ page contentType="application/msword; charset=gb2312" %>
保存成的word名字:<%response.setHeader(“Content-Disposition”, “attachment;filename=test.doc”);%>

3.剩下的完全把这个word当一个jsp页面对待就可以了。

以后访问这张页面的时候就提示打开还是保存word了

补充:
后来发现其实直接设计好html,导出的word也是很不错的,这样代码更好维护。

相关:
struts2导出excel笔记

–EOF–

window.location or window.location.href?

参考:
1.http://www.javascriptkit.com/jsref/location.shtml
2.http://www.highdots.com/forums/javascript-discussion-multi-lingual/window-location-window-location-href-276539.html

Location contains information about the current URL of the browser.
The most common usage of Location is simply to use it to automatically
navigate the user to another page:
<script type="text/javascript">
window.location="http://www.google.com"
</script>

所以推荐使用window.location,包含更多信息

理由(参考文章的第二篇)

Although "window.location.href" also seems to work. The "entire URL"
href property (of window.location) appears to be a bit redundant. Other
properties of "windows.location" could be useful for reading or changing
portions of the URL like domain/host names and port numbers (which are
sometimes not stated - permitted to remain the default).

–EOF–

2010年01月21日

struts2导出excel笔记

例子很简单,就一个Action类和一个Service类

1.所需jar包

struts2需要jar包:commons-logging.jar、freemarker-2.3.8.jar、ognl-2.6.11.jar、struts2-core-2.0.11.1.jar、xwork-2.0.4.jar

excel导出:jxl.jar

2.配置(web.xml)

   .....
              <filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
  ......

Struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" >
<struts>
	<package name="platform-default" extends="struts-default">
		<action name="excel" class="action.ExcelAction">
			<result name="excel" type="stream">
				<param name="contentType">
					application/vnd.ms-excel
				</param>
				<param name="inputName">excelStream</param>
				<param name="contentDisposition">
					filename="export.xls"
				</param>
				<param name="bufferSize">1024</param>
			</result>
		</action>
	</package>
</struts>

3.Action实现(ExcelAction.java)

package action;

import java.io.InputStream;
import service.IExcelService;
import service.impl.ExcelServiceImpl;
public class ExcelAction {

	InputStream excelStream;

	public String execute(){
		IExcelService es = new ExcelServiceImpl();
		excelStream = es.getExcelInputStream();
		return "excel";
	}
	//get set...
}

4.Service实现

a.接口(IExcelService.java)

package service;
import java.io.InputStream;
public interface IExcelService {
	InputStream getExcelInputStream();
}

b.实现类(ExcelServiceImpl.java)

package service.impl;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

import jxl.Workbook;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import service.IExcelService;

public class ExcelServiceImpl implements IExcelService {

	@Override
	public InputStream getExcelInputStream() {
		//将OutputStream转化为InputStream
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		putDataOnOutputStream(out);
		return new ByteArrayInputStream(out.toByteArray());
	}

	private void putDataOnOutputStream(OutputStream os) {
		jxl.write.Label label;
		WritableWorkbook workbook;
		try {
			workbook = Workbook.createWorkbook(os);
			WritableSheet sheet = workbook.createSheet("Sheet1", 0);

			label = new jxl.write.Label(0, 0, "struts2导出excel");
			sheet.addCell(label);

			workbook.write();
			workbook.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

这样例子就完成了:
直接访问:http://127.0.0.1:8080/excel/excel.action 就可以导出excel

说明:

1、例子中OutputStream转InputStream是一种简单的实现,但是需要内存比较多,可以参考:
http://ostermiller.org/convert_java_outputstream_inputstream.html

2、参考实现:http://merrygrass.javaeye.com/blog/558274

3、java报表JXL和POI打印设置

代码在附件中,jar包自己下载后导入即可

问题:

//横向打印
sheet.getSettings().setOrientation(PageOrientation.LANDSCAPE);
//默认行高(似乎不起作用)
sheet.getSettings().setDefaultRowHeight(510);
//设置行宽
sheet.getSettings().setDefaultColumnWidth(10);

横向设置和行宽起作用,但行高不起作用,望高手回答

———————————————————————————

默认行高问题解决:

此方法针对excel2003,在创建sheet后,添加如下代码

for(int i=0;i<65536;i++){
	sheet.setRowView(i, 360);
}

补充:jxl中20个高度对应excel的1个高度,jxl的1个宽度对应excel的7个宽度

下载代码

–EOF–

2010年01月18日

网页打印格式设置总结

1.分页符的添加

.page_break{
	page-break-after:always;
}

分页的时候加上:<div class=”page_break”></div>

2.为使各个浏览器显示效果尽量一致,加上

*{
	margin:0;
	padding:0;
}

3.A4纵向打印,浏览器显示和打印效果相差不大,设置body的宽度

body{
	width:640px;
	font-size:12px;
}

4.css擅长样式的控制,table善于格式的显示。css修饰table

参考文章:http://www.w3schools.com/css/css_table.asp

table添加边框

table{
	border-collapse:collapse;
}
table, th, td{
	border:1px solid #000000;
}

如果一个页面有多个table,这个table和其他table格式略有不同,可以使用下面的方法

<div id="t1">
  <table>
    <tr>
      <th scope="col">&nbsp;</th>
    </tr>
  </table>
</div>

css中,控制不同的格式

#t1 table{
	width:640px;
}
#t1 table,#t1 th,#t1 td{
	text-align:center;
}

5.控制打印时是否显示

@media print{<!--控制哪些打印,哪些不打印的样式-->
  .print   {display:block;}
  .notPrint {display:none;}
}

我们在html中引入css: <link rel=”stylesheet” type=”text/css” media=”screen” href=”styles/basic.css” />

media=”screen”,也可以时media=”print”,分别代表控制浏览器里面的格式,或者打印时的格式,如果没有写media属性,则表示css既控制浏览器显示,有控制打印显示,

所以上面的css就是单独控制打印的


文字间距 行间距

.space{
	word-spacing:20px;
	letter-spacing:20px;
	line-height:60px;
}

–EOF–

2010年01月3日

jfreechart使用小结

参考文章:使用 JFreeChart来创建基于web的图表

一些jfreechart的api:http://topic.csdn.net/t/20050925/03/4292228.html

要建立类似下面的报表(折线图和柱状图都存在,图片不好贴,直接给个flicckr地址):http://www.flickr.com/photos/44025540@N03/4241013620/

生成的报表图片

先贴段代码,用到的地方尽量加载注释里:

package com.wasw100.chart;

import java.awt.Color;
import java.awt.Font;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Map;

import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.DefaultCategoryDataset;

/**
 *
 * @author wasw100
 *
 */

public class ChartTest {

	/**
	 * @param stuScoreMap
	 * @return
	 */
	private static DefaultCategoryDataset getDataSet(
			Map<String, Number> scoreMap, String category) {
		DefaultCategoryDataset dataset = new DefaultCategoryDataset();

		// 遍历Map
		for (String key : scoreMap.keySet()) {
			double value = scoreMap.get(key).doubleValue();
			dataset.setValue(value, category, key);
		}
		return dataset;
	}

	/**
	 *
	 * @param stuScoreMap
	 *            学生成绩
	 * @param avgScoreMap
	 *            班级平均成绩
	 * @return
	 */
	private static JFreeChart getChart(Map<String, Number> stuScoreMap,
			Map<String, Number> avgScoreMap) {

		CategoryPlot categoryPlot = new CategoryPlot();

		// 横轴、纵轴显示的标题
		categoryPlot.setDomainAxis(new CategoryAxis(""));
		categoryPlot.setRangeAxis(new NumberAxis("分数"));

		// 显示的方向,横向还是纵向?
		// categoryPlot.setOrientation(PlotOrientation.VERTICAL);
		// 设置是否显示水平网格线
		categoryPlot.setRangeGridlinesVisible(true);
		// 设置是否显示垂直网格线
		// categoryPlot.setDomainGridlinesVisible(true);

		DefaultCategoryDataset avgData = getDataSet(avgScoreMap, "班级平均成绩");// 得到数据集

		LineAndShapeRenderer lineAndShapeRenderer = new LineAndShapeRenderer();
		// 不显示线条
		lineAndShapeRenderer.setBaseLinesVisible(false);

		// 将线条添加进图表
		categoryPlot.setRenderer(lineAndShapeRenderer);
		categoryPlot.setDataset(avgData);

		// lineAndShapeRenderer的数值显示出来
		StandardCategoryItemLabelGenerator standardcategoryitemlabelgenerator = new StandardCategoryItemLabelGenerator();
		lineAndShapeRenderer
				.setBaseItemLabelGenerator(standardcategoryitemlabelgenerator);
		lineAndShapeRenderer.setBaseItemLabelsVisible(true);

		// 个人成绩的添加
		DefaultCategoryDataset stuData = getDataSet(stuScoreMap, "成绩");// 得到数据集
		BarRenderer barRenderer = new BarRenderer();// 柱状图渲染器
		categoryPlot.setDataset(1, stuData);
		categoryPlot.setRenderer(1, barRenderer);
		// 颜色显示为黄色
		barRenderer.setSeriesPaint(0, Color.YELLOW);
		barRenderer.setShadowVisible(false);
		// barRenderer.setSeriesPaint(0, new Color(0, 0, 255));
		// 显示边框
		barRenderer.setDrawBarOutline(true);
		barRenderer.setBaseOutlinePaint(Color.GRAY);

		// 设置纵轴的最小值和最大值
		ValueAxis valueAxis = categoryPlot.getRangeAxis();
		valueAxis.setLowerBound(40);
		valueAxis.setUpperBound(110);

		JFreeChart chart = new JFreeChart(categoryPlot);
		// 设置title
		Font titleFont = new Font("黑体", Font.BOLD, 10); // 图片标题
		chart
				.setTitle(new TextTitle("高2011级6班在高一下期末的平均成绩与班级平均成绩的比较",
						titleFont));
		chart.setBackgroundPaint(Color.WHITE);

		return chart;

	}

	public static void main(String[] args) {

		Map<String, Number> avgScoreMap = new LinkedHashMap<String, Number>();

		avgScoreMap.put("总分", 0);
		avgScoreMap.put("语文", 97.02);
		avgScoreMap.put("数学", 73.71);
		avgScoreMap.put("英语", 77.9);
		avgScoreMap.put("理综", 0);
		avgScoreMap.put("物理", 52.73);
		avgScoreMap.put("化学", 66.98);

		Map<String, Number> stuScoreMap = new LinkedHashMap<String, Number>();

		stuScoreMap.put("总分", 0);
		stuScoreMap.put("语文", 98);
		stuScoreMap.put("数学", 70);
		stuScoreMap.put("英语", 50);
		stuScoreMap.put("理综", 0);
		stuScoreMap.put("物理", 50);
		stuScoreMap.put("化学", 70);

		JFreeChart chart = getChart(avgScoreMap, avgScoreMap);
		FileOutputStream fos_jpg = null;
		try {
			fos_jpg = new FileOutputStream("D:\\score.jpg");
			ChartUtilities.writeChartAsJPEG(fos_jpg, 1, chart, 400, 300, null);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				fos_jpg.close();
			} catch (IOException e) {
			}
		}
	}

}

还有就是图例如果显示在右面,可以这样设置

// 设置图例位置,字体
chart.getLegend().setPosition(RectangleEdge.RIGHT);
Font kfont = new Font("宋体", Font.PLAIN, 10);
chart.getLegend().setItemFont(kfont);

还没有解决的问题:

1.右侧刻度间距没有手动控制

2.柱状图中间的白色竖线去不掉,欢迎指点

补充:刻度手动控制解决,只要把上面99-102行的代码改为下面即可

// 数据轴精度
		NumberAxis numberAxis = (NumberAxis) categoryPlot.getRangeAxis();
		numberAxis.setTickUnit(new NumberTickUnit(10));
		numberAxis.setLowerBound(0);
		numberAxis.setUpperBound(110);

NumberAxis继承ValueAxis,所以ValueAxis有得属性方法, NumberAxis都可以使用。

–EOF–

2009年12月27日

java中static块执行的时间

先放一个引用:http://www.javaeye.com/topic/11003

引用

其实我想事实是这样的:
一个类的运行,JVM做会以下几件事情 1、类装载 2、链接 3、初始化 4、实例化;而初始化阶段做的事情是初始化静态变量和执行静态方法等的工作。所以,当Class.forName(args[0],true,off.getClass().getClassLoader());中的true变为false的时候,就是告诉JVM不需再load class之后进行initial的工作。这样,将initial的工作推迟到了newInstance的时候进行。所以,static块的绝对不是什么“只是在类被第一次实体化的时候才会被仅仅调用一次”,而应该是在类被初始化的时候,仅仅调用一次。

有上面的引用可知,static块在类加载的时候执行,但是什么时候类加载? 首先明确不是在类加载的时候执行,可以像写jdbc的时候:

Class.forName(“com.mysql.jdbc.Driver”);

这样就会加载并初始化程序,但不实例化,具体可以参考:

http://tech.it168.com/j/d/2007-01-09/200701091303176.shtml

jdbc只需加载并初始化,无需实例化。

在javaApi中有:

newInstance 实例化

创建此 Class 对象所表示的类的一个新实例。如同用一个带有一个空参数列表的 new 表达式实例化该类。如果该类尚未初始化,则初始化之。

可见初始化可以在Class.forName(第二个参数为true)的时候进行,或者在第一次实例化的时候,如果没有初始化先初始化。

–EOF–

返回顶部