konhon

忘掉過去,展望未來。找回自我,超越自我。
逃避不一定躲的过, 面对不一定最难过, 孤单不一定不快乐, 得到不一定能长久, 失去不一定不再拥有, 可能因为某个理由而伤心难过, 但我却能找个理由让自己快乐.

Google

BlogJava 首页 新随笔 联系 聚合 管理
  203 Posts :: 0 Stories :: 61 Comments :: 0 Trackbacks

#

MenuItem1.ShortCut := ShortCut(Word(VK_RIGHT), [ssCtrl])
posted @ 2005-08-26 21:29 konhon 优华 阅读(436) | 评论 (0)编辑 收藏

Struts安装:
首先请到http://jakarta.apache.org/Struts下载Struts,建议使用release版,现在最高版本为1.1,下载后得到的是一个ZIP文件。
将ZIP包解开,可以看到这个目录:lib和webapps,webapps下有一些WAR文件。假设你的Tomcat装在c:\Tomcat下,则将那些WAR文件拷贝到C:\Tomcat\webapps,重新启动Tomcat即可。打开浏览器,在地址栏中输入:http://localhost:8080/Struts-example/index.jsp,若能见到“powered by Struts”的深蓝色图标,即说明成功了。这是Struts自带的一个例子,附有详细的说明文档,可以做为初学者的入门教程。另外,Struts还提供了一系统实用对象:XML处理、通过Java reflection APIs自动处理JavaBeans属性、国际化的提示和消息等

一个实例:
一个用户注册系统,用户通过网页输入相关信息:注册ID号,密码,EMAIL,若注册成功,则返回成功提示信息,反之出现注册失败提示信息。
以下是相关文件的部分核心代码。

项目建立:
正式开发前,需要在Tocmat(我的tomcat装在c:\tomcat)中建立此项目。比较快的一种建立方式为:在C:\tomcat\webapps下新建目录test,再将C:\tomcat\webapps\struts-example下的
WEB-INF目录拷贝到test目录下,然后将test\WEB-INF下的src和classes目录清空,以及struts-config.xml文件中内容清空即可。这样,我们需要的Struts类包及相关的配置文件就都齐了。
开发时,将JSP文件放在test目录下,Java原文件放在test\WEB-INF\src下,编译后的类文件放在test\WEB-INF\classes下。

注册页面:reguser.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="/WEB-INF/Struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/Struts-html.tld" prefix="html" %>
<html:html locale="true">
<head>
<title>RegUser</title>
<html:base/>
</head>
<body bgcolor="white">
<html:errors/>
<html:form action="/regUserAction" focus="logname">
<table border="0" width="100%">
<tr>
<th align="right">
Logname:
</th>
<td align="left">
<html:text property="logname" size="20" maxlength="20"/>
</td>
</tr>
<tr>
<th align="right">
Password:
</th>
<td align="left">
<html:password property="password" size="20" maxlength="20"/>
</td>
</tr> 
<tr>
<th align="right">
E-mail:
</th>
<td align="left">
<html:password property="email" size="30" maxlength="50"/>
</td>
</tr>
<tr>
<td align="right">
<html:submit property="submit" value="Submit"/>
</td>
<td align="left">
<html:reset/>
</td>
</tr>
</table>
</html:form>
</body>
</html:html>


此JSP页面不同于普通的JSP页,因为它大量运用了taglib,这些taglib对初学者而言,可能难于掌握,可这却是Struts的精华之一。灵活运用,将大大提高开发效率。

Struts-config.xml:

<Struts-config> 
<form-beans>
<form-bean name="regUserForm"
type
="org.cjea.Struts.example. RegUserForm "/> 
</form-beans>
<action-mappings>
<action path="/regUserAction"
type
=" org.cjea.Struts.example.RegUserAction "
attribute
=" regUserForm "
scope
="request"
validate
="false">
<forward name="failure" path="/ messageFailure.jsp"/>
<forward name="success" path="/ messageSuccess.jsp"/>
</action>
</action-mappings>
</Struts-config>

Struts的核心是Controller,即ActionServlet,而ActionServlet的核心就是Struts-config.xml,Struts-config.xml集中了所有页面的导航定义。对于大型的WEB项目,通过此配置文件即可迅速把握其脉络,这不管是对于前期的开发,还是后期的维护或升级都是大有裨益的。掌握Struts-config.xml是掌握Struts的关键所在。

FormBean:RegUserForm

package org.cjea.Struts.example;

import javax.Servlet.http.HttpServletRequest;
import org.apache.Struts.action.ActionForm;
import org.apache.Struts.action.ActionMapping;

public final class RegUserForm extends ActionForm{

private String logname;
private String password;
private String email;

public RegUserForm(){
logname 
= null;
password 
= null;
email 
= null;
}


public String getLogName() {
return this.logname;
}

public void setLogName(String logname) {
this.logname = logname;
}

public void setPassWord(String password) {
this.password = password;
}

public String getPassWord() {
return this.password;
}

public void setEmail(String email) {
this.email = email;
}

public String getEmail() {
return this.email;
}


public void reset(ActionMapping mapping, HttpServletRequest request)
{
logname 
= null;
password 
= null;
email 
= null;
}

}


每一个FormBean 都必须继承ActionForm类,FormBean是对页面请求的封装。即把HTTP request 封装在一个对象中,需要说明的一点就是多个HTTP request可以共用一个FormBean,便于维护和重用。

ActionBean:RegUserAction

package org.cjea.Struts.example;

import javax.Servlet.http.
*;
import org.apache.Struts.action.
*;

public final class RegUserAction extends Action
{

public ActionForward perform(ActionMapping mapping,
ActionForm form, HttpServletRequest req,
HttpServletResponse res)

String title 
= req.getParameter("title");
String password 
= req.getParameter("password");
String email 
= req.getParameter("email");
/*
取得用户请求,做相应数据库操作,略
*/
 
}

}


FormBean的产生是为了提供数据给ActionBean,在ActionBean中可以取得FormBean中封装的数据,经相应的逻辑处理后,调用业务方法完成相应业务要求。

Servlet的演变:在常规的 JSP,Servlet,JavaBean三层结构中,JSP实现View的功能,Servlet实现Controller的功能,JavaBean实现Model的实现。

在Struts中,将常规情况下的Servlet拆分与ActionServlet、FormBean、ActionBean三个部分。ActionServlet配合Struts-config.xml,专职完成页面导航,而不再负责具体的数据获取与相应逻辑,这两部分功能由FormBean和ActionBean来完成。

Struts优缺点
优点:
Struts跟Tomcat、Turbine等诸多Apache项目一样,是开源软件,这是它的一大优点。使开发者能更深入的了解其内部实现机制。
除此之外,Struts的优点主要集中体现在两个方面:Taglib和页面导航。Taglib是Struts的标记库,灵活动用,能大大提高开发效率。另外,就目前国内的JSP开发者而言,除了使用JSP自带的常用标记外,很少开发自己的标记,或许Struts是一个很好的起点。
关于页面导航,我认为那将是今后的一个发展方向,事实上,这样做,使系统的脉络更加清晰。通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。尤其是当另一批开发者接手这个项目时,这种优势体现得更加明显。
缺点:
Taglib是Struts的一大优势,但对于初学者而言,却需要一个持续学习的过程,甚至还会打乱你网页编写的习惯,但是,当你习惯了它时,你会觉得它真的很棒。
Struts将MVC的Controller一分为三,在获得结构更加清晰的同时,也增加了系统的复杂度。
Struts从产生到现在还不到半年,但已逐步越来越多运用于商业软件。虽然它现在还有不少缺点,但它是一种非常优秀的J2EE MVC实现方式,如果你的系统准备采用J2EE MVC架构,那么,不妨考虑一下Struts。

Struts实施经验:
1、基于Struts架构的项目开发,首先需要有一个很好的整体规划,整个系统中包括哪几个模块,每个模块各需要多少FormBean和ActionBean等,而且最好有专人负责Struts-config.xml的管理。开发基于Struts的项目的难点在于配置管理,尤其是对Struts-config.xml的管理

2、如果你的项目非常紧,并且项目组中又没有富有经验的Struts开发人员,建议不要冒然采用Struts。Struts的掌握需要一个过程,对于一个熟练的JSP程序员,自学大概需要半个月左右的时间。如果结合titls,则需要更长的时间

3、如果你在网页中大量运用taglib,那么你的美工将做出部分牺牲。当你结合Tiles,功能增强的同时,这种牺牲尤为明显。当然,你对功能和美观的取舍由你自己决定

4、Taglib是一个好东西,但灵活运用它却需要一个过程,如果你不想在Taglib上花太多的时间,那么只需理解与FORM有关的几个标记,其它的标记就放着吧,以后再看,先去研究ActionServlet和Struts-config.xml,你会觉得很有成就感

5、Struts是否只适合于大型项目呢?No!Struts适合于各种大小的项目,当然,对于大型项目,它所体现出来的优势更加明显。

posted @ 2005-08-26 20:53 konhon 优华 阅读(397) | 评论 (0)编辑 收藏

J2EE体系结构简单介绍
一、J2EE提出的背景
1、 企业级应用框架的需求
在许多企业级应用中,例如数据库连接、邮件服务、事务处理等都是一些通用企业需求模块,这些模块如果每次再开发中都由开发人员来完成的话,将会造成开发周期长和代码可靠性差等问题。于是许多大公司开发了自己的通用模块服务。这些服务性的软件系列同陈为中间件。
2、 为了通用必须要提出规范,不然无法达到通用
在上面的需求基础之上,许多公司都开发了自己的中间件,但其与用户的沟通都各有不同,从而导致用户无法将各个公司不同的中间件组装在一块为自己服务。从而产生瓶颈。于是提出标准的概念。其实J2EE就是基于JAVA技术的一系列标准。
注:中间件的解释 中间件处在操作系统和更高一级应用程序之间。他充当的功能是:将应用程序运行环境与操作系统隔离,从而实现应用程序开发者不必为更多系统问题忧虑,而直接关注该应用程序在解决问题上的能力 。我们后面说到的容器的概念就是中间件的一种。
二、相关名词解释
容器:充当中间件的角色
WEB容器:给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使JSP,SERVLET直接更容器中的环境变量接口交互,不必关注其它系统问题。主要有WEB服务器来实现。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。该容器提供的接口严格遵守J2EE规范中的WEB APPLICATION 标准。我们把遵守以上标准的WEB服务器就叫做J2EE中的WEB容器。
EJB容器:Enterprise java bean 容器。更具有行业领域特色。他提供给运行在其中的组件EJB各种管理功能。只要满足J2EE规范的EJB放入该容器,马上就会被容器进行高效率的管理。并且可以通过现成的接口来获得系统级别的服务。例如邮件服务、事务管理。
WEB容器和EJB容器在原理上是大体相同的,更多的区别是被隔离的外界环境。WEB容器更多的是跟基于HTTP的请求打交道。而EJB容器不是。它是更多的跟数据库、其它服务打交道。但他们都是把与外界的交互实现从而减轻应用程序的负担。例如SERVLET不用关心HTTP的细节,直接引用环境变量session,request,response就行、EJB不用关心数据库连接速度、各种事务控制,直接由容器来完成。
RMI/IIOP:远程方法调用/internet对象请求中介协议,他们主要用于通过远程调用服务。例如,远程有一台计算机上运行一个程序,它提供股票分析服务,我们可以在本地计算机上实现对其直接调用。当然这是要通过一定的规范才能在异构的系统之间进行通信。RMI是JAVA特有的。
JNDI:JAVA命名目录服务。主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能。
JMS:JAVA消息服务。主要实现各个应用程序之间的通讯。包括点对点和广播。
JAVAMAIL:JAVA邮件服务。提供邮件的存储、传输功能。他是JAVA编程中实现邮件功能的核心。相当MS中的EXCHANGE开发包。
JTA:JAVA事务服务。提供各种分布式事务服务。应用程序只需调用其提供的接口即可。
JAF:JAVA安全认证框架。提供一些安全控制方面的框架。让开发者通过各种部署和自定义实现自己的个性安全控制策略。
EAI:企业应用集成。是一种概念,从而牵涉到好多技术。J2EE技术是一种很好的集成实现。
三、J2EE的优越性
1、 基于JAVA 技术,平台无关性表现突出
2、 开放的标准,许多大型公司已经实现了对该规范支持的应用服务器。如BEA ,IBM,ORACLE等。
3、 提供相当专业的通用软件服务。
4、 提供了一个优秀的企业级应用程序框架,对快速高质量开发打下基础
四、体系结构图
mailto:luopc@edu-edu.com.cn了解更详细的通俗体系内容,请给我来信。
五、现状
J2EE是由SUN 公司开发的一套企业级应用规范。现在最高版本是1.4。支持J2EE的应用服务器有IBM WEBSPHERE APPLICATION SERVER,BEA WEBLOGIC SERVER,JBOSS,ORACLE APPLICATION SERVER,SUN ONE APPLICATION SERVER 等。.
posted @ 2005-08-26 20:48 konhon 优华 阅读(344) | 评论 (0)编辑 收藏

http://www.blogjava.net/Files/konhon/EnableNetCard.rar

在Delphi中选Project Import Type Library命令,在对话框中选Import Microsoft Shell Controls And Automation类型库,点Install后,在Delphi的ActiveX控件板上就多了TShellFolderItem,TShellLinkObject,TShellFolderView,TShell,TSearchCommand等几个组件

const
   discVerb = '禁用(&B)';
   connVerb = '启用(&A)';

function TForm1.DisableEthernet(const EthName,State: String): Boolean;
var
  cpFolder: Folder;
  nwFolder: Folder;
  nVerbs: FolderItemVerbs;
  i,j,k: integer;
  aItem: TListItem;
begin
  result := false;
  cpFolder := Form1.shell1.NameSpace(3);
  if cpFolder <> nil then
  begin
    for i := 0 to cpFolder.items.Count-1 do
    begin
      if cpFolder.Items.Item(i).Name = '网络和拨号连接' then
      begin
        nwFolder := cpFolder.items.item(i).GetFolder as Folder;
        if nwFolder <> nil then
        begin
          for j :=0 to nwFolder.items.Count-1 do
          begin
            if nwFolder.Items.Item(j).Name = EthName then
            begin
              nVerbs := nwFolder.Items.Item(j).Verbs;
              for k := 0 to  nVerbs.Count-1 do
             begin
                if nVerbs.Item(k).Name = State then
                begin
                  nVerbs.Item(k).DoIt;
                  aItem := Form1.lvLog.Items.Add;
                  aItem.Caption := FormatDateTime('yyyy-mm-dd hh:mm:ss',now);
                  aItem.SubItems.Add(EthName);
                  aItem.SubItems.Add(State);
                  Result := True;
                end;
              end;
            end;
          end;
        end;
      end;
    end;
    if nwFolder = nil then
       showmessage('Network and Dial-up Connections not found');
  end
  else
    showmessage('control panel not found');

end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  DisableEthernet('本地连接',discVerb);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  DisableEthernet('本地连接',connVerb);
end;

posted @ 2005-08-26 04:11 konhon 优华 阅读(447) | 评论 (0)编辑 收藏

procedure TForm1.Button1Click(Sender: TObject);
var
  lUrl: string;
  lParams: TStrings;
  lHtml: string;
begin
  lUrl := 'http://snixxx.co.uk/cgi-bin/mt-comments.cgi';
  lParams := TStringList.Create;
  try
    lParams.Add('entry_id=1302');
    lParams.Add('author=dqxhyy');
    lParams.Add('dqxhyy@sina.com');
    lParams.Add('dqxhyydqxhyydqxhyydqxhyy');
    try
      lHtml := IdHttp1.Post(lUrl, lParams);
    except
      showmessage(lhtml);
    end;
    showmessage(lhtml);
  finally
    lParams.Free;
  end;
end;
posted @ 2005-08-25 22:13 konhon 优华 阅读(388) | 评论 (0)编辑 收藏


procedure TForm1.Button1Click(Sender: TObject);
var
   h,m,s,s1:hwnd;
begin
  h:=FindWindow('notepad',nil);
   if h<>0 then
   begin
     m:=GetMenu(h);
     s:=GetSubMenu(m,1);
     s1:=GetSubMenu(s,7);
     SendMessage(h,WM_COMMAND,MakeLong(GetMenuItemId(s,7),0),s1);
  end;
end;
posted @ 2005-08-25 21:05 konhon 优华 阅读(2698) | 评论 (0)编辑 收藏

procedure TForm1.Label1Click(Sender: TObject);
var
  lPoint: TPoint;
begin
  lPoint.X := TLabel(Sender).Left;
  lPoint.Y := TLabel(Sender).Top + TLabel(Sender).Height;
  lPoint:=ClientToScreen(lPoint);
  PopupMenu1.Popup(lPoint.X, lPoint.Y);
end;
posted @ 2005-08-25 06:58 konhon 优华 阅读(606) | 评论 (0)编辑 收藏

procedure TForm1.ADODataSet1MaterielNameGetText(Sender: TField;
  var Text: string; DisplayText: Boolean);
var
  lSingleWidth: integer;
  lDBGridWidth: integer;
begin
  lSingleWidth := DBGrid1.Canvas.TextWidth('壹');
  lDBGridWidth := DBGrid1.Columns[1].Width;
  if DBGrid1.Canvas.TextWidth(Sender.AsString) <= lDBGridWidth then
    Text := Sender.AsString
  else if DBGrid1.Canvas.TextWidth(Sender.AsString) > lDBGridWidth then
  begin
    lSingleWidth := lDBGridWidth div lSingleWidth - 1;
    if lSingleWidth mod 2 = 1 then
      lSingleWidth := lSingleWidth + 1;
    Text := Copy(Sender.AsString, 1, lSingleWidth) + '...';
  end
end;
posted @ 2005-08-25 06:57 konhon 优华 阅读(396) | 评论 (0)编辑 收藏

uses CommCtrl;

procedure TForm1.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  item: TListItem;
  lvhti: LV_HITTESTINFO;
begin
  item := ListView1.GetItemAt(X, Y);
  if (item <> nil) then
    Caption := 'Mouse at: ' + item.Caption
  else
  begin
    lvhti.pt.X := X;
    lvhti.pt.Y := Y;
    ListView_SubItemHitTest(ListView1.Handle, @lvhti);
    if Assigned(ListView1.Items[lvhti.iItem])
      and (ListView1.Items[lvhti.iItem].SubItems.Count >= lvhti.iSubItem) then
      Caption := 'Mouse at:' + ListView1.Items[lvhti.iItem].SubItems[lvhti.iSubItem - 1];
  end;
end;

posted @ 2005-08-25 06:45 konhon 优华 阅读(1102) | 评论 (0)编辑 收藏

     摘要:   学习sql有一段时间了,发现在我建了一个用来测试的表(没有建索引)中出现了许多的重复记录。后来总结了一些删除重复记录的方法,在Oracle中,可以通过唯一rowid实现删除重复记录;还可以建临时表来实现...这个只提到其中的几种简单实用的方法,希望可以和大家分享(以表employee为例)。 SQL> desc employee  Name&nb...  阅读全文
posted @ 2005-08-25 02:40 konhon 优华 阅读(744) | 评论 (0)编辑 收藏

仅列出标题
共21页: First 上一页 13 14 15 16 17 18 19 20 21 下一页