kk.jar的目录结构如下
+kk.jar
+META-INF
MANIFEST.MF
+config
database.properties
目标:读取database.properties中的参数信息
types=mysql
mysql.url=jdbc:mysql://127.0.0.1:3306/tjtz
mysql.user=root
mysql.password=root
mysql.driver=com.mysql.jdbc.Driver
mysql.maxCounts=5
代码如下:
/*
* @(#)JarFileReader.java Oct 9, 2008
*
* Copyright (c) 2008 by jadmin. All Rights Reserved.
*/
package file.jar;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.Set;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
/**
* 从jar包中读取配置文件信息
*
* @author <a href="mailto:jadmin@yeah.net">jadmin</a>
* @version 1.00 Oct 9, 2008 1:10:44 AM
*/
public class JarReader {
public static void main(String[] args) {
String jarPath = "C:\\Documents and Settings\\Administrator\\桌面\\新建文件夹\\kk.jar";
String entryFile = "config/database.properties";
doRead(jarPath,entryFile);
}
public static void doRead(String jarPath, String entryFile) {
try {
JarFile jarFile = new JarFile(jarPath);
JarEntry entry = jarFile.getJarEntry(entryFile);
InputStream input = jarFile.getInputStream(entry);
process(input);
jarFile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void process(InputStream input) {
Properties p = new Properties();
try {
p.load(input);
Set<?> set = p.keySet();
for (Object name : set)
System.out.println(name + "=" + p.getProperty((String) name));
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果如下:
posted @
2008-10-09 01:49 jadmin 阅读(1736) |
评论 (0) |
编辑 收藏
1.清浊并吞:水在流动时不管清水、浊水皆能加以并合,由此松下幸之助领悟出人或企业在成长、学习的过程中应去面对各种可能的挑战,而非去等待好的时机。因为,如果 任何事情皆要挑好天气、好机会、好环境的话,那终将只能留在原地,毫无机会。所以, “清浊并吞”即是告诉我们在任何环境下,皆需让自己有勇气下决心开始去学习,开始去做,就如同经济有景气、有不景气,人生亦本就有起有伏,重要的是当下的即知即行,而非等待和观望。
2.随方亦圆:水在任何容器中皆可依容器之形状而呈现出不同形状的风貌,不管我们如何的摆弄它,它永远能展现出其最好的一面,人在学习、成长的环境中亦同,处逆境时应下更大的决心,处顺境时应更谦虚的学习,就像水的这种精神,在不同的环境中要能去适应环境、调适自己,去学习不同的东西和感受,给自己的人生或企业的未来下一个目标,然后去做它,不能自我设限,自我定型,而是不管在什幺情形下,皆能去适应它、去调适、去面对它、去克服这些环境,那终将有一番不同的成就。
3.上波下静:水在表面上虽是波浪起伏,但在水面下却是平静无波的。松下幸之助由此领悟出,事业就是要做扎根的工作,根扎得稳,事业才会稳固,事业若建构于沙滩之上,则波浪一来必毁于瞬间。因此,人或企业应学习水的这种精神,努力的去做扎根的工作,怀着单一的思想,专注、持续的去学习、去做,一定会有所体会和成就,否则,随波逐流,没有定位,在三心二意与三分钟热度的情况下,终将一事无成。
4.变化无穷:水存在着各种不同的型态,例如以水、水蒸气、雨水,冰块等不同的方式存在着,它在不同情况下会有不同的转化。松下幸之助又领悟出,做事业亦同,市场上的 变化无穷尽,遇到的人亦是形形色色的。但我们想想,为什幺有些事业做得那幺成功,有些人亦是那么成功?!成功的抉择到底何在呢?关键在于自己。因为,市场和人生乃是变化无穷的,需要有弹性去适应,就如同人在雨天时就应撑伞 ,企业在低潮、不景气时,就应调整策略,而非一成不变,僵化无以应变。事实上,人总是喜欢趋吉避凶,但奇怪的是却又喜欢听消极的事,因此,人的思想,企业文化乃是在面对变化无穷的环境时,能否成功的关键,挑战一定是有的,因难也一定是有的,但是成功的定律却是不变的,如何识人,如何保持弹性便是在面对各种状况时所应具备的。
5.渗透扩散:水具有渗透、扩散的能力,这是许多东西所无法办到的能力。人生的成长、学习过程亦应像水一样,目标要不断的提升和提高,才能让自己有更多的收获;就如同水一样,泼到地上便马上让干的地面逐渐地变成湿的地面,不断的渗透、扩散。而设定目标的式是目标须较自己的能力高一些,方能不断自我挑战和成长。因为如果你有登峰攀顶的能力,为何要把目光停留在半山腰呢?
6.久储必臭:水静置放着,一段时日后自然会发臭。松下幸之助体会到他经营这幺大的事业,如果没有让自己再去学习、成长,那幺一定会落伍,所以须学习水一样不断的去流动,而非静止在那边。故学习是无止境的,惟有不断的去学习、去努力,才有未来可言;对任一个想要成功的人或企业皆是如此,如果连松下幸之助这样的经营神都有这样的体会,那我们更应该努力的去学习。毕竟,人生或事业乃是不进则退的,因此须让自己像水一样,不断的去流动才会有量,才不致“久储臭”。
7.急流澄清:水流很快的地方,水一定特别干净;就如同瀑布之头,因水流湍急,所以水一定是澄清的。松下幸之助亦因此体会到人生的成长不能像小的水流一样慢慢地流,他说慢慢的流虽不致发臭,但却不会澄澈,须像急流一样,水的力量大,又会清淯。因此在人生、事业的成长上要给自己压力,就如同急流而下的高速水流产生强大的力量一般,惟有透过自我要求,方能产生完成目标的力量。
8.生存至宝:人若缺水则必无法生存,所以水是生存至宝。同样地,我们在自己的人生中,亦是扮演着很重要的角色;我们每一个人都是造物主最大的奇迹,因为在世界上,我们每一个人都是独一无二的,是没有任何人可以取代的。因此,我们自己须下最大的决心,对于自己的人生和目标有时间、计划性的努力,则必会完成自己的人生,成就一生的事业
posted @
2008-09-19 22:09 jadmin 阅读(57) |
评论 (0) |
编辑 收藏
JTable是Swing编程中很常用的控件,这里总结了一些常用方法以备查阅.
一.创建表格控件的各种方式:
1) 调用无参构造函数.
JTable table = new JTable();
2) 以表头和表数据创建表格.
Object[][] cellData = {{"row1-col1", "row1-col2"},{"row2-col1", "row2-col2"}};
String[] columnNames = {"col1", "col2"};
JTable table = new JTable(cellData, columnNames);
3) 以表头和表数据创建表格,并且让表单元格不可改.
String[] headers = { "表头一", "表头二", "表头三" };
Object[][] cellData = null;
DefaultTableModel model = new DefaultTableModel(cellData, headers) {
public boolean isCellEditable(int row, int column) {
return false;
}
};
table = new JTable(model);
二.对表格列的控制
1) 设置列不可随容器组件大小变化自动调整宽度.
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
2) 限制某列的宽度.
TableColumn firsetColumn = table.getColumnModel().getColumn(0);
firsetColumn.setPreferredWidth(30);
firsetColumn.setMaxWidth(30);
firsetColumn.setMinWidth(30);
3) 设置当前列数.
DefaultTableModel tableModel = (DefaultTableModel) table.getModel();
int count=5;
tableModel.setColumnCount(count);
4) 取得表格列数
int cols = table.getColumnCount();
5) 添加列
DefaultTableModel tableModel = (DefaultTableModel) table.getModel();
tableModel.addColumn("新列名");
6) 删除列
table.removeColumn(table.getColumnModel().getColumn(columnIndex));// columnIndex是要删除的列序号
三.对表格行的控制
1) 设置行高
table.setRowHeight(20);
2) 设置当前航数
DefaultTableModel tableModel = (DefaultTableModel) table.getModel();
int n=5;
tableModel.setRowCount(n);
3) 取得表格行数
int rows = table.getRowCount();
4) 添加表格行
DefaultTableModel tableModel = (DefaultTableModel) table.getModel();
tableModel.addRow(new Object[]{"sitinspring", "35", "Boss"});
5) 删除表格行
DefaultTableModel tableModel = (DefaultTableModel) table.getModel();
model.removeRow(rowIndex);// rowIndex是要删除的行序号
四.存取表格单元格的数据
1) 取单元格数据
DefaultTableModel tableModel = (DefaultTableModel) table.getModel();
String cellValue=(String) tableModel.getValueAt(row, column);// 取单元格数据,row是行号,column是列号
2) 填充数据到表格.
注:数据是Member类型的链表,Member类如下:
public class Member{
// 名称
private String name;
// 年龄
private String age;
// 职务
private String title;
}
填充数据的代码:
public void fillTable(List<Member> members){
DefaultTableModel tableModel = (DefaultTableModel) table
.getModel();
tableModel.setRowCount(0);// 清除原有行
// 填充数据
for(Member member:members){
String[] arr=new String[3];
arr[0]=member.getName();
arr[1]=member.getAge();
arr[2]=member.getTitle();
// 添加数据到表格
tableModel.addRow(arr);
}
// 更新表格
table.invalidate();
}
2) 取得表格中的数据
public List<Member> getShowMembers(){
List<Member> members=new ArrayList<Member>();
DefaultTableModel tableModel = (DefaultTableModel) table
.getModel();
int rowCount=tableModel.getRowCount();
for(int i=0;i<rowCount;i++){
Member member=new Member();
member.setName((String)tableModel.getValueAt(i, 0));// 取得第i行第一列的数据
member.setAge((String)tableModel.getValueAt(i, 1));// 取得第i行第二列的数据
member.setTitle((String)tableModel.getValueAt(i, 2));// 取得第i行第三列的数据
members.add(member);
}
return members;
}
五.取得用户所选的行
1) 取得用户所选的单行
int selectRows=table.getSelectedRows().length;// 取得用户所选行的行数
DefaultTableModel tableModel = (DefaultTableModel) table.getModel();
if(selectRows==1){
int selectedRowIndex = table.getSelectedRow(); // 取得用户所选单行
.// 进行相关处理
}
2) 取得用户所选的多行
int selectRows=table.getSelectedRows().length;// 取得用户所选行的行数
DefaultTableModel tableModel = (DefaultTableModel) table.getModel();
if(selectRows>1)
int[] selRowIndexs=table.getSelectedRows();// 用户所选行的序列
for(int i=0;i<selRowIndexs.length;i++){
// 用tableModel.getValueAt(row, column)取单元格数据
String cellValue=(String) tableModel.getValueAt(i, 1);
}
}
六.添加表格的事件处理
view.getTable().addMouseListener(new MouseListener() {
public void mousePressed(MouseEvent e) {
// 鼠标按下时的处理
}
public void mouseReleased(MouseEvent e) {
// 鼠标松开时的处理
}
public void mouseEntered(MouseEvent e) {
// 鼠标进入表格时的处理
}
public void mouseExited(MouseEvent e) {
// 鼠标退出表格时的处理
}
public void mouseClicked(MouseEvent e) {
// 鼠标点击时的处理
}
});
posted @
2008-07-29 17:54 jadmin 阅读(70) |
评论 (0) |
编辑 收藏
MAGIC #1:
一个印度人发现的,没有人可以在电脑的任何地方建立一个名为"CON"的文件夹 。微软公司的全体职员没有一个人能解释这是为什么;
这个的解释是在Windows里不能以设备名来命名文件或文件夹,aux、com1、prn、con、nul等,这些都是系统保留的名称
MAGIC #2:
在电脑上照着这个做:1.新建一个空的文本文档 2.在里面输入"Bush hid the facts"(不要引号,可复制进去) 3.关闭文档,再打开文档。 发生了什么?
这个我在做的时候试过把Bush改成其他英文名字,结果就会有点点不一样,大家们探索一下吧!
这个就不知道了
MAGIC #3:
这是最酷也是最不可思议的一个。。。打开一个新的Word,在里面输入=rand (200, 99) ,之后按Enter。。。。自己看吧@ 这个据说连比尔盖茨也解释不清楚@
posted @
2008-06-26 19:17 jadmin 阅读(62) |
评论 (0) |
编辑 收藏
第一步: 准备工作,建立个tabedit.html
里面的内容很简单, 建立个5X5的表格, 代码如下:
posted @
2008-06-25 23:05 jadmin 阅读(71) |
评论 (0) |
编辑 收藏
本程序有两文件test.asp 和tree.asp 还有一些图标文件。
1. test.asp 调用类生成树代码如下
<%@ Language=VBScript %>
<html>
<head>
<link rel="stylesheet" href="tree.css">
<title>tree</title>
</head>
<!-- #include file="tree.asp" -->
<%
'========================================
' BUILDING A TREE PROGRAMATICALLY
'========================================
' This approach would be best suited for building
' dynamic trees using For..Next loops and such.
Set MyTree2 = New Tree
MyTree2.Top = 10
MyTree2.Left = 10
MyTree2.ExpandImage = "plus.gif"
MyTree2.CollapseImage = "minus.gif"
MyTree2.LeafImage = "webpage.gif"
' Notice the indentation used to reprensent the hierarchy
Set Node1 = MyTree2.CreateChild("script")
Set SubNode1 = Node1.CreateChild("server")
Set secSubNode1 = SubNode1.CreateChild("html")
secSubNode1.CreateChild "<A HREF=""http://127.0.0.1/"">asp</A>"
secSubNode1.CreateChild "<A HREF=""http://127.0.0.1/"">php</A>"
secSubNode1.CreateChild "<A HREF=""http://127.0.0.1/"">jsp</A>"
Set SubNode2 = Node1.CreateChild("os")
SubNode2.CreateChild "<A HREF=""#"">winnt</A>"
SubNode2.CreateChild "<A HREF=""#"">win2000</A>"
Set Node2 = MyTree2.CreateChild("Desktop")
Node2.CreateChild "<A HREF=""#"">Area Code Lookup</A>"
Node2.CreateChild "<A HREF=""#"">Arin Based Whois Search</A>"
Node2.CreateChild "<A HREF=""#"">World Time Zone Map</A>"
MyTree2.Draw()
Set MyTree2 = Nothing
%>
</BODY>
</HTML>
2. tree.asp 类的定义 代码如下
<%
Dim gblTreeNodeCount:gblTreeNodeCount = 1
Class TreeNode
Public Value
Public ExpandImage
Public CollapseImage
Public LeafImage
Public Expanded
Private mszName
Private mcolChildren
Private mbChildrenInitialized
Public Property Get ChildCount()
ChildCount = mcolChildren.Count
End Property
Private Sub Class_Initialize()
mszName = "node" & CStr(gblTreeNodeCount)
gblTreeNodeCount = gblTreeNodeCount + 1
mbChildrenInitialized = False
Expanded = False
End Sub
Private Sub Class_Terminate()
If mbChildrenInitialized And IsObject(mcolChildren) Then
mcolChildren.RemoveAll()
Set mcolChildren = Nothing
End If
End Sub
Private Sub InitChildList()
Set mcolChildren = Server.CreateObject("Scripting.Dictionary")
mbChildrenInitialized = True
End Sub
Private Sub LoadState()
If Request(mszName) = "1" Or Request("togglenode") = mszName Then
Expanded = True
End If
End Sub
Public Function CreateChild(szValue)
If Not mbChildrenInitialized Then InitChildList()
Set CreateChild = New TreeNode
CreateChild.Value = szValue
CreateChild.ExpandImage = ExpandImage
CreateChild.CollapseImage = CollapseImage
CreateChild.LeafImage = LeafImage
mcolChildren.Add mcolChildren.Count + 1, CreateChild
End Function
Public Sub Draw()
LoadState()
Response.Write "<table border=""0"">" & vbCrLf
Response.Write "<tr><td>" & vbCrLf
If Expanded Then
Response.Write "<a href=""javascript:collapseNode('" & mszName & "')""><img src=""" & CollapseImage & """ border=""0""></a>" & vbCrLf
ElseIf Not mbChildrenInitialized Then
Response.Write "<img src=""" & LeafImage & """ border=0>" & vbCrLf
Else
Response.Write "<a href=""javascript:expandNode('" & mszName & "')""><img src=""" & ExpandImage & """ border=""0""></a>" & vbCrLf
End If
Response.Write "</td>" & vbCrLf
Response.Write "<td>" & Value & "</td></tr>" & vbCrLf
If Expanded Then
Response.Write "<input type=""hidden"" name=""" & mszName & """ value=""1"">" & vbCrLf
If mbChildrenInitialized Then
Response.Write "<tr><td> </td>" & vbCrLf
Response.Write "<td>" & vbCrLf
For Each ChildNode In mcolChildren.Items
ChildNode.Draw()
Next
Response.Write "</td>" & vbCrLf
Response.Write "</tr>" & vbCrLf
End If
End If
Response.Write "</table>" & vbCrLf
End Sub
End Class
Class Tree
Public Top
Public Left
Public ExpandImage
Public CollapseImage
Public LeafImage
Private mszPosition
Private mcolChildren
Public Property Let Absolute(bData)
If bData Then mszPosition = "absolute" Else mszPosition = "relative"
End Property
Public Property Get Absolute()
Absolute = CBool(mszPosition = "absolute")
End Property
Private Sub Class_Initialize()
Set mcolChildren = Server.CreateObject("Scripting.Dictionary")
mnTop = 0
mnLeft = 0
mszPosition = "absolute"
End Sub
Private Sub Class_Terminate()
mcolChildren.RemoveAll()
Set mcolChildren = Nothing
End Sub
Public Function CreateChild(szValue)
Set CreateChild = New TreeNode
CreateChild.Value = szValue
CreateChild.ExpandImage = ExpandImage
CreateChild.CollapseImage = CollapseImage
CreateChild.LeafImage = LeafImage
mcolChildren.Add mcolChildren.Count + 1, CreateChild
End Function
Public Sub LoadTemplate(szFileName)
Dim objWorkingNode
Dim colNodeStack
Dim fsObj, tsObj
Dim szLine
Dim nCurrDepth, nNextDepth
Set colNodeStack = Server.CreateObject("Scripting.Dictionary")
Set fsObj = CreateObject("Scripting.FileSystemObject")
Set tsObj = fsObj.OpenTextFile(szFileName, 1)
nCurrDepth = 0
While Not tsObj.AtEndOfLine
nNextDepth = 1
szLine = tsObj.ReadLine()
If nCurrDepth = 0 Then
Set objWorkingNode = CreateChild(Trim(szLine))
nCurrDepth = 1
Else
While Mid(szLine,nNextDepth,1) = vbTab Or Mid(szLine,nNextDepth,1) = " "
nNextDepth = nNextDepth + 1
WEnd
If nNextDepth > 1 Then szLine = Trim(Mid(szLine,nNextDepth))
If szLine <> "" Then
If nNextDepth > nCurrDepth Then
If colNodeStack.Exists(nCurrDepth) Then
Set colNodeStack.Item(nCurrDepth) = objWorkingNode
Else
colNodeStack.Add nCurrDepth, objWorkingNode
End If
Set objWorkingNode = objWorkingNode.CreateChild(szLine)
nCurrDepth = nCurrDepth + 1
ElseIf nNextDepth <= nCurrDepth Then
If nNextDepth > 1 Then
nNextDepth = nNextDepth - 1
While Not colNodeStack.Exists(nNextDepth) And nNextDepth > 1
nNextDepth = nNextDepth - 1
WEnd
Set objWorkingNode = colNodeStack.Item(nNextDepth)
Set objWorkingNode = objWorkingNode.CreateChild(szLine)
nNextDepth = nNextDepth + 1
Else
Set objWorkingNode = CreateChild(szLine)
End If
nCurrDepth = nNextDepth
End If
End If
End If
WEnd
tsObj.Close()
Set tsObj = Nothing
Set fsObj = Nothing
colNodeStack.RemoveAll()
Set colNodeStack = Nothing
End Sub
Public Sub Draw()
AddClientScript()
Response.Write "<div id=""treectrl"" style=""left: " & Left & "px; top: " & Top & "px; position: " & mszPosition & ";"">" & vbCrLf
Response.Write "<form name=""treectrlfrm"" action=""" & Request.ServerVariables("SCRIPT_NAME") & """ method=""get"">" & vbCrLf
Response.Write "<table border=""0"">" & vbCrLf
Response.Write "<tr><td>" & vbCrLf
For Each ChildNode In mcolChildren.Items
ChildNode.Draw()
Next
Response.Write "</td></tr>" & vbCrLf
Response.Write "</table>" & vbCrLf
Response.Write "<input type=""hidden"" name=""togglenode"" value="""">" & vbCrLf
Response.Write "</form>" & vbCrLf
Response.Write "</div>" & vbCrLf
End Sub
Private Sub AddClientScript()
%>
<script language="JavaScript">
function expandNode(szNodeName)
{
if(document.layers != null) {
document.treectrl.document.treectrlfrm.togglenode.value = szNodeName;
document.treectrl.document.treectrlfrm.submit();
}
else {
document.all["treectrlfrm"].togglenode.value = szNodeName;
document.all["treectrlfrm"].submit();
}
}
function collapseNode(szNodeName)
{
if(document.layers != null) {
document.treectrl.document.treectrlfrm.elements[szNodeName].value = -1;
document.treectrl.document.treectrlfrm.submit();
}
else {
document.treectrlfrm.elements[szNodeName].value = -1;
document.treectrlfrm.submit();
}
}
</script>
<%
End Sub
End Class
%>
posted @
2008-06-23 15:04 jadmin 阅读(102) |
评论 (0) |
编辑 收藏
尽管对于现如今的带宽来说,网页文件那仅以K来算的大小实在是微不足道,但如何将这以K来计算的网页文件精简到最小还是网页设计师们所应该考虑的问题之一。
众所周之,在不影响整个网页构架与功能的情况下,网页文件越小越好,因为更小的网页文件有利于浏览器对网页的解释时间缩到更短,自然访客也就不用面临等待网页缓慢呈现的烦躁了,这一点对于那些带宽少网速慢的用户犹为明显。试想一下,你会是希望打开一个网站的时候整个站点马上呈现在你面前呢?还是喜欢花上十几秒甚至是几分钏来看整个站点一点一点的被浏览器解释出来呢?
在Table布局的时代,代码无数次的随着表格在页面里重复,致使整个网页文件变得臃肿无比,代码的可读性也降到最低,浏览器的解释时间自然也增加了不少。而自从DIV+CSS的布局替代Table布局之后,这一切都得到了极大的改善,让Table回归到它原本用于显示数据的位置上去,而布局就交给DIV+CSS来做,这样代码的可读性与复用性都得到了提高,而DIV +CSS更为重要的一点就是将网页文件的表现与结构区分开来,再也不用为了表现而去改动整个网页文件的结构了。
即使DIV+CSS的布局方式将以前Table布局时代码的臃肿降到了最低,但对于网页设计师来说,如何将网页文件的大小控制到最小是永远值得探索和追求的一个问题。
看如下一段代码:
#header {
margin-top:10px;
margin-right:15px;
margin-bottom:10px;
margin-left:15px;
backgroung-color:#333333;
background-images:url(Images/header.jpg);
}
这样的一段CSS代码,在条理上很清晰,结构也很明了,可读性很强,可是这样的一段代码却没有做精简,也就是说它是最原始的CSS代码,下面看精简后的代码:
#header {
margin:10px 15px;
backgroung:#333 url(Images/header.jpg);
}
在CSS中有复合属性这一说法,也就是说可以将很多属性参数整合在一起的,比如说上面的“margin-top; margin-right; margin-bottom; margin-left;”可以整合成一个“margin”属性,然后为其配上参数。
通过这一点,我们就可以在原始CSS代码的基本上将代码进一步的精简。而且这样写的结构也合理,可读性也同样强。可是对于要精简到彻底来说,这还不够。为了让这段CSS代码的结构明了,我们用上了空格换行等占用空间的东西,如果将这些占用空间的去掉呢?
#header{margin:10px 15px;background:#333 url(Images/header.jpg);}
只这一句就替代了上面的一段代码,这样代码就已经精简到了最大化,当然,并不推荐所有人都这样写,这样写的CSS代码在可读性上要远远差于段落式的写法,除非你对自己写的代码有完全掌握的信心。
在同一个站点的CSS文件中,不可避免的会出现不同的ID或Class却有一部分相同的属性,如果将这些ID或Class逐个分开来写的话,在CSS文件里无疑会生成重复代码,而我们要尽量的精简CSS文件的大小,那么“消灭”这部分重复的代码就变得势在必行。
看下面一段CSS代码:
#header{margin:10px 15px;background:#333 url(Images/header.jpg);}
#content{margin:10px 15px;padding:10px;background:#999;}
#copyright{margin:10px 15px;border:1px solid #f00;}
在上面的三个ID中都有一个相同的属性“margin:10px 15px;”,如果就这样分开来写的话,这三个ID之间将保持各自独立的关系,但却生成了重复的代码,而我们可以将其写成如下格式:
#header,#content,#copyright{margin:10px 15px;}
#header{background:#333 url(Images/header.jpg);}
#content{padding:10px;background:#999;}
#copyright{border:1px solid #f00;}
将上面的ID换成Class也是一样的。这样写我们就成功的将重复代码“消灭”掉了。但是如果这里具有相同的属性的ID或Class过多的话,难免会造成代码可读性降到很低很低,所以除此之外当具有相同属性的都是Class时还有另外的一种写法:
.main{margin:10px 15px;}
.header{background:#333 url(Images/header.jpg);}
.content{padding:10px;background:#999;}
.copyright{border:1px solid #f00;}
当然这种写法时,调用时的写法也与平常不一样。
这样的写法同样可以达到效果,并且也不会再怕具有相同属性的Class多而造成代码可读性差的问题,但值得注意的一点就是,这种写法对于ID是无效的,不管其中是存在一个ID或者全部都是ID,都将造成这段代码的无效。
posted @
2008-06-23 15:01 jadmin 阅读(74) |
评论 (0) |
编辑 收藏
css对文字的布局上没有靠容器底部对齐的参数,目前使用的一个不错的方法也比较好.就是用position属性来解决,看下面的代码,用position的相对和绝对定位功能也轻松的实现了,文字靠近div低部对齐,并且靠近的距离还可以精确到像素,自己可以调节,是不是很不错呢?
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>无标题文档</title>
<style type="text/css">
#txt{
height:300px;
width:300px;
border:1px solid #333333;
text-align:center;
position:relative
}
#txt p{
position:absolute;
bottom:0px;
padding:0px;
margin:0px
}
</style>
</head>
<body>
<div id=txt>
<p>aadsad</p>
</div>
</body>
</html>
posted @
2008-06-23 15:00 jadmin 阅读(99) |
评论 (0) |
编辑 收藏
apache的commons项目下有个email子项目,它对JavaMail API进行了封装,用起来特变方便。在开始之前,需要做以下准备:
1、JavaMail API
添加JavaMail API里的mail包到CLASSPATH里,JavaMail API下载地址:http://java.sun.com/products/javamail/downloads/index.html
2、commons email
下载地址:http://www.apache.org/dist/commons/email/
工程目录结构如下:
以下给出两个简单示例程序
// SendMail.java 使用SimpleEmail发邮件
package com.apache.commons.email.demo;
import org.apache.commons.mail.SimpleEmail;
public class SendMail
{
public static void main ( String[] arg ) throws Exception
{
// 使用SimpleEmail对于中文内容,可能会产生乱码
SimpleEmail email = new SimpleEmail ( );
// SMTP服务器名
email.setHostName ( "smtp.163.com" );
// 登陆邮件服务器的用户名和密码
email.setAuthentication ( "peki", "123456" );
// 接收人
email.addTo ( "jstio@qq.com", "曦勤" );
// 发送人
email.setFrom ( "peki@163.com", "小陈" );
// 标题
email.setSubject ( "Test message" );
// 邮件内容
email.setMsg ( "This is a simple test of commons-email<br>我是小陈" );
// 发送
email.send ( );
System.out.println ( "Send email successful!" );
}
}
收信结果如下:
This is a simple test of commons-email<br>????
有乱码产生,并且html内容没有正常显示
// MailSender.java 使用HtmlEmail发邮件
package com.apache.commons.email.demo;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.HtmlEmail;
public class MailSender {
public static void main(String[] args) {
// 不要使用SimpleEmail,会出现乱码问题
HtmlEmail email = new HtmlEmail();
try {
// 这里是SMTP发送服务器的名字:,163的如下:
email.setHostName("smtp.163.com");
// 字符编码集的设置
email.setCharset("gbk");
// 收件人的邮箱
email.addTo("jstio@qq.com");
// 发送人的邮箱
email.setFrom("peki@163.com", "小陈");
// 如果需要认证信息的话,设置认证:用户名-密码。分别为发件人在邮件服务器上的注册名称和密码
email.setAuthentication("peki", "123456");
email.setSubject("下午3:00会议室讨论,请准时参加");
// 要发送的信息,由于使用了HtmlEmail,可以在邮件内容中使用HTML标签
email.setMsg("下午3:00会议室讨论,请准时参加<BR>呵呵~!");
// 发送
email.send();
System.out.println ( "邮件发送成功!" );
} catch (EmailException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println ( "邮件发送失败!" );
}
}
}
收信结果如下:
下午3:00会议室讨论,请准时参加
呵呵~!
没有产生乱码,html内容正常显示
以上程序尽供参考,如需要在开发中使用,还得深入研究
posted @
2008-06-21 22:12 jadmin 阅读(3469) |
评论 (0) |
编辑 收藏
1、我们在做验证码的时候往往由于要反作弊,验证有时故意加入多的干扰因素,这时验证码显示不很清楚,用户经常输入错误。这样不但要重新刷新页面,导致用户没有看清楚验证码而重填而不是修改,而且如果没有用session保存下用户输入的其它数据的话(如姓名),用户刚刚输入的内容也不存在了,这样给用户造成不好的体验。
2、本例在原有验证方式基础之上增加一段js,通过xmlhttp来获取返回值,以此来验证是否有效,这样即使用户浏览器不支持js,也不会影响他的正常使用了。
3、为了防止作弊,当用户连接3次输入错误时则重载一下图片,这样也利于用户因为图片上的验证码辨认不清而使其终无法输入正确。
4、本例还特别适合检验用户名是否有效,只要从后台做个sql查询,返回一个值或是xml即可。(这种例子太多 ,就在此不赘述了)。
5、本例的优点在于非常方便用户输入,而且减少对服务器端的请求,可以说既改善用户体验而且略会节省带宽成本,但相应地要在页面上增加一段JavaScript代码,在目前网速越来越快人们要求便捷舒适的今天,似乎我们更应注意提供给用户良好的使用感受。
代码如下:
1、img.jsp,输入主页面
posted @
2008-06-18 21:29 jadmin 阅读(183) |
评论 (1) |
编辑 收藏