2008年10月11日

16进制字符串转换成中文方法.  

2006-12-28 13:25:49|  分类: Java编程|字号 订阅

现知道一个16进制的字符串,比如:"6162B4F36364BCD2657CBAC366",哪位高手能给一个将这个字符串转换成中文的方法啊,我到百度上搜了半天也没搜到,即使有也不是java方法。哪位高人能抽出宝贵的时间帮忙解决一下啊,万分感激!!!转换出来应该是六个字母,3个中文,还有一个符号,希望高手们把谜底揭开,关键是写出实现方法,谢谢了!!!!!!!!!!!!!!!!!!!!!!

 

回复求教!!哪位高手能将6162B4F36364BCD2657CBAC366转换成中文! 
 ymy7100   短消息   
回复主题求教!!哪位高手能将6162B4F36364BCD2657CBAC366转换成中文!

2006-12-21 下午1:14  

回复 1 of 4

回复

晕!
没有高手吗?
是因别的公司开发的delphi程序要调用我们的java程序,其中java中要写个函数,实现将他们传来的数据显示出来并存到数据库,哪位大虾伸出援手啊!!!!!!

 

回复求教!!哪位高手能将6162B4F36364BCD2657CBAC366转换成中文! [得分:50] 
 rehte   短消息   
回复主题求教!!哪位高手能将6162B4F36364BCD2657CBAC366转换成中文!

2006-12-21 下午2:42  

回复 2 of 4

回复

晕,帮帮你
应该是:abcde|f
首先要知道编码,中国汉字一般使用GBK或者gb2312gb2312GBK的子集,因此安全起见使用GBK一般就行了:

public class Decoder {
public static void main(String[]args){
String result=decodeString(args[0], "GBK");
System.out.println(result);

private static String decodeString(String string, String encoding) {
try {
byte[]data=string2Bytes(string);
return new String(data, encoding);
} catch (UnsupportedEncodingException ex) {
ex.printStackTrace();
return null;
}

private static byte[] string2Bytes(String string) {
int blen=string.length()/2;
byte[]data=new byte[blen];
for(int i=0;i<blen;i++){
String bStr=string.substring(2*i,2*(i+1));
data[i]=(byte)Integer.parseInt(bStr,16);
}
return data;
}
}

运行:
java Decoder 6162B4F36364BCD2657CBAC366

posted @ 2013-05-12 14:46 勒紧皮带向前冲 阅读(292) | 评论 (0)编辑 收藏
 
     摘要: JAVA 取得当前目录的路径(转)及PS  阅读全文
posted @ 2012-03-26 09:34 勒紧皮带向前冲 阅读(427) | 评论 (0)编辑 收藏
 
     摘要: flash builder 4文本模板与代码注释(转)  阅读全文
posted @ 2011-12-26 14:56 勒紧皮带向前冲 阅读(1650) | 评论 (0)编辑 收藏
 
     摘要: win7在64位下PL/SQL Developer连接远程oracle数据库(转+补充)  阅读全文
posted @ 2011-12-21 10:59 勒紧皮带向前冲 阅读(1885) | 评论 (0)编辑 收藏
 
只要把 data grid column 的 showDataTips 属性设置为 true ,然后把 column 的 dataTipField 设置一个值就行了 @import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
posted @ 2011-12-13 09:04 勒紧皮带向前冲 阅读(448) | 评论 (0)编辑 收藏
 
     摘要: 这个1个使用flex4 的List 组件的例子  阅读全文
posted @ 2011-12-03 10:14 勒紧皮带向前冲 阅读(1922) | 评论 (0)编辑 收藏
 
@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css); @import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
//验证并更新此对象的属性和布局
Tree.validateNow();
for each (var item:Object in Tree.dataProvider)
{
//打开或关闭指定项目下的所有树项目。如果设置 dataProvider 之后立即调用 expandChildrenOf(),则您可能看不到正确的行为。您应该等待对组件进行验证或调用 validateNow() 方法。
Tree.expandChildrenOf(item, true);}

第二种方式


 1
 <?xml version="1.0" encoding="utf-8"?>
 2 <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
 3                xmlns:s="library://ns.adobe.com/flex/spark" 
 4                xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
 5                creationComplete="onInit()">
 6     <fx:Declarations>
 7         <!-- 将非可视元素(例如服务、值对象)放在此处 -->
 8         
 9         <fx:XML id="xml" xmlns="">
10             <node id="#" label="所有">
11                 <node id="101" label="Name101">
12                     <node id="10101" label="Name10101"/>
13                     <node id="10102" label="Name10102"/>
14                     <node id="10103" label="Name10103"/>
15                 </node>
16                 <node id="102" label="Name102">
17                     <node id="10201" label="Name10201"/>
18                     <node id="10202" label="Name10202"/>
19                 </node>
20                 <node id="103" label="Name103">
21                     <node id="10301" label="Name10301"/>
22                 </node>
23             </node>
24         </fx:XML>
25     </fx:Declarations>
26     
27     <fx:Script>
28         <![CDATA[
29             private function onInit():void{
30                 tree.selectedIndex=0;
31                 tree.callLater(expand,null);
32             }
33             private function expand():void{
34                 tree.expandItem(tree.selectedItem,true);
35                 //这里可以随便指定展开的节点,如果超出默认展开最后一个根节点
36                 tree.selectedIndex=1;
37                 tree.expandItem(tree.selectedItem,true);
38             }
39         ]]>
40     </fx:Script>
41     <mx:Tree id="tree" x="73" y="36" width="200" height="217" dataProvider="{xml}" labelField="@label"></mx:Tree>
42 </s:Application>
43 



posted @ 2011-11-27 10:27 勒紧皮带向前冲 阅读(2629) | 评论 (1)编辑 收藏
 
     摘要: flex4 在浏览器重打开网址  阅读全文
posted @ 2011-11-14 11:47 勒紧皮带向前冲 阅读(401) | 评论 (0)编辑 收藏
 
     摘要: itemCreationPolicy 设定State组件立即创建  阅读全文
posted @ 2011-11-14 09:22 勒紧皮带向前冲 阅读(609) | 评论 (0)编辑 收藏
 
     摘要: StringGrid使用全书
  阅读全文
posted @ 2011-01-13 11:16 勒紧皮带向前冲 阅读(318) | 评论 (0)编辑 收藏
 
     摘要: DELPHI第叁方控件——Devexpress for D7 介绍  阅读全文
posted @ 2010-11-30 16:03 勒紧皮带向前冲 阅读(1385) | 评论 (0)编辑 收藏
 
     摘要: DevExpress:问题:A separator item cannot be placed on the specified toolbar--》一个分离器项目不能放在指定的工具栏 解决  阅读全文
posted @ 2010-11-25 18:13 勒紧皮带向前冲 阅读(586) | 评论 (0)编辑 收藏
 
     摘要: jar打包命令—懒人打包方法  阅读全文
posted @ 2010-11-16 16:28 勒紧皮带向前冲 阅读(370) | 评论 (0)编辑 收藏
 
     摘要: MyEclipse 中安装 Jadclipse (转)  阅读全文
posted @ 2010-11-07 21:52 勒紧皮带向前冲 阅读(409) | 评论 (0)编辑 收藏
 
     摘要: MyEclipse安装FatJar   阅读全文
posted @ 2010-11-07 21:52 勒紧皮带向前冲 阅读(1486) | 评论 (0)编辑 收藏
 
     摘要: Java文件类型与字节型的转换(转)  阅读全文
posted @ 2010-11-07 13:59 勒紧皮带向前冲 阅读(2152) | 评论 (1)编辑 收藏
 
     摘要: axis安装与配置时的一些问题和解决方法  阅读全文
posted @ 2010-10-29 15:15 勒紧皮带向前冲 阅读(764) | 评论 (0)编辑 收藏
 
     摘要: 解决 java.util.MissingResourceException: Can't find bundle for base name com...config, locale zh_CN 错误  阅读全文
posted @ 2010-10-27 09:37 勒紧皮带向前冲 阅读(3798) | 评论 (0)编辑 收藏
 
     摘要: tomcat运行项目中出项java.lang.UnsupportedClassVersionError: com/xxxxxx/xxxx/xxx/xxx(Unsupported major.minor version 49.0) 解决方法及原因
  阅读全文
posted @ 2010-10-26 19:21 勒紧皮带向前冲 阅读(503) | 评论 (0)编辑 收藏
 
     摘要:   Hibernate Tools Reference Guide Version: 3.2.0.GA Table of Contents Preface .........................................................................................................  阅读全文
posted @ 2010-09-06 16:13 勒紧皮带向前冲 阅读(4162) | 评论 (0)编辑 收藏
 
[标题]:[原]Struts2校验框架
[时间]:2009-7-27
[摘要]:校验框架配置、客户端校验
[关键字]:浪曦视频,Struts2应用开发系列,WebWork,Apache,validation
[环境]:struts-2.1.6、JDK6、MyEclipse7、Tomcat6
[作者]:Winty (wintys@gmail.com) http://www.blogjava.net/wintys

[正文]:
    Struts校验框架提供了一种不用编写代码,只需修改配置文件即可对输入进行校验的功能。代码方式校验,即重写validate()方法。实际应用中,validate()与校验框架一般只选其一

1、校验框架配置
    在RegisterAction.java相同目录新建校验框架配置文件RegisterAction-validation.xml。RegisterAction-validation.xml的DTD可以复制struts自带的示例struts2-mailreader-2.1.6中的DTD:
<!DOCTYPE validators PUBLIC
          "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
          "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">

xwork-validator-1.0.2.dtd:
<?xml version="1.0" encoding="UTF-8"?>

<!--
  XWork Validators DTD.
  Used the following DOCTYPE.
 
  <!DOCTYPE validators PUBLIC
          "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
          "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
-->


<!ELEMENT validators (field|validator)+>

<!ELEMENT field (field-validator+)>
<!ATTLIST field
    name CDATA #REQUIRED
>

<!ELEMENT field-validator (param*, message)>
<!ATTLIST field-validator
    type CDATA #REQUIRED
    short-circuit (true|false) "false"
>

<!ELEMENT validator (param*, message)>
<!ATTLIST validator
    type CDATA #REQUIRED
    short-circuit (true|false) "false"
>

<!ELEMENT param (#PCDATA)>
<!ATTLIST param
    name CDATA #REQUIRED
>

<!ELEMENT message (#PCDATA)>
<!ATTLIST message
    key CDATA #IMPLIED
>


RegisterAction-validation.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
          "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
          "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
 
 <validators>
 <!--  
     与field等价的validator
     <validator type="requiredstring">
         <param name="fieldName">name</param>
         <param name="trim">true</param>
         <message>name required</message>
     </validator>
     <validator type="stringlength">
         <param name="fieldName">name</param>
             <param name="trim">true</param>
             <param name="minLength">6</param>
             <param name="maxLength">10</param>
             <message>name length range : ${minLength} ~ ${maxLength}</message>
     </validator>
 -->    
     <field name="name">
         <field-validator type="requiredstring" >
             <param name="trim">true</param>
             <message>name required</message>
         </field-validator>
         <field-validator type="stringlength">
             <param name="trim">true</param>
             <param name="minLength">6</param>
             <param name="maxLength">10</param>
             <message>name length range : ${minLength} ~ ${maxLength}</message>
         </field-validator>
     </field>
     
     <field name="age">
         <field-validator type="conversion" short-circuit="true">
             <message>the field age conversion error</message>
         </field-validator>
         <field-validator type="int">
             <param name="min">1</param>
             <param name="max">150</param>
             <message>age range: ${min} ~ ${max}</message>
         </field-validator>
     </field>
     
     <field name="birthday">
         <field-validator type="required">
             <message>birthday required</message>
         </field-validator>
         <field-validator type="date">
             <param name="min">2009-01-01</param>
             <param name="max">2009-12-31</param>
             <message>birthday range: ${min} ~ ${max}</message>
         </field-validator>
     </field>
     
     <field name="email">
         <field-validator type="email">
             <message>invalid email address</message>
         </field-validator>
     </field>
 </validators>

说明:
a.校验框架有两种校验方式:field和validator。
field校验:先指定需要校验的属性,再指定校验方式。validator校验:先指定校验方式,再指定需要校验的属性。两种方式是等价的。

field校验:
<field name="name">
    <field-validator type="requiredstring" >
        <param name="trim">true</param>
        <message>name required</message>
    </field-validator>
    <field-validator type="stringlength">
        <param name="trim">true</param>
        <param name="minLength">6</param>
        <param name="maxLength">10</param>
        <message>name length range : ${minLength} ~ ${maxLength}</message>
    </field-validator>
</field>

validator校验:
<validator type="requiredstring">
    <param name="fieldName">name</param>
    <param name="trim">true</param>
    <message>name required</message>
</validator>
<validator type="stringlength">
    <param name="fieldName">name</param>
    <param name="trim">true</param>
    <param name="minLength">6</param>
    <param name="maxLength">10</param>
    <message>name length range : ${minLength} ~ ${maxLength}</message>
</validator>

b.<field-validator type="requiredstring" >中的type及其对应的xwork类可以在xwork-2.1.2.jar/com.opensymphony.xwork2.validator.validators/default.xml中查找到。
default.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
        "-//OpenSymphony Group//XWork Validator Config 1.0//EN"
        "http://www.opensymphony.com/xwork/xwork-validator-config-1.0.dtd">

<!-- START SNIPPET: validators-default -->
<validators>
    <validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
    <validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
    <validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
    <validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>
    <validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>
    <validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
    <validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
    <validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
    <validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
    <validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
    <validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
    <validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
    <validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
    <validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
    <validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
    <validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
</validators>
<!--  END SNIPPET: validators-default -->

c. 对于校验<field-validator type="requiredstring" >:String用requiredstring,其它类型用required。
d. 验证错误将默认产生FieldError。
e. short-circuit="true" : 一个校验失败,是否是继续执行后续校验。
f. 对于相同属性的FieldError,validate()方法中的验证和RegisterAction-validation.xml中的验证都会执行,并且FieldError都会显示。
执行顺序: RegisterAction-validation.xml => validate()。


2、特定于业务逻辑的局部校验:
对于struts.xml中<action>的method="register"指定的业务方法register(),使用校验RegisterAction-register-validation.xml(与RegisterAction.java在同一目录下)。同时,RegisterAction-validation.xml会被执行。执行顺序:  RegisterAction-validation.xml => RegisterAction-register-validation.xml

3、Struts2客户端校验
    设置struts标签<s:form>中validate="true"。这样就会根据RegisterAction-validation.xml生成页面Javascript,在客户端执行校验。
 
 注意:
 a.struts标签不能使用simple主题
 b.Struts2客户端校验功能较弱,一般不用。

4、FieldError和ActionError的实现
a.真正存放field级别错误信息的对象是LinkedHashMap。
b.该LinkedHashMap的key是String类型的,value是ArrayList类型,所以同一个key可以对应多个错误消息。
c.对于Action级别的错误信息,实际上是放置在ArrayList中的。
    
[参考资料]:
    《浪曦视频之Struts2应用开发系列》
posted @ 2010-07-27 10:01 勒紧皮带向前冲| 编辑 收藏
 

一.WebContextLoaderListener 监听类
它能捕捉到服务器的启动和停止,在启动和停止触发里面的方法做相应的操作!
它必须在web.xml 中配置才能使用,是配置监听类的

二.下面是搜集的一些listener方面的知识
简例一
监听用户上线与退出,显示在线用户

1、登陆页面 Login.jsp

<%@page pageEncoding="gb2312" contentType="text/html; charset=gb2312" %>
<%
session=request.getSession(false);
if(session!=null)session.invalidate();
%>
<html>
<head><title></title></head>
<body>
<form action="isOnline.jsp" method="post">
用户名:<input type="text" name="uName"/>
<input type="submit" value="上线">
</form>
</body>
</html>

2、控制页面(只是为了说明监听器问题,所以简单了点...) isOnline.jsp

<%@page pageEncoding="gb2312" contentType="text/html; charset=gb2312" %>
<html>
<head><title></title></head>
<body>
<%
session=request.getSession();
session.setAttribute("userName",request.getParameter("uName"));
response.sendRedirect("showOnline.jsp");
%>
</body>
</html>


3、显示页面 showOnline.jsp

<%@page pageEncoding="gb2312" contentType="text/html; charset=gb2312" import="java.util.ArrayList" %>
<html>
<head><title></title></head>
<body>
<%
ArrayList showList=(ArrayList)(getServletContext().getAttribute("list"));
out.print("在线人数 "+showList.size()+"<br>");
for(int i=0;i<showList.size();i++){
out.print(showList.get(i)+"在线"+"<br>");
}
%>
<br>
<a href="Login.jsp">退出</a>
</body>
</html>

4、配置页面 web.xml

<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<listener>
    <listener-class>org.xiosu.listener.onlineListener</listener-class>
</listener>
</web-app>

5、监听器 onlineListener.java

package org.xiosu.listener;

import java.util.ArrayList;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class onlineListener implements HttpSessionListener,
HttpSessionAttributeListener {
// 参数
ServletContext sc;
ArrayList list = new ArrayList();
// 新建一个session时触发此操作
public void sessionCreated(HttpSessionEvent se) {
sc=se.getSession().getServletContext();
System.out.println("新建一个session");
}
// 销毁一个session时触发此操作
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("销毁一个session");
if (!list.isEmpty()) {
   list.remove((String) se.getSession().getAttribute("userName"));
   sc.setAttribute("list", list);
}
}
// 在session中添加对象时触发此操作,在list中添加一个对象
public void attributeAdded(HttpSessionBindingEvent sbe) {
list.add((String) sbe.getValue());
sc.setAttribute("list", list);
}
// 修改、删除session中添加对象时触发此操作
public void attributeRemoved(HttpSessionBindingEvent arg0) {
}
public void attributeReplaced(HttpSessionBindingEvent arg0) {
}
}


说明:本例只为简单介绍监听器,并未进行安全方面设置。

监听器也叫Listener,是Servlet的监听器,它可以监听客户端的请求、服务端的操作等。通过监听器,可以自动激发一些操作,比如监听在线的用户的数量。当增加一个HttpSession时,就激发sessionCreated(HttpSessionEvent   se)方法,这样
就可以给在线人数加1。常用的监听接口有以下几个:
ServletContextAttributeListener监听对ServletContext属性的操作,比如增加、删除、修改属性。
ServletContextListener监听ServletContext。当创建ServletContext时,激发contextInitialized(ServletContextEvent   sce)方法;当销毁ServletContext时,激发contextDestroyed(ServletContextEvent   sce)方法。
HttpSessionListener监听HttpSession的操作。当创建一个Session时,激发session   Created(HttpSessionEvent   se)方法;当销毁一个Session时,激发sessionDestroyed   (HttpSessionEvent   se)方法。
HttpSessionAttributeListener监听HttpSession中的属性的操作。当在Session增加一个属性时,激发attributeAdded(HttpSessionBindingEvent   se)   方法;当在Session删除一个属性时,激发attributeRemoved(HttpSessionBindingEvent   se)方法;当在Session属性被重新设置时,激发attributeReplaced(HttpSessionBindingEvent   se)   方法。
example:随服务器启动
web-app>

      com.tb.listener.CountStartListener


package com.tb.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpServlet;
import com.tb.timertask.DoCountTask;
public class CountStartListener extends HttpServlet implements ServletContextListener
{
private static final long serialVersionUID = 1824920962239905170L;
public CountStartListener()
{
   // TODO Auto-generated constructor stub
}
public void contextDestroyed(ServletContextEvent arg0)
{
   // TODO Auto-generated method stub
}
   public void contextInitialized(ServletContextEvent arg0)
{   
   DoCountTask.dotask();
}
}

posted @ 2010-06-01 10:33 勒紧皮带向前冲 阅读(12655) | 评论 (0)编辑 收藏
 
     摘要: Flex+Spring+Hibernate整合  阅读全文
posted @ 2010-05-23 18:03 勒紧皮带向前冲 阅读(3913) | 评论 (2)编辑 收藏
 
在分享这几种配置之前,先简单的介绍一下需要用到的一些资源。
1、 MyEclipse+Flex 插件(官网下载)
2、 Tomcat6.0作为服务器(官网下载)
3、 用 BlazeDS(免费)代替 LCDS(收费) :没钱啊,只能先使用免费的了。从 Adobe
官方网站上下载下来,将 blazeds.war、ds-console.war、samples.war 三个文件放在
tomcat的webapps目录下。
Flex+Java配置
第一种: Java工程和 Flex 工程独立,这种方式也是很多人使用的方式, Flex程序员和 Java
程序员相互独立的工作,这种方式网上有很多的资料,在这里就不再 赘述了。
第二种:Flex工程加入 Java 元素
1、 切换到 Flex视图,新建 Flex project,如下图

说明: Java source folder 就是你自己 java业务源码存放的根目录,在 FB3 里, LCDS
项目旨在将 Java J2ee 项目和 FlexLcds 项目混合。

当然如果你不选择 combined 两个在一起,那么就麻烦些:要么你再单独新建一个
Flex 项目,而这个项目只写 java代码。要么再建一个J2ee工程写 java代码,而这

因为我们是要 java 和 flex结合,所
以在服务器选择上我们选择 J2EE

存放java类的源文件,我们的目的
就是Flex和 java在一个工程里,所
以我们这里选择上
个项目只写 Flex 代码,但最后要把 Java 编译后的 class 文件放到这个项目下的
webroot\web-inf\classes 目录中。即不管怎样,最后发布时,java 编译后的 class
文件必须和 lcds 部署的项目在一起。
2、 点击Next,配置 J2EE服务器,如下图

说明:Target runtime 实际上没什么用(后来我删除了配置文件里的对应信息,也
没问题),但是不指定就不能继续,如果这里显示的是<none>那么就新建一个
Tomcat 的runtime,简单的只需要指定tomcat 的安装目录即可。

Content folder 实际上就是最终编译后的容器目录,因此,BlazeDS 的 blazeds.war
文件将会发布到 该目录 下的 web-inf 下的 flex 目录中。同时因为教程采用的是
MyEclipse,他默认的就是发布 WebRoot 里的内容,为了自动化,因此这里改为了
WebRoot(这也是 java 开发的习惯)

Flex WAR file 指的是安装了 lcds 后的 flex.war 文件的路径,但是在这里我们采用
的是BlazeDS来取代 lcds,所以这里设置的是 blazeds.war的路径。

Compilation options 指定了 flex 文件的编译方式,选择推荐的在 FlexBuilder 里编
译吧,虽然开发时多耗点时间,但是在发布后不会占用服务器的编译处理时间,对
用户来说是有好处的。

Output folder 指的是 Flex 编译后的 swf 和 html 等文件存放的路径,这里改为了
WebRoot,意思是发布到根目录就可以了。当然你可以根据你的需要和习惯自行设
置其他的路径

因为我们采用的 BlazeDS,所
以这里要设置 BlazeDS 的路

这里我们可以自定义输出路径,
一般情况下设置成根目录
WebRoot 就可以了
3、 点击下一步,采用默认的配置就可以,点击完成,该工程就建立完成。下图为该工
程的目录结构

4、 让它变成 web工程由MyEclipse发布吧


Flex 文件的源文件夹Java 源文件夹自动生成的flex 的配置文件
Flex 编译后发布的文件。我们发布在根目录下


点击Finish,现在我们的工程的图标变成了 J2EE Web 工程了,这意味着,你可以


注意,不要点的太快了,要把这里的
对号勾掉,这样就不会覆盖 BlazeDS
创建的 web.xml 用MyEclipse来发布它或者添加更多容器,比如hibernate、spring等

5、 工程建好以后,你可以通过右键—>属性来进行更多的设置。

6、 这样一个 Flex+Java的工程就建立完成。
7、 编写例子,测试在介绍完第三种方式以后统一介绍。

第三种:由 Web project反向加入 Flex,也就是Java+Flex
1、 先建立一个 web工程:flexweb。(略)
2、 向flexweb 工程手工添加 Flex需要的元素。
1)首先将 BlazeDS需要的jar文件拷到工程的 lib 目录下。可以将上面建的那个 flex
工程的 lib下的jar文件拷到该工程下的 lib目录下。
2)然后要加入 Flex BlazeDS需要的配置文件。在 WEB-INF下新建一个名为 flex 的文
件夹,然后将我们上面建立的那个 firstFlex 该文件夹下的四个 xml 文件拷到该文件
夹下。
3)最后,修改 web.xml 文件,加入 Flex 的配置。做法一个简单的把上面我们新建
的那个 flex工程的web.xml的部分代码拷过来。

(注意:这样会出错,可以把

<web-app version="2.4"
xmlns="
http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

改为:<web-app>)(本人提示:这里经本人测试,并不需要这样更改,本人的测试环境为Eclipse3.4+MyEclipse7.5,不排除在此版本前不需要做更改)


<context-param>
<param-name>flex.class.path</param-name>

<param-value>/WEB-INF/flex/hotfixes,/WEB-INF/flex/jars</param-val
ue>
</context-param>

<!-- Http Flex Session attribute and binding listener support -->
<listener>

<listener-class>flex.messaging.HttpFlexSession</listener-class>
</listener>

<!-- MessageBroker Servlet -->
<servlet>
<servlet-name>MessageBrokerServlet</servlet-name>
<display-name>MessageBrokerServlet</display-name>

<servlet-class>flex.messaging.MessageBrokerServlet</servlet-class>
<init-param>
<param-name>services.configuration.file</param-name>

<param-value>/WEB-INF/flex/services-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>MessageBrokerServlet</servlet-name>
<url-pattern>/messagebroker/*</url-pattern>
</servlet-mapping>
3、 将该工程发布到tomcat下,并启动 tomcat。(注:一定要启动tomcat,因为在后面
的设置中,它要验证工程的路径)
4、 然后在该工程上右键Flex Project NatureAdd Flex Project Nature



5、 设置完成后,会发现 web工程的目录结构已经发生了改变,如下图。
我们发现以这种形式建立的工程的目录结构和第二种方法有少许的不同,flex 的
mxml文件默认的放在 src文件夹中,和java文件共用一个目录。并且没有像上一个
工程那样自动的编译出可运行的文件。

配置服务器路径
配置正确的显示
建议不要修改这里的配置

6、 如果你对这个目录结构不太满意,还想让 flex 的文件放在 flex_src 目录下,别急,
我们可以通过右键属性来设置。如下图

在这里你可以重新设置你的 flex源文件夹和输出目录
7、 配置 flex 默认的 sdk。这样配置完,还不行,程序可能还不能正常地运行,还需要
配置他使用的 sdk。如下图

8、 马上就大功告成了,让我们来写个程序测试一下吧。
1)新建一个 java类:Hello.java
package com;

public class Hello {
public String hello(String name){
System.out.println("flex调用我了,真好~~~~");
return "hello "+name;
}
}
2)为flex配置这个要调用的对象,修改WEB-INF/flex下remoting-config.xml
加入:
<destination id="hello">
<properties>
<source>
com.Hello
</source>
</properties>
</destination>

3)编写一个Flex程序
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute">
<mx:Script>
<![CDATA[
import mx.rpc.events.ResultEvent;

function gg(evnet:ResultEvent):void{
var ff:String = evnet.result as String;
ggg.text = ff;
}

function remotingSayHello():void{
var sname:String = nameInput.text;
h.hello(sname);
}
]]>
</mx:Script>

<mx:RemoteObject destination="hello" id="h"
result="gg(event)"
endpoint="http://localhost:8080/flexweb/messagebroker/amf" >

</mx:RemoteObject>


<mx:TextArea id="ggg" x="109" y="122"/>

<mx:Button label="say hello" click="remotingSayHello();"
x="144" y="193"/>
<mx:TextInput id="nameInput" x="109" y="73"/>
<mx:Label text="name" x="47" y="75"/>
</mx:Application>
4)重启tomcat,运行flexweb.mxml.
第三种方法,在编译完后,访问网页会出现 404 异常。具体原因不详。但是它仍会编译出
一个 swf文件,访问这个 swf 即可。而第二种方式可以编译出一个 html 文件。访问一下会出
现一下界面:
输入 dfdff,则输出 hello dfdff。说明调用 java 类成功。不信我们可以看看 java
类在控制台上的打印。

配置成功,高兴吧,o(∩_∩)o…哈哈。
如果用 lcds,则不需要预编译,可以直接访问 mxml 文件,lcds 会动态编译返回结果。(本人提示:其实你可以通过在上面配置中的flex输出目录中访问其html文件例如:http://127.0.0.1:8080/xxx/xxx_debug/xxx.html

解决:

倒数第11行的404 异常,我对比第二种和第三种发现第三种漏了


这个文件夹,所以解决办法:把漏的文件夹整个从第二种拷一份到项目中、刷新,一定要刷新到到出现

这个文件夹有这些内容,才可以成功。

注:文章中出现的“本人提示”是转载者,不是原作者。
(本人提示:对于第三种方式整合,建议其需要修改的文件全从第二种拷贝,这样能避免一个status404错误)。
posted @ 2010-05-18 23:34 勒紧皮带向前冲 阅读(3449) | 评论 (1)编辑 收藏
 

不可否认MyEclipse现在越做越强大(毕竟是收费的嘛),强大到开始排斥第三方插件,这有些不符合Eclipse的初衷,Eclipse就是靠良好的扩展性发展起来的。

MyEclipse从7.5开始(7.0没用过,不知道),完全改变了程序结构,现在扩展第三方插件 再也没有以前那么方便了,特别是link方式,这对程序员来说是致命的。Flex Plugin 安装时需要选择Eclipse目录,7.5中根本没有Eclipse目录,所以想直接在myeclipse中安装flex plugin是不太可能。我试过将flex里的features和plugins目录拷贝到myeclipse中进行强制安装,还是失败,所以最后只能将Eclipse,Flex plugin和myeclipse分开进行安装。

MyEclipse 7.5对应的Eclipse 版本为3.4,先到www.Eclipse.org官网去下载Eclipse3.4的版本。然后再到Myeclipse官网(已屏蔽大陆IP,需代理,但下载可以用迅雷直接下)去下载增量升级包,注意,一定要是增量升级包,即archived update site.zip 这个包,不能下载集成安装包,flex builder plugin 的版本也必须为3.02,这一点很重要,Adobe官网已经很明确的说明了3.0本版存在bug,不能再Eclipse3.4  中安装,已经下载3.0本版的可以到Adobe官网或google 中去下载补丁。安装顺序是,先解压Eclipse3.4 ,然后安装 Flex plugin ,和以前的安装方法一样,选好目录,直接下一步就行,然后再通过Eclipse的Help->Software Updates->Available Software ->Add site->Archive安装刚才下载的MyEclipse7.5 的增量升级包。如果你RP不是特别差的话,应该就大功告成了,Enjoy this !

同样,MyEclipse8.0中的Flex plugin 也可以这样安装。需要说明的是MyEclipse8.0 对应的Eclipse版本是3.5 。Eclipse3.5 对应的Flex plugin为4.0.目前Flex plugin 4.0的正式版还没出,还是Beta 版 ,Flex builder4 已经正式更名为 Flash builder4了 ,还是喜欢Flex builder的命名,感觉更加专业点,哈哈!


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/turejackon/archive/2010/03/10/5365821.aspx

posted @ 2010-05-17 09:46 勒紧皮带向前冲 阅读(1545) | 评论 (0)编辑 收藏
 
     摘要: Ext:让Grid支持中文排序  阅读全文
posted @ 2010-04-01 11:02 勒紧皮带向前冲 阅读(663) | 评论 (0)编辑 收藏
 
开发环境:Struts2.0.11.1
问题描述:当点击页面链接时候,随机出现以下对话框,Internet Explorer无法打开Internet站点http://localhost:8080/kmtcm/login.action 已终止操作
问题原因:页面使用了My97DatePicker这个日期控件,大概是在IE下载完了源文件但没有加载完,这个时候用JS的DOM对象的AppdenChid和innerHTML就会出错。我用FireFox试下,完全没有问题。
解决方法使用其他日历控件代替。
在此我替换使用的是jquery ui的日历插件。
关于使用方法(转自:http://hi.baidu.com/fairywood/blog/item/638bee30e4d4649ea8018ec8.html):
JQuery 日期控件
2009-02-12 13:16
    JQuery提供了很多控件, 例如用于选择日期的日期控件(Date Picker)。这些控件并没有随Jquery的核心库一并发布。而是作为一个叫做"JQuery UI"的子项目——或者叫做插件——的形式发布。
所以, 我们除了要在页面中引用jquery的那个js文件外, 还需要在http://jqueryui.com/下载与我们使用JQuery对应版本的JQuery UI的程序包。
目前, 最新的JQuery版本是1.3。 与这个版本对应的JQuery UI版本是1.6rc6。
由于JQuery UI采取了显示和功能分离的设计(皮肤, 或者叫”换肤“)。所以, 我们需要为日期控件附加样式。JQuery UI最神奇的特点之一就是提供了一个网站来给我们修改控件的样式:http://jqueryui.com/themeroller/。在这个页面中, 将控件样式调整满意后, 点击左侧的"Download theme"按钮。就可以把样式下载下来了。现在, 下载的是JQuery UI1.6rc5版本所使用的样式库。如果您用的较低的1.5, 那么请注意在点击”Download theme“按钮后出现页面的右侧选择相应的版本。不然, 不同版本的样式是不兼容的。
将下载下来的zip包解开, 我们可以看到里面已经准备好我们要用jquery核心库和JQuery UI的库。首先, 我们把jquery-1.3.x.js复制到网站的js目录下,jquery-ui-personalized-1.6rc6.min.js、i18n目录、theme目录复制到网站js/ui目录下。
JQuery核心库的安装非常简单, 我们把jquery.1.3.x.js文件引入页面即可。一般来说, 我们会把这个js文件改名为jquery.js, 放到“/js"目录下。
然后, 我们将jquery-ui-personalized-1.6rc6.min.js引入页面。如果觉得它的文件名太长。可以直接改成jquery-ui.js或者其他比较短的名字。
最后, 引入分别引入js/ui/theme/ui.all.css样式表以及/js/ui/i18n/ui.datepicker-zh-CN.js脚本文件到页面中。就完成了中文日期控件的安装。如果我们需要其他语言的空间, 请更换ui.datepicker-zh-CN.js文件。在js/ui/i18n中有很多其他语言的脚本。
终于, 我们可以在页面中,给某个输入框绑定一个日期控件了。例如, 我们的页面中有这么一个input:
<input type="text" id="birthday" name="birthday"/>
那么, 我们可以在$(document).ready()的事件函数(不懂的可以参见Jquery核心库的说明或者网上的相关资料)中写:$("birthday").datepicker();
现在打开页面, 如果不出意外。当我们点击这个文本框的时候就可以出现一个很炫的日期控件了。

现在修改一下:$("#bithday").attr("readonly", "true").datepicker(); 这样一来,用户就不能手工输入, 而只能通过控件选择日期了。

上面简单介绍了一下日期控件的使用方法。其实, 他们的可定制性是非常高的。今天我们只是使用了它们最简单最基本的功能。
posted @ 2010-02-26 14:03 勒紧皮带向前冲 阅读(1891) | 评论 (0)编辑 收藏
 
晚上做DEMO的时候遇到了这个问题,其实字面意义很明了:一个是display:inline把元素显示为行内元素,float:left让其脱离文档流,浮动起来。但对其具体的用处和区别还是不解。
于是google一下,好像这个问题并不像其它问题一样有很多博客转载,但还是找到了一些可以参考的东西。
细看了下,网上仅有的一些资料都是转载自这篇博文:http://andymao.com/andy/post/42.html。我也看了一下,但说实话只看懂了一半(可能是对标准化页面的设计还了解得不够深)。
于是动手做了一下实验,一目了然:

例:
XHTML部分
<ul class="disp">
<li>aaa</li>
<li>bbb</li>
<p>asdfadsf</p>
</ul>

<ul class="floa">
<li>ccc</li>
<li>ddd</li>
<p>eweweew</p>
</ul>
CSS部分:
ul.disp li
{
display:inline;
}
ul.floa li
{
float:left;
}
结果:
第一个class为disp的UL里LI显示为aaa,bbb为同一行,而
asdfadsf则另起了一行。前两个都均已经设为了行内元素。所以它们还是占着一行,下一个元素就另起了一行。
第二个class为 floa的UL里三个L均I显示在同一行里,因为前两个已经设为了float:left脱离了标准的文档行,而下一个块级元素,则忽略了前面的元素,而继续按照标准的文档进行排列。

最后摘抄一下,浏览到有用的资料:

首先我们要明确,display:inline;与float:left;正确含义。display:inline;(内联)《CSS权威指南》中文字显示:任何不是块级元素的可见元素都是内联元素。其表现的特性是“行布局”形式,这里的“行布局”的意思就是说其表现形式始终以行进行显示。比如,我们设定一个内联元素border-bottom:1px solid #000;时其表现是以每行进行重复,每一行下方都会有一条黑色的细线。如果是块级元素那么所显示的的黑线只会在块的下方出现。

当然这看起来不像是display:inline;与float:left;的区别所在,但是当理解了float:left;的特性那么我们就清楚到底是怎么回事了。float:left;(左浮动)他使得指定元素脱离普通的文档流而产生的特别的布局特性。并且FLOAT必需应用在块级元素之上,也就是说浮动并不应用于内联标签。或者换句话来说当应用了FLOAT那么这个元素将被指定为块级元素。

那么我们很清楚了,内联(display:inline;)元素不能设置宽高,因为内联属于行布局,其特性是在一行里进行布局,所以不能被设定宽高。

posted @ 2010-02-23 10:37 勒紧皮带向前冲 阅读(658) | 评论 (0)编辑 收藏
 
     摘要: 后台报SQL Error: 1064, SQLState: 42000错误,Could not synchronize database state with session   阅读全文
posted @ 2010-01-09 11:25 勒紧皮带向前冲 阅读(9419) | 评论 (1)编辑 收藏
 
新的项目决定使用s2sh框架,于是按文档整合好,在加入tiles后,启动包实例化tles实例化不能。翻篇看文档,找解决。
同事也同样遇到这样的问题。经两人花费两天时间后中解决。
由于jar包的冲突,特别是asm这个包,我和同事,是用了不同的asm版本,他使用低版本,我使用高版本。
因此,将我和他的jar包做个截图,以供以后配置。
先是同事的




我使用的jar包



请一定要注意在s2sht中去掉xerces-2.6.2.jar这个jar包,导致tiles不能启动的元凶。(上面贴出的jar可直接使用)
我和同事用于是用不同版本的asm.jar包,因此将高版本解决方法贴出。(解决方法来自:http://edu.codepub.com/2009/1215/18741.php
解决办法是:
1.去掉类路径上的关于Hibernate的3个lib
asm.jar
asm-attrs.jar
cglib-2.1.3.jar
2.加入Spring中的以下4个lib
asm-2.2.2.jar
asm-commons-2.2.2.jar
asm-util-2.2.2.jar
cglib-nodep-2.1_3.jar

注:我们是用的MyEclipse8自带的jar包。struts2.18,hibernate3.2,spring2.5
posted @ 2010-01-07 13:48 勒紧皮带向前冲 阅读(1152) | 评论 (0)编辑 收藏
 
     摘要:   1这是一个用JAVA W3C DOM 进行XML操作的例子,包含了查询、增加、修改、删除、保存的基本操作。较完整的描述了一个XML的整个操作流程。适合刚入门JAVA XML操作的朋友参考和学习。   2   3假设有XML文件:test1.xml   4  ...  阅读全文
posted @ 2009-12-18 10:46 勒紧皮带向前冲 阅读(547) | 评论 (0)编辑 收藏
 

package com.tongyue.hot.web;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class Dateutil {

 /**
 * 取得当前日期是多少周
 *
 * @param date
 * @return
 */
 public static int getWeekOfYear(Date date) {
 Calendar c = new GregorianCalendar();
 c.setFirstDayOfWeek(Calendar.MONDAY);
 c.setMinimalDaysInFirstWeek(7);
 c.setTime (date);

 return c.get(Calendar.WEEK_OF_YEAR);
 }

 /**
 * 得到某一年周的总数
 *
 * @param year
 * @return
 */
 public static int getMaxWeekNumOfYear(int year) {
 Calendar c = new GregorianCalendar();
 c.set(year, Calendar.DECEMBER, 31, 23, 59, 59);

 return getWeekOfYear(c.getTime());
 }

 /**
 * 得到某年某周的第一天
 *
 * @param year
 * @param week
 * @return
 */
 public static Date getFirstDayOfWeek(int year, int week) {
 Calendar c = new GregorianCalendar();
 c.set(Calendar.YEAR, year);
 c.set (Calendar.MONTH, Calendar.JANUARY);
 c.set(Calendar.DATE, 1);

 Calendar cal = (GregorianCalendar) c.clone();
 cal.add(Calendar.DATE, week * 7);

 return getFirstDayOfWeek(cal.getTime ());
 }

 /**
 * 得到某年某周的最后一天
 *
 * @param year
 * @param week
 * @return
 */
 public static Date getLastDayOfWeek(int year, int week) {
 Calendar c = new GregorianCalendar();
 c.set(Calendar.YEAR, year);
 c.set(Calendar.MONTH, Calendar.JANUARY);
 c.set(Calendar.DATE, 1);

 Calendar cal = (GregorianCalendar) c.clone();
 cal.add(Calendar.DATE , week * 7);

 return getLastDayOfWeek(cal.getTime());
 }

 /**
 * 取得指定日期所在周的第一天
 *
 * @param date
 * @return
 */
 public static Date getFirstDayOfWeek(Date date) {
 Calendar c = new GregorianCalendar();
 c.setFirstDayOfWeek(Calendar.MONDAY);
 c.setTime(date);
 c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek()); // Monday
 return c.getTime ();
 }

 /**
 * 取得指定日期所在周的最后一天
 *
 * @param date
 * @return
 */
 public static Date getLastDayOfWeek(Date date) {
 Calendar c = new GregorianCalendar();
 c.setFirstDayOfWeek(Calendar.MONDAY);
 c.setTime(date);
 c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek() + 6); // Sunday
 return c.getTime();
 }
 
 /**
 * 取得当前日期所在周的第一天
 *
 * @param date
 * @return
 */
 public static Date getFirstDayOfWeek() {
 Calendar c = new GregorianCalendar();
 c.setFirstDayOfWeek(Calendar.MONDAY);
 c.setTime(new Date());
 c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek()); // Monday
 return c.getTime ();
 }

 /**
 * 取得当前日期所在周的最后一天
 *
 * @param date
 * @return
 */
 public static Date getLastDayOfWeek() {
 Calendar c = new GregorianCalendar();
 c.setFirstDayOfWeek(Calendar.MONDAY);
 c.setTime(new Date());
 c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek() + 6); // Sunday
 return c.getTime();
 }
 /*
  *
 
 public static void main(String[] args) {
  int year = 2009;
  int week = 1;

  // 以2006-01-02位例
  Calendar c = new GregorianCalendar();
  c.set(2009, Calendar.DECEMBER, 7);
  Date d = c.getTime();

  System.out.println("current date = " + d);
  System.out.println("getWeekOfYear = " + getWeekOfYear(d));
  System.out.println("getMaxWeekNumOfYear = " + getMaxWeekNumOfYear(year));
  System.out.println("getFirstDayOfWeek = " + getFirstDayOfWeek(year, week));
  System.out.println("getLastDayOfWeek = " + getLastDayOfWeek(year, week));
  System.out.println ("getFirstDayOfWeek = " + getFirstDayOfWeek(d));
  System.out.println("getLastDayOfWeek = " + getLastDayOfWeek(d));
  System.out.println ("getFirstDayOfWeek = " + getFirstDayOfWeek());
  System.out.println("getLastDayOfWeek = " + getLastDayOfWeek());
  }
 */
}


 

posted @ 2009-12-07 11:45 勒紧皮带向前冲 阅读(2851) | 评论 (1)编辑 收藏
 
http://www.tianqi123.com/main/small_page.html?url=http://www.tianqi123.com/tianqi/chengshi_2291.html
posted @ 2009-11-26 16:58 勒紧皮带向前冲 阅读(358) | 评论 (0)编辑 收藏
 
Caused by: org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type setter of com.ccun.souhu.member.model.Seller.paymonth

最近我总犯这样的小错误 ···所以写下来提醒下自己,万事都怕健忘吗。

其实原因很简单那,我在写hibernate映射文件的时候,为了省事所以属性没写全,所以它映射到数据库中的字段默认值为null    当我所要存取的值为 int 类型或 long   类型的时候就会报错了  只要把数据库里表中的属性默认值改为0 在吧表中数据中的值改为0  就OK拉   嘎嘎  看来映射文件。。。不能总图省事
posted @ 2009-11-24 14:25 勒紧皮带向前冲 阅读(279) | 评论 (0)编辑 收藏
 
 1/** 
 2  * 判断链接是否有效 
 3  */
 
 4public static boolean isValidUrl(String strUrl) 
 5  try 
 6   URL url = new URL(strUrl); 
 7   HttpURLConnection huConn = (HttpURLConnection)url.openConnection(); 
 8   huConn.setRequestMethod("HEAD"); 
 9   String strMessage = huConn.getResponseMessage(); 
10   //if (strMessage.compareTo("Not Found") == 0) { 
11   if (strMessage.equals("OK")) 
12    huConn.disconnect(); 
13    return true
14   }
    
15  }
 catch (Exception e) 
16   return false
17  }
 
18  return false
19}
 
第二个,通过返回页面的内容来判断
 1/**   
 2    *   Get   Remote   Page   content   
 3    *   @param   strURL     
 4    *   @return   String   remote   page   content   
 5    *   @throws   Exception     
 6    */
   
 7  private   String   getRemotePage(String   strURL)   throws   Exception{   
 8  if   (!validation(strURL))   {   
 9  System.out.println(validation(strURL));   
10  throw   (new   Exception("Error   url"));   
11  }
   
12  String   strPageContent="";   
13  StringBuffer   strBuffer=new   StringBuffer();   
14  url=new   URL(strURL);   
15  huc=(HttpURLConnection)url.openConnection();   
16  huc.connect();   
17  BufferedReader   reader=new   BufferedReader(   
18  new   java.io.InputStreamReader(huc.getInputStream()));   
19  String   strLineContent="";   
20  while((strLineContent=reader.readLine())!=null){   
21  strBuffer.append(strLineContent);   
22  }
   
23  strPageContent=strBuffer.toString();   
24  return   strPageContent;   
25  }
以上都是从网上收集而来。
posted @ 2009-11-12 09:30 勒紧皮带向前冲 阅读(641) | 评论 (0)编辑 收藏
 

2009年11月10日 11:54:08
想object数据转换为interger数组 出错
原因:父类型不能强制装换为子类型。
2009年11月11日13:05:51
 JavaScript|html: 并不是所有的页面元素都有name属性,但肯定都有id属性
收集一个js操作,作用实现选项卡效果

 1<script type="text/javascript">
 2        function select(o)
 3            var b = document.all['tds'];    
 4            var c = o-1;                    
 5            for(var i = 0;i<b.length;i++){
 6                if(i == c){
 7                    document.all['tds'][i].className="x2";
 8                    document.all['divs'][i].className="xx2";    
 9                }
else{
10                    document.all['tds'][i].className="xx";
11                    document.all['divs'][i].className="xx1";
12                }
                
13            }
                    
14        }

15        
16        function selmo(o,j)
17                    
18            var b = document.all[o];            
19            var a = document.all[o+'div'];                        
20            for(var i = 0;i<b.length;i++){
21                if(i == j){
22                    b[i].className="selmo2";
23                    a[i].className="xx2";    
24                }
else{
25                    b[i].className="selmo1";
26                    a[i].className="xx1";
27                }
                
28            }
                    
29        }

30    </script>


posted @ 2009-11-10 11:55 勒紧皮带向前冲| 编辑 收藏
 
MySQL导入frm文件
2009年06月25日 星期四 20:00

前几天我心爱的Windows Server 2003系统忽然崩溃里面装的东西全完了

还好我是装双系统的,还能有个系统用用

在恢复过程中试了很多办法都不行哦.

后来去百度搜索一下 mysql导入frm文件,终于找到办法了!

现在把这些记在这里,以防忘记.

也希望能帮到需要帮助的人

下面开始步骤:

在新的系统上装一个mysql

然后在新的MySQL的目录下的data里面建立一个文件夹,文件夹的名字就是数据库的名字 .

先把mysql停止掉. 可以用 net stop mysql 来停止mysql

然后要恢复数的数据库的frm复制到这个新建的文件夹里面.

接着就是把原来那个mysql的data目录下的 ibdata1 文件复制到新的mysql目录下的data目录下覆盖掉原来那个最好把原来那个也备份一下,以防mysql不能启动.(这个我也不太清楚只是预防一下而已我是能启动了)

然后启动mysql就可以了的啦!

启动可以用net start mysql 来启动mysql

posted @ 2009-11-06 11:54 勒紧皮带向前冲 阅读(3837) | 评论 (1)编辑 收藏
 

.JVM内存的设置的原理

默认的java虚拟机的大小比较小,在对大数据进行处理时java就会报错:java.lang.OutOfMemoryError。设置jvm内存的方法,对于单独的.class,可以用下面的方法对Test运行时的jvm内存进行设置。
java -Xms64m -Xmx256m Test
-Xms
是设置内存初始化的大小
-Xmx
是设置最大能够使用内存的大小(最好不要超过物理内存大小)
weblogic中,可以在startweblogic.cmd中对每个domain虚拟内存的大小进行设置,默认的设置是在commEnv.cmd里面。

-vmargs
-Xms128M
-Xmx512M
-XX:PermSize=64M
-XX:MaxPermSize=128M

下面是这几个设置的一些背景知识:

  • 堆(Heap)和非堆(Non-heap)内存
    按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给 自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法 的代码都在非堆内存中。
  • 堆内存分配
    JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最 大分配的内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时, JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。
  • 非堆内存分配
    JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。
  • JVM内存限制(最大值)
    首先JVM内存首先受限于实际的最大物理内存,假设物理内存无限 大的话,JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,这个限制一般是 2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制了
  • JVM内存的调优

    1. Heap设定与垃圾回收Java Heap分为3个区,YoungOldPermanentYoung保存刚实例化的对象。当该区被填满时,GC会将对象移到Old区。Permanent区则负责保存反射对象,本文不讨论该区。JVMHeap分配可以使用-X参数设定,

    -Xms

    初始Heap大小

    -Xmx

    java heap最大值

    -Xmn

    young generationheap大小

    JVM2GC线程。第一个线程负责回收HeapYoung区。第二个线程在Heap不足时,遍历Heap,将Young 区升级为Older区。Older区的大小等于-Xmx减去-Xmn,不能将-Xms的值设的过大,因为第二个线程被迫运行会降低JVM的性能。

    为什么一些程序频繁发生GC?有如下原因:

    l         程序内调用了System.gc()Runtime.gc()

    l         一些中间件软件调用自己的GC方法,此时需要设置参数禁止这些GC

    l         JavaHeap太小,一般默认的Heap值都很小。

    l         频繁实例化对象,Release对象。此时尽量保存并重用对象,例如使用StringBuffer()String()

             如果你发现每次GC后,Heap的剩余空间会是总空间的50%,这表示你的Heap处于健康状态。许多Server端的Java程序每次GC后最好能有65%的剩余空间。经验之谈:

    1ServerJVM最好将-Xms-Xmx设为相同值。为了优化GC,最好让-Xmn值约等于-Xmx1/3[2]

    2.一个GUI程序最好是每1020秒间运行一次GC,每次在半秒之内完成[2]

    注意:

    1.增加Heap的大小虽然会降低GC的频率,但也增加了每次GC的时间。并且GC运行时,所有的用户线程将暂停,也就是GC期间,Java应用程序不做任何工作。

    2Heap大小并不决定进程的内存使用量。进程的内存使用量要大于-Xmx定义的值,因为Java为其他任务分配内存,例如每个线程的Stack等。

    2Stack的设定

    每个线程都有他自己的Stack

    -Xss

    每个线程的Stack大小

    Stack的大小限制着线程的数量。如果Stack过大就好导致内存溢漏。-Xss参数决定Stack大小,例如-Xss1024K。如果Stack太小,也会导致Stack溢漏。

    3.硬件环境

    硬件环境也影响GC的效率,例如机器的种类,内存,swap空间,和CPU的数量。

    如果你的程序需要频繁创建很多transient对象,会导致JVM频繁GC。这种情况你可以增加机器的内存,来减少Swap空间的使用[2]

    44GC

    第一种为单线程GC,也是默认的GC。,该GC适用于单CPU机器。

    第二种为Throughput GC,是多线程的GC,适用于多CPU,使用大量线程的程序。第二种GC与第一种GC相似,不同在于GC在收集Young区是多线程的,但在Old区和第一种一样,仍然采用单线程。-XX:+UseParallelGC参数启动该GC

    第三种为Concurrent Low Pause GC,类似于第一种,适用于多CPU,并要求缩短因GC造成程序停滞的时间。这种GC可以在Old区的回收同时,运行应用程序。-XX:+UseConcMarkSweepGC参数启动该GC

    第四种为Incremental Low Pause GC,适用于要求缩短因GC造成程序停滞的时间。这种GC可以在Young区回收的同时,回收一部分Old区对象。-Xincgc参数启动该GC

    4GC的具体描述参见[3]

    参考文章:

    1. JVM Tuning. http://www.caucho.com/resin-3.0/performance/jvm-tuning.xtp#garbage-collection

    2. Performance tuning Java: Tuning steps

    http://h21007.www2.hp.com/dspp/tech/tech_TechDocumentDetailPage_IDX/1,1701,1604,00.html

    3. Tuning Garbage Collection with the 1.4.2 JavaTM Virtual Machine .

    http://java.sun.com/docs/hotspot/gc1.4.2/

    二.Tomcat配置

    问题分析:

       由于TOMCAT内存溢出而引发的问题,主要原因是JVM的虚拟内存默认为128M,当超过这个值时就把先前占用的内存释放,而导致好象TCP/IP丢包的假象,出现HTTP500的错误。解决方法主要是加大TOMCAT可利用内存,并在程序当中加大内存使用。

    解决方法:

    方法:加大TOMCAT可利用内存:

      在TOMCAT的目录下,也就是在TOMCAT41/bin/catalina.bat文件最前面加入

      set JAVA_OPTS=-Xms800m -Xmx800m

      表现效果是当你启动TOMCAT时,系统内存会增加近800M使用

    操作方法:

      1)、先关掉WINDOWS服务当中的TOMCAT4服务。

      2)、再找到TOMCAT/BIN目录下startup.bat,双击打开它,你会发现现WINDOWS内存占用会增加近800M

      3)、执行程序,因为是TOMCAT重新编译程序,所以第一次会比较慢。

    结论:

    经过测试,我们得出如下数据:

    当系统传输约2000条数据时,大约近12M的净数据(不压缩时),系统辅助运行的内存大约占用150M左右的空间,也就是近200M的内存占用,而我们扩大了近800MJAVA内存使用,这对于业务本身来说是足够了。所以你们不用担心大数据量的传递问题。

    基于JAVA虚拟机的原理,JAVA自动有垃圾回收机制,也就是在你对一些内存长时间不使用时(近2分钟,取决于使用频度和优先级等),就会自动垃圾回收,从而释放不用的内存占用。

    .WebLogic配置:

    由于WebLogic的配置问题,我们的测试出现了失败情况。原因是为WebLogic分配的内存太少了。通过修改commom\bin\commEnv.cmd文件来增加内存分配。

    修改的部分如下:

    :bea

    if "%PRODUCTION_MODE%" == "true" goto bea_prod_mode

    set JAVA_VM=-jrockit

    set MEM_ARGS=-Xms768m -Xmx1024m

    set JAVA_OPTIONS=%JAVA_OPTIONS% -Xverify:none

    goto continue

    :bea_prod_mode

    set JAVA_VM=-jrockit

    set MEM_ARGS=-Xms768m -Xmx1024m//原来是128M~256M,太小了,数据太大

    goto continue

    结果修改后,没有效果。还是有失败的情况。

    发现,原来,在:bea下面还有一段配置信息如下:

    :sun

    if "%PRODUCTION_MODE%" == "true" goto sun_prod_mode

    set JAVA_VM=-client

    set MEM_ARGS=-Xms768m -Xmx1024m -XX:MaxPermSize=256m

    set JAVA_OPTIONS=%JAVA_OPTIONS% -Xverify:none

    goto continue

    :sun_prod_mode

    set JAVA_VM=-server

    set MEM_ARGS=-Xms768m -Xmx1024m -XX:MaxPermSize=256m

    goto continue

    将这里的内存分配修改后见效。

    原因是,上面对第一段代码是为bea自己的JVM设置的,下面的是为Sun的设置的。而WebLogic默认的是Sun的,所以出了毛病。在JDK的选择上,weblogic有两种JDK供选择,一种是SunJDK,另外一种是Beajrockit。按照bea的网站的说明,sun jdk提供更好的兼容性,而使用jrockit可以提供更好的性能。作为weblogic集群我全部采用jrockit作为JDK环境,以达到更高的性能。

    在默认启动情况下,jrockit启动时为其窗口配置的内存大小比较小。注意weblogic的启动内存配置-Xms32m -Xmx256m,通过修改commEnv.sh可以修改这个参数,Xms表示启动开始分配的内存,Xmx表示最大能分配的内存,这里我们根据应用情况调整为-Xms1536m -Xmx1536m,这点需要根据自身测试情况和系统配置进行调整,经过周一晚的调试,我们目前应用比较合理的窗口内存大小为1536M2G× 75%),通过top可以观察到测试中的内存反应,最合理的应该是恰好把物理内存用完。


    posted @ 2009-10-31 09:01 勒紧皮带向前冲 阅读(486) | 评论 (0)编辑 收藏
     
    兼容IE和Firefox的设为首页和收藏的Javascript代码
    [2008-12-27 14:35:00] by mwfls

    本文参考下面这篇文章,在源代码的基础上作了一些小修改,方便各位应用,附下载文件:sethomepage.js(右键目标另存为保存到自己的电脑后,将扩展名txt改为js即可。)

    引用地址:我的空间show:http://csprogrammer.blog.51cto.com/212533/51081
    1. function addCookie()   
    2. {   
    3.  if (document.all)   
    4.     {   
    5.        window.external.addFavorite('http://www.carzymusic.com','疯狂音乐网');   
    6.     }   
    7.     else if (window.sidebar)   
    8.     {   
    9.        window.sidebar.addPanel('疯狂音乐网''http://www.carzymusic.com'"");   
    10.  }   
    11. }   
    12. function setHomepage()   
    13. {   
    14.  if (document.all)   
    15.     {   
    16.         document.body.style.behavior='url(#default#homepage)';   
    17.   document.body.setHomePage('http://www.crazymusic.com');   
    18.     
    19.     }   
    20.     else if (window.sidebar)   
    21.     {   
    22.     if(window.netscape)   
    23.     {   
    24.          try  
    25.    {     
    26.             netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");     
    27.          }     
    28.          catch (e)     
    29.          {     
    30.     alert( "该操作被浏览器拒绝,如果想启用该功能,请在地址栏内输入 about:config,然后将项 signed.applets.codebase_principal_support 值该为true" );     
    31.          }   
    32.     }    
    33.     var prefs = Components.classes['@mozilla.org/preferences-service;1'].getService(Components. interfaces.nsIPrefBranch);   
    34.     prefs.setCharPref('browser.startup.homepage','http://www.carzymusic.com');   
    35.  }   
    36. }   
    37.     

    以上代码全是用Javascript代码所写,大家可以直接使用……

    下面是经过修改后的示例及js代码:

    1. 加入收藏夹(IE、Firefox均可)
    2. 设置为首页(IE、Firefox均可)

    源代码:

    1. <script type="text/javascript" src="js文件所在位置"></script>    
    2. <ol>  
    3. <li><a href="javascript:;" onClick="addCookie('http://www.mak-s.com','MakStudio')">加入收藏夹(IE、Firefox均可)</a></li>  
    4. <li><a href="javascript:;" onClick="setHomepage('http://www.mak-s.com')">设置为首页(IE、Firefox均可)</a></li>  
    5. </ol>  

    JavaScript源代码:

    1. // JavaScript Document   
    2. function addCookie(pageURL,pageNAME)   
    3. {   
    4.  if (document.all)   
    5.     {   
    6.        window.external.addFavorite(pageURL,pageNAME);   
    7.     }   
    8.     else if (window.sidebar)   
    9.     {   
    10.        window.sidebar.addPanel(pageNAME, pageURL, "");   
    11.  }   
    12. }   
    13. function setHomepage(pageURL)   
    14. {   
    15.  if (document.all)   
    16.     {   
    17.         document.body.style.behavior='url(#default#homepage)';   
    18.   document.body.setHomePage(pageURL);   
    19.     
    20.     }   
    21.     else if (window.sidebar)   
    22.     {   
    23.     if(window.netscape)   
    24.     {   
    25.          try  
    26.    {     
    27.             netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");     
    28.          }     
    29.          catch (e)     
    30.          {     
    31.     alert( "该操作被浏览器拒绝,如果想启用该功能,请在地址栏内输入 about:config,然后将项 signed.applets.codebase_principal_support 值该为true" );     
    32.          }   
    33.     }    
    34.     var prefs = Components.classes['@mozilla.org/preferences-service;1'].getService(Components. interfaces.nsIPrefBranch);   
    35.     prefs.setCharPref('browser.startup.homepage',pageURL);   
    36.  }   
    37. }  
    posted @ 2009-10-28 12:15 勒紧皮带向前冲 阅读(512) | 评论 (0)编辑 收藏
     

    Apache2.2.4整合Tomcat6.0.16三种方式的详细配置过程

    关键字: apache2.2.4整合tomcat6.0.16三种方式的详细配置过程

     

    通常都是通过JK_MOD来整合Apache和Tomcat,但是Apache2.2版本以上整合Tomcat可以直接通过AJP_PROXY来完成,很方便。下面把几种方式都简单讲讲。

    假设一个Apache,两个Tomcat容器,访问 a.hackang.cn 和 b.hackang.cn 分别对应 tomcata 和 tomcatb 的应用

    第一种方式:JK_PROXY

    安装好Apache和Tomcat,下载mod_jk-1.2.26-httpd-2.2.4.so (2.2.4对应着Apache版本)

    将mod_jk-1.2.26-httpd-2.2.4.so 放到Apache安装目录的modules文件夹下。

    在Apache安装目录的conf文件夹创建workers.properties配置文件,内容如下:

    #下面是Tomcat实例列表

    worker.list=tomcata,tomcatb

    #tomcata实例配置

    worker.tomcata.host=127.0.0.1

    worker.tomcata.port=8009

    worker.tomcata.type=ajp13

    #tomcatb实例配置

    worker.tomcatb.host=127.0.0.1

    worker.tomcatb.port=9009

    worker.tomcatb.type=ajp13

    编辑apache配置文件httpd.conf,在文件末尾加上以下内容:

    #以下为tomcat集成配置部分

    LoadModule jk_module modules/mod_jk-1.2.26-httpd-2.2.4.so

    JkWorkersFile conf/workers.properties

    JkLogFile logs/mod_jk.log

    JkLogLevel info

    #如果机器有多个IP地址请务必使用*号

    NameVirtualHost *:80

     

    #a.hackang.cn虚拟站点

    <VirtualHost *:80>

    ServerName a.hackang.cn

    JkMount /*.* tomcata

    JkMount /* tomcata

    DirectoryIndex index.jsp

    </VirtualHost>

    #b.hackang.cn虚拟站点

    <VirtualHost *:80>

    ServerName b.hackang.cn

    JkMount /*.* tomcatb

    DirectoryIndex index.jsp

    </VirtualHost>

    下面是Tomcat的配置,很重要。

    tomcata可以使用默认配置,如果想访问 a.hackang.cn直接显示某应用的首页,可在tomcata的配置文件server.xml里面的host节点间加上

    <Context className="org.apache.catalina.core.StandardContext" cachingAllowed="true"

    charsetMapperClass="org.apache.catalina.util.CharsetMapper" cookies="true" crossContext="false" debug="0" displayName="a.hackang.cn" docBase="E:\myweb\a"

           mapperClass="org.apache.catalina.core.StandardContextMapper" path=""  privileged="false" reloadable="false" swallowOutput="false" useNaming="true"

           wrapperClass="org.apache.catalina.core.StandardWrapper">

    </Context>

    docBase指向的你应用所在的文件夹,不能将此应用部署到tomcata的webapps文件夹中。否则就有两个应用了,一个是根访问路径,一个是根访问路径+应用名了。

    tomcatb的配置要稍加修改,修改 conf/server.xml文件

    <Server port="8005" shutdown="SHUTDOWN">将此处的端口号改掉,不能与tomcata的相同,比如可以改成 9005

    修改默认的8080端口为9090,修改后如下:

    <Connector port="9090" maxHttpHeaderSize="8192"

                 maxThreads="150" minSpareThreads="25" maxSpareThreads="75"

                 enableLookups="false" redirectPort="8443" acceptCount="100"

                 connectionTimeout="20000" disableUploadTimeout="true" />

     

    修改端口号为8009的Connector

    修改前为:

    <Connector port="8009" enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />

    修改后:

    <Connector port="9009" enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />

    此处的9009跟workers.properties文件中tomcatb的端口号是一致的。

    如果也想访问 b.hackang.cn时直接显示应用b,配置方法同a,以上已经提及,只需将docBase="E:\myweb\a" 改成 docBase="E:\myweb\b"即可

    最后编辑C:\WINDOWS\system32\drivers\etc\hosts文件,在最后加上两个映射

      127.0.0.1  a.hackang.cn

      127.0.0.1  b.hackang.cn

     

    至此,配置就结束了,可以用Apache的Test Configuration命令测试一下配置文件,如果没有问题,启动Apache,再分别启动两个Tomcat就ok了

    第二种方式配置: ajp

    apache2.2以上版本,无需使用jk_mod来集成tomcat,直接使用ajp,很方便。

    修改apache配置文件httpd.conf

    启用mod_proxy_ajp

    #LoadModule proxy_module modules/mod_proxy.so

    #LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

    把这两行前面的#去掉即可

    然后在末尾加上

    <VirtualHost *:80>

    ProxyPass / ajp://127.0.0.1:8009/

    ProxyPassReverse / ajp://127.0.0.1:8009/

    ServerName a.hackang.cn

    </VirtualHost>

    <VirtualHost *:80>

    ProxyPass / ajp://127.0.0.1:9009/

    ProxyPassReverse / ajp://127.0.0.1:9009/

    ServerName b.hackang.cn

    </VirtualHost>

    搞定!!!方便吧,我现在用的就是这种。

    第三种方式

    第三种方式其实跟第二种差不多,只不过用的是http端口

    <VirtualHost *:80>

    ProxyPass / http://127.0.0.1:8080/

    ProxyPassReverse / http://127.0.0.1:8080/

    ServerName a.hackang.cn

    </VirtualHost>

    <VirtualHost *:80>

    ProxyPass / http://127.0.0.1:9090/

    ProxyPassReverse / http://127.0.0.1:9090/

    ServerName b.hackang.cn

    </VirtualHost>

    此处的9090跟tomcatb中配置的http端口一致

     

    到此Apache整合Tomcat全部结束,若要加强tomcat处理静态资源的能力,可以启用APR服务。

    posted @ 2009-10-18 18:51 勒紧皮带向前冲 阅读(726) | 评论 (0)编辑 收藏
     
    一.整合apache+tomcat+php
     
    1》下载需要的软件:
    Apache :      apache_2.0.59-win32-x86-no_ssl.msi    http://httpd.apache.org/
    Tomcat :      apache-tomcat-5.5.23.exe              http://tomcat.apache.org/
    Php    :      php-5.2.4-Win32.zip                   http://www.php.net
    Mysql  :      mysql-5.0.45-win32.zip                http://www.mysql.org
    JDK    :      jdk-5-windows-i586.exe                http://java.sun.com
    JK插件 :      mod_jk-apache-2.0.59.so    http://archive.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.23/mod_jk-apache-2.0.59.so
     
    2》安装软件
    <1>安装Apache
    在安装的过程中将会出现叫你填服务器的地址
    我是这样写的:
    127.0.0.1  或者localhost  或者是真实的ip地址或域名
    127.0.0.1
    your@yahoo.com 也就是你的油箱
    我的Apache的安装目录是:D:\root\Apache2
    <2>安装JDK环境
    我的JDK的安装目录是:C:\jdk1.5.0
    并增加JAVA_HOME和PATH变量
    分别是:JAVA_HOME=C:\jdk1.5.0
    PATH=%JAVA_HOME%\bin

    <3>安装Tomcat
    Tomcat我采用的是默认安装
    安装目录是:D:\root\Tomcat 5.5
    端口:8080

    <4>安装Mysql数据库
    安装密码是:admin
    数据库编码是:gbk
    安装的目录是:D:\root\Tomcat 5.5

    <5>安装php
    解压php-5.2.4-Win32.zip到目录:D:\root\php
     
    3》配置服务器,使能够提供jsp,php服务
    <1>配置php
    将php安装目录下的php.ini-dist文件改名为php.ini
    修改办法:将扩展加入文件当中
    并将:
    extension=php_mbstring.dll
    extension=php_dbase.dll
    extension=php_gd2.dll
    extension=php_mysql.dll
    这些扩展前面的分号去掉
    我做的修改是:
    extension_dir = "d:/root/php/ext/"
    extension=php_mbstring.dll
    extension=php_dbase.dll
    extension=php_gd2.dll
    extension=php_mysql.dll
    <2>配置Apache
    将JK插件拷贝到D:\root\Apache2\modules目录中,它的作用是将jsp请求转发给Tomcat
    修改http.conf  文件在D:\root\Apache2\conf目录中
    web服务的目录D:\root\webroot
    主要修改:
    1:修改DocumentRoot
    改后的值:DocumentRoot "D:/root/webroot"
    2:修改Directory
    改后的值:<Directory "D:/root/webroot">
    3:增加php服务功能
    在ScriptAlias下面加上:
    ScriptAlias /cgi-bin/ "D:/root/Apache2/cgi-bin/"
    ScriptAlias  /php/  "d:/root/php/"
    addtype application/x-httpd-php .php
    action application/x-httpd-php "/php/php.exe"

    4:加载模块
    在Dynamic Shared Object (DSO) Support下面加入:
    LoadModule php5_module "d:/root/php/php5apache2.dll"
    LoadModule jk_module modules/mod_jk-apache-2.0.59.so
    加载的模块分别是php模块和jk模块
    5:增加tomcat转发配置
    在文件结尾加入:
    JkWorkersFile "D:\root\ConnApaTom\workers.properties"
    JkMount /servlet/* ajp13
    JkMount /*.jsp ajp13
    JkMount /*.do  ajp13

    保存http.conf文件即可

    6:配置和Tomcat的集成
    新建ConnApaTom目录:目录地址是:
    D:\root\ConnApaTom
    将写好的workers.properties文件保存到该目录中
    文件内容是:
    workers.tomcat_home=D:\root\Tomcat 5.5
    workers.java_home=C:\jdk1.5.0
    worker.list=ajp12, ajp13
    worker.ajp12.port=8007
    worker.ajp12.host=localhost
    worker.ajp12.type=ajp12
    worker.ajp12.lbfactor=1
    worker.ajp13.port=8009
    worker.ajp13.host=localhost
    worker.ajp13.type=ajp13
    worker.ajp13.lbfactor=1
    worker.loadbalancer.type=lb
    worker.loadbalancer.balance_workers=ajp12, ajp13
    worker.inprocess.type=jni
    worker.inprocess.class_path=$(workers.tomcat_home)$(ps)lib$(ps)tomcat.jar
    worker.inprocess.cmd_line=start
    worker.inprocess.jvm_lib=$(workers.java_home)$(ps)jre$(ps)bin$(ps)classic$(ps)jvm.dll
    worker.inprocess.stdout=$(workers.tomcat_home)$(ps)logs$(ps)inprocess.stdout
    worker.inprocess.stderr=$(workers.tomcat_home)$(ps)logs$(ps)inprocess.stderr

    修改Tomcat的配置文件:server.xml

          <Host name="localhost" appBase="D:\root\webroot"
           unpackWARs="true" autoDeploy="true"
           xmlValidation="false" xmlNamespaceAware="false">
          </Host>

    保存即可

    在D:\root\webroot目录添加.html .jsp .php文件便可运行.
    jsp的话还是要放入D:\root\webroot\root\*.jsp这样才能在http://localhost/*.jsp显示出来
     
    二.虚拟主机的配置
     
    1>.修改C:\WINDOWS\system32\drivers\etc\hosts文件
     
    # For example:
    #
    #      102.54.94.97     rhino.acme.com          # source server
    #       38.25.63.10     x.acme.com              # x client host

    127.0.0.1 www.aaa.com
    127.0.0.1 www.bbb.com
     
    2>.修改D:\root\Apache2\conf\http.conf  在文件尾部加入:
     
    NameVirtualHost *:80
    <VirtualHost *:80>
        ServerAdmin admin@aaa.com
        DocumentRoot "D:/root/webroot/aaa"
        ServerName www.aaa.com
        ServerAlias *.aaa.com
        DirectoryIndex index.jsp index.php index.htm index.html
        ErrorLog logs/aaa.example.com-error_log
        CustomLog logs/aaa.example.com-access_log common
    </VirtualHost>
    <VirtualHost *:80>
        ServerAdmin admin@bbb.com
        DocumentRoot "D:/root/webroot/bbb"
        ServerName www.bbb.com
        ServerAlias *.bbb.com
        DirectoryIndex index.jsp index.php index.htm index.html
        ErrorLog logs/bbb.example.com-error_log
        CustomLog logs/bbb.example.com-access_log common
    </VirtualHost>

     
    2>.修改D:\root\Tomcat 5.5\server.xml  文件:
     
          <Host name="www.aaa.com" appBase="D:\root\webroot\aaa"
           unpackWARs="true" autoDeploy="true"
           xmlValidation="false" xmlNamespaceAware="false">
      <alias>aaa.com</alias>
      <alias>aaa</alias>
      <Context path="" docBase="D:\root\webroot\aaa" debug="0" reloadable="true"/>
          </Host>
          <Host name="www.bbb.com" appBase="D:\root\webroot\bbb"
           unpackWARs="true" autoDeploy="true"
           xmlValidation="false" xmlNamespaceAware="false">
      <alias>bbb.com</alias>
      <alias>bbb</alias>
      <Context path="" docBase="D:\root\webroot\bbb" debug="0" reloadable="true"/>
          </Host>
     
     
    同时在D:\root\webroot\aaa和D:\root\webroot\bbb放入相应的测试文件,重启Apache与Tomcat.
    注:现在jsp文件不用放入ROOT目录中
    ps:这个是我今天在网上按某大大的改的。改文的软件我都放在我的文件中了。和我一样懒得,可以去下。
    posted @ 2009-09-26 16:10 勒紧皮带向前冲 阅读(356) | 评论 (0)编辑 收藏
     
    tomcat配置虚拟主机
    2008-12-13 17:38

    一、网站系统的组成

    只要在一台计算机上安装了WEB服务器软件,从功能上讲,这台计算机就可以称为WEB服务器。一个网站的规模可大可小,功能可多可少,最简单的网站只需要一台Web服务器即可对外提供网页浏览服务。复杂的网站包括多台WEB服务器组成的群集系统、负载均衡设备、具有缓存功能的代理服务器(可以有多级,甚至包括放置在服务器端的缓存系统)、数据库系统等,如图2.2所示。

     


    2.2

    www.sina.com网站系统采用的基本上就是图2.2所示的架构,不同地区的人们在访问www.sina.com站点时,浏览器实际上所访问的服务器是不一样的,例如,吉林省的用户访问的服务器实际是sina放在吉林地区的代理服务器,湖北省的用户访问的服务器实际是sina放在湖北地区的代理服务器。各地区的浏览器访问www.sina.com站点的过程如图2.3所示。

     


    2.3

    为了能够让浏览器透明地访问到WEB站点,让用户感觉不到是在访问区域代理服务器,在DNS系统中需要将www.sina.com主机名指向所有的区域代理服务器的IP地址。在浏览器访问www.sina.com站点中的页面而向DNS服务器请求解析www.sina.com主机名时,DNS服务器根据访问者的地理位置信息返回他附近的区域代理服务器的IP地址,这样,浏览器的访问请求将发送给该区域代理服务器。只有当区域代理服务器中没有浏览器要访问的页面时,区域代理服务器才去从真正的www.sina.com站点服务器上获取该页面并进行缓存,以后该区域的其他浏览器就都可以就近从区域代理服务器中访问到该页面了,从而大大提高了访问效率和减少了网络流量。

     

     

    二、基于主机名的虚拟主机

    WEB浏览器与WEB服务器建立连接后,除了将请求URL中的资源路径发送给WEB服务器外,还会将URL中的主机名部分作为HTTP请求消息的Host头发送给WEB服务器。例如,在浏览器地址栏中输入http://www.it315.org,浏览器发送给www.it315.org主机上的WEB服务器的请求消息内容如下:

           GET / HTTP/1.1<回车>

           Host: www.it315.org<回车>

           <回车>

    WEB服务器接收到浏览器的访问请求消息后,根据Host头字段中所设置的主机名,就知道该选择哪个WEB站点来进行响应,因此,可以使用不同的主机名来作为区分同一个WEB服务器上的不同站点的标识信息。

    TomcatServer.xml配置文件中有一个<Host>元素,一个<Host>元素用于建立一个WEB站点,使用多个<Host>元素则可以建立多个WEB站点。<Host>元素的父级元素为<Engine>元素,嵌套在同一个<Engine>元素中的多个<Host>元素的name属性不能相同,<Host>元素的name属性指定WEB站点所对应的主机名称。TomcatServer.xml配置文件中初始设置的<Host>元素内容如下:

    <Host name="localhost" appBase="webapps" …>

    </Host>

    <Host>元素中的appBase属性指定了一个路径,该路径将作为嵌套在它里面的<Context>元素的docBase属性中设置的相对路径的基准路径。

    Tomcat接收到访问请求时,将比较请求消息中的Host头字段的值与<Host>元素的name属性值,并以匹配的<Host>元素所创建的WEB站点来响应。如果Server.xml文件中没有与请求消息的Host头字段匹配的<Host>元素,Tomcat将以默认的WEB站点来响应。只要<Engine>元素的defaultHost属性设置为嵌套在它里面的某个<Host>元素的name属性值,该<Host>元素所创建的WEB站点就成了该引擎的默认WEB站点。例如,TomcatServer.xml文件中的<Engine>元素的默认设置如下:

    <Engine name="Standalone" defaultHost="localhost" debug="0">

           <Host name="localhost" appBase="webapps" …>

          

           </Host>

    </Engine>

    上面的这段配置信息说明,该引擎的默认WEB站点为嵌套在<Engine>元素中的name属性为“localhost”的<Host>元素所创建的WEB站点。

    在同一台计算机上建立了多个基于主机名的虚拟主机后,WEB浏览器要访问其中的某个虚拟主机的资源时,在访问URL中必须采用主机名,而不能采用IP地址。这是因为WEB浏览器要将URL中的主机名部分作为HTTP请求消息的Host头发送给WEB服务器,如果URL中的主机名部分使用的是IP地址,那么,浏览器发出的请求消息中的Host头字段的值就是这个IP地址,而在同一台计算机上建立的多个基于主机名的虚拟主机共享同一个IP地址,在Host头字段使用IP地址根本就无法区分不同的站点。

    即使在URL中指定的是主机名时,WEB浏览器还是要先获得该主机名所对应的IP地址,然后再使用这个IP去连接WEB服务器。所以,在建立基于主机名的虚拟主机时,除了要在Tomcatserver.xml文件中进行设置外,还需要在整个网络系统中建立主机名与IP地址的映射关系,即必须将主机名添加到名称解析系统,以便WEB浏览器能够从名称解析系统中查询出主机名所对应的IP地址。建立主机名与IP地址的映射关系的惯用方式有两种:一是使用客户机本地的Hosts 文件,二是使用DNS(Domain Name System,域名系统)服务器。Hosts 文件和DNS的作用都是允许用户使用“友好”的、文本格式的主机名称,而不是数字格式的IP地址来访问网络中的计算机。Hosts文件可用于小型的Intranet(企业内部网),网络中的所有计算机上都需要使用Hosts文件。DNS通常用于大型的网络,特别是Internet上对外提供服务的计算机都是通过DNS来建立其主机名与IP地址的映射关系。客户机首先在本地的Hosts文件中查找主机名称所映射的IP地址,如果没有找到,再去查询DNS服务器。为了简单起见,这里仅介绍一下Hosts文件。对于Windows 2000系统,Hosts 文件位于操作系统根目录(取决操作系统所在的分区,通常是c:\winnt)下的System32\Drivers\Etc子目录中,默认情况下,该文件中有如下一行内容:

           127.0.0.1       localhost

    这行文本的作用就是将IP地址(127.0.0.1)映射成主机名(localhost),这也就是在IE浏览器地址栏中可以使用localhost访问本地WEB服务器的原因。如果要增加更多的主机名与IP地址的映射,可以在Hosts文件中增加更多的行,然后参照上面这行内容的格式在每行中填写IP地址和相应的主机名。

    :动手体验:使用Tomcat建立基于主机名的虚拟主机

    1)用UltraEdit打开<Tomcat主目录>/conf目录下的Server.xml文件,使用“查找”菜单查找内容为“</Host>”的行,紧接该行下面增加一对<Host></Host>标签。参照前面的<Host>标签的属性设置情况,设置新增的<Host>标签的属性,并在它里面嵌套一个设置该WEB站点根目录的<Context>元素,最终的内容如下:

           <Host name="site1" debug="0" appBase="d:\VirtualHost1">

                  <Context path="" docBase="." debug="0"/>

           </Host>

    这样,将创建一个新的WEB站点。上面的<Context>元素的docBase属性值被设置为一个点(.),即表示使用<Host>元素的appBase属性中所设置的路径作为这个<Context>所映射的目录。

    2)在上面新增的<Host></Host>标签对下面再增加一对<Host></Host>标签,并将它设置为如下形式:

           <Host name="site2" debug="0" appBase="d:\VirtualHost2">

                  <Context path="" docBase="." debug="0"/>

           </Host>

    这又创建了一个新的WEB站点,该站点的主机名称为site2,根目录对应的本地文件系统目录为d:\VirtualHost2

    3)在d:盘下创建名称为VirtualHost1VirtualHost2两个目录,并在这两个目录中分别创建一个名为test.html的文件,在d:\VirtualHost1\test.html文件中写入如下一行内容:

        这是d:\VirtualHost1目录中的test.html文件

    d:\VirtualHost2\test.html文件中写入如下一行内容:

        这是d:\VirtualHost2目录中的test.html文件

    4)保存修改后的Server.xml文件,重新启动Tomcat WEB服务器程序。打开一个新的命令行窗口中,并在这个命令行窗口中执行如下命令:

    telnet 127.0.0.1 8080

    接着在连接成功的telnet程序命令窗口中,输入如下内容:

           GET /test.html HTTP/1.1<回车>

           Host:<空格>site1<回车>

           <回车>

    这时在telnet程序窗口中可以看到,WEB服务器返回内容的正文部分为d:\VirtualHost1\test.html文件中的内容。接着WEB服务器返回内容的下边,输入如下内容:

           GET /test.html HTTP/1.1<回车>

           Host:<空格>site2<回车>

           <回车>

    telnet程序窗口中又可以看到,WEB服务器这次返回内容的正文部分为d:\VirtualHost2\test.html文件中的内容。接着WEB服务器返回内容的下边,输入如下内容:

           GET /test.html HTTP/1.1<回车>

           Host:<空格><回车>

           <回车>

    telnet程序窗口中又可以看到,WEB服务器这次返回内容的正文部分为d:\test\test.html文件中的内容。接着WEB服务器返回内容的下边,再次输入如下内容:

           GET /test.html HTTP/1.1<回车>

           Host:<空格>xxx<回车>

           <回车>

    telnet程序窗口中又可以看到,WEB服务器这次返回内容的正文部分仍然为d:\test\test.html文件中的内容。

    上面的整个交互过程如图2.34所示,Tomcat根据第1次和第2次请求中所指定Host头的值,查找Server.xml文件中与之相匹配的<Host>元素的name属性值,并以匹配的<Host>元素所设置的WEB站点来响应;在第3次和第4次请求中所指定Host头的值,在Server.xml文件中没有与之对应的<Host>元素的name属性值,Tomcat将以默认的WEB站点来响应。

     


    2.34

    5)在Windows 2000系统中,用记事本程序打开c:\winnt\System32\Drivers\Etc\Hosts文件,可以看到有如下一行内容:

           127.0.0.1       localhost

    紧接这行文本的下面,用它复制出两行文本,并将这两行文本中的localhost分别修改成site1site2,这样,就使用Hosts文件为当前计算机设置了多个主机名。如果要用site1site2这个两主机名访问其他计算机上的WEB站点,则应将127.0.0.1修改成其他计算机的实际IP地址。保存Hosts文件后,在命令行窗口中执行“ping site1”和“ping site2”命令,查看该主机名是否被正确解析到了相应的IP地址上。建立site1site2与计算机IP地址的映射后,在IE浏览器地址栏中输入http://localhost:8080/test.htmlhttp://site1:8080/test.htmlhttp://site2:8080/test.html,可以看到浏览器将显示出各自站点中的test.html网页文件的内容。

    可见,使用主机名的方式在同一台WEB服务器上创建多个虚拟主机后,在WEB浏览器中使用主机名访问Web服务器时,Web服务器将选择与该主机名关联的WEB站点进行响应。通过这种方式,多个WEB站点可以共享同一个IP地址和相同的端口号,唯一不足的就是WEB浏览不能通过IP地址去访问这些WEB站点。基于主机名的虚拟主机是目前Internet上的大多数虚拟主机业务提供商所通常采用的方式。只要找出几个小型公司或个人的网站,如果在WEB浏览器地址栏中输入“http://主机名”可以访问到该WEB站点,接着在命令行窗口中执行“ping 主机名”,查看到该域名对应的IP地址,然后在WEB浏览器地址栏中输入“http://IP地址”时,却无法访问这个WEB站点了,那么,这个WEB站点就是一个基于主机名的虚拟主机,它与其他一些WEB站点共享一台WEB服务器,而不是自己独享一台WEB服务器。

     

    注意:当使用安全套接字层 (SSL) 时,不能使用主机头字段来实现虚拟主机,这是因为使用SSLHTTP请求有加密保护。主机头字段是加密内容的一部分,不能被解释和路由到正确的站点。

    posted @ 2009-09-16 20:17 勒紧皮带向前冲 阅读(295) | 评论 (0)编辑 收藏
     

    从网上找的IE和FF下都兼容的加入收藏的代码

     1很早就发现传统的加入IE收藏夹的代码在Firefox下是无效的。
     2
     3
     4<a href="javascript:window.external.AddFavorite('http://www.9enjoy.com','9Enjoy')">添加到收藏夹</a>
     5
     6
     7今天浏览im286,发现讨论两者兼容的代码,调试后,发现可行:)
     8
     9第一段:
    10
    11
    12<script>
    13function addfavorite()
    14{
    15  if (document.all)
    16  {
    17     window.external.addFavorite('http://www.9enjoy.com','9Enjoy');
    18  }

    19  else if (window.sidebar)
    20  {
    21     window.sidebar.addPanel('9Enjoy''http://www.9enjoy.com'"");
    22  }

    23}
     
    24</script>
    25<a href="#" onclick="addfavorite()">把本博客加入收藏</a>
    26
    27
    28
    29下面一段更严谨,IE6,IE7,FF均通过。
    30
    31
    32<html>
    33<head>
    34<title>加入收藏</title>
    35<script language="JavaScript" type="text/javascript">
    36function JSAddFavorite()
    37{
    38
    39       if ( window.sidebar && "object" == typeof( window.sidebar ) && "function" == typeof( window.sidebar.addPanel ) )
    40
    41       {
    42
    43               //  firefox
    44
    45               window.sidebar.addPanel( '9Enjoy, 'http://www.9enjoy.com/', '' );
    46
    47       }

    48
    49       else if ( document.all && "object" == typeof( window.external ) )
    50
    51       {
    52
    53               //  ie
    54
    55               window.external.addFavorite( 'http://www.9enjoy.com/''9Enjoy' );
    56
    57       }

    58
    59}

    60
    61</script>
    62</head>
    63
    64<body>
    65<a href="javascript:JSAddFavorite();" title="加入收藏">加入收藏</a>
    66</body>
    67<html>
    68-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    注,我使用以上代码在FF上并未执行成功。
    这个是我的代码
     1<script language="javascript">
     2    function JSAddFavorite(){
     3        if(window.sidebar && "object" == typeof(window.sidebar) && "function"==typeof(window.sidebar.addPanel)){
     4            //firefox
     5            window.sidebar.addPanel("收藏标记","http://www.xxxx.com");
     6        }

     7        else if(document.all && "object" == typeof(window.external)){
     8            //ie
     9            window.external.addFavorite("http://www.xxxx.com","收藏标记");
    10        }

    11    }

    12    window.setTimeout("JSAddFavorite",60*1000);
    13</script>
    如上,在FF上执行不成功。不知怎么回事?有知道的兄弟评论下。
    posted @ 2009-09-15 23:27 勒紧皮带向前冲 阅读(354) | 评论 (0)编辑 收藏
     
    [转]jsp获取客户端ip和mac地址
    2009年04月10日 星期五 16:02

    最近做一个安全系统,需要对用户的 ip 和 mac 地址进行验证,这里用到获取客户端ip和mac地址的两个方法,留存。

    1.获取客户端ip地址( 这个必须从客户端传到后台):
       jsp页面下,很简单,request.getRemoteAddr() ;
       因为系统的VIew层是用JSF来实现的,因此页面上没法直接获得类似request,在bean里做了个强制转换
       public String getMyIP() {
            try {
                FacesContext fc = FacesContext.getCurrentInstance();
                HttpServletRequest request = (HttpServletRequest)fc.getExternalContext().getRequest();
                return request.getRemoteAddr();
            }
            catch (Exception e) {
                e.printStackTrace();
            }
            return "";
        }

    2.获取客户端mac地址
        调用window的命令,在后台Bean里实现 通过ip来获取mac地址。方法如下:

        public String getMACAddress(String ip){
            String str = "";
            String macAddress = "";
            try {
                Process p = Runtime.getRuntime().exec("nbtstat -A " + ip);
                InputStreamReader ir = new InputStreamReader(p.getInputStream());
                LineNumberReader input = new LineNumberReader(ir);
                for (int i = 1; i < 100; i++) {
                    str = input.readLine();
                    if (str != null) {
                        if (str.indexOf("MAC Address") > 1) {
                            macAddress = str.substring(str.indexOf("MAC Address") + 14, str.length());
                            break;
                        }
                    }
                }
            } catch (IOException e) {
                e.printStackTrace(System.out);
            }
            return macAddress;
        }

    posted @ 2009-09-14 12:14 勒紧皮带向前冲 阅读(2088) | 评论 (0)编辑 收藏
     

    Tomcat6.0配置(虚拟目录的设置+多域名绑定)

    Tomcat6.0配置(虚拟目录的设置+多域名绑定)

    优点:tomcat6.0可以自动更新类和页面,当然如果修改了配置文件,或者web.xml和lib,则需要重启tomcat才可以.
    配置更方便,开设站点只需修改一个conf文件。

    Step 1 JDK安装
    ----------------------------------------------------------------------------------
    1.1 点击jdk-6u1-windows-i586-p.exe文件安装Jdk,选择目录(假使E:\jdk1.6),一路回车,安装完成
    1.2 添加JAVA环境变量(我的电脑右键->属性->高级->环境变量->系统变量)
            CLASSPATH   设置变量值 .;%JAVA_HOME%/bin;%JAVA_HOME%/jre/bin;%JAVA_HOME%/lib;%JAVA_HOME%/lib/tools.jar;%JAVA_HOME%/lib/dt.jar
            JAVA_HOME   设置变量值 C:\Program Files\Java\jdk1.6.0
            PATH        设置变量值 .;%JAVA_HOME%;%JAVA_HOME%/bin;(原来里面有内容的话 最后加入就行)
    1.3 在DOS命令行状态下测试Java是否成功安装,敲入java -version可以查看版本
         c:\>java -version
         java version "1.6.0_01"
         Java(TM) SE Runtime Environment (build 1.6.0_01-b06)
         Java HotSpot(TM) Client VM (build 1.6.0_01-b06, mixed mode, sharing)
    1.4 测试HelloWorld,新建一个HelloWorld.java的文件,内容如下
         public class HelloWorld {
            public static void main(String arg[]) {
               System.out.println("Hello World!这是Java测试程序,说明你已成功安装了Java -- Jarry!");
            }
         }
         在命令行输入javac HelloWorld.java,编译一下,然后再执行java HelloWorld,就能看到正常的输出了。
         出现错误一般是环境变量或大小写等有问题,仔细检查就没有问题了。     


    Step 2 Tomcat安装
    ----------------------------------------------------------------------------------
    2.1 点击apache-tomcat-6.0.10.exe文件安装Tomcat,选择目录(假使d:\Tomcat)安装完成后
    2.2 添加TOMCAT环境变量(我的电脑右键->属性->高级->环境变量->系统变量)
             TOMCAT_HOME   设置变量值 d:/Tomcat
    2.3 从程序菜单或是服务里启动Tomcat,然后你在浏览器输入http://localhost:8080/就可以看到Tomcat欢迎页面。
         正常情况下都会成功,如果启动失败,请检查jakarta_service_日期.log日志,通过它一般可以解决问题。

         比如出现类似报错:
         [947 prunsrv.c] [error] Failed creating java
         看一下系统盘windows/system32/下是否丢失msvcr71.dll文件,如果缺失,需要从别的机器拷贝一个过来。

         打开浏览器 进入http://localhost:8080/,当看见Tomcat小猫的图标了,这样表示安装成功。

        至此,JSP服务器就搭建完成了,用于学习和测试没有问题了,如果想要更高级的配置,可以往下面继续看。

    Tomcat 6与Tomcat 5或者之前版本不一样的就是,首页没有显示具体的版本,猫猫也变大了些。
    没有admin管理页面了,admin在Tomcat 5.5来默认都没有了,不过可以下载admin包。
    而Tomcat 6.0没有看见admin包,不过这并不要紧,一般情况下也不需要admin包。

    Tomcat 6.0默认也没有开启servlet、禁止目录浏览。这需要去conf/下配置web.xml文件。
    修改listings为true即可以目录浏览,

                <param-name>listings</param-name>
                <param-value>true</param-value>
                <!-- false disable listings -->
                <!-- <param-value>false</param-value>-->         

    开启servlet直接访问功能,把这两段注释打开。

        <servlet>
            <servlet-name>invoker</servlet-name>
            <servlet-class>
              org.apache.catalina.servlets.InvokerServlet
            </servlet-class>
            <init-param>
                <param-name>debug</param-name>
                <param-value>0</param-value>
            </init-param>
            <load-on-startup>2</load-on-startup>
        </servlet>

    <servlet-mapping>
            <servlet-name>invoker</servlet-name>
            <url-pattern>/servlet/*</url-pattern>
        </servlet-mapping>
       

    2.4 部署一个新项目chengqun,去conf/下配置server.xml

       <Context path="/chengqun" docBase="d:\tomcat\webapps\chengqun"></Context>
       
        chengqun是你程序的目录    重启Tomcat,访问http://127.0.0.1:8080/chengqun就可以访问了

     

     

    ======================================================================================================================
    域名绑定与虚拟目录设置:
    server.xml 的修改方式如下:

    (一)多域名绑定

    1.如果你要绑定网站,首先是要把tomcat的默认访问端口8080,修改成80

    原始:
    <Connector port="8080" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443" />

    修改后:
    <Connector port="80" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443" />

    其实这里就是把port:8080,修改成port:80就可以了,其他的参数不变

    2.接下来就是重点了哈哈...
    单个域名绑定:
    原始:
    <Engine name="Catalina" defaultHost="localhost">
    <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false" />
    </Engine>
    当然这里我把注释代码统统删除掉了,省的碍眼


    修改后:
    <Host name="chengqun.202.71one.com" debug="0" appBase="d:\wwwroot\chengqun"
           unpackWARs="true" autoDeploy="true"
           xmlValidation="false" xmlNamespaceAware="false">
    <Context path="/" docBase="d:\wwwroot\chengqun"></Context>
    </Host>


    <Host name="chengqun1.202.71one.com" debug="0" appBase="d:\wwwroot\chengqun1"
           unpackWARs="true" autoDeploy="true"
           xmlValidation="false" xmlNamespaceAware="false">
    <Context path="/" docBase="d:\wwwroot\chengqun1"></Context>
    </Host>

     

    多域名绑定:
    <Host name="chengqun.202.71one.com" debug="0" appBase="d:\wwwroot\chengqun"
           unpackWARs="true" autoDeploy="true"
           xmlValidation="false" xmlNamespaceAware="false">
    <Alias>chengqun.202.71one.com</Alias>
    <Alias>chengqun1.202.71one.com</Alias>
    <Alias>chengqun2.202.71one.com</Alias>
    <Context path="/" docBase="d:\wwwroot\chengqun"></Context>
    </Host>

    这里面的参数还有很多,我也不是很清楚,不过这样做确实可以实现多域名绑定哈哈.而且网站页面修改了只要直接覆盖就可以了,tomcat可以自动更新类和页面,当然如果修改了web.xml或lib,则需要重启tomcat才可以.


    (二)虚拟目录
    (1)
    <Host name="chengqun.202.71one.com" debug="0" appBase="d:\wwwroot\chengqun"
           unpackWARs="true" autoDeploy="true"
           xmlValidation="false" xmlNamespaceAware="false">
    <Context path="/chengqun" docBase="d:\wwwroot\chengqun"></Context>
    </Host>
    其中,Host标记是用来配置虚拟主机的,就是可以多个域名指向一个tomcat,格式只要参考默认的就

    可以了。

    <context>是Host标记的子元素吧,表示一个虚拟目录,它主要有两个属性,path就相当于虚拟目录名字,

    而 docbase则是具体的文件位置。在这里我的虚拟路径名称为chengqun,实际上我的程序也就是html、jsp、

    servlet都 放在了d:\wwwroot\chengqun这个目录下了。

    这样我就可以通过 chengqun.202. com/chengqun 访问我的这个虚拟目录了。

    另外一种方法是:

    <Host name="chengqun.202. com" debug="0" appBase="d:\wwwroot\chengqun"
           unpackWARs="true" autoDeploy="true"
           xmlValidation="false" xmlNamespaceAware="false">
    <Context path="/" docBase="d:\wwwroot\chengqun"></Context>
    </Host>
    这样设置以后,输入域名可以访问这个站点程序了(Context path="/"这里不同)
    (2)
    没有指定默认站点,所以直接输入IP的时候,无法访问。如何让输入ip就可以访问指定的站点呢?
        修改server.xml的 <Engine name="Catalina" defaultHost="chengqun.202. com">
    这样就可以实现了输入ip访问chengqun.202. com这个站点的程序了!

    posted @ 2009-09-14 11:34 勒紧皮带向前冲 阅读(2244) | 评论 (0)编辑 收藏
     
    今天由于客户对功能提出新要求。采用js操作iframe解决问题。特记录其中遇到的问题。
    用Js控制iframe内表单提交
    代码如下:
     1<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
     2<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
     3<html>
     4  <head>    
     5    <title>c.jsp</title>
     6    
     7    <meta http-equiv="pragma" content="no-cache">
     8    <meta http-equiv="cache-control" content="no-cache">
     9    <meta http-equiv="expires" content="0">    
    10    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    11    <meta http-equiv="description" content="This is my page">    
    12
    13    <script type="text/javascript">
    14    <!--
    15        function reg(){
    16        jsi.document.all.username.value="xxx";
    17        jsi.document.all.userid.value="xxx>";
    18        jsi.document.all.flag.value="xxx";
    19          jsi.document.forms["jsf"].submit();        
    20          window.open("http://js.51baojian.net","_blank");  
    21          setTimeout("",3000);
    22          window.location.href="http://jss.51baojian.net";
    23    }

    24    -->
    25    </script>
    26  </head>
    27  
    28  <body onload="reg();">
    29    <table cellpadding="0" cellspacing="0" border="0">
    30        <tr><td>
    31            页面进入中..
    32            <iframe id="jsi" name="jsi" frameborder="0"
    33                    src="b.jsp" height="0" width="0"
    34            ></iframe>
    35        </td></tr>        
    36    </table>
    37  </body>
    38</html>
    b.jsp代码为:
    1
    2<form id="jsf" name="jsf" action="url">
    3    <input type="hidden" name="username" value="">
    4    <input type="hidden" name="userid" value="">
    5    <input type="hidden" name="flag" value="">                
    6</form>
    7
    注意:
    页面加载时,遇到iframe就直接跳过去,加载下面的内容,然后再回来加载iframe,当然也可以理解成遇到iframe又开了一个线程来加载iframe,但是因为涉及到新的IO操作比较耗时,所以如果在iframe下写了js操作的话,会提示错误。可以采用onload来触发js操作执行。
    在注意:(知道的就不要看了)

    onload指整个页面加载完成后再执行init()函数,而不是当页面加载到<body>时就开始执行。

    同样,onunload指整个页面卸载完成(关闭)后。

    posted @ 2009-08-20 14:19 勒紧皮带向前冲 阅读(3605) | 评论 (0)编辑 收藏
     
    hibernate hql distinct
    2008-08-03 14:15
    hibernate hql distinct
    在 hibernate的reference 中提到过hql是可以直接使用distinct的

    --
    关键字distinct与all 也可以使用,它们具有与SQL相同的语义.
    select distinct cat.name from Cat cat
    select count(distinct cat.name), count(cat) from Cat cat
    --

    所以,我就尝试使用
    select distinct c.* from Column c, 在hql中,使用 * 必须要用到别名的
    查询出的结果是 null来的.
    在mysql 中,这种写法是没有错的,..然后我再试了一下
    select distinct c from Column c , 这样得出的结果是非null,是正确的.
    posted @ 2009-08-17 17:16 勒紧皮带向前冲 阅读(9520) | 评论 (1)编辑 收藏
     

    HQL是个中立的语言,即它跟任何数据库都没关系,你如果使用HQL的话通过数据库方言都会翻译成相应的数据库的SQL语句,包括[排序,子查询,调用SQL中的函数].
      HQL中关键字是不区分大小写的,但是属性和类型是区分大小写的。
       1>.简单属性查询
          1>).单一属性查询,返回结果集属性列表,元素类型和实体类中相应的属性类型一致。如:
              session = HibernateUtils.getSession();
              session.beginTransaction();
               
              //返回结果集属性列表,元素类型和实体类中相应的属性类型一致
               List students = session.createQuery("select name from Student").list();
               for (Iterator iter=students.iterator(); iter.hasNext();) {
                      String name = (String)iter.next();
                      System.out.println(name);
               }
          session.getTransaction().commit();
          2>).多个属性查询,返回的集合元素是对象数组,数组元素的类型和对
              应的属性在实体类中的类型一致,数组的长度取决于select中属性的个数。如:
              List students = session.createQuery("select id, name from Student").list();
             for (Iterator iter=students.iterator(); iter.hasNext();) {
                    Object[] obj = (Object[])iter.next();
                    System.out.println(obj[0] + "," + obj[1]);
              }
          3>).如果认为返回数组不够对象化,可以采用HQL动态实例化Student对象,
              但是Strudent类中必须提供相应的构造函数。如:
              List students = session.createQuery("select new Student(id, name) from Student").list();
              for (Iterator iter=students.iterator(); iter.hasNext();) {
                    Student student = (Student)iter.next();
                    System.out.println(student.getId() + "," + student.getName());
              }
        2>.实体对象查询
           1>).返回Student对象的集合,可以忽略select,表可以使用别名,别名可以用as也可以不用。如:
              List students = session.createQuery("from Student s").list();
              //List students = session.createQuery("from Student as s").list();
             for (Iterator iter=students.iterator(); iter.hasNext();) {
                     Student student = (Student)iter.next();
                     System.out.println(student.getName());
               }
           2>).返回Student对象的集合,使用select查询实体对象,必须采用别名。如:
              List students = session.createQuery("select s from Student as s").list();
              for (Iterator iter=students.iterator(); iter.hasNext();) {
                    Student student = (Student)iter.next();
                     System.out.println(student.getName());
              }
           3>).不支持select * from .....这样的查询语句。如:下面的语句是错误的
               List students = session.createQuery("select * from Student").list();
           4>).list和iterator的区别?
               我们知道,session.createQuery()得到个Query,而从Hibernate API中我们可
               以发现Query有两个方法list()和iterator()用于返回结果集。它们的区别在
               于:
               *list每次都会发出sql语句,list会向缓存中放入数据,而不利用缓存中的数据
               *iterator在默认情况下利用缓存数据,但如果缓存中不存在数据有可能出现N+1问题
            5>).N+1问题
                在默认情况下,使用query.iterator()查询,有可能出现N+1问题
                1: 首先发出一条查询对象id列表的sql语句
                N: 根据id列表到缓存中查询,如果缓存中不存在与之匹配的数据,那么会根据
                   id发出相应的sql语句
                如:
                Iterator iter = session.createQuery("from Student").iterate();
            while(iter.hasNext()) {
                Student student = (Student)iter.next();
                System.out.println(student.getName());
            }
        3>.条件查询
           1>).可以采用拼字符串的方式传递参数。如:
                   List students = session.createQuery("select s.id, s.name from Student s where s.name like '%1%'").list();
                   for (Iterator iter=students.iterator(); iter.hasNext();) {
                          Object[] obj = (Object[])iter.next();
                           System.out.println(obj[0] + "," + obj[1]);
                    }
           2>).可以使用?方式传递参数,参数的索引从0开始;传递的参数值如果是字符型的,不用
               单引号引起来;可以使用方法链编程。如:
                List students = session.createQuery("select s.id, s.name from Student s where s.name like ?")
                                                    .setParameter(0, "%1%")
                                                    .list();
               for (Iterator iter=students.iterator(); iter.hasNext();) {
                           Object[] obj = (Object[])iter.next();
                           System.out.println(obj[0] + "," + obj[1]);
               }
           3>).可以使用 :参数名称 的方式传递参数值。如:
                  List students = session.createQuery("select s.id, s.name from Student s where s.name like :myname")
                                                       .setParameter("myname", "%1%")
                                                       .list();
                  for (Iterator iter=students.iterator(); iter.hasNext();) {
                             Object[] obj = (Object[])iter.next();
                             System.out.println(obj[0] + "," + obj[1]);
                 }
           4>).如果传递多个参数,可以使用setParameterList方法。如:
               List students = session.createQuery("select s.id, s.name from Student s where s.id in(:myids)")
                                                    .setParameterList("myids", new Object[]{1, 2, 3, 4, 5})
                                                   .list();
               for (Iterator iter=students.iterator(); iter.hasNext();) {
                       Object[] obj = (Object[])iter.next();
                       System.out.println(obj[0] + "," + obj[1]);
               }
           5>).在HQL中可以使用数据库的函数,像mysql中的date_format。如:
                 List students = session.createQuery("select s.id, s.name from Student s where date_format(s.createTime, '%Y-%m')=?")
                                                      .setParameter(0, "2008-02")
                                                      .list();
                  for (Iterator iter=students.iterator(); iter.hasNext();) {
                         Object[] obj = (Object[])iter.next();
                          System.out.println(obj[0] + "," + obj[1]);
                   }
           6>).查询某个日期段的数据。如:
               SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
               //查询2008-01-10到2008-02-15创建的学生
               List students = session.createQuery("select s.id, s.name from Student s where s.createTime between ? and ?")
                                                   .setParameter(0, sdf.parse("2008-01-10 00:00:00"))
                                                   .setParameter(1, sdf.parse("2008-02-15 23:59:59"))
                                                   .list();
                  for (Iterator iter=students.iterator(); iter.hasNext();) {
                         Object[] obj = (Object[])iter.next();
                          System.out.println(obj[0] + "," + obj[1]);
                    }

        4>.Hibernate也支持直接使用sql查询。如:
              List students = session.createSQLQuery("select * from t_student").list();
              for (Iterator iter=students.iterator(); iter.hasNext();) {
                    Object[] obj = (Object[])iter.next();
                    System.out.println(obj[0] + "," + obj[1]);
              }
        5>.外置命名查询,主要完成hql语句和程序的解耦合.
           1>).在映射文件中采用<query>标签来定义HQL语句。如:
                <query name="searchStudents">
                    <![CDATA[
                          SELECT s FROM Student s where s.id<?
                     ]]>
                </query>
           2>).在程序中采用session.getNamedQuery()方法得到HQL查询串。如:
                  List students = session.getNamedQuery("searchStudents")
                                                       .setParameter(0, 10)
                                                       .list();
                  for (Iterator iter=students.iterator(); iter.hasNext();) {
                         Student student = (Student)iter.next();
                         System.out.println(student.getName());
                   }
         6>.查询过滤器
           1>).在影射文件中定义过滤器参数。如:
            <filter-def name="filtertest">
                    <filter-param name="myid" type="integer"/>
            </filter-def>   
           2>).在类的影射中使用这些参数。如:
             <filter name="filtertest" condition="id &lt; :myid"/><!--&lt;转义字符"<"-->
           3>).在程序中启用过滤器。如:
             session.enableFilter("filtertest")
                         .setParameter("myid", 10);   
             List students = session.createQuery("from Student").list();//会在该session中所有的查询后自动加上过滤器中的条件
             for (Iterator iter=students.iterator(); iter.hasNext();) {
                   Student student = (Student)iter.next();
                   System.out.println(student.getName());
             }
           参见:Student.hbm.xml,FilterQueryTest.java
         7>.分页查询
            1>).setFirstResult()从0开始
            2>).setMaxResults每页显示多少条数据。如:
                  List students = session.createQuery("from Student")
                                                       .setFirstResult(1)
                                                       .setMaxResults(2)
                                                       .list();
                  for (Iterator iter=students.iterator(); iter.hasNext();) {
                         Student student = (Student)iter.next();
                         System.out.println(student.getName());
                 }
         8>.对象导航查询
            Hibernate支持对象的,因此可以用对象导航查询。如:
            Student类总有Classes类型的属性classes,而Classes类有name属性。我们通过classes的name来查询student:
            List students = session.createQuery("select s.name from Student s where s.classes.name like '%1%'").list();
            for (Iterator iter=students.iterator(); iter.hasNext();) {
                 String name = (String)iter.next();
                 System.out.println(name);
           }
         9>.连接查询
            1>).内连接:只是把两边都有的记录查出来,可以省略inner,并且只要影射文件中已经设好了表之间的关系,无须用on表示查询条件。如:
               //List students = session.createQuery("select c.name, s.name from Student s join s.classes c").list();
               List students = session.createQuery("select c.name, s.name from Student s inner join s.classes c").list();
               for (Iterator iter=students.iterator(); iter.hasNext();) {
                    Object[] obj = (Object[])iter.next();
                    System.out.println(obj[0] + "," + obj[1]);
               }
            2>).外左连接:把左边表的所有记录都显示出来。如:
                 List students = session.createQuery("select c.name, s.name from Classes c left join c.students s").list();
                 for (Iterator iter=students.iterator(); iter.hasNext();) {
                      Object[] obj = (Object[])iter.next();
                      System.out.println(obj[0] + "," + obj[1]);
                 }
            3>).外右连接:把右边表的所有记录都显示出来。如:
                 List students = session.createQuery("select c.name, s.name from Classes c right join c.students s").list();
                  for (Iterator iter=students.iterator(); iter.hasNext();) {
                       Object[] obj = (Object[])iter.next();
                       System.out.println(obj[0] + "," + obj[1]);
                 }
         10>.统计查询
            1>).count。如:
                Long count = (Long)session.createQuery("select count(*) from Student").uniqueResult();//返回的是单条记录
                System.out.println(count);
            2>).group by。如:
                List students =session.createQuery("select c.name, count(s) from Student s join s.classes c " +
                        "group by c.name order by c.name").list();
               for (Iterator iter=students.iterator(); iter.hasNext();) {
                    Object[] obj = (Object[])iter.next();
                    System.out.println(obj[0] + ", " + obj[1]);
               }
         11>.DML风格的操作(尽量少用,因为缓存不同步)
            update和delete只会更新数据库中的数据,而缓存中不会改,此时如果取得该数据还是缓存中的,而不会是更新后的,因此缓
            存中的数据就成了脏数据了。如果批量更新的话,还会给内存带来很大压力。如:
            session.createQuery("update Student s set s.name=? where s.id < ?")
                        .setParameter(0, "李四")
                        .setParameter(1, 5)
                        .executeUpdate();


    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yangfeitarena/archive/2009/04/17/4086334.aspx

    posted @ 2009-08-17 11:44 勒紧皮带向前冲 阅读(345) | 评论 (0)编辑 收藏
     

    点击“开始”—>“设置”——>“控制面板”—>“任务计划”—>“添加任务计划”—>让后按照任务向导设置即可。

    posted @ 2009-06-25 23:42 勒紧皮带向前冲 阅读(242) | 评论 (0)编辑 收藏
     

     

     1<div id="img" style="position:absolute;; width: 200; height: 151"><a href="#" target="_blank"><img src="images/170_19.gif" width="325" height="139" border="0" /></a></div> 2<script language="javascript">
     3 var xPos = 20;
     4var yPos = 10;
     5img.style.left= xPos;
     6img.style.top = yPos;
     7var step = 1;
     8var delay = 30
     9var width,height,Hoffset,Woffset;
    10var y = 1;
    11var x = 1;
    12var interval;
    13img.visibility = "visible";function changePos() 
    14{
    15width = document.body.clientWidth;
    16height = document.body.clientHeight;
    17Hoffset = img.offsetHeight;
    18Woffset = img.offsetWidth;
    19if (y) 
    20{
    21    yPos = yPos + step;
    22}

    23else 
    24{
    25    yPos = yPos - step;
    26}

    27if (yPos < 0
    28{
    29    y = 1;
    30    yPos = 0;
    31}

    32if (yPos >= (height - Hoffset)) 
    33{
    34    y = 0;
    35    yPos = (height - Hoffset);
    36}

    37if (x) 
    38{
    39    xPos = xPos + step;
    40}

    41else 
    42{
    43    xPos = xPos - step;
    44}

    45if (xPos < 0
    46{
    47    x = 1;
    48    xPos = 0;
    49}

    50if (xPos >= (width - Woffset)) 
    51{
    52    x = 0;
    53    xPos = (width - Woffset);
    54}

    55img.style.left = xPos + document.body.scrollLeft;
    56img.style.top = yPos + document.body.scrollTop;
    57}
    function start() 
    58{
    59interval = setInterval('changePos()', delay);
    60}
    function pause_resume() 
    61{
    62    clearInterval(interval);
    63}

    64start();
    65
    </script>
    posted @ 2009-06-16 15:32 勒紧皮带向前冲 阅读(1010) | 评论 (0)编辑 收藏
     
    安装完服务器后,放上自己的网站。。测试,晕竟然出现如下错误提示:</P>
    Active Server Pages 错误 \'ASP 0131\'

    不允许的父路径

    /exam/admin/login.asp,行 1

    包含文件 \'../include/conn.asp\' 不能用 \'..\' 表示父目录。</P>
    特别郁闷,2000 Server 下不会有这个啊。。我到网上找了一下才明白。。</P>
    解决方法如下:</P>
    Internet 信息服务(IIS)管理器>>网站站点>>属性>>主目录选项卡>>配置》选项》勾上"启用父路径"的复选框即可.

    默认不启用启用父路径估计是一项安全设置 :)

    posted @ 2009-06-02 14:45 勒紧皮带向前冲 阅读(293) | 评论 (0)编辑 收藏
     
    废话不多说。
    直接下载看看
    posted @ 2009-05-18 11:02 勒紧皮带向前冲 阅读(267) | 评论 (1)编辑 收藏
     
    1. 两种细线表格做法

    被过滤广告
      源码如下:

    <table width="100%" border="1" bordercolor="#000000">
      <tr bordercolor="#FFFFFF">
        <td>表格边线为1,线色为黑,行线色为白。</td>
      </tr>
    </table>
    <p>
    <table width="100%" border="0" cellspacing="1" bgcolor="#000000">
      <tr>
        <td bgcolor="#FFFFFF">表格边线为0,间距为1,背景色为黑,行背景色为白。</td>
      </tr>
    </table>

      2. 立体表格



      源码如下:

    <table  border=1 cellspacing=0  width=100% bordercolorlight=#333333 bordercolordark=#efefef>
      <tr bgcolor=#cccccc>
        <td>it365cn</td>
        <td>it365cn</td>
        <td>it365cn</td>
        <td>it365cn</td>
      </tr>
      <tr bgcolor=#cccccc>
        <td>cnbruce</td>
        <td>cnbruce</td>
        <td>cnbruce</td>
        <td>cnbruce</td>
      </tr>
    </table>
    <center>表格边线为1,间隔为0,左上为#333333,右下为#efefef,行背景色为#cccccc

    3. 另类圆角表格制作

     


      源码如下:

    原图:
    <table cellpadding=0 cellspacing=0 border=0 width=282 align=center>
      <tr height=1>
        <td rowspan=4 width=1></td>
        <td rowspan=3 width=1></td>
        <td rowspan=2 width=1></td>
        <td width=2></td>
        <td bgcolor=#43B5C9></td>
        <td width=2></td>
        <td rowspan=2 width=1></td>
        <td rowspan=3 width=1></td>
        <td rowspan=4 width=1></td>
      </tr>
      <tr height=1>
        <td bgcolor=#43B5C9></td>
        <td bgcolor=#43B5C9></td>
        <td bgcolor=#43B5C9></td>
      </tr>
      <tr height=1>
        <td bgcolor=#43B5C9></td>
        <td colspan=3 bgcolor=#43B5C9></td>
        <td bgcolor=#43B5C9></td>
      </tr>
      <tr height=2>
        <td bgcolor=#43B5C9></td>
        <td colspan=5 bgcolor=#43B5C9></td>
        <td bgcolor=#43B5C9></td>
      </tr>
    </table>
    <p>放大
    <table cellpadding=0 cellspacing=0 border=1 width=282 align=center>
      <tr height=10>
        <td rowspan=4 width=10></td>
        <td rowspan=3 width=10></td>
        <td rowspan=2 width=10></td>
        <td width=20></td>
        <td bgcolor=#43B5C9></td>
        <td width=20></td>
        <td rowspan=2 width=10></td>
        <td rowspan=3 width=10></td>
        <td rowspan=4 width=10></td>
      </tr>
      <tr height=10>
        <td bgcolor=#43B5C9></td>
        <td bgcolor=#43B5C9></td>
        <td bgcolor=#43B5C9></td>
      </tr>
      <tr height=10>
        <td bgcolor=#43B5C9></td>
        <td colspan=3 bgcolor=#43B5C9></td>
        <td bgcolor=#43B5C9></td>
      </tr>
      <tr height=20>
        <td bgcolor=#43B5C9></td>
        <td colspan=5 bgcolor=#43B5C9></td>
        <td bgcolor=#43B5C9></td>
      </tr>
    </table>
    4. 虚线边框表格


      源码如下:

    <style type="text/css">
    .tb{BORDER-BOTTOM: #000000 1px dotted;BORDER-top: #000000 1px dotted;BORDER-LEFT:
    #000000 1px dotted;BORDER-RIGHT: #000000 1px dotted;}
    </style>
    <table width="100%" border="0" cellspacing="0" cellpadding="0">
      <tr>
        <td class="tb"><center>www.blueidea.com</td>
      </tr>
    </table>
    <p>
    虚线直线1
    <hr size=1 style="border:1px dotted #001403;">
    虚线直线2
    <p size=1 style="border:1px dotted #001403;">

    5. 分类型表格

     

      源码如下:

    <fieldset>
    <legend>item</legend>
    content
    </fieldset>


    6. 变色的单元格1,通过a:hover做


      源码如下:

    <style>
    a:link,a:visited,a:hover
    {width:100%;text-decoration:none;font-family:verdana;font-size:10px;color:white}
    a:hover{background:#0099ff;color:black}
    td{background:#3366cc;color:white;padding:0px}
    </style>

    <TABLE width=100% cellspacing=1 bgcolor=black >
      <TR>
        <TD><a href="#">Blueidea
        <TD><a href="#">.com
      <TR>
        <TD><a href="#">CNBruce
        <TD><a href="#">.com
    </TABLE>

    7. 变色的单元格2,已经做成了CSS,注意还有透明效果

      源码如下:

    <style type="text/css">
    .aa
    { background-color:#0000ff; color:#ff0000;filter: alpha(opacity=50)}
    .bb 
    { background-color:#3366cc; color:#ffffff}
    </style>

     

    <table  width="100%">
      <tr>
        <td  onmouseover="this.className='aa'" onmouseout="this.className='bb'"
    class="bb"><center><b>cnbruce</td>
       </tr>
    </table>


    8. 变色的单元格3,通过mouse事件做.有点微软的味道


      源码如下:
    <table width="100%" border="1" cellpadding="3" cellspacing="0"
    bordercolor="#efefef" bgcolor="#efefef">
      <tr>
        <td onMouseOut="this.bgColor='#efefef';this.borderColor='#efefef'";
    onMouseOver="this.bgColor='#cccccc'; this.borderColor='#000033'"><div align="left">
    Blueidea</div></td>
      </tr>
      <tr>
        <td
    onMouseOut="this.bgColor='#efefef';this.borderColor='#efefef'"; onMouseOver="this.bgColor='#cccccc'; this.borderColor='#000033'">
    cnbruce</td>
      </tr>
    </table>

    9. 透明表格

    <table bgcolor=#ececec style="filter:alpha(opacity=50)" width=200 height=100 border=0>
      <tr><td><center>cnbruce</td></tr>
    </table>

    10. 表格边框显示外阴影

      源码如下:

    <table  align=center  width=200  height=100  bgcolor=#f3f3f3
    style="filter:progid:DXImageTransform.Microsoft.Shadow
    (Color=#333333,Direction=120,strength=5)">
      <tr>
        <td><center>www.cnbruce.com</td>
      </tr>
    </table>
    11. VML代码实现的圆角表格
    (1).

     

      源码如下:

    <html xmlns:v>
    <style>
    v\:*{behavior:url(#default#VML)}
    </style>
    <body>
       <v:RoundRect style="position:relative;width:150;height:240px">
        <v:shadow on="T" type="single" color="#b3b3b3" offset="3px,3px"/>
        <v:TextBox style="font-size:10.2pt;">VML</v:TextBox>
        </v:RoundRect>
    </body>
    </html>

    (2).

      源码如下:

    <html  xmlns:v>
    <style>
    v\:*{behavior:url(#default#VML)}
    </style>
    <body>
          <v:RoundRect  style="position:relative;width:150;height:240px">
    <v:path  textpathok="true"  />
          <v:textpath  on="true"  string="cnbrucecnbrucecnbrucecnbrucecnbruc
    ecnbrucecnbrucecnbrucecnbrucecnbrucecnbrucecnbrucecnbrucecnbrucecnbruce"  />
            <v:shadow  on="T"  type="single"  color="#b3b3b3"  offset="3px,3px"/>
            <v:TextBox  style="font-size:10.2pt;">VML</v:TextBox>
            </v:RoundRect> 
    </body>
    </html>

    (3).


      源码如下:

    <html xmlns:v>
    <style>
    v\:*{behavior:url(#default#VML)}
    </style>
    <body>
       <v:RoundRect style="position:relative;width:150;height:240px" arcsize=0.5>
        <v:shadow on="T" type="single" color="#b3b3b3" offset="3px,3px"/>
        <v:TextBox style="font-size:10.2pt;">VML</v:TextBox>
        </v:RoundRect>
    </body>
    </html>

    posted @ 2009-05-10 09:42 勒紧皮带向前冲 阅读(238) | 评论 (0)编辑 收藏
     

    target="_top"或target="_parent"

    posted @ 2009-05-09 11:49 勒紧皮带向前冲 阅读(448) | 评论 (0)编辑 收藏
     

    如何让PNG格式的透明图片在IE6下正常显示

    原文: Make PNG transparency work in Internet Explorer
    翻译:PARAN

    初学网页设计的朋友可能都会碰到这样的问题,需要在网页插入一透明图片。如果使用Gif格式的透明图片,可能像素低,显示不够清晰。如果用PNG格式透明图片,在IE6下将达不到透明效果,而是灰色的背景。这会让你的网页看上去非常丑陋,任何一个网页设计师都不想出现这样的问题,下面是一个小小的教程,教你如何让PNG格式的透明图片在IE6下同样能够正常显示。

    我们先来看看在透明PNG图片在Mozilla Firefox和Internet Explorer 6中的显示差异:

    Mozilla Firefox

    PNG透明图片在Mozilla Firefox下显示良好。

     

    Internet Explorer 6

    在IE6中这张PNG图片的背景却是一片灰白,真的很难看,除非你的网页背景色就是一片灰白:)

     

    解决方法

    首先,为你的图片外套一个DIV层,像这样:

    <body> <div class=”flower”></div> </body>

    然后,在CSS文件里面写入:

     

     body {background-color:#000} div.flower {background:url(flower-transparent.png) no-repeat; height:100px; width:100px} 

     

    呃,这是指Mozilla Firefox,要让其在IE6下面正常显示,你应该在<head>和</head>之间写入:

    <!–[if gte IE 5]> <style type=”text/css”> div.flower { background:none; filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=’flower.png’ ,sizingMethod=’crop’); } </style> <![endif]–> 

    这样,就OK了,下面是加了上面代码后的IE显示图:

     

    如果还是不太明白的话,你可以下载演示看看.

    注意如果是这样会使得图片的链接失效。
    如果是在页面上直接显示png图片的话,可以直接插入图片。如此演示

    如果要去掉图片链接上的边框,在<imag>中加入border=0 即可

    posted @ 2009-05-09 11:12 勒紧皮带向前冲 阅读(1044) | 评论 (0)编辑 收藏
     
     1/**  
     2 * @param input  
     3 * @return  
     4 * @throws Exception  
     5 */
      
     6public static String encryptData(String input) throws Exception {   
     7  
     8    SecureRandom sr = new SecureRandom();   
     9    byte rawKeyData[] = "ABCDEFGH".getBytes();   
    10    DESKeySpec dks = new DESKeySpec(rawKeyData);   
    11  
    12    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");   
    13    SecretKey key = keyFactory.generateSecret(dks);   
    14  
    15    Cipher c = Cipher.getInstance("DES");   
    16    c.init(Cipher.ENCRYPT_MODE, key, sr);   
    17    byte[] cipherByte = c.doFinal(input.getBytes());   
    18    String dec = new BASE64Encoder().encode(cipherByte);   
    19    return dec;   
    20  
    21}
       
    22  
    23/**  
    24 * @param input  
    25 * @return  
    26 * @throws Exception  
    27 */
      
    28public static String decryptData(String input) throws Exception {   
    29    byte[] dec = new BASE64Decoder().decodeBuffer(input);   
    30  
    31    SecureRandom sr = new SecureRandom();   
    32    byte rawKeyData[] = "ABCDEFGH".getBytes();   
    33  
    34    DESKeySpec dks = new DESKeySpec(rawKeyData);   
    35  
    36    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");   
    37  
    38    SecretKey key = keyFactory.generateSecret(dks);   
    39  
    40    Cipher c = Cipher.getInstance("DES");   
    41    c.init(Cipher.DECRYPT_MODE, key, sr);   
    42    byte[] clearByte = c.doFinal(dec);   
    43  
    44    return new String(clearByte);   
    45  
    46}
      
    47
    注:转自 http://jlusdy.javaeye.com/blog/145803
    posted @ 2009-04-30 15:07 勒紧皮带向前冲 阅读(264) | 评论 (0)编辑 收藏
     
      1 import java.text.DateFormat;
      2 import java.util.*;
      3 
      4 public class JspCalendar {
      5     Calendar calendar = null;
      6 
      7     public JspCalendar() {
      8         calendar = Calendar.getInstance();
      9         Date trialTime = new Date();
     10         calendar.setTime(trialTime);
     11     }
     12 
     13     public int getYear() {
     14         return calendar.get(Calendar.YEAR);
     15     }
     16 
     17     public String getMonth() {
     18         int m = getMonthInt();
     19         String[] months = new String[] { "January""February""March",
     20                 "April""May""June""July""August""September",
     21                 "October""November""December" };
     22         if (m > 12)
     23             return "Unknown to Man";
     24 
     25         return months[m - 1];
     26 
     27     }
     28 
     29     public String getDay() {
     30         int x = getDayOfWeek();
     31         String[] days = new String[] { "Sunday""Monday""Tuesday",
     32                 "Wednesday""Thursday""Friday""Saturday" };
     33 
     34         if (x > 7)
     35             return "Unknown to Man";
     36 
     37         return days[x - 1];
     38 
     39     }
     40 
     41     public int getMonthInt() {
     42         return 1 + calendar.get(Calendar.MONTH);
     43     }
     44 
     45     public String getDate() {
     46         return getMonthInt() + "/" + getDayOfMonth() + "/" + getYear();
     47 
     48     }
     49 
     50     public String getTime() {
     51         return getHour() + ":" + getMinute() + ":" + getSecond();
     52     }
     53 
     54     public int getDayOfMonth() {
     55         return calendar.get(Calendar.DAY_OF_MONTH);
     56     }
     57 
     58     public int getDayOfYear() {
     59         return calendar.get(Calendar.DAY_OF_YEAR);
     60     }
     61 
     62     public int getWeekOfYear() {
     63         return calendar.get(Calendar.WEEK_OF_YEAR);
     64     }
     65 
     66     public int getWeekOfMonth() {
     67         return calendar.get(Calendar.WEEK_OF_MONTH);
     68     }
     69 
     70     public int getDayOfWeek() {
     71         return calendar.get(Calendar.DAY_OF_WEEK);
     72     }
     73 
     74     public int getHour() {
     75         return calendar.get(Calendar.HOUR_OF_DAY);
     76     }
     77 
     78     public int getMinute() {
     79         return calendar.get(Calendar.MINUTE);
     80     }
     81 
     82     public int getSecond() {
     83         return calendar.get(Calendar.SECOND);
     84     }
     85 
     86     public static void main(String args[]) {
     87         JspCalendar db = new JspCalendar();
     88         p("date: " + db.getDayOfMonth());
     89         p("year: " + db.getYear());
     90         p("month: " + db.getMonth());
     91         p("time: " + db.getTime());
     92         p("date: " + db.getDate());
     93         p("Day: " + db.getDay());
     94         p("DayOfYear: " + db.getDayOfYear());
     95         p("WeekOfYear: " + db.getWeekOfYear());
     96         p("era: " + db.getEra());
     97         p("ampm: " + db.getAMPM());
     98         p("DST: " + db.getDSTOffset());
     99         p("ZONE Offset: " + db.getZoneOffset());
    100         p("TIMEZONE: " + db.getUSTimeZone());
    101     }
    102 
    103     private static void p(String x) {
    104         System.out.println(x);
    105     }
    106 
    107     public int getEra() {
    108         return calendar.get(Calendar.ERA);
    109     }
    110 
    111     public String getUSTimeZone() {
    112         String[] zones = new String[] { "Hawaii""Alaskan""Pacific",
    113                 "Mountain""Central""Eastern" };
    114 
    115         return zones[10 + getZoneOffset()];
    116     }
    117 
    118     public int getZoneOffset() {
    119         return calendar.get(Calendar.ZONE_OFFSET) / (60 * 60 * 1000);
    120     }
    121 
    122     public int getDSTOffset() {
    123         return calendar.get(Calendar.DST_OFFSET) / (60 * 60 * 1000);
    124     }
    125 
    126     public int getAMPM() {
    127         return calendar.get(Calendar.AM_PM);
    128     }
    129 }
    130 
    posted @ 2009-04-23 13:55 勒紧皮带向前冲 阅读(236) | 评论 (0)编辑 收藏
     
    [java]比较两个日期之间的天数<script src="http://blog.csdn.net/count.aspx?ID=438390&amp;Type=Rank"></script>
    1.import java.text.SimpleDateFormat;    
    2.import java.util.Date;    
    1.public class Tmp {    
    1.public static void main( String argv[] ) throws Exception {    
    1.long DAY = 24L * 60L * 60L * 1000L;    
    1.SimpleDateFormat df = new SimpleDateFormat( "MM.dd.yyyy" );    
    2.Date d1 = df.parse( "01.01.2001" );    
    3.Date d2 = df.parse( "01.03.2001" );    
    4.System.out.println( "The number days between:" );    
    5.System.out.println( d1 );    
    6.System.out.println( "and:" );    
    7.System.out.println( d2 );    
    8.System.out.println( "is: " + (( d2.getTime() - d1.getTime() ) / DAY ));    
    9.}    
    10.}  

    posted @ 2009-04-23 13:54 勒紧皮带向前冲 阅读(588) | 评论 (0)编辑 收藏
     
    1、这里说用css实现,下面是我摸索的全过程。

    一日,漫无目的的浏览css手册,发现了text-overflow属性可以截取字符串,就来用用,用了n次都不成功,怀疑需要与其他属性连用,就找类似属性进行组合使用,最后发现需要和overflow连用。

    2、举例:
    <div style="overflow:hidden;width:200px;text-overflow:ellipsis">打开抗敌素可打开撒开绿灯撒恺撒棵扩大上爱迪生啊撒大可</div>
    posted @ 2009-04-15 13:38 勒紧皮带向前冲 阅读(345) | 评论 (0)编辑 收藏
     

    <a href="http://www.163.com" onClick="this.style.behavior='url(#default#homepage)';this.setHomePage('http://www.163.com');return(false);" style="behavior: url(#default#homepage)" >设置为我的首页</a>

     

    加入收藏夹
    ·<A href="javascript:window.external.addFavorite('http://www.163.com','网易科技')"   target="_self">加入到我的收藏夹</A>

    posted @ 2009-03-28 11:51 勒紧皮带向前冲 阅读(351) | 评论 (0)编辑 收藏
     

    在WEB开发中,城市-省份是和日历一样需要我们特别处理的用户信息,我们希望自己的程序能够更人性化一些,既方便网友的输入,又尽可能的采集到合法有效的信息,这个时候就需要借助一些插件。

    城市输入插件我先后用过很多款了,因为涉及二级联动,调用一般都比较复杂,这里推荐一个非常简洁的工具,只需要一个JS文件,HTML页面的代码也比较干净:

    演示地址:这里

    在北京卖场的活动中测试通过,不存在跨域等问题。

    另外,也顺便测试了快乐笛子(site:http://www.happyshow.org/)编写的日历输入插件,共同的特点就是简洁,但功能一点也没有缩水,特别值得推荐的是它可以快捷输入年份与月份,比如,你要输入12-23-1994,只要双击年份和月份,就可以从下拉列表中选择1994和12,而不用一页一页的翻

    转自:http://www.litejava.com/?action=show&id=206
    js文件可在我的文件中下载
    posted @ 2009-03-27 17:06 勒紧皮带向前冲 阅读(1651) | 评论 (0)编辑 收藏
     
         摘要:   1<script language="JavaScript" type="text/JavaScript">   2// 日期选择   3// By Ziyue(http://www.web-v.com/)   4var months&n...  阅读全文
    posted @ 2009-03-27 17:03 勒紧皮带向前冲 阅读(449) | 评论 (0)编辑 收藏
     
     
    2008-12-23 17:09:31 原文地址: http://blog.sina.com.cn/u/4a1347d50100bmv8 [查看原文]

    1。每天11:00点前睡觉,每天7:30点前起床;
    2。每天提醒自己,不要忘记梦想;


    3。有时间多看书,多学习,做一个有文学素养的 人,不要把时间浪费在滑稽怪诞的事情上;

    4。多锻炼身体,身体垮了什么都没有了,男人女人要对自己好一点;

    5。努力学习赚钱的本领,钱是一个人活着的根本,是做人的尊严;

    6。常回家看看老妈,常给姐姐哥哥电话,亲情是最珍贵的感情;

    7。要学会做个倾听者,要多听听别人的感受,从中获得教训;

    8。要学会玩,学会有品位的玩;

    9。工作上的烦恼,不要带回家,解决不了任何问题,带回来会平添更多烦恼;

    10。做工作的有心人;

    11。学会奉承领导,多摆笑脸,不做恶人,三缄其口,三思而后行;

    12。学会推拖事情,人善被人欺,马善被人骑;

    13。不和没素养的人交往,免得受其影响;

    14。不与小气的人交往,吃亏的总是自己;

    15。对装B的人要一棒子打死,让他(她)下次再也牛不起来!

    16。不与已婚人或者已经同居的人谈感情,多半是浪费口舌,最后没什么收获,反而打击自己的生活激情;

    17。要寻找与自己有共同价值观的人,爱自己的人,好好珍惜,好好保护,终了一生;

    18。不要把感情浪费在没有希望的人身上,看重外在的人永远都是弱智,只有在伤痕累累时才明白,真正爱她的人原来一直在她身边关注她,而她却一直以为幸福很遥远;

    19。不要过分将就一个人,过分将就不是爱情,是犯贱;

    20。现实一点,爱情在现实面前总是那么苍白,浪漫的爱情不属于男人,属于女人;

    21。做婚姻的有心人,好好准备步入婚姻,好好准备做一个好丈夫好妻子;

    22。做生活的有心人,用心准备营造一个美好的家庭,一个安全温馨的家庭;

    23。不要老是想做救世主,就算是救世主,也没必要去拯救世人。可怜之人,必有可恨之处,而且都是犹大;

    24。不要轻易借钱给别人,借钱的人,许多都不想还钱;

    25。要明白读过很多书的人不一定有很多知识,没上过学的人却不一定是文盲;

    26。不要以貌取人,特别是女人,漂亮的也许是个魔鬼,
    丑陋的却可能是天使,上天总是公平的;

    27。要做回自己,为自己活着;

    28。要会装扮自己,邋遢不是一个酷的表现,是没教养的结果;

    29。走自己的路,让NB说破嘴皮吧;

    30。赚别人的钱,让贫穷见鬼去吧

    posted @ 2009-03-16 16:17 勒紧皮带向前冲 阅读(165) | 评论 (0)编辑 收藏
     

    ConvertUtils,这个工具类的职能是在字符串和指定类型的实例之间进行转换。

     

     

    目前支持的类型有:

     

     

    • java.lang.BigDecimal

       

    • java.lang.BigInteger

       

    • boolean and java.lang.Boolean

       

    • byte and java.lang.Byte

       

    • char and java.lang.Character

       

    • java.lang.Class

       

    • double and java.lang.Double

       

    • float and java.lang.Float

       

    • int and java.lang.Integer

       

    • long and java.lang.Long

       

    • short and java.lang.Short

       

    • java.lang.String

       

    • java.io.File

       

    • java.net.URL

       

    • java.sql.Date

       

    • java.sql.Time

       

    • java.sql.Timestamp

       

    总体提供两类功能:

     

     

    1.         将字符串转换为指定类型;

     

     

    2.         注册、注销和查询类型转换器;

    convert(java.lang.Object value)

    将任意的实例转变为String,用法非常简单。在尝试的过程中,感觉与调用实例上的toString()方法的效果一样,不知道是不是在这个方法内仅仅是调用了传入实例的toString()方法。

    ps:需要读源代码才能清楚。

    convert(java.lang.String value, java.lang.Class clazz)

     

    将字符串value转换为clazz的一个实例;如果失败的话,就以String的形式返回value

     

     

    convert(java.lang.String[] values, java.lang.Class clazz)

     

    这个方法是对前一方法的加强版,将数组中的每个value都进行转换,最后以Object返回。(数组也是Object啊)

     

     

    deregister()和deregister(java.lang.Class clazz)

    注销转换器,前者将所有的转换器注销掉,后者只注销对应于clazz的转换器。注销在这里不是彻底删除了,而是将转换器变为默认的转换器(apache commons提供的)。

    lookup(java.lang.Class clazz)

    获取指定类型clazz的转换器.

    register(Converter converter, java.lang.Class clazz)

    为指定类型clazz注册转换器converter。如果clazz已经存在一个对应的转换器,那么converter,将覆盖原来的转换器。也就是说,我们可以为String,Double创建自定义的类型转换器,并在注册后进行使用。

    ps:apache的类定义明确,描述非常清楚,所以就不贴出例子了。当然这只是到达可以正常使用的阶段,如果要进行改造或者创建自己的ConvertUtils,那可能需要更多的时间,因为还要去参考ConvertUtilsBean,这里就不详述了。

    以下为使用convertUtils的一个DATE类型的例子(该例子来源于尚学堂视屏)
    1.定义converter

     1package com.bjsxt.oa.web;
     2
     3import java.text.ParseException;
     4import java.text.SimpleDateFormat;
     5import java.util.Date;
     6
     7import org.apache.commons.beanutils.Converter;
     8
     9public class UtilDateConverter implements Converter {
    10    
    11    private static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    12
    13    public Object convert(Class type, Object value) {
    14        if (value == null{
    15            return value;
    16        }

    17        if (value instanceof Date) {
    18            return value;
    19        }

    20        if (value instanceof String) {
    21            try {
    22                return format.parse((String)value);
    23            }
     catch (ParseException e) {
    24                e.printStackTrace();
    25            }

    26        }

    27        return null;
    28    }

    29
    30}

    31
    2.使用convertUilts注册converter
     1package com.bjsxt.oa.web;
     2
     3import java.util.Date;
     4
     5import javax.servlet.ServletException;
     6import javax.servlet.http.HttpServlet;
     7
     8import org.apache.commons.beanutils.ConvertUtils;
     9
    10public class UtilDateConverterInitServlet extends HttpServlet {
    11
    12    @Override
    13    public void init() throws ServletException {
    14         ConvertUtils.register(new UtilDateConverter(), Date.class);
    15    }

    16
    17}

    18
    3.在web.xml中配置servlet
    1 <servlet>
    2    <servlet-name>utilDateConverter</servlet-name>
    3    <servlet-class>com.bjsxt.oa.web.UtilDateConverterInitServlet</servlet-class>
    4    <load-on-startup>3</load-on-startup>
    5  </servlet>  
    posted @ 2009-03-04 10:36 勒紧皮带向前冲 阅读(2910) | 评论 (0)编辑 收藏
     
    org.apache.commons.beanutils.BeanUtils
     
    一、简介:

    BeanUtils提供对 Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。我们知道,一个JavaBean通常包含了大量的属性,很 多情况下,对JavaBean的处理导致大量get/set代码堆积,增加了代码长度和阅读代码的难度。

    二、用法:

    BeanUtils是这个包里比较常用的一个工具类,这里只介绍它的copyProperties()方法。该方法定义如下:

    public static void copyProperties(java.lang.Object dest,java.lang.Object orig)
        throws java.lang.IllegalAccessException,
               java.lang.reflect.InvocationTargetException


    如 果你有两个具有很多相同属性的JavaBean,一个很常见的情况就是Struts里的PO对象(持久对象)和对应的ActionForm,例如 Teacher和TeacherForm。我们一般会在Action里从ActionForm构造一个PO对象,传统的方式是使用类似下面的语句对属性逐 个赋值:

    //得到TeacherForm
    TeacherForm teacherForm=(TeacherForm)form;
    //构造Teacher对象
    Teacher teacher=new Teacher();
    //赋值
    teacher.setName(teacherForm.getName());
    teacher.setAge(teacherForm.getAge());
    teacher.setGender(teacherForm.getGender());
    teacher.setMajor(teacherForm.getMajor());
    teacher.setDepartment(teacherForm.getDepartment());

    //持久化Teacher对象到数据库
    HibernateDAO=;
    HibernateDAO.save(teacher);

    而使用BeanUtils后,代码就大大改观了,如下所示:
    //得到TeacherForm
    TeacherForm teacherForm=(TeacherForm)form;
    //构造Teacher对象
    Teacher teacher=new Teacher();
    //赋值
    BeanUtils.copyProperties(teacher,teacherForm);
    //持久化Teacher对象到数据库
    HibernateDAO=;
    HibernateDAO.save(teacher);


    如 果Teacher和TeacherForm间存在名称不相同的属性,则BeanUtils不对这些属性进行处理,需要程序员手动处理。例如 Teacher包含modifyDate(该属性记录最后修改日期,不需要用户在界面中输入)属性而TeacherForm无此属性,那么在上面代码的 copyProperties()后还要加上一句:

    teacher.setModifyDate(new Date());


    怎 么样,很方便吧!除BeanUtils外还有一个名为PropertyUtils的工具类,它也提供copyProperties()方法,作用与 BeanUtils的同名方法十分相似,主要的区别在于后者提供类型转换功能,即发现两个JavaBean的同名属性为不同类型时,在支持的数据类型范围 内进行转换,而前者不支持这个功能,但是速度会更快一些。BeanUtils支持的转换类型如下:

          * java.lang.BigDecimal
          * java.lang.BigInteger
          * boolean and java.lang.Boolean
          * byte and java.lang.Byte
          * char and java.lang.Character
          * java.lang.Class
          * double and java.lang.Double
          * float and java.lang.Float
          * int and java.lang.Integer
          * long and java.lang.Long
          * short and java.lang.Short
          * java.lang.String
          * java.sql.Date
          * java.sql.Time
          * java.sql.Timestamp


    这里要注意一点,java.util.Date是不被支持的,而它的子类java.sql.Date是被支持的。因此如果对象包含时间类型的属性,且希望被转换的时候,一定要使用java.sql.Date类型。否则在转换时会提示argument mistype异常。

    三、优缺点:

    Apache Jakarta Commons项目非常有用。我曾在许多不同的项目上或直接或间接地使用各种流行的commons组件。其中的一个强大的组件就是BeanUtils。我 将说明如何使用BeanUtils将local实体bean转换为对应的value 对象:


    BeanUtils.copyProperties(aValue, aLocal)


    上 面的代码从aLocal对象复制属性到aValue对象。它相当简单!它不管local(或对应的value)对象有多少个属性,只管进行复制。我们假设 local对象有100个属性。上面的代码使我们可以无需键入至少100行的冗长、容易出错和反复的get和set方法调用。这太棒了!太强大了!太有用 了!

    现在,还有一个坏消息:使用BeanUtils的成本惊人地昂贵!我做了一个简单的测试,BeanUtils所花费的时间要超过取数 据、将其复制到对应的 value对象(通过手动调用get和set方法),以及通过串行化将其返回到远程的客户机的时间总和。所以要小心使用这种威力!
    该文章的原文地址为:http://lifejava.spaces.live.com/Blog/cns!A666C33543221640!158.entry
    posted @ 2009-03-04 09:53 勒紧皮带向前冲 阅读(2882) | 评论 (0)编辑 收藏
     
    (1)用文本编辑器打开<Tomcat主目录>/conf目录下的Server.xml文件,使用“查找”菜单查找内容为“</Host>”的行,紧接该行下面增加一对<Host></Host>标签。参照前面的<Host>标签的属性设置情况,设置新增的<Host>标签的属性,并在它里面嵌套一个设置该WEB站点根目录的<Context>元素,最终的内容如下:
    <Host name="www.xydesign.cn" debug="0" appBase="d:\site1">
    <Context path="" docBase="." debug="0"/>
    </Host>
    这样,将创建一个新的WEB站点。上面的<Context>元素的docBase属性值被设置为一个点(.),即表示使用<Host>元素的appBase属性中所设置的路径作为这个<Context>所映射的目录。

        (2)在上面新增的<Host></Host>标签对下面再增加一对<Host></Host>标签,并将它设置为如下形式:
    <Host name="www.xydesign.net.cn" debug="0" appBase="d:\site2">
    <Context path="" docBase="." debug="0"/>
    </Host>
    这又创建了一个新的WEB站点,该站点的主机名称为www.xydesign.net.cn,根目录对应的本地文件系统目录为d:\site2。

        (3)在d:盘下创建名称为site1和site2两个目录,并在这两个目录中分别创建一个名为test.html的文件,在d:\site1\test.html文件中写入如下一行内容:
    这是d:\site1目录中的test.html文件
    在d:\site2\test.html文件中写入如下一行内容:
    这是d:\site2目录中的test.html文件

        (4)用记事本程序打开c:\winnt\System32\Drivers\Etc\Hosts文件,可以看到有如下一行内容:
    127.0.0.1       localhost
    紧接这行文本的下面,用它复制出两行文本,并将这两行文本中的localhost分别修改成www.xydesign.cn和www.xydesign.net.cn,这样,就使用Hosts文件为当前计算机设置了多个主机名。如果要用www.xydesign.cn和www.xydesign.net.cn这个两主机名访问其他计算机上的WEB站点,则应将127.0.0.1修改成其他计算机的实际IP地址。保存Hosts文件后,Hosts文件的内容如下:
    127.0.0.1                  localhost
    202.104.125.154       www.xydesign.cn
    202.104.125.154       www.xydesign.net.cn

    其中202.104.125.154为您服务器的固定IP地址。

    在命令行窗口中执行“ping www.xydesign.cn”和“ping www.xydesign.net.cn”命令,查看该主机名是否被正确解析到了相应的IP地址上。建立site1和site2与计算机IP地址的映射后,在IE浏览器地址栏中输入http://localhost:8080/test.html、http://www.xydesign.cn:8080/test.html和http://www.xydesign.net.cn:8080/test.html,可以看到浏览器将显示出各自站点中的test.html网页文件的内容。
    如需不要后面的8080端口号,可直接把tomcat端口号设置为80即可。

       (5)设置域名www.xydesign.cn    www.xydesign.net.cn 的解析IP地址都为202.104.125.154(即您服务器的IP地址)。

    可见,使用主机名的方式在同一台WEB服务器上创建多个虚拟主机后,在WEB浏览器中使用主机名访问Web服务器时,Web服务器将选择与该主机名关联的WEB站点进行响应。通过这种方式,多个WEB站点可以共享同一个IP地址和相同的端口号,唯一不足的就是WEB浏览不能通过IP地址去访问这些WEB站点。基于主机名的虚拟主机是目前Internet上的大多数虚拟主机业务提供商所通常采用的方式。只要找出几个小型公司或个人的网站,如果在WEB浏览器地址栏中输入“http://主机名”可以访问到该WEB站点,接着在命令行窗口中执行“ping 主机名”,查看到该域名对应的IP地址,然后在WEB浏览器地址栏中输入“http://IP地址”时,却无法访问这个WEB站点了,那么,这个WEB站点就是一个基于主机名的虚拟主机,它与其他一些WEB站点共享一台WEB服务器,而不是自己独享一台WEB服务器。
    注意:当使用安全套接字层 (SSL) 时,不能使用主机头字段来实现虚拟主机,这是因为使用SSL的HTTP请求有加密保护。主机头字段是加密内容的一部分,不能被解释和路由到正确的站点。

    posted @ 2009-02-10 13:25 勒紧皮带向前冲 阅读(504) | 评论 (0)编辑 收藏
     
         摘要:       开发工具:MyEclipse 6.0 ,Tomcat 5.5 ,JDK 1.5  ,MySQL 5.0 ;开发准备:下载Struts 2.0和Hibernate 3.2,大家可Struts和Hibernate的官方网站下载这两个框架。我们先来总览一下开发完成后的包—类图:      ...  阅读全文
    posted @ 2009-02-09 12:08 勒紧皮带向前冲 阅读(76) | 评论 (0)编辑 收藏
     
         摘要:       开发工具:MyEclipse 6.0 ,Tomcat 5.5 ,JDK 1.5  ,MySQL 5.0 ;开发准备:下载Struts 2.0和Hibernate 3.2,大家可Struts和Hibernate的官方网站下载这两个框架。我们先来总览一下开发完成后的包—类图:      ...  阅读全文
    posted @ 2009-02-09 12:07 勒紧皮带向前冲 阅读(73) | 评论 (0)编辑 收藏
     


    专注移动通信,嵌入式,IC设计,硬件研发,手机研发等当今最热门的技术领域的讨论与资料共享
    52RD研发论坛 - http://www.52rd.com/bbs

    本文来自:我爱研发网(52RD.com) 详细出处:http://www.52rd.com/bbs/Detail_RD.BBS_131240_17_1_1.html

    posted @ 2009-02-07 09:41 勒紧皮带向前冲 阅读(409) | 评论 (0)编辑 收藏
     

    什么是ThreadLocal?

    顾名思义它是local variable(线程局部变量)。它的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有该变量。

    使用场景

    1. To keep state with a thread (user-id, transaction-id, logging-id)
    2. To cache objects which you need frequently

    ThreadLocal类

    它 主要由四个方法组成initialValue(),get(),set(T),remove(),其中值得注意的是initialValue(),该方法 是一个protected的方法,显然是为了子类重写而特意实现的。该方法返回当前线程在该线程局部变量的初始值,这个方法是一个延迟调用方法,在一个线 程第1次调用get()或者set(Object)时才执行,并且仅执行1次。ThreadLocal中的确实实现直接返回一个null:

    ThreadLocal的原理

    ThreadLocal是如何做到为每一个线程维护变量的副本的呢?其实实现的思路很简单,在ThreadLocal类中有一个Map,用于存储每一个线程的变量的副本。比如下面的示例实现:

    public class ThreadLocal
    {
    private Map values = Collections.synchronizedMap(new HashMap());
    public Object get()
    {
    Thread curThread = Thread.currentThread();
    Object o = values.get(curThread);
    if (o == null && !values.containsKey(curThread))
    {
    o = initialValue();
    values.put(curThread, o);
    }
    return o;
    }

     public void set(Object newValue)
    {
    values.put(Thread.currentThread(), newValue);
    }

     public Object initialValue()
    {
    return null;
    }
    }

    ThreadLocal 的使用

    使用方法一:

    Hibernate的文档时看到了关于使ThreadLocal管理多线程访问的部分。具体代码如下

    1.  public static final ThreadLocal session = new ThreadLocal();
    2.  public static Session currentSession() {
    3.      Session s = (Session)session.get();
    4.      //open a new session,if this session has none
    5.   if(s == null){
    6.      s = sessionFactory.openSession();
    7.      session.set(s);
    8.   }
          return s;
    9. }

    我们逐行分析
    1。 初始化一个ThreadLocal对象,ThreadLocal有三个成员方法 get()、set()、initialvalue()。
        如果不初始化initialvalue,则initialvalue返回null。
    3。 session的get根据当前线程返回其对应的线程内部变量,也就是我们需要的net.sf.hibernate.Session(相当于对应每个数据 库连接).多线程情况下共享数据库链接是不安全的。ThreadLocal保证了每个线程都有自己的s(数据库连接)。
    5。如果是该线程初次访问,自然,s(数据库连接)会是null,接着创建一个Session,具体就是行6。
    6。创建一个数据库连接实例 s
    7。保存该数据库连接s到ThreadLocal中。
    8。如果当前线程已经访问过数据库了,则从session中get()就可以获取该线程上次获取过的连接实例



    以上转自 橄榄树  http://hi.baidu.com/mojiedao/blog/item/0ceeab99e7a0ad086f068c09.html

    posted @ 2009-01-12 10:23 勒紧皮带向前冲 阅读(171) | 评论 (0)编辑 收藏
     

    java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoaderListener registered?
     at org.springframework.web.context.support.WebApplicationContextUtils.getRequiredWebApplicationContext(WebApplicationContextUtils.java:86)
     at org.springframework.web.struts.DelegatingActionUtils.findRequiredWebApplicationContext(DelegatingActionUtils.java:148)
     at org.springframework.web.struts.DelegatingActionProxy.getWebApplicationContext(DelegatingActionProxy.java:146)
     at org.springframework.web.struts.DelegatingActionProxy.getDelegateAction(DelegatingActionProxy.java:125)
     at org.springframework.web.struts.DelegatingActionProxy.execute(DelegatingActionProxy.java:109)
     at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
     at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
     at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
     at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
     at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
     at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
     at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
     at java.lang.Thread.run(Unknown Source)

    该错误表明你在web.xml中没配置spring环境
    posted @ 2009-01-04 15:21 勒紧皮带向前冲 阅读(260) | 评论 (0)编辑 收藏
     
    1、拷贝pager-taglib.jar包
    2、在JSP页面中使用taglib指令引入pager-taglib标签库
    3、使用pager-taglib标签库进行分页处理

    pg:pager【这个标签用来设置分页的总体参数】重要参数说明:
        url:分页的链接根地址,pager标签会在这个链接的基础上附加分页参数
        items:总记录数,pager标签正是根据这个值来计算分页参数的
        maxPageItems:每页显示的行数,默认为10
        maxIndexPages:在循环输出页码的时候,最大输出多少个页码,默认是10
        
    pg:first【第一页的标签】重要参数说明:
        export变量的意义:
        pageUrl - 分页链接URL地址(最重要的export参数)
        pageNumber - 页码
        firstItem - 首页第一行的索引值
        lastItem - 首页最后一行的索引值
        
    pg:pre【上一页标签】重要参数说明:
        export变量的意义:
        pageUrl - 分页链接URL地址(最重要的export参数)
        pageNumber - 页码
        firstItem - 前页第一行的索引值
        lastItem - 前页最后一行的索引值

    pg:next【下一页标签】重要参数说明:
        export变量的意义:
        pageUrl - 分页链接URL地址(最重要的export参数)
        pageNumber - 页码
        firstItem - 下页第一行的索引值
        lastItem - 下页最后一行的索引值
        
    pg:last重要参数说明:
        export变量的意义:
        pageUrl - 分页链接URL地址(最重要的export参数)
        pageNumber - 页码
        firstItem - 尾页第一行的索引值
        lastItem - 尾页最后一行的索引值
        
    pg:pages【这个标签用来循环输出页码信息】重要参数说明:
        export变量的意义:
        pageUrl - 分页链接URL地址(最重要的export参数)
        pageNumber - 页码
        firstItem - pageNumber这个页码指定的那一页的第一行的索引值
        lastItem - pageNumber这个页码指定的那一页的最后一行的索引值


    pager-taglib-2.0下载
    http://www.blogjava.net/Files/wx886104/pager-taglib-2.0.rar
    posted @ 2008-12-29 16:45 勒紧皮带向前冲 阅读(354) | 评论 (0)编辑 收藏
     

    Log日志:主要用于记录程序运行的情况,以便于程序在部署之后的排错调试等等!也有利于将这些信息进行持久化(如果不将日志信息保存到文件或数据库,则信息便会丢失)

    Java Logging API

    需JDK1.4版本以上才能支持。

    java.util.logging.* 包是JDK的日志记录API。

    基本概念

    logger  用来记录日志的对象

    log level  日志等级:从FINEST到SEVERE级别

    请参考JDK文档

    handler  日志输出处理器,即用来将格式化后的日志信息输出,J2SE提供了下面的处理器

    StreamHandler  将信息输出到一个OutputStream对象

    ConsoleHandler  将信息输出到控制台

    FileHandler  将信息输出到文件

    还有Socket处理器和内存处理器等

    Formater  用来对日志信息进行格式化

    SimpleFormater  简单的格式化输出

    XmlFormater  Xml格式化输出

    logManager  日志管理器,它包含有那些被命名的logger,以及从配置文件中读取来的一些控制信息

    Log4j

    基本概念

    Log4j比JDK Logging更加成熟。Log4j是事实上 日志记录标准。

    三大概念:logger/appender/layout

    logger  使用这个对象来进行输出

    appender  使用这个对象来定义输出到哪里去

    layout  使用这个对象来定义输出的格式

    log4j的级别(level)

    DEBUG < INFO < WARN < ERROR < FATAL

    基本配置与使用

    只需要将log4j.jar包放到类路径中,并且保证在类路径根目录下有一个log4j.properties文件即可。Log4j.properties文件是对log4j的配置。 

    在log4j.properties中,可以配置logger/appender/layout/level等内容。

    了解如何配置logger

    log4j.rootLogger = [级别],[使用哪个appender]

    log4j.logger.[logger的名称]=[级别],[使用哪个appender]

    了解如何配置appender

    Log4j.appender.[appender的名称]=[appender类名]

    Log4j.appender.[appender的名称].[appender的属性名]=[appender的属性值]

    如:对于ConsoleAppender来说,可以配置它的target属性为System.out,而对于FileAppender来说,可以配置它的File属性为一个文件名

    了解如何配置layout

    Log4j.appender.[appender的名称].layout=[layout类名]

    Log4j.appender.[appender的名称].layout.[layout的属性名]=[layout的属性值]

    最常见的是PatternLayout

    Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数见表1如下:
    %m 输出代码中指定的消息
    %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
    %r 输出自应用启动到输出该log信息耗费的毫秒数
    %c 输出所属的类目,通常就是所在类的全名
    %t 输出产生该日志事件的线程名
    %n 输出一个回车换行符,Windows平台为“"r"n”,Unix平台为“"n”
    %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
    %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)

    Commons log

    通用Log处理,它是一个接口抽象,底层的实现可以自动替换:

    如果当前存在log4j,则使用log4j来实现

    否则,使用JDK LOG来实现

    否则,使用其自身的简单实现

    posted @ 2008-12-29 11:29 勒紧皮带向前冲 阅读(144) | 评论 (0)编辑 收藏
     

    1 借助spring

    web.xml中增加

     1<filter>   
     2<filter-name>Set Character Encoding</filter-name>   
     3<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>   
     4<init-param>   
     5    <param-name>encoding</param-name>   
     6    <param-value>utf8</param-value>   
     7</init-param>   
     8</filter>   
     9<filter-mapping>   
    10    <filter-name>Set Character Encoding</filter-name>   
    11    <url-pattern>/*</url-pattern>   
    12</filter-mapping>
    13
    14

    配置文件即可,如果不用spring怎么办呢?有办法啊

     1<filter>
     2   <filter-name>encodingFilter</filter-name>
     3   <filter-class>com.rda.commons.filter.ChineseFilter</filter-class>
     4   <init-param>
     5    <param-name>encoding</param-name>
     6    <param-value>UTF-8</param-value>
     7   </init-param>
     8   <init-param>
     9    <param-name>forceEncoding</param-name>
    10    <param-value>true</param-value>
    11   </init-param>
    12</filter>
    13<filter-mapping>
    14   <filter-name>encodingFilter</filter-name>
    15   <url-pattern>/*</url-pattern>
    16</filter-mapping>
    17
    18

    配置文件,然后呢,转码的过滤器就要自己写咯

     1package com.filter;
     2
     3import java.io.IOException;
     4import javax.servlet.Filter;
     5import javax.servlet.FilterChain;
     6import javax.servlet.FilterConfig;
     7import javax.servlet.ServletException;
     8import javax.servlet.ServletRequest;
     9import javax.servlet.ServletResponse;
    10import javax.servlet.http.HttpServlet;
    11import javax.servlet.http.HttpServletRequest;
    12import javax.servlet.http.HttpServletResponse;
    13
    14/**
    15
    16* 创建人:金鑫
    17* 创建时间:2008-9-21 下午03:27:03
    18* 类作用:中文转码过滤器
    19*
    20*/

    21@SuppressWarnings("serial")
    22public class ChineseFilter extends HttpServlet implements Filter
    23{
    24private FilterConfig filterConfig;
    25
    26public void init(FilterConfig filterConfig) throws ServletException
    27{
    28   this.filterConfig = filterConfig;
    29}

    30
    31public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
    32{
    33   try
    34   {
    35    String encoding = filterConfig.getInitParameter("encoding");
    36    //从WEB.xml配置文件中取出参数,这样我们可以通过配置修改编码格式.
    37    request.setCharacterEncoding(encoding);//设置请求的编码格式
    38
    39    filterChain.doFilter(request, response);
    40   }

    41   catch (ServletException sx)
    42   {
    43    filterConfig.getServletContext().log(sx.getMessage());
    44   }

    45   catch (IOException iox)
    46   {
    47    filterConfig.getServletContext().log(iox.getMessage());
    48   }

    49}

    50
    51public void destroy()
    52{
    53}

    54
    55protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException
    56{
    57   super.doGet(arg0, arg1);
    58}

    59
    60protected void doPost(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException
    61{
    62   super.doPost(arg0, arg1);
    63}

    64
    65/**
    66* @function 验证数据是否为空,如果为空则转换
    67@param param
    68@return String
    69*/

    70public String checkNull(String param)
    71{
    72   if (param == null || param.equals(""))
    73   {
    74    return "";
    75   }

    76   else
    77   {
    78    return param;
    79   }

    80}

    81}

    82
    83

    OK,完美解决掉啦。

    其实解决乱码很简单的,就是通过过滤器来实现的,呵呵很简单吧?

    本文来自“青岛金鑫-java技术攻略”url:http://hi.baidu.com/%C7%E0%B5%BA%BD%F0%F6%CE/blog/item/a726f523915fe4559922ed57.html
    posted @ 2008-12-26 13:53 勒紧皮带向前冲 阅读(289) | 评论 (2)编辑 收藏
     
    getCurrentSession()与openSession()的区别?
     * 采用getCurrentSession()创建的session会绑定到当前线程中,而采用openSession()
       创建的session则不会
     * 采用getCurrentSession()创建的session在commit或rollback时会自动关闭,而采用openSession()
       创建的session必须手动关闭
      
    使用getCurrentSession()需要在hibernate.cfg.xml文件中加入如下配置:
     * 如果使用的是本地事务(jdbc事务)
     <property name="hibernate.current_session_context_class">thread</property>
     * 如果使用的是全局事务(jta事务)
     <property name="hibernate.current_session_context_class">jta</property> 
    posted @ 2008-12-23 09:44 勒紧皮带向前冲 阅读(556) | 评论 (1)编辑 收藏
     
    最近学习spring,看尚学堂的视屏在做AOP的一个demo调试时发现报
    Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userManager' defined in class path resource [applicationContext-bean.xml]: Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: error at ::0 can't find referenced pointcut allAddMethod
    在网上收了下,发现是spring的版本与java的版本不一致的原因。因此自己重新下了spring的包,运行通过。
    posted @ 2008-12-20 13:58 勒紧皮带向前冲 阅读(315) | 评论 (0)编辑 收藏
     

    1、struts国际化的配置
     * 在struts-config.xml文件中加入:<message-resources parameter="MessageResources" />
     
    2、提供不同版本的国际化资源文件,中文需要采用native2ascii转换成unicode

    3、在jsp中采用<bean:message>标签来读取国际化消息文本

    4、了解利用struts默认将locale放到session中的特性,完成采用编程的方式切换语言设置
     * 参见:ChangeLanguageAction.java
     
    5、消息文本的国际化处理,共有三个步骤:
     * 创建国际化消息
     * 传递国际化消息
     * 显示国际化消息
     
    如何创建国际化消息?
     理解ActionMessage和ActionMessages两个对象的区别
     
    如何传递国际化消息?
     * 调用saveMessage()传递普通消息,调用saveErrors传递错误消息
     
    如何显示国际化消息?
     通过<html:messages>标签显示消息(可以显示普通消息和错误消息)
     通过<html:errors>显示消息(只能显示错误消息) 

    当将国际化资源文件放入到一个包时,在struts-config.xml文件中加入:<message-resources parameter="包名.MessageResources" />

    ChangeLanguageAction.java

     1import java.util.Locale;
     2
     3import javax.servlet.http.HttpServletRequest;
     4import javax.servlet.http.HttpServletResponse;
     5
     6import org.apache.struts.Globals;
     7import org.apache.struts.action.Action;
     8import org.apache.struts.action.ActionForm;
     9import org.apache.struts.action.ActionForward;
    10import org.apache.struts.action.ActionMapping;
    11
    12public class ChangeLanguageAction extends Action {
    13
    14    @Override
    15    public ActionForward execute(ActionMapping mapping, ActionForm form,
    16            HttpServletRequest request, HttpServletResponse response)
    17            throws Exception {
    18        String lang = request.getParameter("lang");
    19        
    20        Locale currentLocale = Locale.getDefault(); 
    21        if ("zh".equals(lang)) {
    22            currentLocale = new Locale("zh""CN");
    23        }
    else if("en".equals(lang)) {
    24            currentLocale = new Locale("en""US");
    25        }

    26        //request.getSession().setAttribute(Globals.LOCALE_KEY, currentLocale);
    27        
    28        this.setLocale(request, currentLocale);
    29        return mapping.findForward("index");
    30    }

    31
    32}



     

    posted @ 2008-12-15 10:46 勒紧皮带向前冲 阅读(892) | 评论 (2)编辑 收藏
     

    1、了解缺省Locale是由操作系统决定的,Locale是由语言和国家代码组成

    2、国际化资源文件是由baseName+locale组成,如:MessageBundle_en_US.properties
    baseName是任意合法的文件名

    3、native2ascii命令的位置和用法
     * 位置:JAVA_HOME/bin
     * 使用native2ascii.exe  o.properties MessagesBundle_zh_CN.properties

    例:
     1package com.bjsxt.i18n;
     2
     3import java.text.MessageFormat;
     4import java.util.Locale;
     5import java.util.ResourceBundle;
     6
     7public class I18nSample {
     8
     9    public static void main(String[] args) {
    10        
    11        Locale defaultLocale = Locale.getDefault();//获取默认的本地化
    12        System.out.println("default country=" + defaultLocale.getCountry());
    13        System.out.println("default language=" + defaultLocale.getLanguage());
    14        
    15        //Locale currentLocale = new Locale("en", "US");//通过初始化指定语言和国际本地化
    16        //Locale currentLocale = new Locale("zh", "CN");
    17        
    18        Locale currentLocale = new Locale("ja""JP");
    19        
    20        ResourceBundle rb = ResourceBundle.getBundle("res.MessagesBundle", currentLocale);//获取本地化配置
    21        //System.out.println(rb.getString("k1"));//通过配置文件中的key显示
    22        //System.out.println(rb.getString("k2"));
    23        
    24        MessageFormat mf = new MessageFormat(rb.getString("k1"));//通过站位符显示指定的信息
    25        System.out.println(mf.format(new Object[]{"Tom"}));//对占位符填充
    26        //System.out.println(mf.format(new Object[]{"张三"}));
    27    }

    28}

    29
    o.properties文件
    1k1=你好,{0}
    2k2=再见
    缺省的properties文件MessagesBundle.properties
    1k1=hello,{0}
    2k2=good bye
    英文文件MessagesBundle_en_US.properties
    1k1=hello,{0}
    2k2=good bye
    中文文件MessagesBundle_zh_CN.properties
    1k1=\u4f60\u597d,{0}
    2k2=\u518d\u89c1
    3
    posted @ 2008-12-15 09:44 勒紧皮带向前冲 阅读(778) | 评论 (0)编辑 收藏
     
    转自 http://jinguo.javaeye.com/blog/225596
    关键字: oracle的rownum原理和使用
    Oracle的rownum原理和使用
    在Oracle中,要按特定条件查询前N条记录,用个rownum就搞定了。
    select * from emp where rownum <= 5
    而且书上也告诫,不能对rownum用">",这也就意味着,如果你想用
    select * from emp where rownum > 5
    则是失败的。要知道为什么会失败,则需要了解rownum背后的机制:
    1 Oracle executes your query.

    2 Oracle fetches the first row and calls it row number 1.

    3 Have we gotten past row number meets the criteria? If no, then Oracle discards the row, If yes, then Oracle return the row.

    4 Oracle fetches the next row and advances the row number (to 2, and then to 3, and then to 4, and so forth).

    5 Go to step 3.

    了解了原理,就知道rownum>不会成功,因为在第三步的时候查询出的行已经被丢弃,第四步查出来的rownum仍然是1,这样永远也不会成功。

    同样道理,rownum如果单独用=,也只有在rownum=1时才有用。



    对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,而且rownum不能以任何表的名称作为前缀。
    举例说明:
    例如表:student(学生)表,表结构为:
    ID       char(6)      --学号
    name    VARCHAR2(10)   --姓名
    create table student (ID char(6), name VARCHAR2(100));
    insert into sale values('200001',‘张一’);
    insert into sale values('200002',‘王二’);
    insert into sale values('200003',‘李三’);
    insert into sale values('200004',‘赵四’);
    commit;
    (1) rownum 对于等于某值的查询条件
    如果希望找到学生表中第一条学生的信息,可以使用rownum=1作为条件。但是想找到学生表中第二条学生的信息,使用rownum=2结果查不到数据。因为rownum都是从1开始,但是1以上的自然数在rownum做等于判断是时认为都是false条件,所以无法查到rownum = n(n>1的自然数)。
    SQL> select rownum,id,name from student where rownum=1;(可以用在限制返回记录条数的地方,保证不出错,如:隐式游标)
    SQL> select rownum,id,name from student where rownum=1;
        ROWNUM ID     NAME
    ---------- ------ ---------------------------------------------------
             1 200001 张一
    SQL> select rownum,id,name from student where rownum =2;
        ROWNUM ID     NAME
    ---------- ------ ---------------------------------------------------
    (2)rownum对于大于某值的查询条件
       如果想找到从第二行记录以后的记录,当使用rownum>2是查不出记录的,原因是由于rownum是一个总是从1开始的伪列,Oracle 认为rownum> n(n>1的自然数)这种条件依旧不成立,所以查不到记录
    SQL> select rownum,id,name from student where rownum >2;
    ROWNUM ID     NAME
    ---------- ------ ---------------------------------------------------
    那如何才能找到第二行以后的记录呀。可以使用以下的子查询方法来解决。注意子查询中的rownum必须要有别名,否则还是不会查出记录来,这是因为rownum不是某个表的列,如果不起别名的话,无法知道rownum是子查询的列还是主查询的列。
    SQL>select * from(select rownum no ,id,name from student) where no>2;
            NO ID     NAME
    ---------- ------ ---------------------------------------------------
             3 200003 李三
             4 200004 赵四
    SQL> select * from(select rownum,id,name from student)where rownum>2;
        ROWNUM ID     NAME
    ---------- ------ ---------------------------------------------------
    (3)rownum对于小于某值的查询条件
    如果想找到第三条记录以前的记录,当使用rownum<3是能得到两条记录的。显然rownum对于rownum<n((n>1的自然数)的条件认为是成立的,所以可以找到记录。
    SQL> select rownum,id,name from student where rownum <3;
        ROWNUM ID     NAME
    ---------- ------ ---------------------------------------------------
    1 200001 张一
            2 200002 王二
    综上几种情况,可能有时候需要查询rownum在某区间的数据,那怎么办呀从上可以看出rownum对小于某值的查询条件是人为true的,rownum对于大于某值的查询条件直接认为是false的,但是可以间接的让它转为认为是true的。那就必须使用子查询。例如要查询rownum在第二行到第三行之间的数据,包括第二行和第三行数据,那么我们只能写以下语句,先让它返回小于等于三的记录行,然后在主查询中判断新的rownum的别名列大于等于二的记录行。但是这样的操作会在大数据集中影响速度。
    SQL> select * from (select rownum no,id,name from student where rownum<=3 ) where no >=2;
            NO ID     NAME
    ---------- ------ ---------------------------------------------------
             2 200002 王二
             3 200003 李三
    (4)rownum和排序
    Oracle中的rownum的是在取数据的时候产生的序号,所以想对指定排序的数据去指定的rowmun行数据就必须注意了。
    SQL> select rownum ,id,name from student order by name;
        ROWNUM ID     NAME
    ---------- ------ ---------------------------------------------------
             3 200003 李三
             2 200002 王二
             1 200001 张一
             4 200004 赵四
    可以看出,rownum并不是按照name列来生成的序号。系统是按照记录插入时的顺序给记录排的号,rowid也是顺序分配的。为了解决这个问题,必须使用子查询
    SQL> select rownum ,id,name from (select * from student order by name);
        ROWNUM ID     NAME
    ---------- ------ ---------------------------------------------------
             1 200003 李三
             2 200002 王二
             3 200001 张一
             4 200004 赵四
    这样就成了按name排序,并且用rownum标出正确序号(有小到大)
    posted @ 2008-12-13 11:58 勒紧皮带向前冲 阅读(223) | 评论 (0)编辑 收藏
     

    今天在写hql删除语句是想通过in来实现删除多条数据,但是发现hql语句的delete使用

    where中使用in会报错Operand should contain %d column(s)"。
    另外在设置了二级缓存时,如果策略为read-only时,通过hql的delete通过id删除一条记录时,可以。但如果是通过session.load/get通过id先将记录查询出来,在session.delete的话,会出错。将策略改为read-write。即可。
    posted @ 2008-12-12 17:31 勒紧皮带向前冲 阅读(526) | 评论 (0)编辑 收藏
     

    读取 Cookie 集合,遍历集合找到所需的 Cookie ,如果找到保存进 Session ,否则跳转到登录页面;

    所需资源:

    ReadCookieAction.java- 读取 Cookie 集合,如果找到对应 Cookie ,写入 Session ;

    Login.jsp- 登录用页面;

    LoginSubmit.java- 记录登录信息,并写入 Session ;

    LoginOk.jsp- 读取 Session ,并显示。

    读 Cookie 的方法

    Cookie[] cookies = request.getCookies();

    if (cookies != null ) {

        for ( int i=0; i<cookies. length ; i++) {

           Cookie cookie = cookies[i];

           if (cookie.getName().equals( "userInfo" )) {

               String value = cookie.getValue();

               String[] info = value.split( "_" );

               UserForm userForm = new UserForm();

               userForm.setUserName(info[0]);

               userForm.setUserPassword(info[1]);

               request.getSession().setAttribute( "userForm" , userForm);

               return mapping.findForward( "ok" );

           }

        }

    }

    写 Cookie 的方法:

    Cookie c = new Cookie( "userInfo" ,userForm.getUserName()+ "_" +userForm.getUserPassword());

    c.setComment( "A test cookie" );

    c.setMaxAge(120);

    response.addCookie(c);

    posted @ 2008-12-12 10:57 勒紧皮带向前冲 阅读(777) | 评论 (1)编辑 收藏
     
         摘要:   1<%@ page language="java" contentType="text/html; charset=GB18030"   2    pageEncoding="GB18030"%>   3<%@ taglib...  阅读全文
    posted @ 2008-12-11 15:06 勒紧皮带向前冲 阅读(222) | 评论 (0)编辑 收藏
     
    在采用struts框架项目中,我们通常将模块分类,放在模块的文件夹中。这样在页面中访问时需加上文件目录名路径方可。但是我们可以通过在struts-config中配置Action时加上一个虚拟的目录名,使虚拟的目录名和模块的文件目录名同名,通过访问Action时就可自动进入该目录下,这样访问时就不需再文件目录路径了。
    例:一个文件管理系统中有用户管理模块,将其放入指定的模块文件夹下,如图:

    在struts-config.xml文件中配置Action的path,如图:

    在页面访问时,设置连接如:<a href="user/list.do" title="请点击访问用户管理系统">用户管理系统</a>
    当点击后,在地址栏中显示的地址如图:

    这样就进入user目录下。再在访问改目录下的文件时,就不需加什么目录名了。
    posted @ 2008-12-11 11:09 勒紧皮带向前冲 阅读(405) | 评论 (0)编辑 收藏
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <title>Div+CSS+JS树型菜单,可刷新</title>
    <meta name="description" content="http://www.livepo.com">
    <style type="text/css">
    <!--
    *{margin:0;padding:0;border:0;}
    body {
     font-family: arial, 宋体, serif;
     font-size:12px;
    }
    #nav {
     width:180px;
        line-height: 24px;
     list-style-type: none;
     text-align:left;
        /*定义整个ul菜单的行高和背景色*/
    }
    /*==================一级目录===================*/
    #nav a {
     width: 160px;
     display: block;
     padding-left:20px;
     /*Width(一定要),否则下面的Li会变形*/
    }
    #nav li {
     background:#CCC; /*一级目录的背景色*/
     border-bottom:#FFF 1px solid; /*下面的一条白边*/
     float:left;
     /*float:left,本不应该设置,但由于在Firefox不能正常显示
     继承Nav的width,限制宽度,li自动向下延伸*/
    }
    #nav li a:hover{
     background:#CC0000; /*一级目录onMouseOver显示的背景色*/
    }
    #nav a:link  {
     color:#666; text-decoration:none;
    }
    #nav a:visited  {
     color:#666;text-decoration:none;
    }
    #nav a:hover  {
     color:#FFF;text-decoration:none;font-weight:bold;
    }
    /*==================二级目录===================*/
    #nav li ul {
     list-style:none;
     text-align:left;
    }
    #nav li ul li{ 
     background: #EBEBEB; /*二级目录的背景色*/
    }
    #nav li ul a{
             padding-left:20px;
             width:160px;
     /* padding-left二级目录中文字向右移动,但Width必须重新设置=(总宽度-padding-left)*/
    }
    /*下面是二级目录的链接样式*/
    #nav li ul a:link  {
     color:#666; text-decoration:none;
    }
    #nav li ul a:visited  {
     color:#666;text-decoration:none;
    }
    #nav li ul a:hover {
     color:#F3F3F3;
     text-decoration:none;
     font-weight:normal;
     background:#CC0000;
     /* 二级onmouseover的字体颜色、背景色*/
    }
    /*==============================*/
    #nav li:hover ul {
     left: auto;
    }
    #nav li.sfhover ul {
     left: auto;
    }
    #content {
     clear: left;
    }
    #nav ul.collapsed {
     display: none;
    }
    -->
    #PARENT{
     width:300px;
     padding-left:20px;
    }
    </style>
    </head>
    <body>
    <div id="PARENT">
    <ul id="nav">
    <li><a href="#Menu=ChildMenu1"  onclick="DoMenu('ChildMenu1')">我的网站</a>
     <ul id="ChildMenu1" class="collapsed">
     <li><a href="http://www.netany.net" target="_blank">[url]www.netany.net[/url]</a></li>
     <li><a href="http://www.netany.net" target="_blank">[url]www.netany.net[/url]</a></li>
     <li><a href="http://www.netany.net" target="_blank">[url]www.netany.net[/url]</a></li>
     </ul>
    </li>
    <li><a href="#Menu=ChildMenu2" onclick="DoMenu('ChildMenu2')">我的帐务</a>
     <ul id="ChildMenu2" class="collapsed">
     <a href="http://www.netany.net" target="_blank">支付</a></li>
     <li><a href="#">网上支付</a></li>
     <li><a href="#">登记汇款</a></li>
     <li><a href="#">在线招领</a></li>
     <li><a href="#">历史帐务</a></li>
     </ul>
    </li>
    <li><a href="#Menu=ChildMenu3" onclick="DoMenu('ChildMenu3')">网站管理</a>
     <ul id="ChildMenu3" class="collapsed">
     <li><a href="#">登录</a></li>
     <a href="http://www.netany.net" target="_blank">管理</a></li>
     <li><a href="#">管理</a></li>
     <li><a href="#">管理</a></li>
     </ul>
    </li>
    <li><a href="#Menu=ChildMenu4" onclick="DoMenu('ChildMenu4')">网站管理</a>
     <ul id="ChildMenu4" class="collapsed">
     <li><a href="#">登录</a></li>
     <a href="http://www.netany.net" target="_blank">管理</a></li>
     <li><a href="#">管理</a></li>
     <li><a href="#">管理</a></li>
     </ul>
    </li>
    </ul>
    </div>
    <div style="width:300;padding-left:30px;">
    </br></br>
    工作需要搞了一个菜单,分享给大家,大家一齐学习
    </br></br>
    <p>请大家支持:<a href="http://www.netany.net" target="_blank">[url]http://www.netany.net[/url]</a></p>
    </div>
    </body>
    </html>
    <script type=text/javascript><!--
    var LastLeftID = "";
    function menuFix() {
     var obj = document.getElementById("nav").getElementsByTagName("li");
     
     for (var i=0; i<obj.length; i++) {
      obj[i].onmouseover=function() {
       this.className+=(this.className.length>0? " ": "") + "sfhover";
      }
      obj[i].onMouseDown=function() {
       this.className+=(this.className.length>0? " ": "") + "sfhover";
      }
      obj[i].onMouseUp=function() {
       this.className+=(this.className.length>0? " ": "") + "sfhover";
      }
      obj[i].onmouseout=function() {
       this.className=this.className.replace(new RegExp("( ?|^)sfhover\\b"), "");
      }
     }
    }
    function DoMenu(emid)
    {
     var obj = document.getElementById(emid); 
     obj.className = (obj.className.toLowerCase() == "expanded"?"collapsed":"expanded");
     if((LastLeftID!="")&&(emid!=LastLeftID)) //关闭上一个Menu
     {
      document.getElementById(LastLeftID).className = "collapsed";
     }
     LastLeftID = emid;
    }
    function GetMenuID()
    {
     var MenuID="";
     var _paramStr = new String(window.location.href);
     var _sharpPos = _paramStr.indexOf("#");
     
     if (_sharpPos >= 0 && _sharpPos < _paramStr.length - 1)
     {
      _paramStr = _paramStr.substring(_sharpPos + 1, _paramStr.length);
     }
     else
     {
      _paramStr = "";
     }
     
     if (_paramStr.length > 0)
     {
      var _paramArr = _paramStr.split("&");
      if (_paramArr.length>0)
      {
       var _paramKeyVal = _paramArr[0].split("=");
       if (_paramKeyVal.length>0)
       {
        MenuID = _paramKeyVal[1];
       }
      }
      /*
      if (_paramArr.length>0)
      {
       var _arr = new Array(_paramArr.length);
      }
      
      //取所有#后面的,菜单只需用到Menu
      //for (var i = 0; i < _paramArr.length; i++)
      {
       var _paramKeyVal = _paramArr[i].split('=');
       
       if (_paramKeyVal.length>0)
       {
        _arr[_paramKeyVal[0]] = _paramKeyVal[1];
       }  
      }
      */
     }
     
     if(MenuID!="")
     {
      DoMenu(MenuID)
     }
    }
    GetMenuID(); //*这两个function的顺序要注意一下,不然在Firefox里GetMenuID()不起效果
    menuFix();
    --></script>
    posted @ 2008-12-10 12:37 勒紧皮带向前冲 阅读(455) | 评论 (0)编辑 收藏
     
         摘要: <!--[if !supportLists]-->1.      <!--[endif]-->类图 CacheManager ...  阅读全文
    posted @ 2008-12-06 10:41 勒紧皮带向前冲 阅读(416) | 评论 (0)编辑 收藏
     
         摘要: <!--[if !supportLists]-->1.      <!--[endif]-->类图 CacheManager ...  阅读全文
    posted @ 2008-12-06 10:41 勒紧皮带向前冲 阅读(276) | 评论 (0)编辑 收藏
     
     1<FRAMESET border=0 name=main frameSpacing=0 rows=81,25,* frameBorder=NO>
     2    <FRAMESET border=0 name=main frameSpacing=0 frameBorder=NO cols=*>
     3    <FRAME name=topFrame src="jsp/ms_title.jsp" noResize scrolling=no>
     4    <FRAMESET border=0 name=main frameSpacing=0 frameBorder=NO cols=*>
     5    <FRAME name=topbtnFrame src="jsp/controller/ms_title_ctl.jsp" noResize scrolling=no>
     6    <FRAMESET border=0 name=main frameSpacing=0 frameBorder=NO cols=*>
     7    <FRAMESET id=setyou border=0 frameSpacing=0 rows=* frameBorder=no>
     8        <FRAMESET id=setyou border=0 frameSpacing=0 frameBorder=no cols=150,10,*>
     9        <FRAME name=leftFrame src="jsp/ms_left.jsp" noResize scrolling=no>
    10        <FRAME name=midFrame src="jsp/controller/ms_mid_ctl.jsp" noResize scrolling=no>
    11        <FRAME name=bottomFrame src="jsp/ms_welcome.jsp" noResize scrolling=yes>
    12            
    13        </FRAMESET>
    14            
    15</FRAMESET>
    在ms_left.jsp页面的连接上为
    1addadd("<%=request.getContextPath()%>/<%=SHOWIMG%>","<%=DetailIName%>",'javascript:parent.bottomFrame.location="<%=request.getContextPath()%>/<%=RequestUrl%>"');
    posted @ 2008-11-28 14:00 勒紧皮带向前冲 阅读(2362) | 评论 (0)编辑 收藏
     
    ession flush方法主要做了两件事:
     * 清理缓存
     * 执行sql
     
    session在什么情况下执行flush
     * 默认在事务提交时
     * 显示的调用flush
     * 在执行查询前,如:iterate
     
    hibernate按照save(insert),update、delete顺序提交相关操作

    例:当我们想以下顺序执行代码(先insert,再update,再insert),代码如下:
     1session = HibernateUtils.getSession();
     2tx = session.beginTransaction();
     3
     4User3 user = new User3();
     5user.setId("001");
     6user.setName("张三");
     7    
     8session.save(user);
     9            
    10user.setName("王五");
    11session.update(user);
    12        
    13User3 user3 = new User3();
    14user3.setId("002");
    15user3.setName("李四");
    16session.save(user3);
    17    
    18//Hibernate: insert into t_user3 (name, password, create_time, expire_time, user_id) values (?, ?, ?, ?, ?)
    19//Hibernate: insert into t_user3 (name, password, create_time, expire_time, user_id) values (?, ?, ?, ?, ?)
    20//Hibernate: update t_user3 set name=?, password=?, create_time=?, expire_time=? where user_id=?
    21//hibernate按照save(insert),update、delete顺序提交相关操作
    22tx.commit();

    执行上面的代码,通过查看日志,得到的执行顺序为insert,insert,update
    因此可以用session.flush来实现执行,代码如下:
     1session = HibernateUtils.getSession();
     2tx = session.beginTransaction();
     3
     4User3 user = new User3();
     5user.setId("003");
     6user.setName("张三");
     7            
     8session.save(user);
     9    
    10user.setName("王五");
    11session.update(user);
    12            
    13session.flush();
    14        
    15User3 user3 = new User3();
    16user3.setId("004");
    17user3.setName("李四");
    18session.save(user3);
    19        
    20//Hibernate: insert into t_user3 (name, password, create_time, expire_time, user_id) values (?, ?, ?, ?, ?)
    21//Hibernate: update t_user3 set name=?, password=?, create_time=?, expire_time=? where user_id=?
    22//Hibernate: insert into t_user3 (name, password, create_time, expire_time, user_id) values (?, ?, ?, ?, ?)
    23//因为我们在session.udpate(user)后执行了flush,所以在清理缓存时执行flush前的sql不会生成
    24//sql会按照我们的意愿执行
    25tx.commit();
    这样我们就实现insert,update,insert的顺序。这在一些复杂的情况下很有用。
    posted @ 2008-11-28 11:24 勒紧皮带向前冲 阅读(1803) | 评论 (1)编辑 收藏
     
    有写时候需要使用一下查询两个类的某个属性
    如:s.createQuery("select a.name,b.address from user a,add b where xxx");
    得出来的接过可以通过Object【】通过循环打印出来。
    不过我们也可以通过javabean来保存,以更符合面向对象编程的思想。
    eg:s.createQuery("select new 报名.ad(a.name,b.address) from user a,add b where xxxx");
            (注:在此的包名一定不可少)
    class ab{
            类型  name;类型 address;//类型要与user和add类中的的name,address类型一致
            getter/setter
    }
    这样就可以同过ab.getXXX()来获取属性。
    posted @ 2008-11-25 15:55 勒紧皮带向前冲 阅读(358) | 评论 (0)编辑 收藏
     

    1、当数据库不存在对应ID数据时,调用load()方法将会抛出ObjectNotFoundException异常,get()方法将返回null,我比较喜欢使用get()方法。

    2、当对象.hbm.xml配置文件<class>元素的lazy属性设置为true时,调用load()方法时则返回持久对象的代理类实例,此时的代理类实例是由运行时动态生成的类,该代理类实例包括原目标对象的所有属性和方法,该代理类实例的属性除了ID不为null外,所在属性为null值,查看日志并没有Hibernate SQL输出,说明没有执行查询操作,当代理类实例通过getXXX()方法获取属性值时,Hiberante才真正执行数据库查询操作。当对象.hbm.xml配置文件<class>元素的lazy属性设置为false时,调用load()方法则是立即执行数据库并直接返回实体类,并不返回代理类。而调用get()方法时不管lazy为何值,都直接返回实体类。

    3、load()和get()都会先从Session缓存中查找,如果没有找到对应的对象,则查询Hibernate二级缓存,再找不到该对象,则发送一条SQL语句查询。

    posted @ 2008-11-25 13:10 勒紧皮带向前冲 阅读(255) | 评论 (0)编辑 收藏
     
         摘要: 数据关联是ORM的一个重要特征,但往往也是导致系统性能低下的诱因。 1.一对一关联     一对一关联有两种:         1>.主键关联:即两张表通过主键形成一对一的关联关系。        ...  阅读全文
    posted @ 2008-11-25 13:05 勒紧皮带向前冲 阅读(263) | 评论 (0)编辑 收藏
     
    就是DepartInfo没有相应的映射文件。
    看看是不是Hibernate.cfg.xml里面没有加入这个POJO的映射文件,或者DepartInfo.hbm.xml的内容有没有出错的地方。
    posted @ 2008-11-24 17:18 勒紧皮带向前冲 阅读(1166) | 评论 (0)编辑 收藏
     
    出现Can't start a cloned connection while in manual transaction mode错误,从网上找到原因及解决办法如下:

    原因一般是当你在一个SQL SERVER的JDBC连接上执行多个STATEMENTS的操作,或者是手动事务状态(AutoCommit=false) 并且使用默认的模式. direct (SelectMethod=direct) 模式.

    解决办法
    当你使用手动事务模式时,必须把SelectMethod 属性的值设置为 Cursor, 或者是确保在你的连接只有一个STATEMENT操作。

    修改url
     
    加入SelectMethod=cursor即可

    在eclipse下通过在cfg文件中uri加入即可

    posted @ 2008-11-24 17:16 勒紧皮带向前冲 阅读(954) | 评论 (2)编辑 收藏
     

    今天看的代码是数据池类,对其中的Hashtable,Vector和Properties三个类返回Enumeration类型的方法注意了一下。
    Hashtable返回枚举类型的方法有elements()返回此哈希表中的值的枚举keys()返回此哈希表中的键的枚举。
    Vector有elements()返回此向量的组件的枚举
    Properties有propertyNames()返回属性列表中所有键的枚举,如果在主属性列表中未找到同名的键,则包括默认属性列表中不同的键。
    PropertiesgetProperty方法有两个;
    一个是getProperty(String key)用指定的键在此属性列表中搜索属性
    一个是getProperty(String key, String defaultValue)用指定的键在属性列表中搜索属性。如果在属性列表中未找到该键,则接着递归检查默认属性列表及其默认值。如果未找到属性,则此方法返回默认值变量。

    ThreadGroup    线程组表示一个线程的集合。此外,线程组也可以包含其他线程组。线程组构成一棵树,在树中,除了初始线程组外,每个线程组都有一个父线程组。

    构造方法摘要
    ThreadGroup(String name)
              构造一个新线程组。
    ThreadGroup(ThreadGroup parent, String name)
              创建一个新线程组。


     

    posted @ 2008-11-14 11:58 勒紧皮带向前冲 阅读(206) | 评论 (0)编辑 收藏
     
    posted @ 2008-11-11 21:18 勒紧皮带向前冲 阅读(212) | 评论 (0)编辑 收藏
     
         摘要: 第一个   1/** *//************************************************   2MD5 算法的Java Bean   3@author:Topcat Tuppin   4Last Modified:10,Mar...  阅读全文
    posted @ 2008-11-11 11:38 勒紧皮带向前冲 阅读(257) | 评论 (0)编辑 收藏
     
         摘要:   1import java.io.*;   2import java.util.*;   3/** *//**   4  *   5  * <p>Title: LOG 日志记录&...  阅读全文
    posted @ 2008-11-11 11:24 勒紧皮带向前冲 阅读(268) | 评论 (0)编辑 收藏
     
     1import java.util.*;
     2/**
     3 * <p>Title: Time  </p>
     4 * <p>Description: </p>
     5 *      此类主要用来取得本地系统的系统时间并用下面5种格式显示
     6 *              1. YYMMDDHH         8位
     7 *              2. YYMMDDHHmm       10位
     8 *              3. YYMMDDHHmmss     12位
     9 *              4. YYYYMMDDHHmmss   14位
    10 *              5. YYMMDDHHmmssxxx  15位 (最后的xxx 是毫秒)
    11 * <p>Copyright: Copyright (c) 2003</p>
    12 * <p>Company: hoten </p>
    13 * @author lqf
    14 * @version 1.0
    15 */

    16public class CTime {
    17    public static final int YYMMDDhhmmssxxx=15;
    18    public static final int YYYYMMDDhhmmss=14;
    19    public static final int YYMMDDhhmmss=12;
    20    public static final int YYMMDDhhmm=10;
    21    public static final int YYMMDDhh=8;
    22/**
    23 * 取得本地系统的时间,时间格式由参数决定
    24 * @param format 时间格式由常量决定
    25 * @return String 具有format格式的字符串
    26 */

    27    public synchronized static String  getTime(int format){
    28        StringBuffer cTime=new StringBuffer(10);
    29        Calendar time=Calendar.getInstance();
    30        int miltime=time.get(Calendar.MILLISECOND);
    31        int second=time.get(Calendar.SECOND);
    32        int minute=time.get(Calendar.MINUTE);
    33        int hour=time.get(Calendar.HOUR_OF_DAY);
    34        int day =time.get(Calendar.DAY_OF_MONTH);
    35        int month=time.get(Calendar.MONTH)+1;
    36        int year =time.get(Calendar.YEAR);
    37        if(format!=14){
    38            if(year>=2000) year=year-2000;
    39            else year=year-1900;
    40        }

    41        if(format>=2){
    42            if(format==14) cTime.append(year);
    43            else    cTime.append(getFormatTime(year,2));
    44        }

    45        if(format>=4)
    46            cTime.append(getFormatTime(month,2));
    47        if(format>=6)
    48            cTime.append(getFormatTime(day,2));
    49        if(format>=8)
    50            cTime.append(getFormatTime(hour,2));
    51        if(format>=10)
    52            cTime.append(getFormatTime(minute,2));
    53        if(format>=12)
    54            cTime.append(getFormatTime(second,2));
    55        if(format>=15)
    56            cTime.append(getFormatTime(miltime,3));
    57        return cTime.toString();
    58    }

    59/**
    60 * 产生任意位的字符串
    61 * @param time 要转换格式的时间
    62 * @param format 转换的格式
    63 * @return String 转换的时间
    64 */

    65    private synchronized static String getFormatTime(int time,int format){
    66        StringBuffer numm=new StringBuffer();
    67        int length=String.valueOf(time).length();
    68
    69        if(format<length) return null;
    70
    71        for(int i=0 ;i<format-length ;i++){
    72            numm.append("0");
    73        }

    74        numm.append(time);
    75        return numm.toString().trim();
    76    }

    77}
    posted @ 2008-11-11 11:04 勒紧皮带向前冲 阅读(198) | 评论 (0)编辑 收藏
     
    JS的正则表达式
    2008年11月06日 星期四 07:22


    //校验是否全由数字组成
    [code]
    function isDigit(s)
    {
    var patrn=/^[0-9]{1,20}$/;
    if (!patrn.exec(s)) return false
    return true
    }
    [/code]

    //校验登录名:只能输入5-20个以字母开头、可带数字、“_”、“.”的字串
    [code]
    function isRegisterUserName(s)
    {
    var patrn=/^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){4,19}$/;
    if (!patrn.exec(s)) return false
    return true
    }
    [/code]

    //校验用户姓名:只能输入1-30个以字母开头的字串
    [code]
    function isTrueName(s)
    {
    var patrn=/^[a-zA-Z]{1,30}$/;
    if (!patrn.exec(s)) return false
    return true
    }
    }}

    //校验密码:只能输入6-20个字母、数字、下划线
    [code]
    function isPasswd(s)
    {
    var patrn=/^(\w){6,20}$/;
    if (!patrn.exec(s)) return false
    return true
    }
    [/code]

    //校验普通电话、传真号码:可以“+”开头,除数字外,可含有“-”
    [code]
    function isTel(s)
    {
    //var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?(\d){1,12})+$/;
    var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/;
    if (!patrn.exec(s)) return false
    return true
    }
    [/code]

    //校验手机号码:必须以数字开头,除数字外,可含有“-”
    [code]
    function isMobil(s)
    {
    var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/;
    if (!patrn.exec(s)) return false
    return true
    }
    [/code]

    //校验邮政编码
    [code]
    function isPostalCode(s)
    {
    //var patrn=/^[a-zA-Z0-9]{3,12}$/;
    var patrn=/^[a-zA-Z0-9 ]{3,12}$/;
    if (!patrn.exec(s)) return false
    return true
    }
    [/code]

    //校验搜索关键字
    [code]
    function isSearch(s)
    {
    var patrn=/^[^`~!@#$%^&*()+=|\\\][\]\{\}:;'\,.<>/?]{1}[^`~!@$%^&()+=|\\\]
            [\]\{\}:;'\,.<>?]{0,19}$/;
    if (!patrn.exec(s)) return false
    return true
    }

    function isIP(s) //by zergling
    {
    var patrn=/^[0-9.]{1,20}$/;
    if (!patrn.exec(s)) return false
    return true
    }
    [/code]

    正则表达式
    [code]
    "^\\d+$"  //非负整数(正整数 + 0)
    "^[0-9]*[1-9][0-9]*$"  //正整数
    "^((-\\d+)|(0+))$"  //非正整数(负整数 + 0)
    "^-[0-9]*[1-9][0-9]*$"  //负整数
    "^-?\\d+$"    //整数
    "^\\d+(\\.\\d+)?$"  //非负浮点数(正浮点数 + 0)
    "^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$" 
    //正浮点数
    "^((-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$"  //非正浮点数(负浮点数 + 0)
    "^(-(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*)))$" 
    //负浮点数
    "^(-?\\d+)(\\.\\d+)?$"  //浮点数
    "^[A-Za-z]+$"  //由26个英文字母组成的字符串
    "^[A-Z]+$"  //由26个英文字母的大写组成的字符串
    "^[a-z]+$"  //由26个英文字母的小写组成的字符串
    "^[A-Za-z0-9]+$"  //由数字和26个英文字母组成的字符串
    "^\\w+$"  //由数字、26个英文字母或者下划线组成的字符串
    "^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$"    //email地址
    "^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$"  //url
    "^[A-Za-z0-9_]*$"
    [/code]

    正则表达式使用详解

    简介

    简单的说,正则表达式是一种可以用于模式匹配和替换的强有力的工具。其作用如下:
    测试字符串的某个模式。例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证。
    替换文本。可以在文档中使用一个正则表达式来标识特定文字,然后可以全部将其删除,或者替换为别的文字。
    根据模式匹配从字符串中提取一个子字符串。可以用来在文本或输入字段中查找特定文字。

    基本语法

    在对正则表达式的功能和作用有了初步的了解之后,我们就来具体看一下正则表达式的语法格式。

    正则表达式的形式一般如下:  

    /love/  其中位于“/”定界符之间的部分就是将要在目标对象中进行匹配的模式。用户只要把希望查找匹配对象的模式内容放入“/”定界符之间即可。为了能够使用户更加灵活的定制模式内容,正则表达式提供了专门的“元字符”。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
    较为常用的元字符包括: “+”, “*”,以及 “?”。

    “+”元字符规定其前导字符必须在目标对象中连续出现一次或多次。

    “*”元字符规定其前导字符必须在目标对象中出现零次或连续多次。

    “?”元字符规定其前导对象必须在目标对象中连续出现零次或一次。

    下面,就让我们来看一下正则表达式元字符的具体应用。

    /fo+/  因为上述正则表达式中包含“+”元字符,表示可以与目标对象中的 “fool”, “fo”, 或者 “football”等在字母f后面连续出现一个或多个字母o的字符串相匹配。

    /eg*/  因为上述正则表达式中包含“*”元字符,表示可以与目标对象中的 “easy”, “ego”, 或者 “egg”等在字母e后面连续出现零个或多个字母g的字符串相匹配。

    /Wil?/  因为上述正则表达式中包含“?”元字符,表示可以与目标对象中的 “Win”, 或者“Wilson”,等在字母i后面连续出现零个或一个字母l的字符串相匹配。

    有时候不知道要匹配多少字符。为了能适应这种不确定性,正则表达式支持限定符的概念。这些限定符可以指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。

    {n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。

    {n,} n 是一个非负整数。至少匹配 n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。

    {n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。

    除了元字符之外,用户还可以精确指定模式在匹配对象中出现的频率。例如,/jim {2,6}/ 上述正则表达式规定字符m可以在匹配对象中连续出现2-6次,因此,上述正则表达式可以同jimmy或jimmmmmy等字符串相匹配。
    在对如何使用正则表达式有了初步了解之后,我们来看一下其它几个重要的元字符的使用方式。
    [code]
    \s:用于匹配单个空格符,包括tab键和换行符;
    \S:用于匹配除单个空格符之外的所有字符;
    \d:用于匹配从0到9的数字;
    \w:用于匹配字母,数字或下划线字符;
    \W:用于匹配所有与\w不匹配的字符;
    . :用于匹配除换行符之外的所有字符。
    [/code]
    (说明:我们可以把\s和\S以及\w和\W看作互为逆运算)
    下面,我们就通过实例看一下如何在正则表达式中使用上述元字符。
    /\s+/ 上述正则表达式可以用于匹配目标对象中的一个或多个空格字符。
    /\d000/ 如果我们手中有一份复杂的财务报表,那么我们可以通过上述正则表达式轻而易举的查找到所有总额达千元的款项。
    除了我们以上所介绍的元字符之外,正则表达式中还具有另外一种较为独特的专用字符,即定位符。定位符用于规定匹配模式在目标对象中的出现位置。 较为常用的定位符包括: “^”, “$”, “\b” 以及 “\B”。
    [code]
    “^”定位符规定匹配模式必须出现在目标字符串的开头
    “$”定位符规定匹配模式必须出现在目标对象的结尾
    “\b”定位符规定匹配模式必须出现在目标字符串的开头或结尾的两个边界之一
    “\B”定位符则规定匹配对象必须位于目标字符串的开头和结尾两个边界之内,
          即匹配对象既不能作为目标字符串的开头,也不能作为目标字符串的结尾。
    [/code]
    同样,我们也可以把“^”和“$”以及“\b”和“\B”看作是互为逆运算的两组定位符。举例来说: /^hell/ 因为上述正则表达式中包含“^”定位符,所以可以与目标对象中以 “hell”, “hello”或“hellhound”开头的字符串相匹配。 /ar$/ 因为上述正则表达式中包含“$”定位符,所以可以与目标对象中以 “car”, “bar”或 “ar” 结尾的字符串相匹配。 /\bbom/ 因为上述正则表达式模式以“\b”定位符开头,所以可以与目标对象中以 “bomb”, 或 “bom”开头的字符串相匹配。/man\b/ 因为上述正则表达式模式以“\b”定位符结尾,所以可以与目标对象中以 “human”, “woman”或 “man”结尾的字符串相匹配。
    为了能够方便用户更加灵活的设定匹配模式,正则表达式允许使用者在匹配模式中指定某一个范围而不局限于具体的字符。例如:
    [code]
    /[A-Z]/  上述正则表达式将会与从A到Z范围内任何一个大写字母相匹配。
    /[a-z]/  上述正则表达式将会与从a到z范围内任何一个小写字母相匹配。
    /[0-9]/  上述正则表达式将会与从0到9范围内任何一个数字相匹配。
    /([a-z][A-Z][0-9])+/ 上述正则表达式将会与任何由字母和数字组成的字符串,如 “aB0” 等相匹配。
    [/code]
    这里需要提醒用户注意的一点就是可以在正则表达式中使用 “()” 把字符串组合在一起。“()”符号包含的内容必须同时出现在目标对象中。因此,上述正则表达式将无法与诸如 “abc”等的字符串匹配,因为“abc”中的最后一个字符为字母而非数字。
    如果我们希望在正则表达式中实现类似编程逻辑中的“或”运算,在多个不同的模式中任选一个进行匹配的话,可以使用管道符 “|”。例如:/to|too|2/ 上述正则表达式将会与目标对象中的 “to”, “too”, 或 “2” 相匹配。
    正则表达式中还有一个较为常用的运算符,即否定符 “[^]”。与我们前文所介绍的定位符 “^” 不同,否定符 “[^]”规定目标对象中不能存在模式中所规定的字符串。例如:/[^A-C]/ 上述字符串将会与目标对象中除A,B,和C之外的任何字符相匹配。一般来说,当“^”出现在 “[]”内时就被视做否定运算符;而当“^”位于“[]”之外,或没有“[]”时,则应当被视做定位符。
    最后,当用户需要在正则表达式的模式中加入元字符,并查找其匹配对象时,可以使用转义符“\”。例如:/Th\*/  上述正则表达式将会与目标对象中的“Th*”而非“The”等相匹配。
    在构造正则表达式之后,就可以象数学表达式一样来求值,也就是说,可以从左至右并按照一个优先级顺序来求值。优先级如下:
    [code]
    1.\ 转义符
    2.(), (?:), (?=), [] 圆括号和方括号
    3.*, +, ?, {n}, {n,}, {n,m} 限定符
    4.^, $, \anymetacharacter 位置和顺序
    5.|“或”操作
    [/code]

    使用实例
    在JavaScript 1.2中带有一个功能强大的RegExp()对象,可以用来进行正则表达式的匹配操作。其中的test()方法可以检验目标对象中是否包含匹配模式,并相应的返回true或false。
    我们可以使用JavaScript编写以下脚本,验证用户输入的邮件地址的有效性。
    [code]
    <html>
    <head>
      <script language="Javascript1.2">
         <!-- start hiding
         function verifyAddress(obj)
         {
          var email = obj.email.value;
          var pattern =
    /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/;
          flag = pattern.test(email);
          if(flag)
          {
           alert(“Your email address is correct!”);
           return true;
          }
          else
           {
            alert(“Please try again!”);
            return false;
            }
          }
         // stop hiding -->
        </script>
      </head>
      <body>
       <form onSubmit="return verifyAddress(this);">
        <input name="email" type="text">
        <input type="submit">
        </form>
      </body>
    </html>
    [/code]

    正则表达式对象
    本对象包含正则表达式模式以及表明如何应用模式的标志。
    [code]
    语法 1 re = /pattern/[flags]
    语法 2 re = new RegExp("pattern",["flags"])
    [/code]
    参数
    re
    必选项。将要赋值为正则表达式模式的变量名。

    Pattern
    必选项。要使用的正则表达式模式。如果使用语法 1,用 "/" 字符分隔模式。如果用语法 2,用引号将模式引起来。

    Flags
    可选项。如果使用语法 2 要用引号将 flag 引起来。标志可以组合使用,可用的有:
    [code]
    g (全文查找出现的所有 pattern)
    i (忽略大小写)
    m (多行查找)
    [/code]

    示例
    下面的示例创建一个包含正则表达式模式及相关标志的对象(re),向您演示正则表达式对象的用法。在本例中,作为结果的正则表达式对象又用于 match 方法中:
    [code]
    function MatchDemo()
    {
    var r, re; // 声明变量。
    var s = "The rain in Spain falls mainly in the plain";
    re = new RegExp("ain","g"); // 创建正则表达式对象。
    r = s.match(re); // 在字符串 s 中查找匹配。
    return(r);
    }
    [/code]

    返回值: ain,ain,ain,ain\\
    属性 lastIndex 属性 | source 属性\\
    方法 compile 方法 | exec 方法 | test 方法\\
    要求 版本 3\\
    请参阅 RegExp 对象 | 正则表达式语法 | String 对象\\

    exec 方法
    用正则表达式模式在字符串中运行查找,并返回包含该查找结果的一个数组。
    rgExp.exec(str)

    参数

    rgExp
    必选项。包含正则表达式模式和可用标志的正则表达式对象。

    str
    必选项。要在其中执行查找的 String 对象或字符串文字。

    说明\\
    如果 exec 方法没有找到匹配,则它返回 null。如果它找到匹配,则 exec 方法返回一个数组,并且更新全局 RegExp 对象的属性,以反映匹配结果。数组的0元素包含了完整的匹配,而第1到n元素中包含的是匹配中出现的任意一个子匹配。这相当于没有设置全局标志 (g) 的 match 方法。
    如果为正则表达式设置了全局标志,exec 从以 lastIndex 的值指示的位置开始查找。如果没有设置全局标志,exec 忽略 lastIndex 的值,从字符串的起始位置开始搜索。

    exec 方法返回的数组有三个属性,分别是 input、index 和 lastIndex。Input 属性包含了整个被查找的字符串。Index 属性中包含了整个被查找字符串中被匹配的子字符串的位置。LastIndex 属性中包含了匹配中最后一个字符的下一个位置。

    示例\\
    下面的例子举例说明了 exec 方法的用法:
    [code]
    function RegExpTest()
    {
    var ver = Number(ScriptEngineMajorVersion() + "." + ScriptEngineMinorVersion())
    if (ver >= 5.5){ // 测试 JScript 的版本。
    var src = "The rain in Spain falls mainly in the plain.";
    var re = /\w+/g; // 创建正则表达式模式。
    var arr;
    while ((arr = re.exec(src)) != null)
    document.write(arr.index + "-" + arr.lastIndex + arr + "\t");
    }
    else{
    alert("请使用 JScript 的更新版本");
    }
    }
    [/code]

    返回值:0-3The 4-8rain 9-11in 12-17Spain 18-23falls 24-30mainly 31-33in 34-37the 38-43plain

    test 方法\\
    返回一个 Boolean 值,它指出在被查找的字符串中是否存在模式。
    rgexp.test(str)

    参数\\
    rgexp
    必选项。包含正则表达式模式或可用标志的正则表达式对象。

    str
    必选项。要在其上测试查找的字符串。

    说明
    test 方法检查在字符串中是否存在一个模式,如果存在则返回 true,否则就返回 false。
    全局 RegExp 对象的属性不由 test 方法来修改。

    示例
    下面的例子举例说明了 test 方法的用法:
    [code]
    function TestDemo(re, s)
    {
    var s1; // 声明变量。
    // 检查字符串是否存在正则表达式。
    if (re.test(s)) // 测试是否存在。
    s1 = " contains "; // s 包含模式。
    else
    s1 = " does not contain "; // s 不包含模式。
    return("'" + s + "'" + s1 + "'"+ re.source + "'"); // 返回字符串。
    }
    [/code]

    函数调用:document.write (TestDemo(/ain+/ ,"The rain in Spain falls mainly in the plain."));

    返回值:'The rain in Spain falls mainly in the plain.' contains 'ain+'

    match 方法
    使用正则表达式模式对字符串执行查找,并将包含查找的结果作为数组返回。\\
    stringObj.match(rgExp)

    参数\\
    stringObj
    必选项。对其进行查找的 String 对象或字符串文字。

    rgExp
    必选项。为包含正则表达式模式和可用标志的正则表达式对象。也可以是包含正则表达式模式和可用标志的变量名或字符串文字。

    说明\\
    如果 match 方法没有找到匹配,返回 null。如果找到匹配返回一个数组并且更新全局 RegExp 对象的属性以反映匹配结果。
    match 方法返回的数组有三个属性:input、index 和 lastIndex。Input 属性包含整个的被查找字符串。Index 属性包含了在整个被查找字符串中匹配的子字符串的位置。LastIndex 属性包含了最后一次匹配中最后一个字符的下一个位置。
    如果没有设置全局标志 (g),数组的 0 元素包含整个匹配,而第 1 到 n 元素包含了匹配中曾出现过的任一个子匹配。这相当于没有设置全局标志的 exec 方法。如果设置了全局标志,元素 0 到 n 中包含所有匹配。

    示例\\
    下面的示例演示了match 方法的用法:
    [code]
    function MatchDemo()
    {
    var r, re; // 声明变量。
    var s = "The rain in Spain falls mainly in the plain";
    re = /ain/i; // 创建正则表达式模式。
    r = s.match(re); // 尝试匹配搜索字符串。
    return(r); // 返回第一次出现 "ain" 的地方。
    }
    [/code]
    返回值:ain

    本示例说明带 g 标志设置的 match 方法的用法。
    [code]
    function MatchDemo()
    {
    var r, re; // 声明变量。
    var s = "The rain in Spain falls mainly in the plain";
    re = /ain/ig; // 创建正则表达式模式。
    r = s.match(re); // 尝试去匹配搜索字符串。
    return(r); // 返回的数组包含了所有 "ain"
    // 出现的四个匹配。
    }
    [/code]
    返回值:ain,ain,ain,ain

    上面几行代码演示了字符串文字的 match 方法的用法。
    [code]
    var r, re = "Spain";
    r = "The rain in Spain".replace(re, "Canada");
    return r;
    [/code]
    返回值:The rain in Canada

    search 方法
    返回与正则表达式查找内容匹配的第一个子字符串的位置。

    stringObj.search(rgExp)

    参数\\
    stringObj
    必选项。要在其上进行查找的 String 对象或字符串文字。

    rgExp
    必选项。包含正则表达式模式和可用标志的正则表达式对象。

    说明

    search 方法指明是否存在相应的匹配。如果找到一个匹配,search 方法将返回一个整数值,指明这个匹配距离字符串开始的偏移位置。如果没有找到匹配,则返回 -1。

    示例\\
    下面的示例演示了 search 方法的用法。
    [code]
    function SearchDemo()
    {
    var r, re; // 声明变量。
    var s = "The rain in Spain falls mainly in the plain.";
    re = /falls/i; // 创建正则表达式模式。
    r = s.search(re); // 查找字符串。
    return(r); // 返回 Boolean 结果。
    }
    [/code]
    返回值:18


    正则表达式语法
    一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。

    这里有一些可能会遇到的正则表达式示例:
    [code]
    JScript VBScript 匹配
    /^\[ \t]*$/ "^\[ \t]*$" 匹配一个空白行。
    /\d{2}-\d{5}/ "\d{2}-\d{5}" 验证一个ID 号码是否由一个2位数字,一个连字符以及一个5位数字组成。
    /<(.*)>.*<\/\1>/ "<(.*)>.*<\/\1>" 匹配一个 HTML 标记。
    [/code]

    下表是元字符及其在正则表达式上下文中的行为的一个完整列表:

    字符 描述
    \ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 后向引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。

    ^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。

    $ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。

    * 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。 * 等价于{0,}。

    + 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。

    ? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。

    {n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。

    {n,} n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。

    {n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。刘, "o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。

    ? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。

    . 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。
    (pattern) 匹配pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 '\(' 或 '\)'。

    (?:pattern) 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。

    (?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如, 'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

    (?!pattern) 负向预查,在任何不匹配Negative lookahead matches the search string at any point where a string not matching pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始

    x|y 匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。

    [xyz] 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。

    [^xyz] 负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。

    [a-z] 字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。

    [^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。

    \b 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。

    \B 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。

    \cx 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。 x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。

    \d 匹配一个数字字符。等价于 [0-9]。

    \D 匹配一个非数字字符。等价于 [^0-9]。

    \f 匹配一个换页符。等价于 \x0c 和 \cL。

    \n 匹配一个换行符。等价于 \x0a 和 \cJ。

    \r 匹配一个回车符。等价于 \x0d 和 \cM。

    \s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。

    \S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。

    \t 匹配一个制表符。等价于 \x09 和 \cI。

    \v 匹配一个垂直制表符。等价于 \x0b 和 \cK。

    \w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。

    \W 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。

    \xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如, '\x41' 匹配 "A"。'\x041' 则等价于 '\x04' & "1"。正则表达式中可以使用 ASCII 编码。.

    \num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匹配两个连续的相同字符。

    \n 标识一个八进制转义值或一个后向引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为后向引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。

    \nm 标识一个八进制转义值或一个后向引用。如果 \nm 之前至少有is preceded by at least nm 个获取得子表达式,则 nm 为后向引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。

    \nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。

    \un 匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。


    优先权顺序
    在构造正则表达式之后,就可以象数学表达式一样来求值,也就是说,可以从左至右并按照一个优先权顺序来求值。

    下表从最高优先级到最低优先级列出各种正则表达式操作符的优先权顺序:
    [code]
    操作符 描述
    \ 转义符
    (), (?:), (?=), [] 圆括号和方括号
    *, +, ?, {n}, {n,}, {n,m} 限定符
    ^, $, \anymetacharacter 位置和顺序
    | “或”操作
    [/code]

    普通字符

    普通字符由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母字符,所有数字,所有标点符号以及一些符号。

    最简单的正则表达式是一个单独的普通字符,可以匹配所搜索字符串中的该字符本身。例如,单字符模式 'A' 可以匹配所搜索字符串中任何位置出现的字母 'A'。这里有一些单字符正则表达式模式的示例:
    [code]
    /a/
    /7/
    /M/
    [/code]
    等价的 VBScript 单字符正则表达式为:
    [code]
    "a"
    "7"
    "M"
    [/code]
    可以将多个单字符组合在一起得到一个较大的表达式。例如,下面的 JScript 正则表达式不是别的,就是通过组合单字符表达式 'a'、'7'以及 'M' 所创建出来的一个表达式。

    /a7M/
    等价的 VBScript 表达式为:

    posted @ 2008-11-10 11:42 勒紧皮带向前冲 阅读(207) | 评论 (0)编辑 收藏
     
    1.打开企业管理器-安全性-创建用户test,授予connect和resource权限,在系统选项卡里赋予无限表空间权限(unlimited tablespace).
     
    2.在企业管理器-存储-表空间中创建2个新的表空间,一个设为永久空间,一个设为临时空间.
     
    3.双击用户test,给其设定永久空间和临时空间,对应上一步创建的2个空间.
     
    4.此时,在方案中还没有出现test方案,只需在任意方案下右击,创建一个新表,在方案下拉列表中就会出现test方案,创建表成功后,刷新一下,就可以看到新的方案test了.

    转自  http://blog.tom.com/netmax2008/article/942.html
    posted @ 2008-11-08 15:00 勒紧皮带向前冲 阅读(272) | 评论 (0)编辑 收藏
     

    转自http://hi.baidu.com/zml525/blog/item/59a3a277ed10ba19b051b957.html

    1.C:\WINDOWS\system32\drivers\etc下的hosts文件
      

    加入域名解析相关的东西,比如:
       127.0.0.1        localhost
       127.0.0.1        test.001m.cn
       127.0.0.1        www.001m.cn
       如果在实战中,前边的127.0.0.1换作公有IP地址

    2.Tomcat 5.0\conf下的server.xml文件
      

    (2.1)
         修改端口号(默认为8080,现改为80):
         <!-- Define a non-SSL Coyote HTTP/1.1 Connector on the port specified    during installation   -->
         <Connector port="80"    maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
                    enableLookups="false" redirectPort="8443" acceptCount="100"
                    debug="0" connectionTimeout="20000"
                    disableUploadTimeout="true" />

        (2.2)
            添加发布文件夹,并为每个文件夹指定要绑定的域名:
            因为想要实现,在发布文件夹根目录下发布项目,所以,一个文件夹只能发布一个项目,所以,要指定不同的文件夹。
            在<Host name=" 此处是要绑定的域名 " debug="0"   appBase=" 此处是发布目录 "
              unpackWARs="true" autoDeploy="true"      xmlValidation="false" xmlNamespaceAware="false">
            如果要建多个发布目录,可以在<Host name.....></Host> 的前边再加上一个<Host name....></Host>

        (2.3)
           在前边的工作做好之后,启动服务器,就会发现,Tomcat 5.0\conf\Catalina下多了几个文件夹,文件夹名就是你前边<Host..>
           </Host>中存在的发布文件夹的名字。然后,把相应的配置文件*.xml放在对应的Tomcat 5.0\conf\Catalina里的文件夹里。
           而且让他们的路径是根目录下,这样访问时就可以直接打绑定好的域名访问了。比如:
           <Context path="" reloadable="true" docBase="hnnj">
          <Resource name="jdbc/hnnj" auth="Container" type="javax.sql.DataSource"/>
          <ResourceParams name="jdbc/hnnj">
         
    3.好啦,一切问题就解决了。好爽啊!
    补:127.0.0.1        test.001m.cn这里的域名要和<Host name=" 此处是要绑定的域名 "..>这里的域名一致,否则
         也不会在Tomcat 5.0\conf\Catalina下生成文件夹,就不会达到既定目标了。呵呵!

    4.附录:
       (4.1)
          C:\WINDOWS\system32\drivers\etc下的hosts文件,内容格式为:IP地址    域名
          例如:  
          202.102.240.91    web.nyist.net
       (4.2)
          Tomcat 5.0\conf下的server.xml文件,内容基本为:(注:server.xml里的一些注释我给省去了
          <!-- Example Server Configuration File -->
    <!-- Note that component elements are nested corresponding to their
          parent-child relationships with each other -->

    <!-- A "Server" is a singleton element that represents the entire JVM,
          which may contain one or more "Service" instances.   The Server
          listens for a shutdown command on the indicated port.

          Note:   A "Server" is not itself a "Container", so you may not
          define subcomponents such as "Valves" or "Loggers" at this level.
    -->

    <Server port="8005" shutdown="SHUTDOWN" debug="0">


       <!-- Comment these entries out to disable JMX MBeans support -->
       <!-- You may also configure custom components (e.g. Valves/Realms) by
            including your own mbean-descriptor file(s), and setting the
            "descriptors" attribute to point to a ';' seperated list of paths
            (in the ClassLoader sense) of files to add to the default list.
            e.g. descriptors="/com/myfirm/mypackage/mbean-descriptor.xml"
       -->
       <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener"
                 debug="0"/>
       <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"
                 debug="0"/>

       <!-- Global JNDI resources -->
       <GlobalNamingResources>

         <!-- Test entry for demonstration purposes -->
         <Environment name="simpleValue" type="java.lang.Integer" value="30"/>

         <!-- Editable user database that can also be used by
              UserDatabaseRealm to authenticate users -->
         <Resource name="UserDatabase" auth="Container"
                   type="org.apache.catalina.UserDatabase"
            description="User database that can be updated and saved">
         </Resource>
         <ResourceParams name="UserDatabase">
           <parameter>
             <name>factory</name>
             <value>org.apache.catalina.users.MemoryUserDatabaseFactory</value>
           </parameter>
           <parameter>
             <name>pathname</name>
             <value>conf/tomcat-users.xml</value>
           </parameter>
         </ResourceParams>

       </GlobalNamingResources>

       <!-- A "Service" is a collection of one or more "Connectors" that share
            a single "Container" (and therefore the web applications visible
            within that Container).   Normally, that Container is an "Engine",
            but this is not required.

            Note:   A "Service" is not itself a "Container", so you may not
            define subcomponents such as "Valves" or "Loggers" at this level.
        -->

       <!-- Define the Tomcat Stand-Alone Service -->
       <Service name="Catalina">

         <!-- A "Connector" represents an endpoint by which requests are received
              and responses are returned.   Each Connector passes requests on to the
              associated "Container" (normally an Engine) for processing.

              By default, a non-SSL HTTP/1.1 Connector is established on port 8080.
              You can also enable an SSL HTTP/1.1 Connector on port 8443 by
              following the instructions below and uncommenting the second Connector
              entry.   SSL support requires the following steps (see the SSL Config
              HOWTO in the Tomcat 5 documentation bundle for more detailed
              instructions):
              * If your JDK version 1.3 or prior, download and install JSSE 1.0.2 or
                later, and put the JAR files into "$JAVA_HOME/jre/lib/ext".
              * Execute:
                  %JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA (Windows)
                  $JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA   (Unix)
                with a password value of "changeit" for both the certificate and
                the keystore itself.

              By default, DNS lookups are enabled when a web application calls
              request.getRemoteHost().   This can have an adverse impact on
              performance, so you can disable it by setting the
              "enableLookups" attribute to "false".   When DNS lookups are disabled,
              request.getRemoteHost() will return the String version of the
              IP address of the remote client.
         -->

         <!-- Define a non-SSL Coyote HTTP/1.1 Connector on the port specified
              during installation   -->
         <Connector port="80"                maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
                    enableLookups="false" redirectPort="8443" acceptCount="100"
                    debug="0" connectionTimeout="20000"
                    disableUploadTimeout="true" />
         <!-- Note : To disable connection timeouts, set connectionTimeout value
          to 0 -->

    <!-- Note : To use gzip compression you could set the following properties :

           compression="on"
           compressionMinSize="2048"
           noCompressionUserAgents="gozilla, traviata"
           compressableMimeType="text/html,text/xml"
    -->

         <!-- Define a SSL Coyote HTTP/1.1 Connector on port 8443 -->
         <!--
         <Connector port="8443"
                    maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
                    enableLookups="false" disableUploadTimeout="true"
                    acceptCount="100" debug="0" scheme="https" secure="true"
                    clientAuth="false" sslProtocol="TLS" />
         -->

         <!-- Define a Coyote/JK2 AJP 1.3 Connector on port 8009 -->
         <Connector port="8009"
                    enableLookups="false" redirectPort="8443" debug="0"
                    protocol="AJP/1.3" />

         <!-- Define a Proxied HTTP/1.1 Connector on port 8082 -->
         <!-- See proxy documentation for more information about using this. -->
         <!--
         <Connector port="8082"
                    maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
                    enableLookups="false"
                    acceptCount="100" debug="0" connectionTimeout="20000"
                    proxyPort="80" disableUploadTimeout="true" />
         -->

            
         <!-- Define the top level container in our container hierarchy -->
         <Engine name="Catalina" defaultHost="localhost" debug="0">



           <Logger className="org.apache.catalina.logger.FileLogger"
                   prefix="catalina_log." suffix=".txt"
                   timestamp="true"/>


           <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
                      debug="0" resourceName="UserDatabase"/>

          <Host name="www.001m.cn" debug="0" appBase="test"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">
          </Host>

          <Host name="test.001m.cn" debug="0" appBase="webapps"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">
        
             <Logger className="org.apache.catalina.logger.FileLogger"
                      directory="logs"   prefix="localhost_log." suffix=".txt"
                 timestamp="true"/>

           </Host>

         </Engine>

       </Service>

    </Server>
          (4.3)
            现在文件夹的结构是:
            Tomcat-->bin\common\conf\logs\server\work\temp\sharedwebapps\test;
            conf-->Catalina-->test.001m.cn\www.001m.cn;
            test.001m.cn-->hnnj.xml;
            www.001m.cn-->hnnj_test.xml
            test-->hnnj_test;
            webapps-->hnnj;
            其中,hnnj和hnnj_test是项目目录;test和webapps是发布目录;

    posted @ 2008-11-07 14:51 勒紧皮带向前冲 阅读(566) | 评论 (0)编辑 收藏
     
    在Oracle中查看各个表、表空间占用空间的大小
    查看当前用户每个表占用空间的大小:
        Select Segment_Name,Sum(bytes)/1024/1024 From User_Extents Group By Segment_Name

    查看每个表空间占用空间的大小:
        Select Tablespace_Name,Sum(bytes)/1024/1024 From Dba_Segments Group By Tablespace_Name
    -------------------------------------------------------------------------------------------------------------
    查询Oralce中某个用户有多少个存储过程
    select distinct name from user_source where type='PROCEDURE';
    select distinct name from dba_source where type='PROCEDURE' and owner='XG_TEST';
    -------------------------------------------------------------------------------------------------------------
    oracle的使用心得



    1、DDL(Data Definition Language) Command
       create,alter,drop objects;
       grant,revoke privileges and roles;
       establishing auditing options;
       add comments to the data dictionary;
       Before and after each DDL statement,Oracle implicitly commit the current transactions.

    2、DML(Data Manipulation Language) Command
       Query and Modify data within existing schema objects;
       DML statements consist of DELETE,INSERT,SELECT and UPDATE statements;
                            EXPLAIN PLAN statements;
                            LOCK TABLE statements;
       Unlike DDL Command , a commit is not implicit , after execute DDL Command ,must execute commit command    to commit a transaction;

    3、Dynamic Performance Tables
       These tables are created at the instance startup and used to store information about the performance    of the instance. This information includes connection informatioion,I/OS, initialization parameter    values and so on..

    4、Procedure and Function are identical except that Founction are always return a value(Procedure do not).

    5、Schema is a collection of Objects that associated with the DataBase.

    6、SGA is made up of :
       DataBase Buffers;
       Redo Log Buffers;
       The Shared Pool;

    7、Transaction is a logical unit of work consisting of one or more SQL statements,ending in a commit or rollback.

    8、 The DataBase
    The Physical Layer
    (1)One or more datafiles;
    (2)Two or more redo log files;
    (3)One or more control files;
    The Logical Layer
    (1)One or more tablespaces;
    (2)The database schema;

    9、The database is devided into one or more logical pieces known as tablespace;

    10、Recommend that every one need DBA roles should have a different account , thus , if auditing is enabled , there is a record who made these system changes.

    11、The Instance is the logical term that refers to the components necessary to access the data in a database.

    12、数据库实例(也称为服务器Server),是用来访问一个数据库文件集的一个存储结构及后台进程的集合。Oralce并行服务器是指一个单独的数据库可以被多个实例访问。

    13、查询实例名:
       select instance_name from v$instance;

    14、查询动态视图v$waitstat、v$system_event、v$session_event、v$session_wait和v$ buffer_pool_statistics(在Oracle8中通过catperf.sql脚本创建)以获取下面所的统计信息,
    目的是为了检查服务器进程是否正等待DBWR(对单个会话而言,也对整个数据库而言)。

    15、
    (1)SMON:系统监控程序
    (2)PMON:进程监控程序
    (3)DBWR:数据库写入程序
    (4)LGWR:日志写入程序
    (5)CKPT:检查点进程
    (6)ARCH:归档日志
    (7)RECO:恢复进程
    (8)SNPn:快照进程
    (9)LCKn:锁定进程
    (10)Dnnn:调度程序进程
    (11)Snnn:服务器进程
    (12)Pnnn:并行查询服务器进程

    16、数据库备份之前,若使用了shutdown abort命令,则需要进行如下操作,然后才能进行数据库备份:
    1)    执行一个shutdown abort命令;
    2)    启动数据库实例;
    3)    执行shutdown命令;

    17、使用OPS数据库时,如何解决两个服务器同时对同一记录的更新?
    更新同一个表的数据的用户使用同一个实例来访问数据库。

    18、通过ORACLE数据库对非ORACLE数据库进行访问,首先需要在运行非ORACLE数据库的服务器端安装ORACLE透明网关产品,每种被访问的数据引擎需要一个独立的网关;然后需要在本地ORACLE数据库中建立一个数据库连接(DATABASE LINK)。

    19、外部文件访问:
    1)    用作脚本文件的源代码写入SQL*PLUS、SQL、PL/SQL中;
    2)    用作SQL*PLUS脚本文件的输出,用SPOOL命令生成;
    3)    用作PL/SQL程序的输入或输出,通过UTL_FILE软件包访问;
    4)    用作PL/SQL程序的脚本文件的输出,通过DBMS_OUTPUT软件包生成;
    5)    用作通过BFILE数据类型在数据库中引用的外部数据,BFILE数据类型含有一个指向外部二进制数据文件的指针,用户必须通过CREATE DIRECTORY命令,在ORACLE中创建一个目录指针,指向存储文件的目录。
    6)    用作通过DBMS_PIPE访问的外部程序,该程序必须以ORACLE支持的3GL来编写。

    20、取消用户在SYSTEM表空间上创建对象的定额:
    ALTER USER USER_NAME QUOTA 0 ON SYSTEM;
    注:
    如果一个用户被授权UNLIMITED_TABLESPACE系统权限或RESOURCE角色(Resouce角色拥有使用数据库中所有表空间的权限),则这个授权将覆盖用户的任何定额设置。
    21、创建一个用户,并且指定缺省表空间:
    CREATE USER USER_NAME IDENTIFIED BY USER_PASSWORD DEFAULT TABLESPACE TABLESPACE_NAME;

    22、重新指定用户的缺省表空间:
    ALTER USER USER_NAME DEFAULT TABLESPACE TABLESPACE_NAME;

    23、从数据表中分离出已有的索引:
    ALTER INDEX INDEX_NAME REBUILD
       TABLESPACE INDEX_TABLESPACE
       STORAGE(INITIAL 2M NEXT 2M PCTINCREASE 0);

    24、创建表时指定数据表空间和索引表空间:
    CREATE TABLE TAB_NAME(
    COLUMN_A TYPE,
    COLUMN_B TYPE,

    COLUM_N TYPE,
    CONSTRAINT TAB_NAME_PK PRIMARY KEY (COLUMN_A)
    USING INDEX TABLESPACE TABLESPACE_INDEXES
    STORAGE(INITIAL 2M NEXT 2M PCTINCREASE 0))
    TABLESPACE TABLESPACE_DATA
    STORAGE(INITIAL 5M NEXT 5M PCTINCREASE 0);

    25、TEMP表空间只有在大型排序操作时才使用;

    26、STORAGE子句的意义:
    Storage(initial 盘区大小 next 盘区大小 pctincrease 每个顺序盘区几何增长的系数);
    使用非零pctincrease参数的结果:
    storage(initial 10M next 10M pctincrease 50);
    盘区号        大小        总块数        盘区容量注释
    1            10            10            INITIAL
    2            10            20            NEXT
    3            15            35            NEXT×1.5
    4            22.5            57.5            NEXT×1.5×1.5
    5            33.75        91.25        NEXT×1.5×1.5×1.5
    .. .. .. .. .. ..
    理想的情况:
    一个段只具有一个大小合适的盘区,并且next值较小,设表的pctincrease值为零;
    实际上:
    在表空间级设置pctincrease的值为零,会影响ORACLE自动合并表空间中自由空间的能力,把表空间缺省pctincrese设置为一个非常低的值,例如1;

    27、通常称作TEMP的临时表空间,由于其自身的特点会有很多碎片,临时段总是在不断的创建、扩展和撤销,对于临时表,将INITIAL和NEXT盘区大小设为表空间大小的1/20到1/50,对于这个表空间,INITIAL和NEXT缺省设置应该相等,PCTINCREASE的值为0,这样,段将有同样大小的盘区构成,当撤消这些段时,下一个临时段将能够重新利用这些已撤消的盘区。

    28、
    1)将一个表空间改为临时表空间:
    alter tablespace tablespace_name temporary;
    2)将一个表空间转换为能存储永久对象:
    alter tablespace tablespace_name permenent;
    3)强制表空间合并其自由空间(只能合并位置相邻的自由盘区):
    alter tablespace talbespace_name coalesce;

    29、
    1)手工缩放数据文件(只能增大不能减小):
    alter database datafile '$path/datafile01.dat' resize nnnM;
    2)创建一个在需要时自动扩展的文件:
    CREATE TABLESPACE DATA
    DATAFILE '$PATH/DATAFILE01.DAT' SIZE 200M
    AUTOEXTEND ON
    NEXT 10M
    MAXSIZE 250M;
    3)通过ALTER TABLESPACE增加一个新的数据文件:
    alter tablespace tablespace_name
    add datafile '$path/datafile02.dat' size 200M
    autoextend on
    maxsize 300M;

    40、移动数据文件:
    1)    关闭实例;
    2)    使用操作系统命令来移动数据文件;
    3)    安装数据文件并使用ALTER DATABASE命令改变数据库中的文件名;
    4)    启动实例;
    具体步骤如下:
    1)>svrmgrl
    >connect internal
    >shutdown
    >exit
    2)mv /db01/oracle/cc1/data01.dbf /db02/oracle/cc1/
    3)>svrmgrl
    >connect internal
    >startup mount cc1
    >alter database rename file '/db01/oracle/cc1/data01.dbf' to '/db02/oracle/cc1/data01.dbf';
    4)    startup

    31、
    查看回滚段名称:v$rollname
    查看表空间:dba_tablespace;
    查看用户表空间:user_tablespaces;
    查看回滚段状态信息:dba_rollback_segs;
    查看数据库回滚段的当前分配情况:dba_segments;

    32、
    若系统中有多个表空间,就需要在system表空间中创建"第二回滚段"来支持多个表空间,有了"第二回滚段",system表空间就只用于管理数据库级的事务。

    33、
    ipcs | grep oracle
    ipcrm [-m|-s] ipcid(数字)

    34、连接字符串:||   
    select 'drop talbe '||table_name from user_tables;

    35、视图中不能使用order by,但可以用group by 代替来达到排序目的:
    create view as select b1,b2 from table_b group by b1,b2;

    36、用户间复制数据:
    copy from user1@databasex to user2@databasey create table2 using select * from talbe1;

    37、察看数据库的大小,和空间使用情况
    select b.file_id FileID,b.tablespace_name TableSpace,b.file_name PhysicalFileName,b.bytes TotalBytes,(b.bytes-sum(nvl(a.bytes,0))) UsedSpace,sum(nvl(a.bytes,0)) FreeSpace,sum(nvl(a.bytes,0))/(b.bytes)*100 FreePecent from dba_free_space a,dba_data_files b where a.file_id=b.file_id group by b.tablespace_name,b.file_name,b.file_id,b.bytes order by b.tablespace_name;

    38、Oracle提供了几个包,它们可以用来完成很多任务,从内部进程通信到文件I/O,到在PL/SQL块中动态创建和执行SQL语句。所有这些包由SYS用户所拥有-当Oracle最初安装时两个用户中的一个,这些包中最重要的包括:
    DBMS_ALERT          不用轮询就允许应用命名并发出警告条件信号的过程与函数
    DBMS_DDL          允许获取PL/SQL程序内部一定数量的DDL语句的过程
    DBMS_DESCRIBE    为存储过程与函数描述API的过程
    DBMS_JOB           管理BLOBs、CLOBs、NCLOBs与BFILEs的过程与函数
    DBMS_OUTPUT        允许PL/SQL程序生成终端输出的过程与函数
    DBMS_PIPE           允许数据库会话使用管道通信(通信频道)的过程与函数
    DBMS_SQL           在PL/SQL程序内部执行动态SQL的过程与函数
    DBMS_ULTILITY        DBMS_ULTILITY
    ULT_FILE    允许PL/SQL程序读写服务器文件系统上的文本文件的过程与函数

    39、如何解决单机监听不启动的问题:
    你给IP固定一个值,然后配置NET8时最好用机器名,把listener.ora,tnsname.ora里的IP改成机器名。

    40、查看日志文件的路径和数量:
    select * from v$logfile;

    41、oracle中的配置文件:
    init.ora
    tnsname.ora
    listener.ora
    sqlnet.ora

    42、如何利用rownum 检索纪录:(在oracle中,只能通过rownum检索比rownum值小的所有的列)利用如下方法,可以检索表中rownum等于固定值的列:
    select * from ( select rownum rn,column1,column2,… from table_name) where rn=要查询的值;

    43、利用translate(char,from,to)函数判断一个字符串是否可以转换成 number 型:
    translate(str,'x1234567890','x') is null,则str为纯字符串。
    利用from to 参数,把str字段中所有的0-9的字符替换为空,然后判断函数返回值,返回值为空,则str一定可以转换成number型。

    44、如何修改internal 用户的密码?
    用法:orapwd file= password= entries=
    参数解释:
        file - name of password file (mand),
        password - password for SYS and INTERNAL (mand),
        entries - maximum number of distinct DBA and OPERs (opt),
        There are no spaces around the equal-to (=) character.
    1)进入DOS下
    2)默认internal密码文件在c:\orant\database下,是隐藏属性,文件名称与数据库实例名有关
      如默认ORACLE实例名为ORCL,则internal密码文件名为pwdorcl.ora
    3)建立新的internal密码文件,起个新名字为pwdora8.ora
      orapwd80 file=pwdora8.ora password=B entries=5     
    --注:password项一定要用大写,并且不要用单引号
    4)拷贝pwdora8.ora文件到c:\orant\database目录下
    5)运行regedit,修改口令文件指向
    6)找到HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE项
      定位ORA_ORCL_PWFILE子项,改变其值为c:\orant\database\pwdora8.ora
    7)关闭ORACLE数据库,重新启动
    Cool进入svrmgrl服务程序,测试internal密码是否更改成功

    45、只有对象的拥有者才有对对象的操作权。如,把用户user1下的表tab_1赋给用户user2 查看的权限。此时,必须以uer1用户登陆,让后执行如下语句:
    grant select on tab_1 to user2;

    46、Oracle的本地进程    ps -aef | grep LOCAL=YES   的父进程ID不能为 1 ,若为 1 ,则该进程被掉死,需要用命令杀死改进程!!

    47、在Windows 2000 server 操作系统下,用 net start 命令启动oracle的服务,如下:
    net start OracleServiceORCL
    net start OracleStartORCL
    net start OracleTNSListener80
    net start OracleWWWListener80
    或者,利用 net stop 命令来终止服务:
    net stop oraclestartorcl
    net stop oracleserviceorcl
    net stop oracletnslistener80

    启动数据库的另外一个方法:
    oradim -startup -sid SID
    关闭数据库的另外一个方法:
    oradim -shutdown -sid SID

    48、多表操作在被实际执行前,查询优化器会根据连接条件,列出几组可能的连接方案并从中找出系统开销最小的最佳方案。连接条件要充份考虑带有索引的表、行数多的表;内外表的选择可由公式:外层表中的匹配行数*内层表中每一次查找的次数确定,乘积最小为最佳方案。

    49、保持Oracle数据库优良性能的若干诀窍:
    1)    分区:
    根据实际经验所得,在一个大数据库中,数据库空间的绝大多数是被少量的表所占有。如何简化大数据库和管理,如何改善应用的查询性能,一般可以使用分区这种手段。所谓分区就是动态地将表中记录分离到若干不同的表空间上,使数据在物理上被分割开来,便于维护、备份、恢复、事务及查询性能。当使用的时候可建立一个连接所有分区的视图,使其在逻辑上仍以一个整体出现。
    (1)建立分区表
    Create table Employee (
    EmpNo varchar2(10) primary key,
    Name varchar2(30),
    DeptNo Number(2)
    )
    Partition by range(DeptNo)
    (
    partition PART1 values less than (11)
    tablespace PART1_TS,
    partition PART2 values less than (21)
    tablespace PART2_TS,
    partition PART3 values less than (31)
    tablespace PART3_TS
    partition PART4 values less than (MAXVALUE)
    tablespace PART4_TS
    );
    表Employee依据DeptNo列进行分区。
    (2)分区索引
    Create index Employee_DeptNo on Employee(DeptNo)
    local (
    partition PART1 tablespace PART1_NDX_TS,
    partition PART2 tablespace PART2_NDX_TS,
    partition PART3 tablespace PART3_NDX_TS,
    partition PART4 tablespace PART4_NDX_TS,
    );
    当分区中出现许多事务并且要保证所有分区中的数据记录的唯一性时采用全局索引,如:
    Create index Employee_DeptNo on Employee(DeptNo)
    global partition by range (DeptNo)
    (
    partition PART1 values less than (11)
    tablespace PART1_NDX_TS,
    partition PART2 values less than (21)
    tablespace PART2_NDX_TS,
    partition PART3 values less than (31)
    tablespace PART3_NDX_TS
    partition PART4 values less than (MAXVALUE)
    tablespace PART4_NDX_TS
    );
    在建立全局索引时,global子句允许指定索引的范围值,这个范围值可以不同于表分区的范围值。只有建立局部索引才会使索引索引分区与表分区间建立起一一对应关系。因此,在大多数情况下,应该使用局部索引分区。若使用了此索引,分区就能够很容易地将索引分区与表分区建立关联,局部索引比全局索引更易于管理。
    (3)分区管理
    根据实际需要,还可以使用 alter table 命令来增加、丢弃、交换、移动、修改、重命名、划分、截短一个已存在分区的结构。

    2)Rebuild Indexes(重建索引不会影响存储过程)
    如果表中记录频繁的被删除或插入,尽管表中的记录总量保持不变,索引空间的使用量会不断增加。虽然记录从索引中被删除,但是该记录索引项的使用空间不能被重新使用。因此,如果表变化不定,索引空间量会不断增加,不管表中记录数量是否增加--只仅仅是因为索引中无效空间量的增加。
    要回收那些曾被删除记录使用的空间,需要使用alter index rebuild 命令。可以做一个定期运行的批处理程序,来重建最活动表的索引。这个批处理程序可以在空闲时运行,以避免程序与用户冲突。若能坚持索引的这一程序规划,便可以及时回收那些未使用空间,提高空间利用率。

    3)段的碎片整理
    当生成一个数据库对象时(一个表或一个索引),通过用户缺省值或指定值来为它指定表空间。一个在表空间中所生成的段,用于存储对象的相关数据。在段被关闭、收缩、截断之前,段所分配的空间将不被释放。
    一个段是由范围组成,而范围是由相邻的Oracle块组成。一旦存在的范围不能再存储新的数据,那这个段就会去获得新的范围,且并不要求这些范围是彼此相邻的。这样的扩展会一直继续下去,直到表空间中的数据文件不能提供更多的自由空间,或者范围数量已达到极限。
    因此,一个碎片太多的数据段,不仅会影响运行,也会引发表空间中的空间管理问题。所以,每个数据段只含有一个范围是十分有益的。借助监控系统,可以通过检查DBA_SEGMENTS数据字典视图来了解哪些数据库对象含有10个或更多范围的段,确定其数据段碎片。
    若一个段的碎片过多,可用两种方法解决这个问题:
    (1)用正确的存储参数建立一个新表,将旧表中的数据插入到新表中,再删除旧表;
    (2)利用Export/Import工具。
    如:exp system/manager file=exp.dmp compress=Y grants=Y indexes=Y tables=(T1,T2)
    若输出成功,进入Oracle,删除上述表。
    注:compress=Y决定将在输出过程中修改它们的存储参数。
    imp system/manager file=exp.dmp commit=Y buffer=64000 full=Y
    注:在输入时重新配置新的存储参数。

    自由范围的碎片整理
    表空间中的一个自由范围是表空间中相连自由(空间)块的集合。当一个段关闭时,它的范围将被释放,并被标记为自由范围。然而,这些自由范围再也不能与相邻的自由范围合并,它们之间的界线始终存在。但是当表空间的缺省值pctincrease设置不为0时,SMON后台进会定期的将这些相邻的自由范围合并。若pctincrease设置为0,那相邻自由范围不会被数据库自动合并。但可以使用 alter tablespace 命令coalesce选项,来强迫进行相邻自由范围的合并。
    不进行自由范围合并,在日后的空间请求中,会影响到表空间中的空间分配。当需要一个足够大的范围时,数据库并不会合并相邻的自由范围,除非没有其他选择。这样,当表空间中前面较小自由范围已被相关使用时,将使用表空间中后面部分最大的一个自由范围。结果,会因为它们没有足够多的使用空间,从而导致表空间中速度上的矛盾。由于这样的进程出现,使数据库的空间分配距理想越来越远。自由空间碎片常会出现在那些经常关闭又重新生成的数据库表和索引中。
    在理想的ORACLE表空间中,每一个数据库对象存储在一个单独的范围中,并且所有有效自由空间集中在一个巨大而连续的范围中。这样,在一个对象需要附加存储空间时,可以在增加获取足够大自由空间的可能性同时,最小化空间中的循环调用,提高自由空间使用率

    50、查看和修改Oracle服务器端字符集:
    方法一:
    1)    查看服务器端字符集:
    select * from v$nls_parameters;
    select * from nls_database_parameters;
    select * from sys.props$;
    2)    修改服务器端字符集(用sys用户):
    首先执行:update props$ set value$ = 'WE8ISO8859P1' where name ='NLS_CHARACTERSET';
    update props$ set value$ = 'china' where name ='NLS_LANGUAGE';
    提交(commit),然后,重新启动数据库;
    3)用客户端工具(PL/SQL DEVELOP or PB etc.)查询数据库,若显示乱码,先查询出数据库端的字符集,然后,从注册表中修改NLS_LANG字段的值,可能为AMERICAN_AMERICA.WE8ISO8859P1或者SIMPLIFIED CHINESE_CHINA.ZHS16GBK或者NA等。
    方法二:
    alter system enable restricted session;
    alter database ORCL character set ZHS16GBK;
    alter database ORCL national character set ZHS16GBK;

    51、查看系统中的角色:
    select * from dba_roles;
    -------------------------------------------------------------------------------------------------------------
    Oracle中查看所有的表
    select   table_name   from   user_tables;     //当前用户的表  
       
      select   table_name   from   all_tables;     //所有用户的表  
       
      select   table_name   from   dba_tables;       //包括系统表
    -------------------------------------------------------------------------------------------------------------
    posted @ 2008-11-07 09:34 勒紧皮带向前冲 阅读(881) | 评论 (0)编辑 收藏
     

    File类有两个构造方法,File(父目录,文件名),关联指定的目录下指定名称的文件,File(文件名/目录名),关联某个文件名或者目录,这里的/表示的意思是“或者”。
        比较好的方法是先用一个File对象关联一个目录名,然后创建这个目录,(mkdir()),再用构造方法构造一个文件。以下的代码是在“我的文档”里创建一个名为“1.txt”的文件。
      File dir=new File("C:"+File.separator+"Documents and Settings"+File.separator+"Yxy"+File.separator+"My Documents");  //此处注意转义字符
      dir.mkdir();  //创建目录
      File file1=new File(dir,"1.txt");
      file1.createNewFile();  //创建一个新文件
            String[] str1=dir.list();  //下文说到的list()
        //不知道为什么这里的空格硬是只能这么长,代码是我从我自己的代码里拷过来的,汗      
        //一个先
        各位,其实这里可以用转义字符“\\”来代替File.separator,但是这不是一个好的习惯。为了实现Java的一次编译,四处运行的性感特点,我们需要一个通用的文件分隔符,因为各种操作系统下存在差异,比如linux的文件分隔符是正斜杠"/"。而File的特性separator正是获取当前操作系统下的文件分隔符。另,千万不要将让"\"单独存在,在代码中这是一个转义字符的标识,它会将接下来的一个字符理解为转义字符。
         除了这种方法可以创建新的文件,还可以调用File类下的一个静态函数
     File createTempFile(String prefix,String suffix,File directory),这是一个完整的版本,在指定的目录下创建一个以prefix为前缀名,suffix为后缀名的临时文件,通过deleteOnExit()来删除。但是还有一个精简的版本,
    File createTempFile(String prefix,String suffix),没有指定目录,将在当前操作系统默认的临时文件夹里创建以prefix为前缀名,suffix为后缀名的临时文件。
         以上是如何创建文件,接下来讲的是如何查阅目录下的文件和通过文件过滤器查找文件。
        看到前面的代码里写到的list()方法了吗,返回一个String类型的数组,获取当前目录下的所有文件名,包括目录名(即文件夹)。但是,这样是不够的,无法找到我们所需要的文件,我们需要的是按我们的要求找到某个房间。Java.io包类提供类文件过滤器FileNameFilter,它是一个接口,内有方法boolean accept(File dir, String name),这是一个需要重写的方法,重写了这个方法之后,list(FileNameFileter f)方法可以列出符合我们要求的方法。
    本文来源【学网】网站链接是http://www.xue5.com

     Java中的separator,pathSeparator等常量- -

    File.separatorChar 返回一个字符,表示当前系统默认的文件名分隔符,在Windows中为"\",unix中为"/"
    File.separator 与前者相同,但将分隔符作为字符串类型返回。
    pathSeparatorChar 返回一个字符,表示当前系统默认的路径名分隔符,在Windows中为";",unix中为":"
    File.pathSeparator 与前者相同,但将分隔符作为字符串类型返回。

    正文为JDKAPI帮助文档相关内容:


    separatorChar
    public static final char separatorCharThe system-dependent default name-separator character. This field is initialized to contain the first character of the value of the system property file.separator. On UNIX systems the value of this field is '/'; on Microsoft Windows systems it is '\'.

    See Also:
    System.getProperty(java.lang.String)

    --------------------------------------------------------------------------------

    separator
    public static final String separatorThe system-dependent default name-separator character, represented as a string for convenience. This string contains a single character, namely separatorChar.


    --------------------------------------------------------------------------------

    pathSeparatorChar
    public static final char pathSeparatorCharThe system-dependent path-separator character. This field is initialized to contain the first character of the value of the system property path.separator. This character is used to separate filenames in a sequence of files given as a path list. On UNIX systems, this character is ':'; on Microsoft Windows systems it is ';'.

    See Also:
    System.getProperty(java.lang.String)

    --------------------------------------------------------------------------------

    pathSeparator
    public static final String pathSeparatorThe system-dependent path-separator character, represented as a string for convenience. This string contains a single character, namely pathSeparatorChar.

    posted @ 2008-11-06 11:24 勒紧皮带向前冲 阅读(550) | 评论 (0)编辑 收藏
     
    今天在服务器上安装oracle11g,是我同事装的。他在安装的时候,处于安全考虑,将密码都更改了。结果安装好后。登录不上去。以致无法导入备份。(不过sqlplus可以正常连接)。他在百度一下说是在安装oracle11g的时候,修改了密码就会这样。(我保留怀疑态度)我和以前折腾半天没搞出来,最后我想了下,直接修改了密码。一切ok
    posted @ 2008-11-05 16:57 勒紧皮带向前冲 阅读(992) | 评论 (0)编辑 收藏
     

    在使用Oracle过各中经常会遇到密码丢失的时候,本文用两种试来解决这个问题。

    一种方法:

    sqlplus "/ as sysdba"
                SQL>startup
                SQL>alter user system identified by root123;

    如果sqlplus "/ as sysdba"不能进入,让输入密码,我输入原始密码和修改的密码后都不行的话,修改unix环境下:

    1. $ORACLE_HOME\network\admin\SQLNET.ORA中为:

    SQLNET.AUTHENTICATION_SERVICES=(NTS)

    重起数据库/监听服务,就可以用操作系统认证sqlplus "/ as sysdba"了,来进入你的数据库,从而轻而易举的搞定你的数据库了。

    2.

    sqlplus /nolog
                sql>connect /as sysdba

    第二种方法:

    详细步骤如下:

    一:查询视图V$PWFILE_USERS:select * from V$PWFILE_USERS;记录下拥有 SYSOPER/SYSDBA系统权限的用户信息。

    二:关闭数据库 shutdown immediate。

    三:删除密码文件,文件路径一般为:ORACLE_HOME\DATABASE,文件名为PWD.ORA。

    四:创建密码文件:

    ORAPWD FILE=< FILENAME > PASSWORD =< PASSWORD >

    五:向密码文件中增加用户:

    CONNECT SYS/internal_user_passsword AS SYSDBA;

    启动数据库实例并打开数据库; 创建相应用户帐号,对其授权授予 权限:GRANT SYSDBA TO user_name(如果先前数据库只有sys具有sysdba权限,可不做这步)。

    六:修改密码文件状态,默认密码文件的状态shared,要将初始化参数里的REMOTE_LOGIN_PASSWORDFILE 设置成EXCLUSIVE。(T006)

    posted @ 2008-11-05 16:43 勒紧皮带向前冲 阅读(236) | 评论 (0)编辑 收藏
     

    window.open()方法中,窗口控制参数的详细定义:
    alwaysLowered innerWidth screenY
    alwaysRaised left scrollbars
    channelmode location status
    dependent menubar titlebar
    directories outerWidth toolbar
    fullscreen outerHeight top
    height menubar width
    hotkeys resizable z-lock
    innerHeight screenX  


    alwaysLowered
      Internet Explorer:不支持

      Navigator:版本 4+

      指定窗口总是保留在堆栈的最下面。换言之,不管新窗口是否激活,总是其他窗口下。

      window.open("alwayslowered.html", "_blank", "alwaysLowered");

    alwaysRaised
      Internet Explorer:不支持

      Navigator:版本 4+

      指定窗口总是保留在堆栈的最上面。换言之,不管新窗口是否激活,总是其他窗口上。

      window.open("alwaysraised.html", "_blank", "alwaysRaised");

    channelmode
      Internet Explorer:版本 4+

      Navigator:不支持

      指定是否按照剧场模式显示窗口,以及是否显示频道区。

      window.open("channelmode.html", "_blank", "channelmode");

    dependent
      Internet Explorer:不支持

      Navigator:版本 4+

      定义是否窗口成为当前打开窗口的依赖子窗口。依赖窗口就是当它的父窗口关闭时,它也随即关闭。在windows平台上,一个依赖窗口不会在任务栏上显示。

      window.open("dependent.html", "_blank", "dependent");

    directories
      Internet Explorer:所有版本

      Navigator:所有版本

      指定是否显示目录按钮(比如众所周知的"What's Cool" and "What's New" 按钮)。Internet Explorer将这些目录按钮引用为链接工具栏,Navigator(版本4和以上)称之为个人工具栏。

      window.open("directories.html", "_blank", "directories");

    fullscreen
      Internet Explorer:版本 4+

      Navigator:不支持

      定义是否按照全屏方式打开浏览器。请小心使用全屏模式,因为在这种模式下,浏览器的标题栏和菜单都被隐藏,所有你应该提供一个按钮或者其他可视的线索来帮助用户关闭这个窗口。当然,使用热键ALT+F4也能关闭窗口。

      window.open("fullscreen.html", "_blank", "fullscreen");

    height
      Internet Explorer:所有版本

      Navigator:所有版本

      以象素pixel为单位定义窗口文档显示区域的高度,最小数值是100。如果仅仅定义高度,Internet Explorer使用给定的高度和默认的宽度。对于Navigator,如果不同时指定width或者innerWidth,那么就将忽略这个属性。

      window.open("height.html", "_blank", "height=200,width=300");

    hotkeys
      Internet Explorer:不支持

      Navigator:版本 4+

      如果没有定义(或者为0),那么就屏蔽了没有菜单条的新窗口的大部分热键。但是安全以及退出热键仍然保留。

      window.open("hotkeys.html", "_blank", "hotkeys=0,menubar=0");

    innerHeight
      Internet Explorer:不支持

      Navigator:版本 4+

      以象素pixel为单位定义窗口文档显示区域的高度,最小数值是100。在Navigator版本4中,这个特征替换height,为得是保持向后兼容。对于Navigator,如果不同时指定width或者innerWidth,那么就将忽略这个属性。

      window.open("innerheight.html", "_blank", "innerHeight=200,innerWidth=300");

    innerWidth
      Internet Explorer:不支持

      Navigator:版本 4+

      以象素pixel为单位定义窗口文档显示区域的宽度,最小数值是100。在Navigator版本4中,这个特征替换width,为得是保持向后兼容。对于Navigator,如果不同时指定height或者innerHeight,那么就将忽略这个属性。

      window.open("innerwidth.html", "_blank", "innerHeight=200,innerWidth=300");

    left
      Internet Explorer:版本 4+

      Navigator:不支持

      以象素为单位定义窗口的X左标。

      window.open("left.html", "_blank", "left=20");

    location
      Internet Explorer:所有版本

      Navigator:所有版本

      定义是否显示浏览器中供地址URL输入的文本域。

      window.open("location.html", "_blank", "location");

    menubar
      Internet Explorer:所有版本

      Navigator:所有版本

      定义是否显示菜单条(菜单条位于窗口顶部,包括“文件”和“编辑”等)。

      window.open("menubar.html", "_blank", "menubar");

    outerHeight
      Internet Explorer:不支持

      Navigator:版本 4+

      以象素为单位定义窗口(它的外部边界)的总高度,最小数值比100多一些,因为窗口内容区域的高度必须至少是100。如果没有同时定义outerWidth,Navigator将忽视这个特征。

      window.open("outerheight.html", "_blank", "outerHeight=200,outerWidth=300");

    outerWidth
      Internet Explorer:不支持

      Navigator:版本 4+

      以象素为单位定义窗口(它的外部边界)的总宽度,最小数值比100多一些,因为窗口内容区域的宽度必须至少是100。如果没有同时定义outerHeight,Navigator将忽视这个特征。

      window.open("outerwidth.html", "_blank", "outerHeight=200,outerWidth=300");

    resizable
      Internet Explorer:所有版本

      Navigator:所有版本

      定义是否窗口可以通过它的边界进行大小缩放控制。依赖于平台不同,用户也许还有其他改变窗口大小的方法。

      window.open("resizable.html", "_blank", "resizable");

    screenX
      Internet Explorer:不支持

      Navigator:版本 4+

      以象素为单位定义窗口的X坐标。

      window.open("screenx.html", "_blank", "screenX=20");

    screenY
      Internet Explorer:不支持

      Navigator:版本 4+

      以象素为单位定义窗口的Y坐标。

      window.open("screeny.html", "_blank", "screenY=20");

    scrollbars
      Internet Explorer:所有版本

      Navigator:所有版本

      定义是否激活水平和垂直滚动条。

      window.open("scrollbars.html", "_blank", "scrollbars");

    status
      Internet Explorer:所有版本

      Navigator:所有版本

      定义是否在窗口的下部添加状态栏。

      window.open("status.html", "_blank", "status");

    titlebar
      Internet Explorer:Version 5+

      Navigator:版本 4+

      定义是否显示窗口的标题栏。在Internet Explorer中,除非调用者是一个HTML应用程序或者一个可信任的对话框,那么这个特征是被屏蔽的。

      window.open("titlebar.html", "_blank", "titlebar=0");

    toolbar
      Internet Explorer:所有版本

      Navigator:所有版本

      定义是否显示浏览器的工具栏(位于窗口的上部,包括“后退”和“向前”)。

      window.open("toolbar.html", "_blank", "toolbar");

    top
      Internet Explorer:版本 4+

      Navigator:不支持

      以象素为单位定义窗口的纵坐标。

      window.open("top.html", "_blank", "top=20");

    width
      Internet Explorer:所有版本

      Navigator:所有版本

      以象素pixel为单位定义窗口文档显示区域的宽度,最小数值是100。如果仅仅定义宽度,Internet Explorer使用给定的宽度和默认的高度。对于Navigator,如果不同时指定height或者innerHeight,那么就将忽略这个属性。

      window.open("width.html", "_blank", "height=200,width=300");

    z-lock
      Internet Explorer:不支持

      Navigator:版本 4+

      定义窗口激活时不在堆栈中浮起,就是说,新窗口当被激活时并不能位于其他窗口之上。

      window.open("zlock.html", "_blank", "z-lock");

    posted @ 2008-11-04 10:50 勒紧皮带向前冲 阅读(175) | 评论 (0)编辑 收藏
     
    在本地计算机上的远程连接的选项卡中

    WordPress 中文文档

    远程桌面将本地资源复制到远程

    From WordPress Chinese

    Jump to: navigation, search
    服务器之远程桌面的应用专题 远程桌面入门 远程控制的实现 远程管理 远程桌面的一些操作
    Telnet远程连接方式 用MMC实现远程管理 远程桌面实用技巧 远程桌面的安全 ★→远程桌面的所有文章



    在远程桌面连接成功后就可以进行一些远程桌面连接可以进行的计算机管理了。具体可以进行的远程桌面连接操作如下:






    目录

    [隐藏]

    使用终端服务快捷键

    如果没在如图所示对话框“键盘”下拉列表中选择将Windows 键组合应用到远程桌面计算机上,则还可使用终端服务快捷键执行许多相同的功能。



    n21926.jpg





    重定向打印

    打印机重定向将打印作业从终端服务器或“远程桌面”计算机路由到本地计算机(也称为“客户端计算机”)连接的打印机。有两种方法可提供对本地打印机的访问:自动和手动打印机重定向。当在远程计算机上运行的Windows 版本中没有本地打印机所需要的驱动程序时,使用手动重定向。在初次进行手动重定向之后,打印机将在以后的登录过程中自动重定向。



    →更多相关内容请参见打印机共享





    将本地计算机中的文件复制并粘贴到远程计算机

    如果在如图所示对话框中选择了“本地设备”栏下的“磁盘驱动器”复选项,则可以直接在远程桌面窗口中将本地文件粘贴到远程计算机上。方法如下:



    n21926.jpg


    • 第1步,单击远程计算机任务栏上的“开始”按钮,然后单击“我的电脑”,或者双击远程计算机桌面上的“我的电脑”图标。打开如图11所示远程桌面我的电脑窗口。


    n21970.jpg





    在以上“我的电脑”(或资源管理器)窗口会显示本地磁盘,显示的方式就是<computername> 上的 <driveletter>。computername是指“远程桌面连接”分配给本地计算机的计算机名。
    • 第2步,在本地计算机找到希望传送到远程计算机的文件,然后单击右键,然后选择“复制”选项。
    • 第3步,在同一“我的电脑”或资源管理器窗口中,找到要粘帖本地文件的文件夹位置。单击右键,选择“粘贴”即可把从本地计算机上复制的文件复制到远程计算机上了。
    如果要将远程计算机的文件复制到本地计算机上,方法一样,只是复制和粘贴的对象不同而已。其实方法与本地计算机上的复制和粘贴一样,不再赘述。
    至于其它操作,如在远程计算机上运行计算机程序,方法与在本地计算机上操作完全样,也不再赘述。


    →更多相关内容请参见远程桌面连接





    结束会话和断开连接

    如果要结束当前会话,断开远程桌面连接,可以直接单击远程桌面窗口右外角的“X”按钮,也可在远程桌面中执行〖开始〗→〖断开〗菜单操作,如图12所示。此时会弹出一个确认对话框,确认断开即可。如果仅是想注意当前远程登录用户,则单击“注销”按钮,重新输入新的登录账户。不过要注意,新账户也一定要有远程桌面连接权限。



    n21972.jpg





    posted @ 2008-11-04 10:06 勒紧皮带向前冲 阅读(570) | 评论 (0)编辑 收藏
     

    这个问题的根源是jvm虚拟机的默认Heap大小是64M,可以通过设置其最大和最小值来实现.设置的方法主要是几个.

    1.可以在windows 更改系统环境变量

    加上JAVA_OPTS=-Xms64m -Xmx512m

    2,如果用的tomcat,在windows下,可以在

    C:\tomcat5.5.9\bin\catalina.bat 中加上:

    set JAVA_OPTS=-Xms64m -Xmx256m

    位置在: rem Guess CATALINA_HOME if not defined 这行的下面加合适.

    3.如果是linux系统

    Linux 在{tomcat_home}/bin/catalina.sh的前面,加

    set JAVA_OPTS='-Xms64 -Xmx512'


    使用Java程序从数据库中查询大量的数据时出现异常:java.lang.OutOfMemoryError: Java heap space 在JVM中如果98%的时间是用于GC且可用的 Heap size 不足2%的时候将抛出此异常信息。 JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。例如:java -jar -Xmn16m -Xms64m -Xmx128m MyApp.jar如果Heap Size设置偏小,除了这些异常信息外,还会发现程序的响应速度变慢了。GC占用了更多的时间,而应用分配到的执行时间较少。Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。Heap size的 -Xms -Xmn 设置不要超出物理内存的大小。否则会提示“Error occurred during

    posted @ 2008-11-03 15:18 勒紧皮带向前冲 阅读(402) | 评论 (0)编辑 收藏
     
    通常在表中设置的日期列,用于存放与信息相关的日期。
    在某些时候需要通过日期中的年,月,日等来统计数据,通常我们会将日期取出,再在程序中获取当前日期。进行比较,这样会加大开销。
    现在可以通过to_date来截取日期中的年,月,日的来获取数据。
    如: to_char(to_date(b_time,'yyyy-mm-dd'),'yyyy')=to_char(to_date(?,'yyyy-mm-dd hh24:mi:ss'),'yyyy')
    这样获取的就是年的字符串,就可得到指定年的数据。
    月:to_char(to_date(b_time,'yyyy-mm-dd'),'mm')=to_char(to_date(?,'yyyy-mm-dd hh24:mi:ss'),'mm')
    日:to_char(to_date(b_time,'yyyy-mm-dd'),'dd')=to_char(to_date(?,'yyyy-mm-dd hh24:mi:ss'),'dd')

    posted @ 2008-11-01 14:11 勒紧皮带向前冲 阅读(1783) | 评论 (2)编辑 收藏
     
    几个正则表达式:
    1.验证用户名和密码:("^[a-zA-Z]\w{5,15}$")正确格式:"[A-Z][a-z]_[0-9]"组成,并且第一个字必须为字母6~16位;
       2.验证电话号码:("^(\d{3.4}-)\d{7,8}$")正确格式:xxx/xxxx-xxxxxxx/xxxxxxxx;
       3.验证身份证号(15位或18位数字):("^\d{15}|\d{18}$");
       4.验证Email地址:("^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$");
       5.只能输入由数字和26个英文字母组成的字符串:("^[A-Za-z0-9]+$") ;
       6.整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$
       7.只能输入数字:"^[0-9]*$"。
       8.只能输入n位的数字:"^\d{n}$"。
       9.只能输入至少n位的数字:"^\d{n,}$"。
       10.只能输入m~n位的数字:。"^\d{m,n}$"
       11.只能输入零和非零开头的数字:"^(0|[1-9][0-9]*)$"。
       12.只能输入有两位小数的正实数:"^[0-9]+(.[0-9]{2})?$"。
       13.只能输入有1~3位小数的正实数:"^[0-9]+(.[0-9]{1,3})?$"。
       14.只能输入非零的正整数:"^\+?[1-9][0-9]*$"。
       15.只能输入非零的负整数:"^\-[1-9][]0-9"*$。
       16.只能输入长度为3的字符:"^.{3}$"。
       17.只能输入由26个英文字母组成的字符串:"^[A-Za-z]+$"。
       18.只能输入由26个大写英文字母组成的字符串:"^[A-Z]+$"。
       19.只能输入由26个小写英文字母组成的字符串:"^[a-z]+$"。
       20.验证是否含有^%&',;=?$\"等字符:"[^%&',;=?$\x22]+"。
       21.只能输入汉字:"^[\u4e00-\u9fa5]{0,}$"
       22.验证URL:"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$"。
       23.验证一年的12个月:"^(0?[1-9]|1[0-2])$"正确格式为:"01"~"09"和"1"~"12"。
       24.验证一个月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正确格式为;"01"~"09"和"1"~"31"。
         从上面我们可以看到:"^"表示后面紧跟着的字符为开头;与之相对应的式"$"以紧跟前面的字符为结尾.但是要注意的式当"^"位于"[]"里时,表示"非"的意思,例如:[^AZ]表示不能为"AZ"中的任一个字符."[]"表示当中的一个字符."{}"可以取得一个范围,例如"{9}"表示9个,而"{1,9}"表示1到9个字符.
    下面我们看看正则表达式在Asp.Net数据验证中的应用,第一个当然式在服务器验证控件中的应用了,很简单看下面的代码:
    <asp:RegularExpressionValidator ID="RegularExpressionValidator1" ControlToValidate="UserName" ValidationExpression="^[a-zA-Z]\w{3,15}$" runat="server" ErrorMessage="用户名格式不正确" ToolTip="用户名格式不正确!">*</asp:RegularExpressionValidator>

    转自  http://hi.baidu.com/liuliangzhou/blog/item/1a856e243f31f9308644f958.html
    posted @ 2008-11-01 14:00 勒紧皮带向前冲 阅读(246) | 评论 (0)编辑 收藏
     

    js 验证表单 js提交验证类

    附加:js验证radio是否选择

    <script language="javascript">
    function checkform(obj)
    {
    for(i=0;i<obj.oo.length;i++)
             if(obj.oo[i].checked==true) return true;

    alert("请选择")
    return false;        

    }
    </script>
    <form id="form1" name="form1" method="post" action=""   onsubmit="return checkform(this)">
       <input type="radio" name="oo" value="radiobutton" />
       <input type="radio" name="oo" value="radiobutton" />
       <input type="submit" name="Submit" value="提交" />
    </form>

    1. 长度限制
    <script>
    function test()
    {
    if(document.a.b.value.length>50)
    {
    alert("不能超过50个字符!");
    document.a.b.focus();
    return false;
    }
    }
    </script>
    <form name=a onsubmit="return test()">
    <textarea name="b" cols="40" wrap="VIRTUAL" rows="6"></textarea>
    <input type="submit" name="Submit" value="check">
    </form>

    2. 只能是汉字
    <input onkeyup="value="/oblog/value.replace(/[^\u4E00-\u9FA5]/g,'')">

    3." 只能是英文
    <script language=javascript>
    function onlyEng()
    {
    if(!(event.keyCode>=65&&event.keyCode<=90))
    event.returnvalue=false;
    }
    </script>

    <input onkeydown="onlyEng();">

    4. 只能是数字
    <script language=javascript>
    function onlyNum()
    {
    if(!((event.keyCode>=48&&event.keyCode<=57)||(event.keyCode>=96&&event.keyCode<=105)))
    //考虑小键盘上的数字键
    event.returnvalue=false;
    }
    </script>

    <input onkeydown="onlyNum();">

    5. 只能是英文字符和数字
    <input onkeyup="value="/oblog/value.replace(/[\W]/g,"'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))">

    6. 验证油箱格式
    <SCRIPT LANGUAGE=javascript RUNAT=Server>
    function isEmail(strEmail) {
    if (strEmail.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) != -1)
    return true;
    else
    alert("oh");
    }
    </SCRIPT>
    <input type=text onblur=isEmail(this.value)>

    7. 屏蔽关键字(这里屏蔽***和****)
    <script language="javascript1.2">
    function test() {
    if((a.b.value.indexOf ("***") == 0)||(a.b.value.indexOf ("****") == 0)){
    alert("");
    a.b.focus();
    return false;}
    }
    </script>
    <form name=a onsubmit="return test()">
    <input type=text name=b>
    <input type="submit" name="Submit" value="check">
    </form>

    8. 两次输入密码是否相同
    <FORM METHOD=POST ACTION="">
    <input type="password" id="input1">
    <input type="password" id="input2">
    <input type="button" value="test" onclick="check()">
    </FORM>
    <script>
    function check()
    {
    with(document.all){
    if(input1.value!=input2.value)
    {
    alert("false")
    input1.value = "";
    input2.value = "";
    }
    else document.forms[0].submit();
    }
    }
    </script>
    够了吧
    屏蔽右键 很酷
    oncontextmenu="return false" ondragstart="return false" onselectstart="return false"
    加在body中




    2.1     表单项不能为空

    <script     language="javascript">
    <!--
    function     CheckForm()
    {  
    if     (document.form.name.value.length     ==     0)     {  
    alert("请输入您姓名!");
    document.form.name.focus();
    return     false;
    }
    return     true;
    }
    -->
    </script>

    2.2     比较两个表单项的值是否相同

    <script     language="javascript">
    <!--
    function     CheckForm()
    if     (document.form.PWD.value     !=     document.form.PWD_Again.value)     {  
    alert("您两次输入的密码不一样!请重新输入.");
    document.ADDUser.PWD.focus();
    return     false;
    }
    return     true;
    }
    -->
    </script>

    2.3     表单项只能为数字和"_",用于电话/银行帐号验证上,可扩展到域名注册等

    <script     language="javascript">
    <!--
    function     isNumber(String)
    {  
    var     Letters     =     "1234567890-";     //可以自己增加可输入值
    var     i;
    var     c;
    if(String.charAt(     0     )=='-')
    return     false;
    if(     String.charAt(     String.length     -     1     )     ==     '-'     )
    return     false;
    for(     i     =     0;     i     <     String.length;     i     ++     )
    {  
    c     =     String.charAt(     i     );
    if     (Letters.indexOf(     c     )     <     0)
    return     false;
    }
    return     true;
    }
    function     CheckForm()
    {  
    if(!     isNumber(document.form.TEL.value))     {  
    alert("您的电话号码不合法!");
    document.form.TEL.focus();
    return     false;
    }
    return     true;
    }
    -->
    </script>


    2.4     表单项输入数值/长度限定

    <script     language="javascript">
    <!--
    function     CheckForm()  
    {  
    if     (document.form.count.value     >     100     ||     document.form.count.value     <     1)
    {  
    alert("输入数值不能小于零大于100!");
    document.form.count.focus();
    return     false;
    }
    if     (document.form.MESSAGE.value.length<10)
    {  
    alert("输入文字小于10!");
    document.form.MESSAGE.focus();
    return     false;
    }
    return     true;
    }
    //-->
    </script>

    2.5     中文/英文/数字/邮件地址合法性判断

    <SCRIPT     LANGUAGE="javascript">
    <!--

    function     isEnglish(name)     //英文值检测
    {  
    if(name.length     ==     0)
    return     false;
    for(i     =     0;     i     <     name.length;     i++)     {  
    if(name.charCodeAt(i)     >     128)
    return     false;
    }
    return     true;
    }

    function     isChinese(name)     //中文值检测
    {  
    if(name.length     ==     0)
    return     false;
    for(i     =     0;     i     <     name.length;     i++)     {  
    if(name.charCodeAt(i)     >     128)
    return     true;
    }
    return     false;
    }

    function     isMail(name)     //     E-mail值检测
    {  
    if(!     isEnglish(name))
    return     false;
    i     =     name.indexOf("     at     ");
    j     =     name     dot     lastIndexOf("     at     ");
    if(i     ==     -1)
    return     false;
    if(i     !=     j)
    return     false;
    if(i     ==     name     dot     length)
    return     false;
    return     true;
    }

    function     isNumber(name)     //数值检测
    {  
    if(name.length     ==     0)
    return     false;
    for(i     =     0;     i     <     name.length;     i++)     {  
    if(name.charAt(i)     <     "0"     ||     name.charAt(i)     >     "9")
    return     false;
    }
    return     true;
    }

    function     CheckForm()
    {  
    if(!     isMail(form.Email.value))     {  
    alert("您的电子邮件不合法!");
    form.Email.focus();
    return     false;
    }
    if(!     isEnglish(form.name.value))     {  
    alert("英文名不合法!");
    form.name.focus();
    return     false;
    }
    if(!     isChinese(form.cnname.value))     {  
    alert("中文名不合法!");
    form.cnname.focus();
    return     false;
    }
    if(!     isNumber(form.PublicZipCode.value))     {  
    alert("邮政编码不合法!");
    form.PublicZipCode.focus();
    return     false;
    }
    return     true;
    }
    //-->
    </SCRIPT>

    2.6     限定表单项不能输入的字符

    <script     language="javascript">
    <!--

    function     contain(str,charset)//     字符串包含测试函数
    {  
    var     i;
    for(i=0;i<charset.length;i++)
    if(str.indexOf(charset.charAt(i))>=0)
    return     true;
    return     false;
    }

    function     CheckForm()
    {  
    if     ((contain(document.form.NAME.value,     "%\(\)><"))     ||     (contain(document.form.MESSAGE.value,     "%\(\)><")))
    {  
    alert("输入了非法字符");
    document.form.NAME.focus();
    return     false;
    }
    return     true;
    }
    //-->
    </script>  





    转自  http://www.cnblogs.com/zwl12549/archive/2008/01/07/1028701.html
    posted @ 2008-11-01 13:58 勒紧皮带向前冲 阅读(2084) | 评论 (1)编辑 收藏
     

    这里只说一下对sp提供的移动通道的接口调用的方法。希望能给一些没有涉及这些内容的朋友提供一些帮助。

    首先说一下用户上行,上行就是指手机用户编辑短信到指定的号码的过程,我们在web开发中针对用户上行内容的处理流程是这样:
     手机用户编辑短信到指定的号码--------------》(传输到移动网关)------->移动网关在收到这条信息,并处理完后把处理结果返回到合作方(一般这里是sp)的网关------->sp的网关收到这条上行处理后再把结果传输到我们最下层的合作方-------》到这里我们就可以写出我们的处理接口实现对应的数据处理或者短信下发。

    其次是实现下行,下行就是我们通过移动网关向指定的移动用户发送用户选择的内容,比如图片铃声等。其流程是这样:

    web开发员------》调用sp的移动下发接口,(一般是进行事前的数据处理,然后再配置下发的参数)-----》调用sp的接口后,sp的接口会进行响应的数据记录,然后把内容提交到移动的网关------》移动网关再把内容下发给用户----》下发操作执行后,移动网关将相应的状态报告再回发给sp的接口------》sp的接口再通知我们的响应处理接口。

    流程基本上是以上的内容。在实际操作的过程中还会出现掉包的情况,毕竟数据通过几个中转,大数据量并发的状态下肯定会掉包,所以也有个掉包率的概念。另外web开发者需要与sp的技术中心进行一些协调,比如我们需要从sp那边获取sp为我们分配的业务编号,以及指令和地址码这类信息,以及我们还需要提供给sp一些我们的响应接口(响应接口的开发需按照的sp的开发手册来进行开发,每家的sp在这里会有一些不同),比如用户上行后,sp的网关收到这个报告后,就需要绑定一个我们的响应接口,来对上行内容进行一些操作。

    注意:
    移动增值类的业务主要分为三个,点播,按条定制,包月定制。
    点播:就是用户上行一条信息,扣一次钱。另外针对点播业务,用户上行后会产生一个随机的linkid,当我们给用户下发的时候必须以这个linkid来为这个手机号下发内容,负责用户上性的这条信息就不会扣钱,也就是说只有我们通过这个产生的linkid,并为用户下发了内容以后,移动才能够收取手机用户的钱。

    按条定制:当用户订制了这个业务时,系统将会每天自动会用户下发几条内容,每下发成功就会扣一条信息的钱。现在有很多手机交费的网站就会采用这个业务,当用户发送了订制指令后,sp的通道就会为用户下发指定条数的信息,以此来收取费用,下发30条,就收你30块。

    包月定制:这个大家都比较熟悉了,这里就不介绍了。

    下面为大家简单介绍一个类似的通道调用(具体的sp接口每家都有些不同,但基本是大同小异)

    下发接口(以短信下发接口为例):
    http://www.xxxx.com/sms/sendsms.asp?serviceid==xxx&to==xxx&from=xxx&linkid=xxx&msg=xxx

    参数注释:
    serviceid为业务id 由sp提供
    to :接受方手机
    from:发送方号码,由sp提供 比如 1861
    linkid: 用户上行后产生的linkid,可以从用户上行的短信中,或者从sso接口获得。(linkid是有有效期的,超过有效期将会失效)
    msg:为我们下发的手机内容。

    如果我们要下发的图片铃声等资源,一般这类接口还会提供一个pushurl
    pushurl: 用来告诉移动网关我们要给手机用户下载的资源地址。

    其它的接口就不一一举例了。关键是掌握这些流程,和原理。


    转自  http://blog.csdn.net/rehearts/archive/2006/09/01/1155362.aspx

    posted @ 2008-10-30 17:03 勒紧皮带向前冲 阅读(278) | 评论 (0)编辑 收藏
     
         摘要: Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->  1 <html xmlns="http://www.w3.org/1999/xhtml">   2 &l...  阅读全文
    posted @ 2008-10-15 09:20 勒紧皮带向前冲 阅读(1813) | 评论 (2)编辑 收藏
     
         摘要: Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> 1 <tr>  2          &nbs...  阅读全文
    posted @ 2008-10-14 17:33 勒紧皮带向前冲 阅读(3121) | 评论 (0)编辑 收藏
     
    oracle可以使用exp/imp进行逻辑导出和导入。
    例:exp导出
        exp username/password@database file=xxx/xxx/xx.dmp
     
        imp导入
        imp username/password@database file=xxx/xxx/xxx.dmp FULL=y

    以上的例子是对整个数据库进行的导出导入,除了以数据库外,还可以导出表,表空间。
    注意在导入是如果遇到imp-00015提示following statement failed because the objiect already exits时,只需对该信息后面的所存在的对象删除,再次导入即可。
    posted @ 2008-10-11 11:52 勒紧皮带向前冲 阅读(262) | 评论 (0)编辑 收藏