动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.Java模式学习一、简单工厂.
.一个计时类.
.开发webservice应用程序.
.软件最大的追求是什么?.
.JavaAnts-1.0(网络蚂蚁Java版).
.Jakarta Struts应用的七个经验(.
.Java、XML与数据库编程实践 (三).
.Java Q&A: 使用Observer模式.
.java性能优化-之一.
.定制xDoclet标签自动生成框架配置.
.JAVA文件编译执行与虚拟机(JVM)介.
.JDK的安装.
.X3D实战基础讲座之四.
.接口和抽象类有什么区别?.
.JDBC专题介绍.
.java非对称加密的源代码(RSA).
.为 SWT Windows桌面程序定制适合.
.java学习 - 乱评prot.
.两个加速Eclipse流行的插件介绍.
.java性能优化-之二.

通过三种方式对Struts框架进行扩展

发表日期:2008-1-5 |



  简介
  
  我见过许多项目开发者实现自己专有的MVC框架。这些开发者并不是因为想实现不同于Struts的某些功能,而是还没有意识到怎么去扩展Struts。通过开发自己的MVC框架,你可以掌控全局,但同时这也意味着你必须付出很大的代价;在项目计划很紧的情况下也许根本就不可能实现。
  
  Struts不但功能强大也易于扩展。你可以通过三种方式来扩展Struts:
  
  1.PlugIn:在应用启动或关闭时须执行某业务逻辑,创建你自己的PlugIn类
  
  2.RequestProcessor:在请求处理阶段一个特定点欲执行某业务逻辑,创建你自己的RequestProcessor。例如:你想继续RequestProcessor来检查用户登录及在执行每个请求时他是否有权限执行某个动作。
  
  3.ActionServlet:在应用启动或关闭或在请求处理阶段欲执行某业务逻辑,继续ActionServlet类。但是必须且只能在PligIn和RequestProcessor都不能满足你的需求时候用。
  
  本文会列举一个简单的Struts应用来示范如何使用以上三种方式扩展Struts。在本文末尾资源区有每种方式的可下载样例源代码。Struts Validation 框架和 Tiles 框架是最成功两个的Struts扩展例子。
  
  我是假设读者已经熟悉Struts框架并知道怎样使用它创建简单的应用。如想了解更多有关Struts的资料请参见资源区。
  
  PlugIn
  
  根据Struts文档,“PlugIn是一个须在应用启动和关闭时需被通知的模块定制资源或服务配置包”。这就是说,你可以创建一个类,它实现PlugIn的接口以便在应用启动和关闭时做你想要的事。
  
  假如创建了一个web应用,其中使用Hibernate做为持久化机制;当应用一启动,就需初始化Hinernate,这样在web应用接收到第一个请求时,Hibernate已被配置完毕并待命。同时在应用关闭时要关闭Hibernate。跟着以下两步可以实现Hibernate PlugIn的需求。
  
  1.创建一个实现PlugIn接口的类,如下:
  
  public class HibernatePlugIn implements PlugIn{    private String configFile;    // This method will be called at application shutdown time    public void destroy() {        System.out.println("Entering HibernatePlugIn.destroy()");        //Put hibernate cleanup code here        System.out.println("Exiting HibernatePlugIn.destroy()");    }    //This method will be called at application startup time    public void init(ActionServlet actionServlet, ModuleConfig config)        throws ServletException {        System.out.println("Entering HibernatePlugIn.init()");        System.out.println("Value of init parameter " +                  getConfigFile());        System.out.println("Exiting HibernatePlugIn.init()");    }    public String getConfigFile() {        return name;    }    public void setConfigFile(String string) {        configFile = string;    }}
  
  实现PlugIn接口的类必须是实现以下两个方法:
  
  init() 和destroy().。在应用启动时init()被调用,关闭destroy()被调用。Struts答应你传入初始参数给你的PlugIn类;为了传入参数你必须在PlugIn类里为每个参数创建一个类似JavaBean形式的setter方法。在HibernatePlugIn类里,欲传入configFile的名字而不是在应用里将它硬编码进去
  
  2.在struts-condig.XML里面加入以下几行告知Struts这个新的PlugIn
  
  <struts-config>    ...    <!-- Message Resources -->    <message-resources parameter=     "sample1.resources.ApplicationResources"/>    <!-- Declare your plugins -->    <plug-in className="com.sample.util.HibernatePlugIn">        <set-property property="configFile"          value="/hibernate.cfg.xml"/>    </plug-in></struts-config>
  
  ClassName属性是实现PlugIn接口类的全名。为每一个初始化传入PlugIn类的初始化参数增加一个<set-property>元素。在这个例子里,传入config文档的名称,所以增加了一个config文档路径的<set-property>元素。
  
  Tiles和Validator框架都是利用PlugIn给初始化读入配置文件。另外两个你还可以在PlugIn类里做的事情是:
  
  假如应用依靠于某配置文件,那么可以在PlugIn类里检查其可用性,假如配置文件不可用则抛出ServletException。这将导致ActionServlet不可用。
  
  PlugIn接口的init()方法是你改变ModuleConfig方法的最后机会,ModuleConfig方法是描述基于Struts模型静态配置信息的集合。一旦PlugIn被处理完毕,Struts就会将ModuleCOnfig冻结起来。
  
  请求是如何被处理的
  
  ActionServlet是Struts框架里唯一一个Servlet,它负责处理所有请求。它无论何时收到一个请求,都会首先试着为现有请求找到一个子应用。一旦子应用被找到,它会为其生成一个RequestProcessor对象,并调用传入HttpServletRequest和HttpServletResponse为参数的process()方法。
  
  大部分请处理都是在RequestProcessor.process()发生的。Process()方法是以模板方法(Template Method)的设计模式来实现的,其中有完成request处理的每个步骤的方法;所有这些方法都从process()方法顺序调用。例如,寻找当前请求的ActionForm类和检查当前用户是否有权限执行action mapping都有几个单独的方法。这给我们提供了极大的弹性空间。Struts的RequestProcessor对每个请求处理步骤都提供了默认的实现方法。这意味着,你可以重写你感爱好的方法,而其余剩下的保留默认实现。例如,Struts默认调用request.isUserInRole()检查用户是否有权限执行当前的ActionMapping,但假如你需要从数据库中查找,那么你要做的就是重写processRoles()方法,并根据用户角色返回true 或 false。
  
  首先我们看一下process()方法的默认实现方式,然后我将解释RequestProcessor类里的每个默认的方法,以便你决定要修改请求处理的哪一部分。
  
  public void process(HttpServletRequest request,            HttpServletResponse response)  throws IOException, ServletException {    // Wrap multipart requests with a special wrapper    request = processMultipart(request);    // Identify the path component we will    // use to select a mapping    String path = processPath(request, response);    if (path == null) {      return;    }    if (log.isDebugEnabled()) {      log.debug("Processing a '" + request.getMethod() +           "' for path '" + path + "'");    }    // Select a Locale for the current user if requested    processLocale(request, response);    // Set the content type and no-caching headers    // if requested    processContent(request, response);    processNoCache(request, response);    // General purpose preprocessing hook    if (!processPreprocess(request, response)) {      return;    }    // Identify the mapping for this request    ActionMapping mapping =      processMapping(request, response, path);    if (mapping == null) {      return;    }    // Check for any role required to perform this action    if (!processRoles(request, response, mapping)) {      return;    }    // Process any ActionForm bean related to this request    ActionForm form =      processActionForm(request, response, mapping);    processPopulate(request, response, form, mapping);    if (!processValidate(request, response, form, mapping)) {      return;    }    // Process a forward or include specified by this mapping    if (!processForward(request, response, mapping)) {      return;    }    if (!processInclude(request, response, mapping)) {      return;    }    // Create or acquire the Action instance to    // process this request    Action action =      processActionCreate(request, response, mapping);    if (action == null) {      return;    }    // Call the Action instance itself    ActionForward forward =      processActionPerform(request, response,                action, form, mapping);    // Process the returned ActionForward instance    processForwardConfig(request, response, forward);  }
  
  1、processMultipart(): 在这个方法中,Struts读取request以找出contentType是否为multipart/form-data。假如是,则解析并将其打包成一个实现HttpServletRequest的包。当你成生一个放置数据的Html FORM时,request的contentType默认是application/x-www-form-urlencoded。但是假如你的form的input类型是FILE-type答应用户上载文件,那么你必须把form的contentType改为multipart/form-data。如这样做
上一篇:Struts 的汉字显示问题终结解决方案 人气:429
下一篇:详细介绍用JBuilder9开发的Struts实例 人气:461
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-8-29 oblog v4.6 build 20080827
2008-8-29 ASBLOG v2.5 bulid 080828
2008-8-29 时尚DJ舞曲小偷 v3.1
2008-8-29 仿代码信息分类系统 v1.0 Beta3
2008-8-29 浮梦呓语-个人网站 完整版
2008-8-29 多用户QQ空间Flash播放器
2008-8-29 美思卡企业网站管理系统高级版
2008-8-28 LDV个人相册系统 v1.6.1
2008-8-28 讯时网站管理系统CMS v3.5
2008-8-23 Mini WinMount V0.4
2008-8-23 Vista优化大师3.11正式版
2008-8-23 Wine 1.13
2008-8-23 KlipFolio 5.0 Build 5899-80
2008-8-23 Windows Sysinternals Desktops
2008-8-23 OneTap Movies1.2破解版
2008-8-23 AnnotaterPDF阅读1.1.503 破解版
2008-8-23 SoundMeter分贝测量仪 v1.0汉化破
2008-8-23 iDrum音乐节拍1.0破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | Html转换js | js/vbs加密 | md5加密 | 进制转换
实用工具:汉字翻译拼音 | 符号对照表 | 个税计算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号