![](file:///C:/DOCUME%7E1/%E6%88%91/LOCALS%7E1/Temp/moz-screenshot.png)
工程目录
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>android</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 第一 这个过滤器与Struts的核心过滤器协同工作,以便更容易与sitemesh整合 -->
<filter>
<filter-name>struts-cleanup</filter-name>
<filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
</filter>
<!-- 第二 sitemesh的过滤器,同时也整合了Freemarker -->
<filter>
<filter-name>sitemesh</filter-name>
<filter-class>org.apache.struts2.sitemesh.FreeMarkerPageFilter</filter-class>
</filter>
<!-- 第三 struts2过滤器 -->
<filter>
<filter-name>struts2Filter</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts-cleanup</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>sitemesh</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>struts2Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--
使FreeMarker模块能够使用strut2标签,使用方式:<#assign
s=JspTaglibs["/WEB-INF/struts-tags.tld"] />
-->
<servlet>
<servlet-name>JspSupportservlet</servlet-name>
<servlet-class>org.apache.struts2.views.JspSupportServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>sitemesh-freemarker</servlet-name>
<servlet-class>com.opensymphony.module.sitemesh.freemarker.FreemarkerDecoratorServlet</servlet-class>
<init-param>
<param-name>TemplatePath</param-name>
<param-value>/</param-value>
</init-param>
<init-param>
<param-name>default_encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>sitemesh-freemarker</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<constant name="struts.convention.default.parent.package" value="crud-default" />
<constant name="struts.convention.package.locators" value="action" />
<constant name="struts.convention.package.locators.basePackage" value="org.david.android" />
<constant name="struts.convention.result.path" value="/WEB-INF/web" />
<!-- 用于CRUD Action的parent package -->
<package name="crud-default" extends="convention-default">
<!-- 基于paramsPrepareParamsStack,
增加store interceptor保证actionMessage在redirect后不会丢失 -->
<interceptors>
<interceptor-stack name="crudStack">
<interceptor-ref name="store">
<param name="operationMode">AUTOMATIC</param>
</interceptor-ref>
<interceptor-ref name="paramsPrepareParamsStack" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="crudStack" />
</package>
<!--
使用Convention插件,实现约定大于配置的零配置文件风格.
特殊的Result路径在Action类中使用@Result设定.
-->
</struts>
decorators.xml
<?xml version="1.0" encoding="UTF-8"?>
<decorators defaultdir="/WEB-INF/decorators">
<decorator name="main" page="main.ftl">
<pattern>/*</pattern>
</decorator>
</decorators>
HelloWorldAction.java
package org.david.android.action.user;
public class HelloWorldAction {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String execute(){
this.message = "ITdavid";
return "success";
}
}
main.ftl
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>${title}</title>
</head>
<body>
<div>
hello
${body}
</body>
</html>
hello-world.ftl
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="layout" content="main"/>
<title>Insert title here</title>
</head>
<body>
Hello ${message!}
</body>
</html>
posted @
2009-11-29 17:05 大卫 阅读(3281) |
评论 (4) |
编辑 收藏
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>fmtest</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/service-context.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<filter>
<display-name>Stripes Filter</display-name>
<filter-name>StripesFilter</filter-name>
<filter-class>net.sourceforge.stripes.controller.StripesFilter</filter-class>
<init-param>
<param-name>ActionResolver.Packages</param-name>
<param-value>net.sourceforge.stripes.examples</param-value>
</init-param>
<init-param>
<param-name>Interceptor.Classes</param-name>
<param-value>net.sourceforge.stripes.integration.spring.SpringInterceptor</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>StripesFilter</filter-name>
<servlet-name>StripesDispatcher</servlet-name>
</filter-mapping>
<servlet>
<servlet-name>StripesDispatcher</servlet-name>
<servlet-class>net.sourceforge.stripes.controller.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>StripesDispatcher</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Freemarker</servlet-name>
<servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>
<init-param>
<param-name>TemplatePath</param-name>
<param-value>/</param-value>
</init-param>
<init-param>
<param-name>template_update_delay</param-name>
<param-value>0</param-value> <!-- 0 is for dev only! Use higher value otherwise. -->
</init-param>
<init-param>
<param-name>DefaultEncoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Freemarker</servlet-name>
<url-pattern>*.ftl</url-pattern>
</servlet-mapping>
</web-app>
posted @
2009-11-25 15:45 大卫 阅读(1741) |
评论 (2) |
编辑 收藏
解决FreeMarker中文乱码问题。
在web.xml中配置如下:
<servlet>
<servlet-name>Freemarker</servlet-name>
<servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>
<init-param>
<param-name>TemplatePath</param-name>
<param-value>/</param-value>
</init-param>
<init-param>
<param-name>template_update_delay</param-name>
<param-value>3600</param-value> <!-- 0 值仅用于开发环境,生产环境请设置为3600或者更大。 -->
</init-param>
<init-param>
<param-name>DefaultEncoding</param-name> <!-- 解决中文编码问题 -->
<param-value>utf-8</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
--------------------
PES准高手
posted @
2009-11-25 15:02 大卫 阅读(5055) |
评论 (1) |
编辑 收藏
RT
太保守会影响效率,当某些代码逻辑是认为可控制时,不用保守。
posted @
2009-09-28 10:08 大卫 阅读(419) |
评论 (0) |
编辑 收藏
关于类的划分,上层应该按业务领域含义划分,下层应该按实现细节划分。
posted @
2009-09-27 12:10 大卫 阅读(405) |
评论 (0) |
编辑 收藏
其实很简单,就把标记@Id放在主键(非自增)上就OK了。
posted @
2009-02-25 14:12 大卫 阅读(2543) |
评论 (0) |
编辑 收藏
摘要: 在设计数据库表的时候,往往会设计出带有复合主键的表,即表的记录由多个字段联合标识,如:
表
CREATE TABLE TB_HOUR_DATA
(
STAT_DATE DATE &...
阅读全文
posted @
2009-02-25 14:10 大卫 阅读(2996) |
评论 (2) |
编辑 收藏
如何调用执行iframe中的方法?如下:
document.getElementById("iframeId").contentWindow.functionName();
posted @
2008-10-07 14:50 大卫 阅读(5346) |
评论 (5) |
编辑 收藏
http://www.nciku.com/
这个网站里面的手写输入真棒!
posted @
2008-09-19 14:15 大卫 阅读(1268) |
评论 (1) |
编辑 收藏
最近用smartdraw画了一些结构图,感觉比visio之类好用,而且也包罗万象,推荐一下!
下载地址:http://soft.mumayi.net/downinfo/3393.html
posted @
2008-09-18 14:04 大卫 阅读(1844) |
评论 (2) |
编辑 收藏
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**//* 判断是否含有GBK以外的特殊字符 */
boolean isGBK(String s) throws UnsupportedEncodingException
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
if(s.equals(new String(s.getBytes("gbk"))))
return true;
else
return false;
}
posted @
2008-09-16 13:04 大卫 阅读(870) |
评论 (1) |
编辑 收藏
使用这个组合,感觉还是很方便灵活的。
1、将struts2的json插件加入web工程的lib,jsonplugin的下载地址:
http://code.google.com/p/jsonplugin/downloads/list
2、struts.xml添加专为ajax使用的package
<package name="ajax" extends="json-default">
<action name="ajaxRequest"
class="org.david.struts2.HelloWorld">
<result type="json"></result>
</action>
</package>
3、helloworld.jsp
<SCRIPT type="text/javascript" src="js/jquery-1.2.6.min.js"></script>
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
<SCRIPT type="text/javascript">![](http://www.blogjava.net/Images/dot.gif)
function clickButton()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
var url = 'ajaxRequest.action';
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
var params =
{
name:$('#name').attr('value')
};
jQuery.post(url, params, callbackFun, 'json');
}
function callbackFun(data)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
alert(data.result);//对应HelloWorld类的message属性
//获取数据后渲染页面
}
</SCRIPT>
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/dot.gif)
![](/Images/OutliningIndicators/None.gif)
<input id="name" type="text">
<input type="button" value="ok" onclick="javascript:clickButton();">
4、HelloWorld.java
package org.david.struts2;
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
public class HelloWorld
{
![](/Images/OutliningIndicators/InBlock.gif)
private String name;
private String result;
![](/Images/OutliningIndicators/InBlock.gif)
// ajax请求参数赋值
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void setName(String name)
{
this.name = name;
}
![](/Images/OutliningIndicators/InBlock.gif)
// ajax返回结果
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public String getResult()
{
return result;
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public String execute()
{
this.result = "Hello! " + this.name + ".";
return "success";
}
![](/Images/OutliningIndicators/InBlock.gif)
}
posted @
2008-09-07 23:07 大卫 阅读(41948) |
评论 (17) |
编辑 收藏
鼠标手型代码:
this.style.cursor='pointer'
不要用hand,否则firefox无效。
posted @
2008-08-01 17:03 大卫 阅读(2327) |
评论 (1) |
编辑 收藏
word-wrap:break-word 在firefox中不会起作用,以下是解决办法:
完整的css代码为
word-wrap:break-word; overflow:hidden;
这段代码应添加到td标签的样式中。另外,应该在外层的table标签中添加样式
table-layout:fixed;
posted @
2008-07-11 13:34 大卫 阅读(2099) |
评论 (1) |
编辑 收藏
(.|\s)*
posted @
2008-06-23 14:49 大卫 阅读(920) |
评论 (0) |
编辑 收藏
按照下面做法,终于成功了!庆祝,纪念......
背景:某个系统的mysql数据库dnname采用默认的latin1字符集,系统升级需要将所有数据转换成utf-8格式,目标数据库为newdbname(建库时使用utf8)
方法一:
步骤一 命令行执行:mysqldump --opt -hlocalhost -uroot -p*** --default-character-set=lantin1 dbname > /usr/local/dbname.sql
步骤二 将 dbname.sql文件中的create table语句的CHARSET=latin1改为CHARSET=utf8
步骤三 在dbname.sql文件中的insert语句之前加一条'set names utf8;'
步骤四 将dbname.sql转码为utf-8格式,建议使用UltraEditor,可以直接使用该编辑器的'转换->ASCII到UTF-8(Unicode编辑)',或者将文件另存为UTF-8(无BOM)格式
步骤五 命令行执行:mysql -hlocalhost -uroot -p*** --default-character-set=utf8 new_dbname < /usr/local/dbname.sql
总结:这种方法有个致命之处就是当数据中有大量中文字符和其他特殊符号字符时,很有可能导致在[步骤五]时报错导致无法正常导入数据,如果数据库比较大可以分别对每张表执行上述步骤
方法二(推荐大家使用):
为了解决第一种方法中总结时说到的问题,在网上苦苦查找了一天资料才东拼西凑的搞出一个比较稳妥的解决方法
步骤一 将待导出的数据表的表结构导出(可以用Phpmyadmin、mysqldump等,很简单就不说了),然后将导出的create table语句的CHARSET=latin1改为CHARSET=utf8,在目标库newdbname中执行该create table语句把表结构建好,接下来开始导出-导入数据。命令:
./mysqldump -d DB_Dig > /usr/local/tmp/tables.sql
步骤二 命令行:进入mysql命令行下,mysql -hlocalhost -uroot -p*** dbname
步骤三 执行SQL select * from tbname into outfile '/usr/local/tbname.sql';
步骤四 将tbname.sql转码为utf-8格式,建议使用UltraEditor,可以直接使用该编辑器的'转换->ASCII到UTF-8(Unicode编辑)',或者将文件另存为UTF-8(无BOM)格式
步骤五 在mysql命令行下执行语句 set character_set_database=utf8; 注:设置mysql的环境变量,这样mysql在下一步读取sql文件时将以utf8的形式去解释该文件内容
步骤六 在mysql命令行下执行语句 load data infile 'tbname.sql' into table newdbname.tbname;
注意:千万不要忘了第四步
采用第二种方法,所有数据均正常导入,且格式转换成功没有乱码。
参考:http://blog.csdn.net/guoguo1980/archive/2008/01/28/2070701.aspx
--------------------
WE准高手
posted @
2008-06-11 16:54 大卫 阅读(8952) |
评论 (8) |
编辑 收藏
编译:
运行junit:
java -cp ../lib/junit.jar:../lib/j2ee.jar:. junit.textui.TestRunner com.chinaren.common.ToolKitTest
posted @
2008-06-10 18:32 大卫 阅读(1187) |
评论 (0) |
编辑 收藏
build.xml
1
<?xml version="1.0"?>
2
<project name="anttest" default="run">
3
<property name="build.path" value="build/classes/"/>
4
<path id="compile.classpath">
5
<fileset dir="lib">
6
<include name="*.jar"/>
7
</fileset>
8
</path>
9![](/Images/OutliningIndicators/None.gif)
10
<target name="init">
11
<mkdir dir="${build.path}" />
12
<mkdir dir="dist" />
13
</target>
14
<target name="compile" depends="init">
15
<javac srcdir="src/" destdir="${build.path}" classpath="${build.path}">
16
<classpath refid="compile.classpath"/>
17
</javac>
18
<echo>compilation complete!</echo>
19
</target>
20
<target name="run" depends="compile">
21
<java classname="org.test.work.HelloWorld" classpath="${build.path}" />
22
<echo>Run complete!</echo>
23
</target>
24![](/Images/OutliningIndicators/None.gif)
25
<target name="test" depends="compile">
26
<junit printsummary="on" haltonfailure="true" showoutput="true">
27
<classpath refid="compile.classpath"/>
28
<classpath path="${build.path}"/>
29
<formatter type="xml" />
30
<test name="org.test.work.HelloWorldTest"/>
31
</junit>
32
</target>
33
34
</project>
HelloWorld.java
1
package org.test.work;
2![](/Images/OutliningIndicators/None.gif)
3![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
public class HelloWorld
{
4![](/Images/OutliningIndicators/InBlock.gif)
5![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public String showMessage()
{
6
return "Hello world!!!";
7
}
8![](/Images/OutliningIndicators/InBlock.gif)
9![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public static void main(String[] args)
{
10
11
System.out.println("Hello world!!!");
12
}
13
}
HelloWorldTest.java
1
package org.test.work;
2![](/Images/OutliningIndicators/None.gif)
3
import static org.junit.Assert.*;
4
import org.junit.*;
5![](/Images/OutliningIndicators/None.gif)
6
import org.test.work.HelloWorld;
7![](/Images/OutliningIndicators/None.gif)
8![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
public class HelloWorldTest
{
9![](/Images/OutliningIndicators/InBlock.gif)
10
private static HelloWorld hw = null;
11![](/Images/OutliningIndicators/InBlock.gif)
12
@BeforeClass
13![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public static void setUp()
{
14
hw = new HelloWorld();
15
}
16![](/Images/OutliningIndicators/InBlock.gif)
17
@Test
18![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void showHelloWorld()
{
19
assertEquals(hw.showMessage(),"Hello world!!!");
20
}
21![](/Images/OutliningIndicators/InBlock.gif)
22
@AfterClass
23![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public static void tearDown()
{
24
hw = null;
25
}
26![](/Images/OutliningIndicators/InBlock.gif)
27
}
posted @
2008-06-09 20:24 大卫 阅读(421) |
评论 (0) |
编辑 收藏
JSP+jQuery+Spring+iBatis
posted @
2008-05-29 21:06 大卫 阅读(263) |
评论 (0) |
编辑 收藏
编译:
1
D:\je-3.2.76\examples\je>javac -classpath ..\..\lib\je-3.2.76.jar .\SimpleExample.java
执行:
D:\je-3.2.76\examples>java -classpath .\;..\lib\je-3.2.76.jar je.SimpleExample
posted @
2008-05-07 15:28 大卫 阅读(445) |
评论 (1) |
编辑 收藏
超级简单的一段代码,通过正则表达式获取字符串中某部分的值,代码:
1![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/** *//**
2
* 这段代码就是要获取到字符串"2008-05-10"的月份值及日期
3
*/
4
5
Pattern pattern = Pattern.compile("[0-9]{4}-([0-9]{1,2})-([0-9]{1,2})");//括号用于组获取
6
Matcher matcher = pattern.matcher("2008-05-10");
7
8
int i = 0;
9
//循环只运行了一次
10
while(matcher.find())
11![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
12
System.out.println(++i);
13
System.out.println(matcher.group(0));//组0为全部串值
14
System.out.println(matcher.group(1));//pattern模式中中间的括号中的为组1
15
System.out.println(matcher.group(2));//pattern模式中后面的括号中的为组2
16
}
posted @
2008-05-05 18:16 大卫 阅读(1071) |
评论 (0) |
编辑 收藏
执行如下批处理:
1
@echo off
2
echo 正在清除系统垃圾文件,请稍等![](http://www.blogjava.net/Images/dot.gif)
3
del /f /s /q %systemdrive%\*.tmp
4
del /f /s /q %systemdrive%\*._mp
5
del /f /s /q %systemdrive%\*.log
6
del /f /s /q %systemdrive%\*.gid
7
del /f /s /q %systemdrive%\*.chk
8
del /f /s /q %systemdrive%\*.old
9
del /f /s /q %systemdrive%\recycled\*.*
10
del /f /s /q %windir%\*.bak
11
del /f /s /q %windir%\prefetch\*.*
12
rd /s /q %windir%\temp & md %windir%\temp
13
del /f /q %userprofile%\小甜饼s\*.*
14
del /f /q %userprofile%\recent\*.*
15
del /f /s /q "%userprofile%\Local Settings\Temporary Internet Files\*.*"
16
del /f /s /q "%userprofile%\Local Settings\Temp\*.*"
17
del /f /s /q "%userprofile%\recent\*.*"
18
echo 清除系统LJ完成!
19
echo. & pause
绝对安全!
--------------------
WE准高手
posted @
2008-03-30 18:22 大卫 阅读(1626) |
评论 (8) |
编辑 收藏
数据格式:
1![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
var folders=[
{'folderId':'1','folderName':'收信箱'},
{'folderId':'2','folderName':'发信箱'}];
2![](/Images/OutliningIndicators/None.gif)
3
//用于下拉列表的store
4![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
var foldersJsonStore = new Ext.data.SimpleStore(
{
5![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
fields: [
{name: 'folderId', mapping:'folderId'},
{name: 'folderName', mapping:'folderName'}],
6
data: folders
7
});
刷新数据:
1
foldersJsonStore.loadData(folders);
下拉框组件:
1![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
var combo = new Ext.form.ComboBox(
{
2
fieldLabel: '文件夹',
3
name: 'folderMoveTo',
4
store: foldersJsonStore,
5
displayField: 'folderName',
6
valueField: 'folderId',
7
mode: 'local',
8
typeAhead: true, //自动将第一个搜索到的选项补全输入
9
triggerAction: 'all',
10
emptyText: '全部',
11
selectOnFocus: true,
12
forceSelection: true
13
})
--------------------
WE准高手
posted @
2008-03-28 15:07 大卫 阅读(5610) |
评论 (4) |
编辑 收藏
摘要: 在使用Ext与DWR框架时,我们往往会用到GridPanel组件搭配PagingToolbar组件来实现翻页数据列表。翻页的时候每一页都要从后台获取该页的数据列表信息。
在解决此问题时,花了不少时间,看过不少前人的代码,终于成功了!共享之。
关键代码如下:
Store为:
1var ds = new Ext.data.Store({
...
阅读全文
posted @
2008-03-20 13:51 大卫 阅读(6930) |
评论 (1) |
编辑 收藏
一、配置
在页面中添加:
1![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
<script type='text/javascript' src='dwr/interface/Folder.js'>![](http://www.blogjava.net/Images/dot.gif)
2
</script>
3![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
<script type='text/javascript' src='dwr/engine.js'>![](http://www.blogjava.net/Images/dot.gif)
4
</script>
5![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
<script type='text/javascript' src='dwr/util.js'>![](http://www.blogjava.net/Images/dot.gif)
6
</script>
需要注意的是路径,而不是官方的:
1
<script type='text/javascript' src='../interface/Folder.js'></script>
2
<script type='text/javascript' src='../engine.js'></script>
3
<script type='text/javascript' src='../util.js'></script>
二、返回的json串需要进行处理,才可以在前台javascript正确处理。
使用json-lib的JSONArray对List类型数据进行处理:
1
JSONArray.fromObject(folders).toString();
返回List型的json数据为:
1![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
[
{"folderId":1,"folderName":"收信箱"},
{"folderId":2,"folderName":"发信箱"},
{"folderId":3,"folderName":"草稿箱"},
{"folderId":4,"folderName":"回收站"},
{"folderId":5,"folderName":"垃圾箱"}]
这个数据返回到前台一定要用Ext.util.JSON.decode(data)进行编码,否则javascript不能正常处理。
1
//刷新文件夹列表,DWR获取数据。
2![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
function initFolders()
{
3
Folder.getFolderList(refrashFolders);}
4![](/Images/OutliningIndicators/None.gif)
5![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
function refrashFolders(data)
{
6
folders = Ext.util.JSON.decode(data);//一定要用这个进行解码
7
initFolderTreeNode();}
--------------------
WE准高手
posted @
2008-03-14 10:21 大卫 阅读(2414) |
评论 (1) |
编辑 收藏
摘要: 页面代码:
1<html>
2 <head>
3 <meta http-equiv="Content-Type" content="text/html; ch...
阅读全文
posted @
2008-03-07 16:11 大卫 阅读(5065) |
评论 (1) |
编辑 收藏
1
package test;
2![](/Images/OutliningIndicators/None.gif)
3
import java.lang.reflect.Method;
4
import java.lang.reflect.ParameterizedType;
5
import java.lang.reflect.Type;
6
import java.util.List;
7
import java.util.Map;
8![](/Images/OutliningIndicators/None.gif)
9![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
public class TempTest
{
10![](/Images/OutliningIndicators/InBlock.gif)
11![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public static void main(String[] args) throws Exception
{
12
Method[] methods = TempTest.class.getDeclaredMethods();
13![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
for (Method method : methods)
{
14
System.out.println("method:" + method.getName());// 方法名
15![](/Images/OutliningIndicators/InBlock.gif)
16
// //////////////方法的参数
17
System.out.println(" paramTypeType: ");
18
Type[] paramTypeList = method.getGenericParameterTypes();// 方法的参数列表
19![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
for (Type paramType : paramTypeList)
{
20
System.out.println(" " + paramType);// 参数类型
21![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (paramType instanceof ParameterizedType)/**//* 如果是泛型类型 */
{
22
Type[] types = ((ParameterizedType) paramType)
23
.getActualTypeArguments();// 泛型类型列表
24
System.out.println(" TypeArgument: ");
25![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
for (Type type : types)
{
26
System.out.println(" " + type);
27
}
28
}
29
}
30![](/Images/OutliningIndicators/InBlock.gif)
31
// //////////////方法的返回值
32
System.out.println(" returnType: ");
33
Type returnType = method.getGenericReturnType();// 返回类型
34
System.out.println(" " + returnType);
35![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (returnType instanceof ParameterizedType)/**//* 如果是泛型类型 */
{
36
Type[] types = ((ParameterizedType) returnType)
37
.getActualTypeArguments();// 泛型类型列表
38
System.out.println(" TypeArgument: ");
39![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
for (Type type : types)
{
40
System.out.println(" " + type);
41
}
42
}
43![](/Images/OutliningIndicators/InBlock.gif)
44
}
45![](/Images/OutliningIndicators/InBlock.gif)
46
}
47![](/Images/OutliningIndicators/InBlock.gif)
48![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public static String method1(List list)
{
49
return null;
50
}
51![](/Images/OutliningIndicators/InBlock.gif)
52![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
private static Map<String, Double> method2(Map<String, Object> map)
{
53
return null;
54
}
55![](/Images/OutliningIndicators/InBlock.gif)
56
}
posted @
2008-02-28 10:29 大卫 阅读(5796) |
评论 (3) |
编辑 收藏
算法程序题:
该公司笔试题就1个,要求在10分钟内作完。
题目如下:用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。
基本思路:
1 把问题归结为图结构的遍历问题。实际上6个数字就是六个结点,把六个结点连接成无向连通图,对于每一个结点求这个图形的遍历路径,所有结点的遍历路径就是最后对这6个数字的排列组合结果集。
2 显然这个结果集还未达到题目的要求。从以下几个方面考虑:
1. 3,5不能相连:实际要求这个连通图的结点3,5之间不能连通, 可在构造图结构时就满足改条件,然后再遍历图。
2. 不能有重复: 考虑到有两个2,明显会存在重复结果,可以把结果集放在TreeSet中过滤重复结果。//TreeSet用于过滤一个集合中相同的东西还真是个挺不错的方法
3. 4不能在第三位: 仍旧在结果集中去除满足此条件的结果。
采用二维数组定义图结构,最后的代码是:
1
package test;
2![](/Images/OutliningIndicators/None.gif)
3
import java.util.Iterator;
4
import java.util.TreeSet;
5![](/Images/OutliningIndicators/None.gif)
6![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
public class TestQuestion
{
7![](/Images/OutliningIndicators/InBlock.gif)
8![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
private String[] b = new String[]
{ "1", "2", "2", "3", "4", "5" };
9
private int n = b.length;
10
private boolean[] visited = new boolean[n];
11
private int[][] a = new int[n][n];
12
private String result = "";
13
private TreeSet treeSet = new TreeSet();// 用于保存结果,具有过滤相同结果的作用。
14![](/Images/OutliningIndicators/InBlock.gif)
15![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public static void main(String[] args)
{
16
new TestQuestion().start();
17
}
18![](/Images/OutliningIndicators/InBlock.gif)
19![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
private void start()
{
20
// 创建合法路径标识集合
21![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
for (int i = 0; i < n; i++)
{
22![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
for (int j = 0; j < n; j++)
{
23![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (i == j)
{
24
a[i][j] = 0;
25![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else
{
26
a[i][j] = 1;
27
}
28
}
29
}
30
a[3][5] = 0;
31
a[5][3] = 0;
32![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
for (int i = 0; i < n; i++)
{
33
this.depthFirstSearch(i);// 深度递归遍历
34
}
35
Iterator it = treeSet.iterator();
36![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
while (it.hasNext())
{
37
String string = (String) it.next();
38![](/Images/OutliningIndicators/InBlock.gif)
39![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (string.indexOf("4") != 2)
{
40
System.out.println(string);
41
}
42
}
43
}
44![](/Images/OutliningIndicators/InBlock.gif)
45![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/** *//**
46
* 深度优先遍历
47
*
48
* @param startIndex
49
*/
50![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
private void depthFirstSearch(int startIndex)
{
51
// 递归的工作
52
visited[startIndex] = true;// 用于标识已经走过的节点
53
result = result + b[startIndex];// 构造结果
54![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (result.length() == n)
{
55
treeSet.add(result);// 添加到TreeSet类型中,具有过滤相同结果的作用
56
}
57
// 每走到一个节点,挨个遍历下一个节点
58![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
for (int j = 0; j < n; j++)
{
59![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (a[startIndex][j] == 1 && visited[j] == false)
{
60
depthFirstSearch(j);// 深度递归遍历
61![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else
{
62
continue;
63
}
64
}
65
// 递归的收尾工作
66
result = result.substring(0, result.length() - 1);
67
visited[startIndex] = false;// 取消访问标识
68
}
69
}
70![](/Images/OutliningIndicators/None.gif)
--------------------
WE准高手
posted @
2008-02-27 14:30 大卫 阅读(2986) |
评论 (12) |
编辑 收藏
TreeSet类型是J2SE中唯一可实现自动排序的类型,用法如下:
MyComparator.java
1
package test;
2![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
3
import java.util.Comparator;
4![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
5![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
public class MyComparator<T> implements Comparator<T>
{
6![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
7![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public int compare(T arg0, T arg1)
{
8![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (arg0.equals(arg1))
{
9
return 0;
10
}
11
return ((Comparable<T>) arg0).compareTo(arg1) * -1;
12
}
13![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
14
}
TreeSetTest.java
1
package test;
2![](/Images/OutliningIndicators/None.gif)
3
import java.util.Iterator;
4
import java.util.TreeSet;
5![](/Images/OutliningIndicators/None.gif)
6![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
public class TreeSetTest
{
7![](/Images/OutliningIndicators/InBlock.gif)
8![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/** *//**
9
* @param args
10
*/
11![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public static void main(String[] args)
{
12![](/Images/OutliningIndicators/InBlock.gif)
13
MyComparator<String> myComparator = new MyComparator<String>();
14![](/Images/OutliningIndicators/InBlock.gif)
15
// /////////////////////不添加自定义排序
16
TreeSet<String> treeSet1 = new TreeSet<String>();
17
treeSet1.add("c");
18
treeSet1.add("a");
19
treeSet1.add("b");
20![](/Images/OutliningIndicators/InBlock.gif)
21
Iterator<String> iterator1 = treeSet1.iterator();
22![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
while (iterator1.hasNext())
{
23
System.out.println(iterator1.next());
24
}
25![](/Images/OutliningIndicators/InBlock.gif)
26
// /////////////////////添加自定义排序
27
TreeSet<String> treeSet2 = new TreeSet<String>(myComparator);
28
treeSet2.add("c");
29
treeSet2.add("a");
30
treeSet2.add("b");
31![](/Images/OutliningIndicators/InBlock.gif)
32
Iterator<String> iterator2 = treeSet2.iterator();
33![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
while (iterator2.hasNext())
{
34
System.out.println(iterator2.next());
35
}
36
}
37![](/Images/OutliningIndicators/InBlock.gif)
38
}
39![](/Images/OutliningIndicators/None.gif)
运行结果:
--------------------
WE准高手
posted @
2008-02-27 13:34 大卫 阅读(8419) |
评论 (3) |
编辑 收藏
假设要添加库文件
richfaces-ui-3.1.3.GA.jar
1、为库
richfaces-ui-3.1.3.GA.jar文件建立pom文件
richfaces-ui-3.1.3.GA.pom
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>
4.0.0</modelVersion>
<groupId>
org.richfaces</groupId>
<artifactId>
richfaces-ui</artifactId>
<version>
3.1.3.GA</version>
<name>RichFaces JSF components library</name>
<packaging>jar</packaging>
</project>
2、用ant为jar和pom文件分别生成校验文件.sha1
<project default="main">
<target name="main" description="Generate checksum file for jar and pom">
<checksum algorithm="SHA" fileext=".sha1">
<fileset dir="
F:/software/java/richfaces-ui-3.1.3.GA/lib" id="id">
<include name="**/*.pom" />
<include name="**/*.jar" />
<include name="**/*.xml" />
<exclude name="**/*.sh1" />
</fileset>
</checksum>
</target>
</project>
3、在.m2目录中创建该库文件的代码库目录
.m2\repository\org\richfaces\richfaces-ui\3.1.3.GA
其中,
org\richfaces为包路径,
richfaces-ui为包名,
3.1.3.GA为版本,这三项是与pom文件中的
groupId,artifactId,version分别对应的。
将
richfaces-ui-3.1.3.GA.jar,richfaces-ui-3.1.3.GA.jar.sha1,richfaces-ui-3.1.3.GA.pom,richfaces-ui-3.1.3.GA.pom.sha1拷贝到该目录下。
4、在工程的pom文件中添加依赖
<dependency>
<groupId>
org.richfaces</groupId>
<artifactId>
richfaces-ui</artifactId>
<version>
3.1.3.GA</version>
</dependency>
--------------------
WE准高手
posted @
2008-02-12 15:07 大卫 阅读(1445) |
评论 (0) |
编辑 收藏
1、mvn archetype:create -DgroupId=org.david.app -DartifactId=mywebapp -DarchetypeArtifactId=maven-archetype-webapp
2、cd mywebapp
mvn eclipse:eclipse
导入eclipse工程
(或者直接从eclipse中导入maven工程)
3、添加servlet依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
4、添加源代码目录src/main/java
将源代码放在该目录下。
5、添加jetty插件
<build>
<finalName>mywebapp</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
</plugin>
</plugins>
</build>
6、用jetty调试(http://www.blogjava.net/alwayscy/archive/2007/06/01/118584.html)
命令行:mvn jetty:run
或者
1、先来配置一个外部工具,来运行JETTY:
选择菜单Run->External Tools->External Tools ...在左边选择Program,再点New:
配置
Location为mvn完整命令行。定位到bin下的mvn.bat
选择
Working Directory为本项目。
Arguments填写:jetty:run
再点选Enviroment页:加入MAVEN_OPTS变量,值为:
-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=
8080,server=y,suspend=
y
其中,如果suspend=n 表示不调试,直接运行。address=8080为端口
然后,点APPLY,再关闭本对话框。
另外注意一点,好像external tool菜单项在java browering的perspective下才会出现。如果在java下看不见,可以切换下试试。
启动jetty
2、调试应用
点选run->debug...
选中左树中的Remote Java Application,再点New。
选择你的项目,关键是要填和之前设置外部工具时相同的端口号。
--------------------
WE准高手
posted @
2008-02-12 15:05 大卫 阅读(6466) |
评论 (1) |
编辑 收藏
tomcatPlugin(启动tomcat):http://www.sysdeo.com/eclipse/tomcatPlugin.html,2.x版本的eclipse要用3的版本,2.1版本不好用。
Lomboz(开发jsp程序,jsp动态提示,调试):http://forge.objectweb.org/project/showfiles.php?group_id=97
CSS Editor for Eclipse
http://csseditor.sourceforge.net/
FacesIDE
FacesIDE是一个用于开发JSF的Eclispe插件.它可以可视化编辑faces-config.xml文件并且提供代码编辑与校验,预览JSF的JSP文件.FacesIDE包含MyFaces来作为JSF的实现
http://amateras.sourceforge.jp/cgi-b ... iki.cgi?page=FacesIDE
Eclipse SQLExplorer plugin
一个数据库管理插件
http://sourceforge.net/projects/eclipsesql
Poperties Editor
一个在编辑完成后可以将资源文件中的中文编码格式转换为unicode编码的插件,在开发国际化应用程序的时候非常有用
http://propedit.sourceforge.jp/eclipse/updates/
eclipseME
http://eclipseme.org/updates/
Eclipse加速插件KeepResident
http://suif.stanford.edu/pub/keepresident/
MyEclipse J2EE开发插件,支持SERVLET/JSP/EJB/数据库操纵等
www.myeclipseide.com
Properties Editor 编辑java的属性文件,并可以自动存盘为Unicode格式
http://propedit.sourceforge.jp/index_en.html
http://propedit.sourceforge.jp/eclipse/updates/
Colorer Take 为上百种类型的文件按语法着色
http://colorer.sourceforge.net/
XMLBuddy 编辑xml文件
www.xmlbuddy.com
Code Folding 加入多种代码折叠功能(比eclipse自带的更多)
http://www.coffee-bytes.com/servlet/PlatformSupport
Easy Explorer 从eclipse中访问选定文件、目录所在的文件夹
http://easystruts.sourceforge.net/
Fat Jar 打包插件,可以方便的完成各种打包任务,可以包含外部的包等
http://fjep.sourceforge.net/
RegEx Test 测试正则表达式
http://brosinski.com/stephan/archives/000028.php
JasperAssistant 报表插件(强,要钱的)
http://www.jasperassistant.com/
Jigloo GUI Builder JAVA的GUI编辑插件
http://cloudgarden.com/jigloo/
Profiler 性能跟踪、测量工具,能跟踪、测量BS程序
http://sourceforge.net/projects/eclipsecolorer/
AdvanQas 提供对if/else等条件语句的提示和快捷帮助(自动更改结构等)
http://eclipsecolorer.sourceforge.net/advanqas/index.html
Log4E Log4j插件,提供各种和Log4j相关的任务,如为方法、类添加一个logger等
http://log4e.jayefem.de/index.php/Main_Page
VSSPlugin VSS插件
http://sourceforge.net/projects/vssplugin
Implementors 提供跳转到一个方法的实现类,而不是接口中的功能(实用!)
http://eclipse-tools.sourceforge.net/implementors/
Call Hierarchy 显示一个方法的调用层次(被哪些方法调,调了哪些方法)
http://eclipse-tools.sourceforge.net/call-hierarchy/index.html
EclipseTidy 检查和格式化HTML/XML文件
http://eclipsetidy.sourceforge.net/
Checkclipse 检查代码的风格、写法是否符合规范
http://www.mvmsoft.de/content/plugins/checkclipse/checkclipse.htm
Hibernate Synchronizer Hibernate插件,自动映射等
http://www.binamics.com/hibernatesync/
spring updatesite 插件
http://springide.org/updatesite/
VeloEclipse Velocity插件
http://propsorter.sourceforge.net/
EditorList 方便的列出所有打开的Editor
http://editorlist.sourceforge.net/
MemoryManager 内存占用率的监视
http://cloudgarden.com/memorymanager/
Eclipse的游戏插件
http://eclipse-games.sourceforge.net/
JBoss-IDE
http://jboss.sourceforge.net/jbosside/updates/
自动反编译class,安装后要设定class文件缺省关联到jode
http://www.technoetic.com/eclipse/update
jigloo swing/sw设计工具,里面自带的form/anchor布局很好用!
http://cloudgarden.soft-gems.net/update-site/
jinto的资源文件编辑工具,同时编辑多种语言,而且自动转换成iso8859-1编码。很好用!
http://www.guh-software.de/eclipse/
lomboz:
http://forge.objectweb.org/project/showfiles.php?group_id=97
emf:模型框架
http://download.eclipse.org/tools/emf/scripts/downloads-viewer.php?s=2.1.0/R200507070200
--------------------
WE准高手
posted @
2008-02-04 18:38 大卫 阅读(4343) |
评论 (3) |
编辑 收藏
发布时间:2007.11.28 04:52 来源:赛迪网 作者:baocl |
(1) 类名首字母应该大写。字段、方法以及对象(句柄)的首字母应小写。对于所有标识符,其中包含的所有单词都应紧靠在一起,而且大写中间单词的首字母。例如:
ThisIsAClassName
thisIsMethodOrFieldName
若在定义中出现了常数初始化字符,则大写static final基本类型标识符中的所有字母。这样便可标志出它们属于编译期的常数。
Java包(Package)属于一种特殊情况:它们全都是小写字母,即便中间的单词亦是如此。对于域名扩展名称,如com,org,net或者edu等,全部都应小写(这也是Java 1.1和Java 1.2的区别之一)。
(2) 为了常规用途而创建一个类时,请采取“经典形式”,并包含对下述元素的定义:
equals()
hashCode()
toString()
clone()(implement Cloneable)
implement Serializable
(3) 对于自己创建的每一个类,都考虑置入一个main(),其中包含了用于测试那个类的代码。为使用一个项目中的类,我们没必要删除测试代码。若进行了任何形式的改动,可方便地返回测试。这些代码也可作为如何使用类的一个示例使用。
(4) 应将方法设计成简要的、功能性单元,用它描述和实现一个不连续的类接口部分。理想情况下,方法应简明扼要。若长度很大,可考虑通过某种方式将其分割成较短的几个方法。这样做也便于类内代码的重复使用(有些时候,方法必须非常大,但它们仍应只做同样的一件事情)。
(5) 设计一个类时,请设身处地为客户程序员考虑一下(类的使用方法应该是非常明确的)。然后,再设身处地为管理代码的人考虑一下(预计有可能进行哪些形式的修改,想想用什么方法可把它们变得更简单)。
(6) 使类尽可能短小精悍,而且只解决一个特定的问题。下面是对类设计的一些建议:
■一个复杂的开关语句:考虑采用“多形”机制
■数量众多的方法涉及到类型差别极大的操作:考虑用几个类来分别实现
■许多成员变量在特征上有很大的差别:考虑使用几个类
(7) 让一切东西都尽可能地“私有”——private。可使库的某一部分“公共化”(一个方法、类或者一个字段等等),就永远不能把它拿出。若强行拿出,就可能破坏其他人现有的代码,使他们不得不重新编写和设计。若只公布自己必须公布的,就可放心大胆地改变其他任何东西。在多线程环境中,隐私是特别重要的一个因素——只有private字段才能在非同步使用的情况下受到保护。
(8) 谨惕“巨大对象综合症”。对一些习惯于顺序编程思维、且初涉OOP领域的新手,往往喜欢先写一个顺序执行的程序,再把它嵌入一个或两个巨大的对象里。根据编程原理,对象表达的应该是应用程序的概念,而非应用程序本身。
(9) 若不得已进行一些不太雅观的编程,至少应该把那些代码置于一个类的内部。
(10) 任何时候只要发现类与类之间结合得非常紧密,就需要考虑是否采用内部类,从而改善编码及维护工作(参见第14章14.1.2小节的“用内部类改进代码”)。
(11) 尽可能细致地加上注释,并用javadoc注释文档语法生成自己的程序文档。
(12) 避免使用“魔术数字”,这些数字很难与代码很好地配合。如以后需要修改它,无疑会成为一场噩梦,因为根本不知道“100”到底是指“数组大小”还是“其他全然不同的东西”。所以,我们应创建一个常数,并为其使用具有说服力的描述性名称,并在整个程序中都采用常数标识符。这样可使程序更易理解以及更易维护。
(13) 涉及构建器和异常的时候,通常希望重新丢弃在构建器中捕获的任何异常——如果它造成了那个对象的创建失败。这样一来,调用者就不会以为那个对象已正确地创建,从而盲目地继续。
(14) 当客户程序员用完对象以后,若你的类要求进行任何清除工作,可考虑将清除代码置于一个良好定义的方法里,采用类似于cleanup()这样的名字,明确表明自己的用途。除此以外,可在类内放置一个boolean(布尔)标记,指出对象是否已被清除。在类的finalize()方法里,请确定对象已被清除,并已丢弃了从RuntimeException继承的一个类(如果还没有的话),从而指出一个编程错误。在采取象这样的方案之前,请确定finalize()能够在自己的系统中工作(可能需要调用System.runFinalizersOnExit(true),从而确保这一行为)。
(15) 在一个特定的作用域内,若一个对象必须清除(非由垃圾收集机制处理),请采用下述方法:初始化对象;若成功,则立即进入一个含有finally从句的try块,开始清除工作。
(16) 若在初始化过程中需要覆盖(取消)finalize(),请记住调用super.finalize()(若Object属于我们的直接超类,则无此必要)。在对finalize()进行覆盖的过程中,对super.finalize()的调用应属于最后一个行动,而不应是第一个行动,这样可确保在需要基础类组件的时候它们依然有效。
(17) 创建大小固定的对象集合时,请将它们传输至一个数组(若准备从一个方法里返回这个集合,更应如此操作)。这样一来,我们就可享受到数组在编译期进行类型检查的好处。此外,为使用它们,数组的接收者也许并不需要将对象“造型”到数组里。
(18) 尽量使用interfaces,不要使用abstract类。若已知某样东西准备成为一个基础类,那么第一个选择应是将其变成一个interface(接口)。只有在不得不使用方法定义或者成员变量的时候,才需要将其变成一个abstract(抽象)类。接口主要描述了客户希望做什么事情,而一个类则致力于(或允许)具体的实施细节。
(19) 在构建器内部,只进行那些将对象设为正确状态所需的工作。尽可能地避免调用其他方法,因为那些方法可能被其他人覆盖或取消,从而在构建过程中产生不可预知的结果(参见第7章的详细说明)。
(20) 对象不应只是简单地容纳一些数据;它们的行为也应得到良好的定义。
(21) 在现成类的基础上创建新类时,请首先选择“新建”或“创作”。只有自己的设计要求必须继承时,才应考虑这方面的问题。若在本来允许新建的场合使用了继承,则整个设计会变得没有必要地复杂。
(22) 用继承及方法覆盖来表示行为间的差异,而用字段表示状态间的区别。一个非常极端的例子是通过对不同类的继承来表示颜色,这是绝对应该避免的:应直接使用一个“颜色”字段。
(23) 为避免编程时遇到麻烦,请保证在自己类路径指到的任何地方,每个名字都仅对应一个类。否则,编译器可能先找到同名的另一个类,并报告出错消息。若怀疑自己碰到了类路径问题,请试试在类路径的每一个起点,搜索一下同名的.class文件。
(24) 在Java 1.1 AWT中使用事件“适配器”时,特别容易碰到一个陷阱。若覆盖了某个适配器方法,同时拼写方法没有特别讲究,最后的结果就是新添加一个方法,而不是覆盖现成方法。然而,由于这样做是完全合法的,所以不会从编译器或运行期系统获得任何出错提示——只不过代码的工作就变得不正常了。
(25) 用合理的设计方案消除“伪功能”。也就是说,假若只需要创建类的一个对象,就不要提前限制自己使用应用程序,并加上一条“只生成其中一个”注释。请考虑将其封装成一个“独生子”的形式。若在主程序里有大量散乱的代码,用于创建自己的对象,请考虑采纳一种创造性的方案,将些代码封装起来。
(26) 警惕“分析瘫痪”。请记住,无论如何都要提前了解整个项目的状况,再去考察其中的细节。由于把握了全局,可快速认识自己未知的一些因素,防止在考察细节的时候陷入“死逻辑”中。
(27) 警惕“过早优化”。首先让它运行起来,再考虑变得更快——但只有在自己必须这样做、而且经证实在某部分代码中的确存在一个性能瓶颈的时候,才应进行优化。除非用专门的工具分析瓶颈,否则很有可能是在浪费自己的时间。性能提升的隐含代价是自己的代码变得难于理解,而且难于维护。
(28) 请记住,阅读代码的时间比写代码的时间多得多。思路清晰的设计可获得易于理解的程序,但注释、细致的解释以及一些示例往往具有不可估量的价值。无论对你自己,还是对后来的人,它们都是相当重要的。如对此仍有怀疑,那么请试想自己试图从联机Java文档里找出有用信息时碰到的挫折,这样或许能将你说服。
(29) 如认为自己已进行了良好的分析、设计或者实施,那么请稍微更换一下思维角度。试试邀请一些外来人士——并不一定是专家,但可以是来自本公司其他部门的人。请他们用完全新鲜的眼光考察你的工作,看看是否能找出你一度熟视无睹的问题。采取这种方式,往往能在最适合修改的阶段找出一些关键性的问题,避免产品发行后再解决问题而造成的金钱及精力方面的损失。
(30) 良好的设计能带来最大的回报。简言之,对于一个特定的问题,通常会花较长的时间才能找到一种最恰当的解决方案。但一旦找到了正确的方法,以后的工作就轻松多了,再也不用经历数小时、数天或者数月的痛苦挣扎。我们的努力工作会带来最大的回报(甚至无可估量)。而且由于自己倾注了大量心血,最终获得一个出色的设计方案,成功的快感也是令人心动的。坚持抵制草草完工的诱惑——那样做往往得不偿失。
(责任编辑:包春林)
|
文章来自:http://nolan022.javaeye.com/blog/161326
posted @
2008-02-04 15:38 大卫 阅读(3034) |
评论 (2) |
编辑 收藏
下面是用PipedInputStream,PipedOutputStream实现的输入流与输出流的链接:
PipedInputStream pis = new PipedInputStream();
PipedOutputStream pos = new PipedOutputStream();
pos.connect(pis);
用commons-io的IOUtils.copy方法也可以实现输入流、输出流的链接,但是原理是不一样的。
--------------------
WE准高手
posted @
2008-02-03 14:56 大卫 阅读(2794) |
评论 (3) |
编辑 收藏
maven上传jar的pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.asiainfo.mime4j</groupId><!- 存储位置 -->
<artifactId>aimime4j</artifactId><!- 工程名 -->
<name>aimime4j</name>
<version>1.0-SNAPSHOT</version>
<url>http://localhost</url><!- 服务器 -->
![](/Images/OutliningIndicators/None.gif)
<!- 部署位置 -->
<distributionManagement>
<repository>
<id>aicu-repository</id>
<name>AICU Repository</name>
<url>ftp://localhost/repository/</url>
</repository>
</distributionManagement>
![](/Images/OutliningIndicators/None.gif)
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.1</version>
</dependency>
</dependencies>
![](/Images/OutliningIndicators/None.gif)
<!- 需要的插件 -->
<build>
<defaultGoal>install</defaultGoal>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
</plugins>
<extensions>
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ftp</artifactId>
<version>1.0-alpha-6</version>
</extension>
</extensions>
</build>
</project>
--------------------
WE准高手
posted @
2008-01-29 17:23 大卫 阅读(2656) |
评论 (0) |
编辑 收藏
如何显示如下日期格式:Fri, 11 Jan 2008 15:29:31 +0800 ?
代码如下:
1
import java.io.IOException;
2
import java.text.ParseException;
3
import java.text.SimpleDateFormat;
4
import java.util.Date;
5
import java.util.Locale;
6![](/Images/OutliningIndicators/None.gif)
7![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/** *//**
8
*
9
* @author david
10
*
11
*/
12![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
public class Test
{
13![](/Images/OutliningIndicators/InBlock.gif)
14
public static void main(String[] args) throws NumberFormatException,
15![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
IOException, ParseException
{
16![](/Images/OutliningIndicators/InBlock.gif)
17
SimpleDateFormat sdfIn = new SimpleDateFormat("yyyy-MM-dd E HH:mm:ss",
18![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
Locale.US);/**//* 输入格式 */
19![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
Date date = sdfIn.parse("2008-01-11 Fri 15:29:31");/**//* 输入日期 */
20![](/Images/OutliningIndicators/InBlock.gif)
21
SimpleDateFormat sdfOut = new SimpleDateFormat(
22![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
"E, dd MMM yyyy HH:mm:ss Z", Locale.US);/**//* 输出格式 */
23![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
System.out.println(sdfOut.format(date));/**//* 输出日期 */
24
}
25![](/Images/OutliningIndicators/InBlock.gif)
26
}
其中,MM为月份,mm为分钟,HH为24进制的小时,hh为12进制的小时。
另外,在创建SimpleDateFormat的时候,第二个参数Locale.US为指定系统编码,如果不指定的话,输出的星期会根据本地操作系统的编码而定,中文系统会是“星期五”,而不是Fri 。
--------------------
WE准高手
posted @
2008-01-25 11:27 大卫 阅读(1287) |
评论 (0) |
编辑 收藏