0

0

学习Jakarta Struts 1.1 (三)

黄舟

黄舟

发布时间:2016-12-17 10:48:01

|

1294人浏览过

|

来源于php中文网

原创

  在第一篇文章《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,要验证的用户名
  

 以上就是学习Jakarta Struts 1.1 (三)的内容,更多相关文章请关注PHP中文网(www.php.cn)! 

千图设计室AI海报
千图设计室AI海报

千图网旗下的智能海报在线设计平台

下载

相关专题

更多
php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

65

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

43

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

35

2025.12.31

不受国内限制的浏览器大全
不受国内限制的浏览器大全

想找真正自由、无限制的上网体验?本合集精选2025年最开放、隐私强、访问无阻的浏览器App,涵盖Tor、Brave、Via、X浏览器、Mullvad等高自由度工具。支持自定义搜索引擎、广告拦截、隐身模式及全球网站无障碍访问,部分更具备防追踪、去谷歌化、双内核切换等高级功能。无论日常浏览、隐私保护还是突破地域限制,总有一款适合你!

41

2025.12.31

出现404解决方法大全
出现404解决方法大全

本专题整合了404错误解决方法大全,阅读专题下面的文章了解更多详细内容。

204

2025.12.31

html5怎么播放视频
html5怎么播放视频

想让网页流畅播放视频?本合集详解HTML5视频播放核心方法!涵盖<video>标签基础用法、多格式兼容(MP4/WebM/OGV)、自定义播放控件、响应式适配及常见浏览器兼容问题解决方案。无需插件,纯前端实现高清视频嵌入,助你快速打造现代化网页视频体验。

9

2025.12.31

关闭win10系统自动更新教程大全
关闭win10系统自动更新教程大全

本专题整合了关闭win10系统自动更新教程大全,阅读专题下面的文章了解更多详细内容。

8

2025.12.31

阻止电脑自动安装软件教程
阻止电脑自动安装软件教程

本专题整合了阻止电脑自动安装软件教程,阅读专题下面的文章了解更多详细教程。

3

2025.12.31

html5怎么使用
html5怎么使用

想快速上手HTML5开发?本合集为你整理最实用的HTML5使用指南!涵盖HTML5基础语法、主流框架(如Bootstrap、Vue、React)集成方法,以及无需安装、直接在线编辑运行的平台推荐(如CodePen、JSFiddle)。无论你是新手还是进阶开发者,都能轻松掌握HTML5网页制作、响应式布局与交互功能开发,零配置开启高效前端编程之旅!

2

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
ThinkPHP开发大型商城项目实战视频
ThinkPHP开发大型商城项目实战视频

共54课时 | 21.1万人学习

Tomcat核心原理解析
Tomcat核心原理解析

共57课时 | 6.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号