网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  学习jakarta struts 1.1 (三)     
  文章作者:未知  文章来源:水木森林  
  查看:78次  录入:管理员--2007-11-17  
 
  在第一篇文章《jakarta struts简介》中,我大致分析了struts框架,讨论了它所能完成的功能,还浏览了组成struts的各个组成部分。在第二篇文章《学习jakarta struts》中,我开始详细描述如何利用struts来构建一个简单应用的过程步骤。而本篇文章将会向大家演示如何将applicationresource文件中的文本信息,通过struts标签在jsp页面中显示出来。
  action类是连接struts架构和应用中业务逻辑代码的桥梁。所以你应该尽可能让action类小巧简单,因为真实应用中的逻辑处理应该是由单独分离出来的逻辑层来完成的。如果你正在从事n层应用的开发,你当然希望层与层之间的接口越简单越好。而事实上,action类中的主要方法"perform()"(1.1中为execute())却有点暗示应该在本方法中做点什么的意思。我们知道,每个action类都需要从 org.apache.struts.action.action 继承而来。在小型应用中,我们的action类很可能就只要继承org.apache.struts.action.action就足够了;而在某些特定的复杂应用中,我就从我们所实现的action类中总结出来了一些通用特性。因此,在我看来,构造一个基类将这些通用特性的代码实现出来,让应用中所用到的所有action类不直接继承org.apache.struts.action.action,而继承这个完成了一些通用特性的基类以实现代码重用,是一个相当不错的设计。我在strutssample中就应用了这种方法,构造了这样的一个基类,该基类的方法在完成复杂逻辑的和简单转发请求的action类中都可以使用。
  
  package com.oreilly.actions;
  
  import java.io.ioexception;
  import java.util.properties;
  import java.util.resourcebundle;
  import java.util.missingresourceexception;
  import java.util.enumeration;
  import java.util.properties;
  import java.rmi.remoteexception;
  import javax.ejb.ejbhome;
  import javax.ejb.createexception;
  import javax.naming.context;
  import javax.naming.initialcontext;
  import javax.naming.namingexception;
  import javax.servlet.servletexception;
  import javax.servlet.http.httpservletrequest;
  import javax.servlet.http.httpservletresponse;
  import org.apache.struts.action.action;
  import org.apache.struts.action.actionservlet;
  import org.apache.struts.action.actionform;
  import org.apache.struts.action.actionforward;
  import org.apache.struts.action.actionmapping;
  
  这个类就是使用struts开发时,所有action类都要继承的基类。它把一些通常在实际应用中最有可能被用到的东西都考虑进来了。就这篇文章而言, 类中一些与struts并不是太紧密相关的方法将只做注释而不会完整的实现,而从事开发工作的你,有兴趣的话,请完成这些方法并应用这个类,将为你在实际项目中的开发快马加鞭。注意,因为所有的action类都要从org.apache.struts.action.action 继承而来,所以我们的这个类同样。
  public abstract class abststrutsactionbase extends action {
   / * 定义一些在struts-config.xml中记录在案的
    * 全局应用中皆可可通用的forward标识*/
   protected static final string success = "success";
   protected static final string failure = "failure";
   protected static final string error = "error";
   protected static final string login = "login";
   protected static final string confirm = "confirm";
   protected context jndicontext = null;
  
   /**
    * 默认构造方法
    */
  
   public abststrutsactionbase() {
  }
  
  /**
  下面这个查找ejb实例的方法将不会完整实现。
  一般来说,action类应该调用实现了应用的商务逻辑的ejb会话bean(或仅仅普通javabean)。在大型项目中,开发人员必须划清层与层之间的界限。在action类中,我们应该拿到获取含有jndi信息的环境的实例,然后通过ejb的jndi名字去查询获取它的home接口。过程并不简单,所以下面这个代码片断只是个给出了必要实现的小例子。
   参数类型string,传入的要查询jndi的名字
   返回类型object,即查找到的home接口
   如果查找失败,抛出namingexception异常
   如果获取资源信息失败,抛出missingresourceexception异常
  */
  
  public object lookup(string jndiname)
    throws namingexception, missingresourceexception {
   // 为调用ejb对象,通过构建记录jndi信息的properties对象
   // 来获得初始环境信息
    if (jndicontext == null) {
     resourcebundle resource =
      resourcebundle.getbundle("strutssample.properties");
    properties properties = new properties();
     properties.setproperty(
      context.initial_context_factory,
      resource.getstring(context.initial_context_factory));
    properties.setproperty(
      context.provider_url,
      resource.getstring(context.provider_url));
    properties.setproperty(
      context.security_principal,
      resource.getstring(context.security_principal));
    properties.setproperty(
      context.security_credentials,
      resource.getstring(context.security_credentials));
    jndicontext = new initialcontext(properties);
  }
  
  注意:在真正的产品中,我们应该在此处考虑代码的健壮性,将代码加入到try/catch块内,并记录所有错误或重要信息到系统log中。而本例中,我们仅仅把异常往外抛,并假定一定会找到ejb对象的home接口并返回。
  
    return (jndicontext.lookup(jndiname));
  }
  
  由于action类将是由struts来调用的。所以它的主要方法应该是一个抽象方法,而由每个继承的子类来具体实现,或者在其中做一些所有action都会做的通用机制,例如记录log信息。在本例中,我们一切从简,将其抽象之。
   参数mapping:其类型为actionmapping,将在本action做跳转选择用
   参数actionform:由struts根据本次http请求数据填充完成的actionform对象(可选,如果存在请求数据的话)
   参数request:此action所有处理的本次http请求(对象)
   参数response:此action输出数据所要用到的http响应(对象)
   如果有i/o错误出现,则本方法抛出ioexception异常
   如果处理时发生servlet异常,则本方法抛出servletexception异常
   本方法处理完请求后按照处理逻辑返回相应的页面导向(对象)
  
   public abstract actionforward perform(
    actionmapping mapping,
    actionform form,
    httpservletrequest request,
    httpservletresponse response)
    throws ioexception, servletexception;
  }
  
  或者让这个抽象方法更有用一点,那就在里面干点什么吧,比如像下面这样在其中记录log。
  
   {
    actionforward forward = null;
    // 只是简单的记录一些提示信息到servlet log
  
    getservlet().log(
     "abststrutsactionbase.perform() [action class: "
      + this.getclass().getname()
      + " ]");
    getservlet().log(
     "abststrutsactionbase.perform() [form class : "
      + (form == null ? "null" : form.getclass().getname())
      + " ]");
   }
  
  然后,我们再编写的每个action类都应该从abststrutsactionbase继承,并依照处理逻辑编写各自的perform方法。让我们用loginaction为例,看看具体应该怎么应用吧。
  
  package com.oreilly.actions;
  
  import java.io.ioexception;
  import java.rmi.remoteexception;
  import javax.ejb.createexception;
  import javax.servlet.servletexception;
  import javax.servlet.http.httpservletrequest;
  import javax.servlet.http.httpservletresponse;
  import org.apache.struts.action.actionerror;
  import org.apache.struts.action.actionerrors;
  import org.apache.struts.action.actionform;
  import org.apache.struts.action.actionmapping;
  import org.apache.struts.action.actionforward;
  import com.oreilly.forms.loginform;
  
  /*
  loginaction 将演示一个action将如何被struts架构所调用
  在这个例子中,我们只是简单的演示perform方法是如何调用、执行并返回的
  */
  
  public class loginaction extends abststrutsactionbase {
  
  接下来这个是验证用户的方法,本例中没有具体实现。但一个典型的应用方案是调用javabean或者ejb来完成。用来查找ejb的lookup方法(在基类中完成的)应该在本方法中被调用,其返回一个依据后台数据库验证用户的接口。
   参数类型string,要验证的用户名
  
 
 
上一篇: 在struts中使用validator框架    下一篇: 学习jakarta struts 1.1 (二)
  相关文档
weblogic server 9.0:jms增强功能(图) 11-17
浅谈java的输入输出流 11-16
cos 方法 11-16
sun宣布发布更多免费软件 11-17
step-by-step 使用 swt 开发 gui 11-17
在java中基于udp协议编程 11-17
checked vs unchecked exception ,使用场合? 11-17
java基础之api零碎总结 11-17
javascript实例教程(19) 使用hotmetal(3) 11-16
taglib原理和实现之el表达式和jstl标签 11-16
java开发中多线程同步技巧 11-16
java软件架构设计概论 11-17
jdk 1.5中实现面向对象形式的sql语句 11-16
jbuilder corba applet实做 11-17
数据库:jdbmonitor在多数据源中的问题 03-06
在javascript程序中整合java函数 11-16
ajax是否能够取代桌面应用程序 11-17
notifier类实现event/listener更容易 11-17
j2me蓝牙程序开发实战入门 11-16
java多线程程序设计入门 11-16
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
技术电话:13616026886
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息