Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2521064
  • 博文数量: 867
  • 博客积分: 10010
  • 博客等级: 上将
  • 技术积分: 9800
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-27 14:44
文章分类

全部博文(867)

文章存档

2007年(6)

2006年(861)

我的朋友

分类: Oracle

2006-09-01 18:37:18

1、从网上下载redhat Enterprise Linux Advanced Server3的四个安装文件,安装时swap分区设置为内存的二倍。不要采用DHCP设置主机名和IP地址,而是“手工设置”。否则会在安装oracle的时候出现如下错误:
引用:
Thrown when the IP address of a host cannot be determined

出现这个错误将使Oracle不能安装成功。安装RHAS3,可以刻录到光盘安装,也可以从硬盘安装,从硬盘安装RHAS3,请参考:
2、系统要求:内存最低256(我的就是这么大),建议512M,硬盘空间4G,如果Oracle安装文件存在硬盘,建议5G(在安装操作系统后的剩余空间)。
可以查看内存的大小,用到的命令是:grep MemTotal /proc/meminfo
swap分区在安装操作系统的时候就设定好了,为内存的2倍,当内存达到1G以上时,和内存大小相同就可以了啊。相看交换分区命令是:/sbin/swapon -s
3、检查是否安装以下包:
引用:
#su - root
#rpm -qa|grep compat
compat-db-4.0.14-5.i386
compat-gcc-7.3-2.96.122.i386
compat-gcc-c++-7.3-2.96.122.i386
compat-libstdc++-7.3-2.96.122.i386
compat-libstdc++-devel-7.3-2.96.122.i386
#rpm -qa|grep openmotif21
openmotif21-2.1.30-8.i386
#rpm -qa|grep setarch
setarch-1.3-1.i386
#rpm -qa|grep tcl
tcl-8.3.5-92.i386

上面显示的内容是在笔者已经安装了具体的RPM包之后的结果。它们对应的软件包是:
引用:

compat-db-4.0.14-5.i386.rpm
compat-gcc-7.3-2.96.122.i386.rpm
compat-gcc-c++-7.3-2.96.122.i386.rpm
compat-libstdc++-7.3-2.96.122.i386.rpm
compat-libstdc++-devel-7.3-2.96.122.i386.rpm
openmotif21-2.1.30-8.i386.rpm
setarch-1.3-1.i386.rpm
tcl-8.3.5-92.i386.rpm

一般情况下,你的系统上的输出结果和这个不同。如果个别包没有安装,把系统安装光盘mount上,找到具体的软件包(大多数在第三张光盘上),然后利用如下的命令来安装相应的包:
# rpm -ivh compat.....rpm
因为我没有把RHAS3刻录到光盘,所以我用下面的命令来挂载iso文件
引用:
mount -o loop /mnt/e/rhas3/rhel-3-i386-as-disc3.iso /mnt/cdrom

要额外注意的是,这些软件包之间是有依赖性的,先后的顺序要找好。否则会报告不能安装的错误。在安装软件包的时候,如果出现软件包的依赖性,就先安装有有依赖的包。我相信大家会看明白软件包之间的依赖性的。
还需要将gcc、g++更换为2.96的版本.
方法如下:
引用:
#su - root
mv /usr/bin/gcc /usr/bin/gcc323
ln -s /usr/bin/gcc296 /usr/bin/gcc
mv /usr/bin/g++ /usr/bin/g++323 # if g++ doesn't exist, then gcc-c++ was not installed(这里是注释哦)
ln -s /usr/bin/g++296 /usr/bin/g++

3、设置内核参数:
这个版本的默认的glibc 很合适,免去了不少麻烦。
用grep MemTotal /proc/meminfo查看内存总量
出现 MemTotal XXXXXKB,其中的XXXXX就是内存总量。
修改两个文件,如下:
引用:

#vi /etc/sysctl.conf
加入:
kernel.shmmax = xxxxx*1024*2(为内存的2倍,切换到字节。要是超过这个值,在运行dbca时会出现Ora-27123:Unable to attach to shared memeroy segment)
kernel.shmmni=4096
kernel.shmall=2097152
kernel.sem=250 32000 100 128
fs.file-max=65536
net.ipv4.ip_local_port_range=1024 65000
#vi /etc/security/limits.conf
加入:
oracle hard nofile 65536
oracle soft nofile 65536
oracle hard nproc 16384
oracle soft nproc 16384

4、建立用户、设置环境变量
建立用户的命令是以root用户运行的。
引用:
#groupadd oinstall
#groupadd dba
#useradd -g oinstall -G dba oracle
#passwd oracle

设置环境变量:
以oracle用户登录,
引用:
vi $HOME/.bash_profile
插入下面的内容
# Set the LD_ASSUME_KERNEL environment variable only for Red Hat 9 and
# for Red Hat Enterprise Linux Advanced Server 3 (RHEL AS 3) !!
# Use the "Linuxthreads with floating stacks" implementation instead of NPTL:
export LD_ASSUME_KERNEL=2.4.1

# Oracle Environment
export ORACLE_BASE=/home/oracle
export ORACLE_HOME=$ORACLE_BASE/product/9.2.0
export ORACLE_SID=test
export ORACLE_TERM=xterm
# export TNS_ADMIN= Set if sqlnet.ora, tnsnames.ora, etc. are not in $ORACLE_HOME/network/admin
export NLS_LANG=AMERICAN;
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
export LD_LIBRARY_PATH

# Set shell search paths
export PATH=$PATH:$ORACLE_HOME/bin

然后注销重新登录,用set|more查看环境变量是否生效。因为我把Oracle安装在了oracle用户主目录下,所以我的ORACLE_BASE值为/home/oracle,当然你也可以安装到指定的目录,如下:
引用:
#su - root
#mkdir /opt/oracle
#mkdir /opt/oracle/product
#mkdir /opt/oracle/product/9.2.0
#chown -R oracle.oinstall /opt/oracle

#mkdir /var/opt/oracle
#chown oracle.dba /var/opt/oracle
#chmod 755 /var/opt/oracle

这时ORACLE_BASE的值就是/opt/oracle。
5、开始安装
下载三个安装文件,
ship_9204_linux_disk1.cpio.gz
ship_9204_linux_disk2.cpio.gz
ship_9204_linux_disk3.cpio.gz
用zcat ship_9204_linux_disk1.cpio.gz|cpio -idmv
zcat ship_9204_linux_disk2.cpio.gz|cpio -idmv
zcat ship_9204_linux_disk3.cpio.gz|cpio -idmv
生成三个文件夹Disk1,Disk2,Disk3;
你也可以用gunzip ship_9204_linux_disk1.cpio.gz
cpio -idmv 这样的命令来生成三个目录,可以用下面的命令刻录到光盘,也可以保存在硬盘。
引用:

mkisofs -r Disk1 | cdrecord -v --eject dev=0,0,0 speed=15 -
mkisofs -r Disk2 | cdrecord -v --eject dev=0,0,0 speed=15 -
mkisofs -r Disk3 | cdrecord -v --eject dev=0,0,0 speed=15 -

进入Disk1目录运行runInstaller之前,注意两点:
a、export LANG=en_us(否则安装界面出来就会出现“□”,因为Oracle9i不支持中文界面。)
b、安装p3006854_9204_LINUX.zip补丁,否则会出现如下错误:
引用:
Error occurred during initialization of VM
Unable to load native library: /tmp/OraInstall2003-10-25_03-14-57PM/jre/lib/i386/libjava.so:
symbol __libc_wait, version GLIBC_2.0 not defined in file libc.so.6 with link time reference

下载p3006854_9204_LINUX.zip补丁。安装此补丁的方法:
引用:

su - root
# unzip p3006854_9204_LINUX.zip
Archive: p3006854_9204_LINUX.zip
creating: 3006854/
inflating: 3006854/rhel3_pre_install.sh
inflating: 3006854/README.txt

# cd 3006854
# sh rhel3_pre_install.sh
Applying patch...
Patch successfully applied
#
注意:如果运行 rhel3_pre_install.sh出现下面的错误
rhel3_pre_install.sh: line 36: gcc: command not found
是因为你忘了安装gcc,同样要是出现下面的错误:
# ls
ls: error while loading shared libraries: /etc/libcwait.so: cannot open shared object file: No such file or directory
# rm /etc/ld.so.preload
rm: error while loading shared libraries: /etc/libcwait.so: cannot open shared object file: No such file or directory
#
请不要退出bash,用下面的方法来修复(我开始遇到,后来没有遇到了,可能是因为我把gcc降级到了296吧)
# echo "" > /etc/ld.so.preload
rm /etc/ld.so.preload
And start over again.


现在运行./runInstaller &(必须进入到Disk1目录,或者从光盘运行,从光盘安装不要进入/mnt/cdrom后运行runInstaller,而是这样运行./mnt/cdrom/runInstaller)
  呵呵,高兴了吧,期待以久的GUI界面终于出来了啊。这是欢迎界面。显示了Oracle安装的源文件所在目录,还有要安装到的产品目录。我们点“Next”;
接着出现的下一个界面是Inventory路径,我们点“Next”;
  现在要求用户输入UNIX组名,我们用Oracle用户所在的组“oinstall”,然后点“Next”,如果你是第一次安装Oracle产品,则要你运行一个sh文件。文件是/tmp/orainstRoot.sh,我们打开一个shell窗口,切换到root用户,如下:
引用:
su root
sh /tmp/orainstRoot.sh

运行完毕我们返回Oracle安装界面,点“Continue”;
  选择文件存放的目录,我们选择默认值。然后“Next”;
  安装的产品是“Oracle9i Database 9.2.0.4.0”,点“Next”;
  选择安装类型是“通用”,默认选项。点“Next”;
  输入全局数据库名,然后“Next”;
  数据文件的存放位置,我采用的是默认位置,点“Next”;
  出现安装组件的选择结果,这时点“Install”,开始安装,复制文件,进度条在一点一点的增加,当安装并link完后,出现配置工具界面,agent服务不能配置成功,忽略不用管,在下面修复。DBCA,NETCA,HTTP都正确配置完毕哦。呵呵。下面开始修复错误。其实要是把各个界面抓取下来就更好了。
6、安装p3238244_9204_LINUX.zip补丁
此补丁也是从
下下载,同时要下载一个opatch软件包:p2617419_220_GENERIC.zip,它主要是用来悠agent服务不能启动的错误。
过程如下:
引用:
su - oracle
$ cp p2617419_210_GENERIC.zip /tmp
$ cd /tmp
$ unzip p2617419_210_GENERIC.zip
$ export PATH=$PATH:/tmp/OPatch
$ export PATH=$PATH:/sbin # the patch needs "fuser" which is located in /sbin
$ unzip p3238244_9204_LINUX.zip
$ cd 3238244
$ opatch apply
补丁修复完成,需要relinked一个.mk文件。
$ cd $ORACLE_HOME/network/lib
$ make -f ins_oemagent.mk install
现在在运行agentctl start,看是不是可以成功运行agent服务了啊,可以用stop、status来停止此服务或者检查服务的状态。
在这个成功之后,居然不能启动Oracle,说是不能找到初始化文件,没办法,我用dbca先删除了原来安装时建立的库,再重新建立了数据库。
7、运行dbca来创建数据库。呵呵,一路畅通,完成数据库的安装。
希望你也能成功安装。

后记:我想在各个版本的LINUX上安装Oracle的各版本,思路和步骤都大体相同,但是更要注意那些微小的差别,也许可能就是这些微小的差别将使你无法成功的安装。建议各位多到Oracle的网部去看看,多上网找些资料来对比着学习学习。工想你肯定会成功的。祝愿热爱Oracle和Linux的朋友都能成功。
Startup and Shutdown of the Oracle 9i Database
安装完成后,就可以启动和停止Oracle数据库了。
Oracle9i不再支持svrmgrl,你可以用sqlplus来启动与停止数据库。
启动数据库的命令如下:
引用:

oracle$ sqlplus /nolog
SQL> connect / as sysdba
SQL> startup

上面的连接是以sys的身份进入数据库的,并且以sysdba的角色来连接。sysdba具有下面的权限:
- sysoper privileges WITH ADMIN OPTION
- create database
- recover database until

$ORACLE_HOME/bin/dbstart and $ORACLE_HOME/bin/dbshut

你也可以用$ORACLE_HOME/bin/dbstart来启动database,和用$ORACLE_HOME/bin/dbshut 来停止 database。你可以把 $ORACLE_HOME/bin/dbstart加入到/etc/rc.d/rc.local启动脚本中, 在系统启动时自动启动Oracle,为了让 $ORACLE_HOME/bin/dbstart 和$ORACLE_HOME/bin/dbshut 工作,你需要改变三个地方: /etc/oratab 改"N"为 "Y"。

如,我的 Oracle SID 是"orcl" 我把文件 /etc/oratab中的下面的行从

orcl:/home/oracle/product/9.2.0:N
to read:
orcl:/home/oracle/product/9.2.0:Y

In some cases for 9.2.0 I also had to copy the init file for my SID "test" from /opt/oracle/admin/orcl/pfile to $ORACLE_HOME/dbs to get dbstart and dbshut working:
cp /opt/oracle/admin/test/pfile/inittest.ora.642002224936 $ORACLE_HOME/dbs/initorcl.ora
But first make sure if your init file already exists in $ORACLE_HOME/dbs!


After the 9.2.0.4 patchset has been applied, download the patch p3119415_9204_LINUX.zip from See bug 3119415 for more information. Also, download the opatch Release 2.2.0 utility from See bug 2617419 for more information.

To install opatch, run:
su - oracle
$ cp p2617419_210_GENERIC.zip /tmp
$ cd /tmp
$ unzip p2617419_210_GENERIC.zip
Before you apply the 3119415 patch, you need to make sure the fuser binary can be found by the oracle user, see the PATH environment variable below. Otherwise the patch can't be applied because the fuser binary is used by opatch.

To apply the 3119415 patch, run
su - oracle
$ unzip p3119415_9204_LINUX.zip
$ cd 3119415
$ export PATH=$PATH:/tmp/OPatch
$ export PATH=$PATH:/sbin # the patch needs "fuser" which is located in /sbin
$ which opatch
/tmp/OPatch/opatch
$ opatch apply


Now you should be able to create a database with dbca:
su - oracle
dbca

Patching Oracle Intelligent Agent on RH AS 3

When you run "agentctl start" (Oracle 9.2.0.4), dbsnmp will crash:
$ su - oracle
$ agentctl start

DBSNMP for Linux: Version 9.2.0.4.0 - Production on 07-JAN-2004 19:11:14

Copyright (c) 2003 Oracle Corporation. All rights reserved.

Starting Oracle Intelligent Agent.../opt/oracle/product/9.2.0/bin/dbsnmpwd: line 156: 1855 Segmentation fault nohup $ORACLE_HOME/bin/dbsnmp $*
>>$DBSNMP_WDLOGFILE 2>&1
/opt/oracle/product/9.2.0/bin/dbsnmpwd: line 156: 1868 Segmentation fault nohup $ORACLE_HOME/bin/dbsnmp $* >>$DBSNMP_WDLOGFILE 2>&1
/opt/oracle/product/9.2.0/bin/dbsnmpwd: line 156: 1880 Segmentation fault nohup $ORACLE_HOME/bin/dbsnmp $* >>$DBSNMP_WDLOGFILE 2>&1
/opt/oracle/product/9.2.0/bin/dbsnmpwd: line 156: 1892 Segmentation fault nohup $ORACLE_HOME/bin/dbsnmp $* >>$DBSNMP_WDLOGFILE 2>&1


To resolve this problem, apply the patch p3238244_9204_LINUX.zip from See bug/patch 3238244 for more information.

Before you apply the patch, make sure the instance is down!

Also make sure the opatch script appears in your $PATH. See "Patching Oracle9iR2 on Red Hat AS 3" for information on getting and installing opatch. To verify if opatch is in your $PATH, run the which command:
$ su - oracle
$ which opatch
/tmp/OPatch/opatch
$

To apply now the patch, run:
$ su - oracle
$ unzip p3238244_9204_LINUX.zip
$ cd 3238244
$ export PATH=$PATH:/sbin # the patch needs "fuser" which is located in /sbin
$ opatch apply


Now you need to relink dbsnmp. This is the binary that crashed when running agentctl start. To find which makefile handles the linking of dbsnmp, you can run:
$ su - oracle
$ find $ORACLE_HOME -name "*.mk" | xargs grep -l dbsnmp
/opt/oracle/product/9.2.0/network/lib/ins_oemagent.mk
/opt/oracle/product/9.2.0/network/lib/env_oemagent.mk
$


I relinked dbsnmp and all associated executables which are maintained by the ins_oemagent.mk makefile:
$ su - oracle
$ cd $ORACLE_HOME/network/lib
$ make -f ins_oemagent.mk install


Now you should be able to start the agent:
$ su - oracle
$ agentctl start


NOTE: Don't forget to undo the changes (links) to /usr/bin/gcc and /usr/bin/g++ if you don't need it any more. Also don't forget the /etc/ld.so.preload file.



阅读全文(165) | 回复(3) | 引用通告(0)  by funson 发表于 2004-10-10 17:20:00


  WEB Server用tomcat4。到下载struts1.1,把zip文件释放到c:struts,拷贝C:strutswebappsstruts-example.war到c: omcat4webapps中,启动tomcat,war包被释放为struts-example文件夹,删除war包,把struts-example文件夹更名为test。
  一、把WEB-INF/web.xml改成:

  PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
  "">


 Struts FW Application

 
 
    action
    org.apache.struts.action.ActionServlet
   
      config
      /WEB-INF/struts-config.xml, /WEB-INF/struts-config-registration.xml
   

  
      debug
      2
   

   
      detail
      2
   

    2
 


 
 
    action
    *.do
 


 
 
    index.jsp
 

 
 
    /WEB-INF/app.tld
    /WEB-INF/app.tld
 

 
 
    /WEB-INF/struts-bean.tld
    /WEB-INF/struts-bean.tld
 

 
    /WEB-INF/struts-html.tld
    /WEB-INF/struts-html.tld
 

 
    /WEB-INF/struts-logic.tld
    /WEB-INF/struts-logic.tld
 


二、把test/WEB-INF struts-config.xml改成:

          "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
          "">



 

  











 







 

 

 


三、增加一个FormBean,类路径为test.UserForm,以下是这个类的内容:
package test;
import org.apache.struts.action.ActionForm;
public class UserForm extends ActionForm
{
  private String name="fw";
  private String ps="123";
  public UserForm(){}
  public void setName(String s) {name=s;}
  public String getName() {return name;}
  public void setPs(String s) {ps=s;}
  public String getPs() {return ps;}
}
编辑时注意:在IDE中添加Struts.jar包到编译环境中,否则出现找不到action类!

四、增加一个Action的子类,类路径为test. RegistAction,以下是这个类的内容:
package test;
import java.lang.reflect.InvocationTargetException;
import java.util.Locale;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.util.MessageResources;
import test.UserForm;
public final class RegistAction extends Action
{
  public ActionForward execute(ActionMapping mapping,ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception
  {
    Locale locale = getLocale(request);
    MessageResources messages = getResources(request);
    HttpSession session = request.getSession();
    UserForm userform = (UserForm) form;
    if( "fw".equals(userform.getName()) )
    return (mapping.findForward("failed"));
    else
    return (mapping.findForward("regist"));
  }
}
注意:直接COPY有可能每行前有一些看不见的控制符,应该删除,在编辑器中关键要是不同着色才正常。否则编辑出错。

五、以下所有新增或修改的页面相当于struts的View部分,把首页fw\index.jsp改成:

<%@ page contentType="text/html;charset=GBK" language="java" %>
<%@ page import = "test.*" %>



<BR><bean:message key="index.title"/><BR>


站点导航



用户:

密码:




六、增加hello.jsp,用于站点导航:
<%@ page contentType="text/html;charset=GBK" language="java" %>



<BR><bean:message key="index.title"/><BR>


测试Struts!-----Fangwei

site map

The following is content filling by reader

七、增加wuwu.jsp,当没有新用户登陆时,将转到这个页面:
<%@ page contentType="text/html;charset=GBK" language="java" %>



<BR><bean:message key="index.title"/><BR>



现有用户:<%=beanlpw.getName()%>

密码:<%=beanlpw.getPs()%>


没有得到新的用户!

  八、增加regist.jsp,当有新用户登陆时,将转到这个页面:
<%@ page contentType="text/html;charset=GBK" language="java" %>


regist



新用户帐号:<%=beanlpw.getName()%>

密码:<%=beanlpw.getPs()%>


九、启动tomcat4,浏览器中键入,操作一下,就可以看到结果,并初步理解struts的M、V、C各部分的协同工作原理,当然这是作者的良好意愿,如果读者看得一头雾水,欢迎指出错误在哪里 :)

阅读全文(139) | 回复(2) | 引用通告(0)  by funson 发表于 2004-9-27 19:26:12

随着越来越多手提电话和个人数字助理开始融入到信息高速公路之上,从移动设备上访问Web站点变得越来越重要。Java开创了消费设备中小型的储存容量的先河,它是用于开发手机、传呼机及其他微型设备应用程序的理想语言。
  在本文中,我们将学习如何从一个J2ME客户机上向服务器发送一条HTTP GET请求和一条HTTP POST请求。虽然这只是一篇探讨性质的文章,但是我还是假定读者已经熟悉Java,J2ME,以及Java Midlets(MIDP应用程序)的运作机制。我们将使用J2ME的MIDP简表,并利用SUN的J2ME的无线应用程序开发工具包编译、配置和测试我们的应用程序。对于HTTP服务器,任何WWW地址都可以被访问,但是默认时我们将使用一个简单的Java Servlet来返回我们的HTTP请求的细节。

  如何使用J2ME客户机向Web服务器和类似的支持HTTP的服务器发送HTTP请求呢?答案就是使用可在javax.microedition.io程序包中可找到的J2ME的网络类。本文就想具体阐述这个问题。

  本文概述∶
  使用J2ME设计无线网络应用程序
  .发送一条超文本GET请求
  .发送一条超文本POST请求
  .使用J2ME进行无线网络编程

  Java的网络编程能力是相当健壮的。Java 2标准版( J2SE)在java.io和java.net程序包中定义了100多个接口程序,类和异常。通过这些库实现的功能是很强大的,但是这只适用于传统的计算机系统,这些计算机系统有强大的CPU处理能力,快速的内存和持久的数据储存,但是这些在大多数的无线设备上是不现实的。因此,J2ME定义了这些函数的子集,并提供了一套用于网络和文件访问的固定的程序包--- javax.microedition.io程序包。由于可移动设备种类繁多,这个程序包仅仅定义了一套接口,而为每个可移动设备供应厂商留下了实际的应用程序接口实现。这就在可移植性和设备特定特征的应用中找到了一个最佳的平衡点。

  定义在javax.microedition.io类中的抽象网络和文件输入输出框架称为通用连接框架(Generic Connection Framework,简称GCF)。GCF定义了一套有关抽象化的内容来描述不同的通信方法。最高级的抽象被称作连接(Connection),还声明了六个接口(四个是直接的,两个是间接的)。这七个接口就构成了J2ME的CLDC的一部分,CLDC是大多数的能使用Java的无线设备使用的配置。设计这个配置的目的就是为所有的CLDC设备(手提电话,双向传呼机,低档的PDA等等)提供公用的网络和文件输入输出能力。虽然GCF的目的是公用网络和文件输入输出框架,但是生产商并不要求实现GCF中声明的所有的接口。有的厂家可以决定只支持socket连接,而其它的厂家可以选择只支持基于数据报的通信。为了促进跨越类似装置的可移植性,MIDP规范要求所有的MIDP设备实现HttpConnection接口。HttpConnection不是GCF的一部分,但是它是从GCF的一个接口ContentConnection衍生出来的。我们将使用HttpConnection接口构造我们样本应用程序。

  

发送一个HTTP GET请求


  这一节将重点解释程序代码,在下一节中我们将只讲述被用来发送HTTP请求并检索由服务器返回的响应通用连接框架接口和HttpConnection接口。创建MIDP用户界面的程序代码见附录。

  我们先要定义一个方法来放用于发送HTTP GET请求的代码。因为这个方法中的有些操作有潜在的抛出IOException的可能,所以我们将把这样的意外(exception)抛给调用方法。

public String sendHttpGet( String url ) throws IOException {;
HttpConnection hcon = null;
DataInputStream dis = null;
StringBuffer message = "";
try {;


  第一步是使用Connector类打开一个到服务器的连接,这是GCF的关键。我们将把这个连接强制转换为需要的类型,在本例中为HttpConnection类型。

hcon = ( HttpConnection ) Connector.open( url );


  接下来,我们得到HttpConnection上的一个DataInputStream,允许我们一个字符一个字符的读取服务器的响应数据。

dis = new DataInputStream( hcon.openInputStream() );

  使用DataInputStream的read ()方法,服务器响应的每个字符都被集中起来放入StringBuffer对象。

int ch;
while ( ( ch = dis.read() ) != -1 ) {;
message = message.append( ( char ) ch );
};


  最后,连接对象被净空以保存资源,而信息从这个方法中返回。

}; finally {;
if ( hcon != null ) hcon.close();
if ( dis != null ) dis.close();
};//结束try/finally代码段
return message.toString();
};//结束 sendGetRequest( String )

  
如何发送一个HTTP POST请求


  你可以想象,发送一个HTTP POST请求的处理过程其实与发送一个GET请求非常地类似。我们将修改一个现有命令,添加少量的新的命令,并添加一个来自通用连接框架的附加的对象和一个附加的StringBuffer对象把POST请求体重的内容发送到服务器中。剩下的命令将保持不变。

  复制我们刚才创建的sendHttpGet()方法,把它粘贴进同一个类文件,改名为sendHttpPost()。 现在,我们将修改这个新方法来发送一个HTTP POST请求到服务器。 在方法的顶部添加两个新的变量说明。 声明一个类型为DataOutputStream的变量和另一个String类型的变量。 我们将使用DataOutputStream对象把存在于字符串变量中的POST请求体发送到服务器中。

DataOutputStream dos = null;
String requestBody = null;

  修改connector.open()命令包含另一个参数,指出连接将允许客户端可以通过连接在服务器上读和写。

hcon = ( HttpConnection ) Connector.open( url, Connector.READ_WRITE );

  设置HttpConnection对象使用的请求方法为POST(默认的方法是GET)。

hcon.setRequestMethod( HttpConnection.POST );

  得到一个用于现有的HTTP连接的DataOutputStream对象。

dos = hc.openDataOutputStream();

  声明一个字节数组并通过检索一个来自requestBody字符串的字节数组初始化。 然后把DataOutputStream的缓冲写入字节数组内。

byte[] byteRequest = requestBody.getBytes();
for( int i = 0; i < byteRequest.length; i++ ) {;
dos.writeByte(byteRequest);
};//结束for( int i = 0; i < byteRequest.length; i++ )

dos.flush(); //包含本句,在某些设被上将可能会产生不可预期的结果

  调用flush ()方法的意图是发送已经写入的数据到DataOutputStream的服务器的缓冲区中。 在某些电话上,这个操作工作正常,在其他的电话上,它导致HTTP请求的Transfer - Encoding被设置为" chunked ",有一些随机字符被放到请求本身的前面和后面。那又怎样处理这个问题呢?这个方法调用实际上是根本不需要的。在接下来的一行中,服务器连接打开(通过openInputStream ()),将自动输入缓冲区。因此,你最好不要调用缓冲区的flush()方法。这个方法其余的部分保持不变,除了DataOutputStream对象必须在finally{;};语句块中关闭。

}; finally {;
if ( hc != null ) hc.close();

if ( dis != null ) dis.close();

if ( dos != null ) dis.close();
};//结束 try/finally


  这就是所有的程序代码!并请参见本文后附带的程序代码。

  随着可以使用国际互联网络和支持网络的无线设备日益的增多普及,Java和J2ME的重要性也在不断的变大。因为HTTP协议是当前仅有的,被所有的遵从MIDP规范的设备支持的网络协议,它也是用于开发无线网络应用程序的最好的候选者。

  在本文中,我们探究了无线网络编程的基本结构和几个核心问题,我们看了如何调用两个最常用的HTTP请求方法:GET和POST。J2ME仍然在它的发展初期,并且无线设备也即将得到大面积的普及。所以,所有有志投身于无线网络编程中的开发者们将得到大展拳脚的好机会。

  附录:

/*
* HttpMidlet.java
*/
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.io.*;
import java.io.*;


public class HttpMidlet extends MIDlet implements CommandListener {;
//使用默认的URL。用户可以从图形用户接口改变这个值
private static String defaultURL = ";;

// 主MIDP 显示
private Display myDisplay = null;

// 输入URL的图形用户接口组件
private form requestScreen;
private TextField requestField;

// 用于提交请求的图形用户接口组件
private List list;
private String[] menuItems;

// 用于显示服务器响应的图形用户接口组件
private form resultScreen;
private StringItem resultField;

//用于requestScreen的"send"按钮
Command sendCommand;
// 用于requestScreen的"exit"按钮
Command exitCommand;
// 用于requestScreen的"back"按钮
Command backCommand;

public HttpMidlet(){;
// 初始化图形用户接口组件
myDisplay = Display.getDisplay( this );
sendCommand = new Command( "SEND", Command.OK, 1 );
exitCommand = new Command( "EXIT", Command.OK, 1 );
backCommand = new Command( "BACK", Command.OK, 1 );

//显示请求的URL
requestScreen = new form( "Type in a URL:" );
requestField = new TextField( null, defaultURL, 100, TextField.URL );
requestScreen.append( requestField );
requestScreen.addCommand( sendCommand );
requestScreen.addCommand( exitCommand );
requestScreen.setCommandListener( this );

// 选择想要的HTTP请求方法
menuItems = new String[] {;"GET Request", "POST Request"};;
list = new List( "Select an HTTP method:", List.IMPLICIT, menuItems, null );
list.setCommandListener( this );

// 先是从服务器上收到的信息
resultScreen = new form( "Server Response:" );
resultScreen.addCommand( backCommand );
resultScreen.setCommandListener( this );

};//结束HttpMidlet()

public void startApp() {;
myDisplay.setCurrent( requestScreen );
};//结束 startApp()

public void commandAction( Command com, Displayable disp ) {;
// 当用户点击"send"按钮
if ( com == sendCommand ) {;
myDisplay.setCurrent( list );
}; else if ( com == backCommand ) {;
requestField.setString( defaultURL );
myDisplay.setCurrent( requestScreen );
}; else if ( com == exitCommand ) {;
destroyApp( true );
notifyDestroyed();
};//结束 if ( com == sendCommand )

if ( disp == list && com == List.SELECT_COMMAND ) {;

String result;

if ( list.getSelectedIndex() == 0 ) // 发送一个 GET 请求到服务器
result = sendHttpGet( requestField.getString() );
else // 发送一个 POST 请求到服务器
result = sendHttpPost( requestField.getString() );

resultField = new StringItem( null, result );
resultScreen.append( resultField );
myDisplay.setCurrent( resultScreen );
};//结束if ( dis == list && com == List.SELECT_COMMAND )
};//结束 commandAction( Command, Displayable )

private String sendHttpGet( String url )
{;
HttpConnection hcon = null;
DataInputStream dis = null;
StringBuffer responseMessage = new StringBuffer();

try {;
//使用READ权限的标准的 HttpConnection
hcon = ( HttpConnection )Connector.open( url );

//从HttpConnection取得一个 DataInputStream
dis = new DataInputStream( hcon.openInputStream() );

// 从服务器上取回响应
int ch;
while ( ( ch = dis.read() ) != -1 ) {;
responseMessage.append( (char) ch );
};//结束while ( ( ch = dis.read() ) != -1 )
};
catch( Exception e )
{;
e.printStackTrace();
responseMessage.append( "ERROR" );
}; finally {;
try {;
if ( hcon != null ) hcon.close();
if ( dis != null ) dis.close();
}; catch ( IOException ioe ) {;
ioe.printStackTrace();
};//结束try/catch
};//结束try/catch/finally
return responseMessage.toString();
};//结束sendHttpGet( String )

private String sendHttpPost( String url )
{;
HttpConnection hcon = null;
DataInputStream dis = null;
DataOutputStream dos = null;
StringBuffer responseMessage = new StringBuffer();
// 请求体
String requeststring = "This is a POST.";

try {;
// 使用读写权限的 HttpConnection
hcon = ( HttpConnection )Connector.open( url, Connector.READ_WRITE );

//设置请求方法为POST
hcon.setRequestMethod( HttpConnection.POST );

// 取得发送请求字符串的DataOutputStream
dos = hcon.openDataOutputStream();
byte[] request_body = requeststring.getBytes();

// 发送请求字符串到服务器
for( int i = 0; i < request_body.length; i++ ) {;
dos.writeByte( request_body );
};//结束 for( int i = 0; i < request_body.length; i++ )

// 取得做为接收服务器响应的DataInputStream
dis = new DataInputStream( hcon.openInputStream() );

// 从服务器上取回响应
int ch;
while( ( ch = dis.read() ) != -1 ) {;
responseMessage.append( (char)ch );
};//结束while( ( ch = dis.read() ) != -1 ) {;
};
catch( Exception e )
{;
e.printStackTrace();
responseMessage.append( "ERROR" );
};
finally {;
// 释放输入输出流和HTTP连接
try {;
if( hcon != null ) hcon.close();
if( dis != null ) dis.close();
if( dos != null ) dos.close();
}; catch ( IOException ioe ) {;
ioe.printStackTrace();
};//结束try/catch
};//结束try/catch/finally
return responseMessage.toString();
};//结束sendHttpPost( String )

public void pauseApp() {;
};//结束pauseApp()

public void destroyApp( boolean unconditional ) {;
myDisplay = null;
requestScreen = null;
requestField = null;
resultScreen = null;
resultField = null;
};//结束 destroyApp( boolean )
};//结束HttpMidlet
阅读全文(98) | 回复(2) | 引用通告(0)  by funson 发表于 2004-9-25 11:14:52

大致规划权限管理文章的框架:(RBAC/Web)

    1、浅述权限管理的现在

    2、重点论述RBAC

    3、结合实际进行设计

    4、自己的一些感受

参考:

   

  

  

http://icecloud.51.net/blog/archives/000147.html

正文:

1、浅述权限管理的现在

   对于在企业环境中的访问控制方法,一般有三种:

    第一种:授权(Authorization),也叫做自主型访问控制方法。目前在我国的大多数的信息系统中的访问控制模块中基本是借助于自主型访问控制方法中的访问控制列表(ACLs)。

    第二种:多级安全(Multilevel Security),也叫做强制型访问控制方法。用于多层次安全级别的军事应用。

第三种:基于角色的访问控制方法(RBAC),是目前公认的解决大型企业的统一资源访问控制的有效方法。

其显著的两大特征是:

1.减小授权管理的复杂性,降低管理开销。

2.灵活地支持企业的安全策略,并对企业的变化有很大的伸缩性。

访问控制的一般策略:(如图)

 2、重点论述RBAC

    下面是RBAC 原理结构示意图:

 

名词解释:

1、  USERS:可以是人,设备,进程。

2、  ROLE(角色):是指具有一定技能、可以执行某些工作的人员(或资源)集合。通过给成员赋予不同的角色,对成员的多职能进行表达,提供约束成员不同权限范围变化的依据。(是粗粒度和细粒度(业务逻辑)的接口)它具有层次关系和继承的特性。角色层次的上方是具有较高权限的角色,而下方则代表较低权限的角色。

3、  Permission(许可)描述了角色对OP OB 所具有的权限,其反映的是授权的结果。比如授予角色A 对资源B 有读的权限,则代表了一个许可的存在,这个许可表示:角色A获取了对资源B 读的许可。针对objectOB)来说,其描述的是permission object 之间的一种关联关系,而这层关系则表示了某一角色对某一资源客体(object)所具有的权限及权限状态;针对operationOP)来说,其描述的是permission operation 之间的一种关联关系,而这层关系则表示了某一角色对某一操作(operation)所具有的权限及权限状态

4、  Assignment(分配)分配(assignment)则包含两个方面,用户分配(user assignment)和许可分配(permission assignment)。用户分配表示的是,将用户或用户组分配给特定的角色。许可分配表示的是,为角色分配访问许可(访问object opertiaon 的许可)

5、  Sessions(会话):这跟WEB的SESSION的不同。这里的Session是用户与激活的角色集合之间的映射。

6、  Constraints(限制):对user分配角色或角色分配许可加入条件限制。如:1、在user分配角色时,可以根据需求,限制某些角色无法同时分配给同一个user.2、限制角色的user,如:总经理只能由一个担任。3、先决角色(prerequisite roles)。也就是在有这个角色之前必须要有一个角色存在。

上图中描述了一个会话代表某段时间user和role间的一个映射关系。User先透过建立的会话(可以不只一个)映射到role上,而角色再映射到事先被许可的许可上,这些映射都须满足存在于user、role、role层次间的限制。

RABC模型分为是个四个模型

1、Core RBAC

 

图中的ops代表operations  obs代表objects,叫客体,即规定的需要保护的资源,又称目标。

 2、Hierarchal RBAC

 

这个模型是在角色间衍生出层次性的关系。如图2,这样就可以把一些较为基本的权限分配给层次较为低的角色,再利用继承的方式继承权限,这样就免去了每个角色都要重复一些基本的权限分配行为,从而减轻了维护上的负担。

同时,Hierarchical RBAC 又可以分为:

1、           General Hierarchical RBAC(一般性层次模型):指上层的角色可以继承下层的所有权限,而且没有任何限制。

2、           Limited Hierarchical RBAC(限制性层次模型):指上层的角色继承下层的权限是有限制范围的。

后面两种模型是权责分离(Separation of Duty)的。权责分离主要是防止使用者拥有的权限过多,而造成资源滥用或者利益冲突(conflict of interest)的情况发生。

3、Static Separation of Duty Relations(静态权责分离)

    又称强互斥。指具有冲突的角色不能同时分配给同一个使用者,以避免利益冲突(conflict of interest)

4、Dynamic Separation of Duty Relations(动态权责分离)

 

 图中的DSD:Dynamic separation of duty的缩写。

   动态权责分离又称为弱互斥。指使用者可以同时拥有相互冲突的角色,但是使用者不能在统一时间担任。

   RBAC中的各个模型中,都是由一下成分所组成:

1、一些基本的元素。(a set of basic element sets)。

2、一序列的RBAC的关系,也包含了包含有效的笛卡儿积的子集。(a set of RBAC relations involving those element sets (containing subsets of Cartesian products denoting valid assignments

    3、一些映射功能。为一个给定的实例确定的一种元素中产生成员的实例。(a set of Mapping Functions which yield instances of members from one element set for a given instance from another element set.

3、结合实际进行设计

下面我就以时义浩维公司为例。在设计之前我们先要分清一些概念。

权限逻辑和业务逻辑?

业务逻辑就是情况由系统运行时的某些条件决定,如公司营销中心的直销部各成员进入系统只能看到自己所负责的区域销售记录,而权限逻辑?如直销部各成员不能看其他部门的成员的记录,这是有各自不同身份来决定的。

粗粒度:表示类别级,即仅考虑对象的类别(the type of object),不考虑对象的某个特

定实例。比如,用户管理中,创建、删除,对所有的用户都一视同仁,并不区分操作的具体对象实例。

   细粒度:表示实例级,即需要考虑具体对象的实例(the instance of object),当然,细

粒度是在考虑粗粒度的对象类别之后才再考虑特定实例。比如,合同管理中,列表、删除,需要区分该合同实例是否为当前用户所创建。

 

   系统设计的目标:

1、  直观,因为系统最终会由最终用户来维护,权限分配的直观和容易理解,显得比较重要。

2、  简单实用,包括概念数量上的简单和意义上的简单还有功能上的简单。想用一个权限系统解决所有的权限问题是不现实的。设计中将常常变化的定制特点比较强的部分判断为业务逻辑,而将常常相同的通用特点比较强的部分判断为权限逻辑就是基于这样的思路。

3、 扩展,采用可继承在扩展上的困难。系统可以根据公司的发展而相应的扩展,从而达到可维护性。

  系统设计的原则:

  权限逻辑配合业务逻辑。即权限系统以为业务逻辑提供服务为目标。相当多细粒度的权限问题因其极其独特而不具通用意义,它们也能被理解为是“业务逻辑”的一部分。

  系统设计的方案:

需要解决的问题:

1、销售部区域的问题;

2、查询、修改和新增,删除的问题;

  3、解决角色冲突的问题;

  4、不能造成数据冗余;

  5、操作流程要简洁,明了。

  数据库的设计:

  User (USER信息:userIDUser描述)

  RoleROLE描述:ROLEIDPole描述, PolePID

  RolePROLEP描述:RolePIDRoleP描述)

  SOD(角色冲突描述:SODIDRoleID,TYPE(其中D为动态冲突,S为静态冲突)

  PermissionPermission描述:PermissionIDPermission描述)

  UserRoleUser Role对应关系:UserIDRoleID

  RolePermissionRole Permission对应关系表:RoleID PermissionIDPermission范围)

权限用户角色示意图:

 工作流程:

 系统结构:

 

数据层:物理数据库

映射层:把对象映射成数据

控制层:通过对对象的操作从而达到对数据的操作。

界面层:为用户提供友好的界面输入。

系统界面:

1、  用户注册界面:

2、  用户分配权限界面

3、  登记角色冲突界面

系统的开发程序:

  系统开发利用了Tomcat容器和Hibernate

  前期先配置好Tomcat容器和hibernate

 

  控制层:

      用户信息类:UserInfo.java

      权限信息类:PermissionInfo.java

      角色信息类:RoleInfo.java

      添加用户类:AddUsers.java

      添加权限类:AddPermission.java

     

     

     

  映射层:

      把各个的表的字段映射为xml里的节点。

  操作层:

      可以利用script来实现一些验证。

第二种方案:

过滤方式(Filter):直接在前端读取数据进行相应的过滤来验证用户的身份。

第三种方案:

   在第一种方案的基础上,减去一个映射层。直接操作物理数据库。

4、自己的一些感受

1、  在权限系统设计中,有关于组的概念,要根据自己系统的要求而决定要不要引入组。

2、  在设计中要尽量去引入工作流的思想。

3、  数据库设计中,不要一味为了符合范式而使数据库变的很复杂,可以适当加入一些标记字段,以减少数据库的复杂性。

4、权限设计和组织结构的关系的问题的解决还没有研究透.

阅读全文(299) | 回复(1) | 引用通告(0)  by admin 发表于 2004-9-20 21:09:04

  WebWork是一个源代码开放的Web应用框架,用于简化基于Web的应用开发。本专栏介绍了WebWork并且描述了如何使用WebWork和JavaServer Pages(JSP)、Velocity两种技术来建立注册界面的过程。

Web 应用程序的设计开发是复杂并且费时的。然而,你能够通过运用一种框架处理常见的Web应用程序来简化开发流程。许多开源Web应用框架能够做到这一点甚至更好一些。这些开发框架中最好的一个就是WebWork,是开源项目中OpenSymphony组的一个Web应用开发框架。

   WebWork的最大优点是它的简单性和灵活性。WebWork有一个很小的API,它使开发者可以迅速进行开发工作。WebWork是许多特性和适用性的组合,包括使用variour view技术,例如JavaServer Pages(JSP),Velocity,Extensible Stylesheet Language Transformations 
Specification(XSLT)和JasperReporters。WebWork拥有一个活跃的社区,有许多文章、开发者和用户。

  注意:本文基于WebWork1.3.0 release candidate 2(RC2)。为了使用本文提供的例子,你需要在你的应用服务器的webapps目录下建立文件夹,将例子拷贝至新的文件夹下,同时将所需的jar文件从WebWork distribution拷贝至WEB-INF/lib目录。在此处下载WebWork和本文相关的源代码。

------
  Actions

   WebWork的一个最重要的特色就是Action接口。WebWork actions通过在页面(视图)和商业逻辑间提供mapping来控制Web应用程序流程。在WebWork中,提交窗体到一个action URI(Uniform Resource Identifier);这个URI指向一个相应的action;action执行;用户可以前进到相应的视图。

  下述class,LoginAction,是WebWork处理基于Web应用的注册窗体的例子。LoginAction扩展了ActionSupport。它是一个基类,提供了处理错误、视图映射、和许多有用的功能。
import webwork.action.*;

public class LoginAction extends ActionSupport
{
  private String userName;
  private String password; 

  public String getPassword()
  {
    return password;
  }

  public String getUserName()
  {
    return userName;
  }

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

  public void setUserName(String userName)
  {
    this.userName = userName;
  }

  public String doExecute()
  {
    return SUCCESS;
  }

  public void doValidation()
  {
    if (userName == null || userName.length() < 1) addError("UserName", "Please enter username.");
    if (password == null || password.length() < 1) addError("Password", "Please enter password.");
  }
}

LoginAction包括了两个JavaBean属性,password和username。WebWork把数据从属性中放置到你的视图中并且自动解析送到action的参数来设置属性值。

   LoginAction重载了ActionSupport的两个方法:doValidation()和doExecute()。doValidation()方法验证参数,doExecute()方法让用户前进到相应的视图。doExecute()方法返回一个字符串,如果所有的处理是成功的,返回常量success。如果有任何问题发生,在用户输入视图上返回常量input。在LoginAction的doValidation()方法中调用addError指出了一个认证问题并且让用户返回INPUT视图。

---------

  View mapping
 
  WebWork有两种方法从map到视图:通过一个Action.xml文件或者一个views.properties文件。每一种动作应该具有一个INPUT视图和一个SUCCESS视图。下述Action.xml文件定义了两个actions,loginJSP和loginVelocity。这两个action都使用了LoginAction类。如果LoginAction返回SUCCESS,这两个action使用LoginAction类并且使用户转向success.html。如果LoginAction返回INPUT,action转向相应的INPUT视图,或者login.jsp、或者login.vm;








  
    login.jsp
    success.html
  

  
    login.vm
    success.html
  

阅读(1604) | 评论(0) | 转发(0) |
0

上一篇:oracle的安装

下一篇:一个完整的vsftp服务

给主人留下些什么吧!~~