`

framework struts2 / uniportal

阅读更多

http://struts.apache.org/2.0.11.2/index.html

http://struts.apache.org/download.cgi#struts212

http://struts.apache.org/2.0.11.2/docs/home.html

http://apache.mirror.phpchina.com/struts/binaries/struts-2.0.11.2-all.zip

 

http://www.verycd.com/topics/210454/  

http://www.verycd.com/topics/117656/

JSP+DAO

http://www2.mldn.cn/down/mldnjava/demo/%E6%A1%88%E4%BE%8B-jsp+DAO%E5%AE%9E%E7%8E%B0%E7%95%99%E8%A8%80%E7%AE%A1%E7%90%86%E7%A8%8B%E5%BA%8F.rar

MVC+DAO

http://www2.mldn.cn/down/mldnjava/demo/%E6%A1%88%E4%BE%8B-mvc+dao%E5%AE%9E%E7%8E%B0%E7%95%99%E8%A8%80%E7%AE%A1%E7%90%86%E7%A8%8B%E5%BA%8F.rar

 

Windows下本地DTD( Document Type Definition )应用

project name :struts2

project libs :

(basic )commons-logging-1.1.jar

(basic )freemarker-2.3.8.jar

(basic )ognl-2.6.11.jar

(basic )struts2-core-2.0.6.jar

(basic )xwork-2.0.1.jar

(plugin )struts2-spring-plugin-2.0.11.2.jar

打开jar文件

struts2-core-2.0.11.jar>>>> struts-2.0.dtd扒出来放入

D:\workspace\struts2\WebRoot\WEB-INF\dtd\struts-2.0.dtd

struts2-spring-plugin-2.0.11.2.jar>>>> struts-plugin.xml扒出来放入

D:\workspace\struts2\WebRoot\WEB-INF\struts-plugin.xml

将xml中:

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd ">

修改为:

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "D:\workspace\struts2\WebRoot\WEB-INF\dtd\struts-2.0.dtd ">

或:

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "dtd\struts-2.0.dtd "> 

ok 


struts文件上传

http://hi.baidu.com/kukuyan/blog/item/12bad81696e6aa1d962b43c7.html

struts2 入门

http://chenshuang.iteye.com/blog/136527

Struts2 CRUD

http://www.iteye.com/topic/65208

Struts2 实现ip拦截

http://czp.iteye.com/blog/247679

 

最近在帮学校做一个网站,其中部分内容要求对校外IP的屏蔽但对校内IP开放,思考后决定实现基于struts2拦截器的IP拦截器,发上来跟大家一起交流··
基本思想:先将的IP地址转换成long型的数,然后比较IP的大小来判断是否处在符合条件的IP地址段。
IP地址转化成long型数的算法:

Java代码 复制代码
  1. public   long  getIP(InetAddress ip) {  
  2.         byte [] b = ip.getAddress();  
  3.         long  l = b[ 0 ] << 24L & 0xff000000L | b[ 1 ] << 16L & 0xff0000L  
  4.                 | b[2 ] << 8L &  0xff00  | b[ 3 ] << 0L &  0xff ;  
  5.         return  l;  
  6.     }  
public long getIP(InetAddress ip) {
		byte[] b = ip.getAddress();
		long l = b[0] << 24L & 0xff000000L | b[1] << 16L & 0xff0000L
				| b[2] << 8L & 0xff00 | b[3] << 0L & 0xff;
		return l;
	}



在struts2相应的action中编写如下判断是否用户是校内用户的方法(方法参数中ip1的IP大小应该大于ip2的IP大小):

Java代码 复制代码
  1. public   void  isSchoolUser(String ip1, String ip2)  throws  Exception {  
  2.          // 得到用户的IP地址   
  3.         String s = ServletActionContext.getRequest().getRemoteAddr();  
  4.         long  l = getIP(InetAddress.getByName(s));  
  5.          // 设置IP地址段   
  6.         long  l1 = getIP(InetAddress.getByName(ip1));  
  7.         long  l2 = getIP(InetAddress.getByName(ip2));  
  8.          // 判断用户IP是否处在IP段中   
  9.         if  (l >= l1 && l <= l2) {  
  10.         ActionContext.getContext().getSession().put("isSchoolUser" , "yes" );  
  11.         }  
  12.     }  
public void isSchoolUser(String ip1, String ip2) throws Exception {
		 // 得到用户的IP地址
        String s = ServletActionContext.getRequest().getRemoteAddr();
		long l = getIP(InetAddress.getByName(s));
         // 设置IP地址段
		long l1 = getIP(InetAddress.getByName(ip1));
		long l2 = getIP(InetAddress.getByName(ip2));
         // 判断用户IP是否处在IP段中
		if (l >= l1 && l <= l2) {
	    ActionContext.getContext().getSession().put("isSchoolUser","yes");
		}
	}

上面的方法中用到了InetAddress,所以需要引入java.net.InetAddress包;
接着再编写IP拦截器如下:

Java代码 复制代码
  1. public   class  IpAuthorityInterceptor  extends  AbstractInterceptor {  
  2.     public  String intercept(ActionInvocation invocation)  throws  Exception {  
  3.         ActionContext context = invocation.getInvocationContext();  
  4.         Map<String, String> session = context.getSession();  
  5.         if  ( "yes" .equals(session.get( "isSchoolUser" ))){  
  6.             return  invocation.invoke();  
  7.         } else  {  
  8.             context.put("AuthorityError" "你是外网用户无法访问此资源" );  
  9.             return   "error" ;  
  10.         }  
  11.     }  
  12. }  
public class IpAuthorityInterceptor extends AbstractInterceptor {
	public String intercept(ActionInvocation invocation) throws Exception {
		ActionContext context = invocation.getInvocationContext();
		Map<String, String> session = context.getSession();
		if ("yes".equals(session.get("isSchoolUser"))){
			return invocation.invoke();
		} else {
			context.put("AuthorityError", "你是外网用户无法访问此资源");
			return "error";
		}
	}
}



最后当然是配置IP拦截器,让它为你工作吧:

Xml代码 复制代码
  1. < interceptors >   
  2.             < interceptor   name = "IpAuthorityInterceptor"   
  3.                 class = "web.IpAuthorityInterceptor" >   
  4.               <!--此class对应你项目中的IpAuthorityInterceptor的编写位置-->   
  5.             </ interceptor >   
  6.             < interceptor-stack   name = "IpAuthority" >   
  7.                 < interceptor-ref   name = "defaultStack" > </ interceptor-ref >   
  8.                 < interceptor-ref   name = "IpAuthorityInterceptor" > </ interceptor-ref >   
  9.             </ interceptor-stack >   
  10.         </ interceptors >   
<interceptors>
			<interceptor name="IpAuthorityInterceptor"
				class="web.IpAuthorityInterceptor">
              <!--此class对应你项目中的IpAuthorityInterceptor的编写位置-->
			</interceptor>
			<interceptor-stack name="IpAuthority">
				<interceptor-ref name="defaultStack"></interceptor-ref>
				<interceptor-ref name="IpAuthorityInterceptor"></interceptor-ref>
			</interceptor-stack>
		</interceptors>

 

此时在你的action中加入相应的配置就可以使用该IP拦截器了

 

Struts Action线程安全的是基于struts2的,而说线程不安全的是基于struts1的。 
总结: 
struts1中,每一个Action在web容器中只会有一个实例,因此它是不安全的(我们必须明白什么样的变量是线程安全的,方法内的局部变量和方法的参数变量都是线程安全的,所以即使系统只启用一个Action对象为所有线程服务,因为Form对象对每个请求来说都是单独创建的,而且是做为参数传到Action里,所以Form对象一定是线程安全的. )只要在Action中不使用实例变量就可以避免线程不安全的问题了。 
struts2中,Action是多实例的,每一个请求会创建一个action。 
Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能做的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的;Struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题 。 
Servlet也是线程不安全的。有关于Servlet的线程安全问题请看这篇文章:http://www.yesky.com/334/1951334.shtml。

 

WebSphere 6.1 上 struts2 程序无法找到Action 解决方法

WebSphere升级到6.1.0.5 以后所有struts2的程序都会发生Action找不到的情况,解决方法如下,服务器>应用程序服务器>[选择所使用的服务 器]>Web 容器设置>Web 容器>定制属性,增加名称为“com.ibm.ws.webcontainer.invokefilterscompatibility”

的定制属性,值为true。

 

华为 uniportal MVC

http://unionportal.huawei.com

Uniportal 平台和baseline版本基础之上进行WESMAP开发,完成营业厅操作员、个人用户、集团操作员等管理界面开发

.screen 后缀名

action / ejbaction

较多的配置文件

什么是JAVA,什么是UNIPORTAL

http://blog.csdn.net/UB/archive/2004/06/24/24673.aspx

 

    前言:

   本文是根据我的工作经验。主要介绍 JAVA 的编程思想,框架等概念,并且根据我对 uniportal 2 周学习,介绍 uniportal 的相关概念。本文不对 uniportal 的具体使用进行说明,请参看相关文档。本文主要目的在于编程技术和思想的交流,难免有错误之处,恳请指正。

 

1.         什么是 JAVA

JAVA 是种编程语言,但他不仅限于一种语言,他的流行告诉我们,他是一种编程思想的革新,也是网络应用的主力。

 

JAVA SUN 公司在上世纪 90 年代初推出,最早的应用是嵌入式的小应用,比如,微波炉,遥控器等家电,满足独立于平台的需要。后来随着 Internet 的发展,从 JAVA Applet WEB 应用开始流行。以前的编程大多基于某种特定平台(操作系统),但是随着网络的发展,跨平台,可移植性的需求变得很迫切。“应用软件”发展的根本是要脱离硬件平台和操作系统平台的,这也是 JAVA 越来越流行的主要原因。

 

(说明: JDK JAVA 的基本开发包(也就是 API ),主要由 SUN 提供( IBM 也提供,稍有不同)。 JDK1.0 以前叫 JAVA JDK1.1 以后变化很大,一般叫 JAVA2 。)

JAVA 的编程技术基本上是开源的, JAVA 的发展非常快,目前 JAVA 的应用主要有 3 个方面:

(1)       J2ME JAVA2 小应用平台。主要是手机, PDA 等终端上的应用,如手机游戏等无线方面的应用,主要使用 MIDlet

(2)       J2SE JAVA2 标准应用平台。基础的 JAVA 编程核心包,包括 swing awt )界面编程, util 工具包, JDBC 数据库编程等。

(3)       J2EE JAVA2 企业级应用平台。主要的企业级网络应用平台,常说的三层(或者 N 层)架构就是说这个平台。包括 EJB JSP SERVLET 等。

 

注意:上面所说的 J2EE 等,是说“平台”(或者环境),我的理解是:与业务无关的软件语言系统平台,一种编程环境(其实就是一组 API JAVA 语言的实际运用环境)。他是在操作平台(即操作系统)与业务应用平台(即框架,后面会说到)的中间的基础操作层。

 

 

2.         软件为什么要分层?

软 件开发的发展必然带来可复用性,和可扩展性的需求不断增加,这与其他行业是一样的,人们总是不喜欢大量的重复劳动。而分层的根本目的就是把工作细分,职责 明确划分。这样就可以把一个大系统划分成若干个部分的子系统,从而我们可以根据不同需求,复用这些子系统,或者扩展这些子系统。这也是软件的目标:“高内 聚,低耦合”。子系统“高内聚”,层与层之间“低耦合”。很多人经常说的“脱耦”,就是指降低耦合度,减少层与层之间的关联性,从而提高复用性和扩展性。

 

   常见的 JAVA 应用,不仅仅是 BS 的结构。一般的三层架构是指:客户应用层,商业逻辑层,数据层。这其中每一层又可以根据具体应用分层若干层。

  1 )客户应用层,对于网络应用常见的客户端是使用浏览器( Browser ),所以常见的是使用 JSP BS 应用。不过,客户端也可以使用 GUI ,而且 JAVA GUI 做出来是很漂亮的,他可以通过 JAVA WEB START 进行增量下载,他与服务器短的连接与 JSP 没什么区别。对于 uniportal 而言,这也是为什么需要 WEBAction ,又需要 EJBAction 的原因,因为 WEBAction 是客户层的东西,你可以根据需要把 JSP 的东西换成 GUI ,而 EJBAction (商业逻辑层)不用变。

  2 ) 商业逻辑层,是很重要的一层。因为对于大多数应用系统,客户端和数据层是比较简单的,而商业逻辑是最复杂的。特别是大型行业软件,如:地税。不把商业逻辑 层脱离开,那么整个系统的编程是很困难的,而且,维护的难度是无法想象的。这也是其他很多语言的弱点,不能把商业逻辑层分离,软件如果要升级,比如数据库 升级更换,很可能带来整个系统的重做。这对一个几千万的软件项目是很难容忍的。

  3 )数据层,我们目前常用的数据存储是使用关系型数据库,他的发展已经有很长的历史,而且已经很壮大。但是他与面向对象的编程是不协调的。打个比方:你家有 2 辆车,关系型数据库的做法是把 2 辆车的轮子拆下来放在一个表里,把方向盘拆下来放在另一个表里,把座位拆下来放在另一个表里 …… 而面向对象的编程,在保存的时候,需要把一辆车开进车库放起来,在使用的时候,可以把整辆车开出来使用。显然,我们更喜欢面向对象的存储方式。所以, JAVA 里有很多, O/R Mapping 的工具,用它实现对象与关系数据库的映射,比如 EJB Entity Bean ), Hibernate 等。这也是编程技术的一种革新,一个飞跃。另一方面,对象型数据库也发展了好几年了(很多是基于 XML 的),但是据我所知,困难重重。主要是性能和效率上的问题很难解决,而这是关系型数据库的特长,比如:各种复杂的查询。

 

 

 

3.         什么是面向对象( OO )?

    JAVA 是真正面向对象的编程语言,你可能会说, JAVA 中也有 8 种基本类型, int char double 等,那不是对象。是的,他们不是对象,他们其实是“关键字”,不过,他们都有对应的包装类 Integer Character ,这些都可以作对象使用。 JAVA 只是从效率上考虑而使用他们。

 

对象是什么?我认为,对象就是一种类型的实例化。他的基本特征就是:封装性,继承性,动态性。(注意,类和类型是指同一个意思,经常混用)。举个例子:人就是一种类型,男人就是他的继承类型,而男人张三就是个对象,他是个具体的实例,他有具体的身高,体重,年龄等属性值。

实际上,类是一种类型定义,他有属性名称定义,但是没有状态(即属性值),而对象对象就是给类型附上状态(即属性值) , 在计算机里也叫“实例化”,就是给这些状态值分配内存空间。

对于大多数操作系统,对象的内存空间是分配在“堆”上的,他是不连续的内存空间,因为你无法知道一个对象的实际大小,大小是用户自己定义的。而基本类型,比如 int char ,的内存空间是分配在“栈”上的,他是连续的内存空间,因为这些类型是固定大小的,他的大小在每种机器上都有规定。( JAVA 因为跨平台,所以基本类型的大小是固定的,比较大,而且对类型的要求很严格,是强类型语言)。

在“堆”上把数据取出来,自然要比从“栈”上取数据慢,所以, JAVA 相对是比较慢的,他也很消耗内存。不过,硬件发展已经很快,而且对于企业级应用,一般都是数个 CPU ,数 G 内存,乃至集群服务器的使用,所以,对性能的约束不是很强。

 

 

面对对象一般是指面向对象的编程,但是我认为,面向对象的核心是面向对象的设计( OOD )。

与面向对象对应的是面向过程的编程,比如 C

面向对象核心是对象,他是自底向上的编程,以对象为核心,组织对象关系,去添加业务逻辑。

面向过程的核心是过程,他是自顶向下的编程,以业务流程为核心,围绕过程去组织数据。

对 于应用软件而言,我们需要面向对象的设计,因为,应用软件的业务流程是变化多端的,很多时候客户自己也不能描述清楚他需要的软件流程,他们原来是手工办 公,他们无法理解软件原理,自然无法用软件思想描述清楚业务流程。而业务的核心其实是业务对象(或者说“实体”),因为对象和对象之间的关系才是业务最根 本的东西,是不易变的东西。

 

其实我觉得,软件应该分为系统软件和业务软件。

1 )系统软件:目的是控制机器或者帮助你控制机器, C/C++ 很合适。他关心的是“物理模型”,是系统流转的过程细节。

2 )业务软件(或者应用软件):目的是构建客户业务流程,组织业务数据。具体说就是存取、分析业务数据。 JAVA 很适合,他关心的是“对象模型”,是对象与对象之间的关系。

 

另外,近期还有一种编程模式叫 AOP ,面向方面的编程,很流行。我认为他是面向对象的一种补充。他是更高一层的编程模式,他的核心是面向某一方面的应用,可以说面向对象和面向过程的编程都是纵向的思路 , 而面向方面的编程就是一种横向编程的编程模式。小到系统内的综合查询,大到某一领域的应用 , 如网络搜索( GOOGLE ),或者行业软件,如地税,银行 .( 这又类似于另一个技术 Web Service , 不过 WebService 是一种远程的软件服务方式 , AOP 是一种编程方法和思路 , 而且 JBOSS 已经开始支持他 , 有文章介绍 JBoss 4.0 带了一个 AOP 框架。 )

因为,我们不断想要提高软件复用性,不断想要把软件做成模块化,组件化,就像搭积木一样可以拼装成一个系统,这种模块化的“粒度”越来越大,就形成了某个方面,或者某个行业领域的复用,比如,你可以直接调用 GOOGLE 服 务接口做搜索,调用银行服务接口做金融处理。这是软件编程思想的又一次革新。面向对象是基础,但他一般在小范围内使用,因为范围大了对象关系太复杂,而且 内聚性太高会带来子系统之间的协调困难,这样会带来大范围(粗粒度)的连接使用困难,比如大系统内的综合查询会涉及到各个子系统的查询,分开做是不明智的 而且困难的。而面向方面的编程正是这种问题的解决思路。

 

   由上所述,可以看出编程语言不仅仅是技能的不同,更深入的是编程思想的不同。

我 以前在的都是小公司,做业务软件,系统内的各个部分我都要关心,所以我有这种想法,其实那就是“小作坊”的生产方式。华为的情况不一样,华为已经形成了一 个“软件产业”,有清晰的生产流水线,每个部门都负责自己的那部分的工作,这样带来很高的生产效率,但是,对于每个环节可能不需要多少编程思想了,最重要 的是熟悉业务。

   但是 JAVA 是软件发展的趋势,有很有多先进性(我说的是思想的先进性)。所以我想,我们可以多关注一些 JAVA 方面的软件思想,比如设计模式,框架等,他对于我们解决实际问题很有好处。

 

  另 外,改变编程思想对我们现在的工作,代码的维护很重要。我目前看到的软件文档,大多是需求规格说明,物理模型,那些东西根本看不到代码的组织结构,那么多 代码又很难一行行去分析,这样的系统代码很难维护,而且我看不到每个模块之间的关系,如果我以前不参加这个项目,就很难进行扩展,这对软件产品是非常不利 的。所以,对于软件,使用 UML Rational Rose )描述,远比使用物理模型( Viso )描述要重要。

   UML 是什么?他是统一模式语言,是几个软件牛人想出来的工具。其实就是描述软件的图形语言。看图永远比看文字要直观,而且,看图更容易反映代码之间的关系。

举个例子:

软件需要的主要 UML 描述举例:

用例图:

 

活动图:(一般以时序图替代,他们可以相互转换。)

 

 

类图:

 

 

    如上所示,你可以很容易看清楚系统的结构,所用到的类以及方法都很明白,系统的设计思路,设计模式一目了然,要维护就很方便,更重要的是他让你的设计思路清晰,功能之间的关系明确,可以把系统做到最大程度的优化。如果让我去看长篇的 WORD 说明文档,我很容易头晕,而且,依赖需求文档和物理模型(仅仅描述硬件层的结构,以及简单的数据流向),你怎么保证你的系统的是正确的?并且是有效的?

  软件产品最重要不是能用,而是好用。因为客户不懂软件,但是软件维护,推广还是我们自己做,软件好不好,只有自己知道。

 

 

 

4.         什么是模式?什么是框架?

这两个概念都很模糊,这里简要说明,只是个人观点,仅供参考。

 

  设计模式:软件的设计模式来源于建筑工程,随着一个行业的成熟,需要大量规范化的模板,而且在处理很多问题的时候,会出现很多重复的问题,经过不断的经验总结,把一些好的问题解决方法归纳出来就形成了“模式”。

模式有很多层面的模式,有软件开发过程管理模式,比如: RUP (统一软件过程), XP (极限编程)。有编程模式,最出名的就是“四人帮”(四个软件牛人)写的 23 种设计模式。《设计模式》这本书的中文版是机械工业出版社出版的(他是用 C ++举例的),可以说是软件人员必备手册,不过,很多人(包括我)都有一个反映就是“看不懂”,呵呵。其他还有《 JAVA 与模式》是一个华裔博士写的,初学者很适合。常见的模式有“工厂方法”,“抽象工厂”,“代理模式”,“门面模式( facade )”,“单例模式( singleton ”等。关于 JAVA 与模式的书籍现在也是多如牛毛,我只是初级应用者。

 

框 架:他是某些特定领域系统的半成品。他可以帮助你封装解决很多底层问题,比如事务处理,用户安全等,他的主要作用是使系统结构稳定,约束代码人员的代码。 就好像是一个房子的骨架,代码人员只需要根据业务往里面填业务逻辑代码。而且很多具体处理细节由框架处理,对代码人员是透明的,代码人员只要继承相应的“ 基础类”就可以了,(这些“基础类”就是框架。)

模式是一种抽象概念和工作方法,而框架是一种实际使用的代码集合。

常见的框架有 STRUTS WEB 应用, APACHE 子项目), Hibernate(O/R Mapping 使用,很好的东西,由一个叫 Gavin King 的牛人为主开发的 ) TCF JAVA GUI 框架,要收费的。)

下面主要说一下 WAF 框架:

2000 年左右, SUN 为了推出 J2EE 这个平台,就要介绍 J2EE 的核心 EJB 的应用,他做了一个样例 PetStore (网上宠物店的电子商务应用),来说明这个东西,这个系统使用的框架就叫 WAF Web Application Framework )。

先简单说一下 EJB 是什么,他是企业级 JAVA Bean Entity Java Bean )。他与普通的 JAVA 应用的最大不同之处就是他支持分布式处理,就是说 EJB 可以分别发布在不同的应用服务器上。他包括 3 个部分,

(1)       Session Bean :做商业逻辑处理,内置事务,缓存等处理。

(2)       Entity Bean :做数据实体对象映射,即 O/R Mapping ,并且内置了事务处理,“状态机”机制等很多复杂功能,但是太高级了,性能一直是个问题,所以后来 SUN 又推出一个轻量级的东西叫 JDO 。但是,很多人(包括我)都喜欢用 Hibernate

(3)       Message Driver Bean :做消息驱动处理,主要是异步的消息处理。

(说明:一般来说,支持

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics