(转贴)实际项目中的StrutsPlugIn插件扩展 作者: l

作者:冰莲如水

本文讲述Struts应用在实际项目中的插件类开发技术。在我们的learndiaryV1.0项目中已经有了很好的应用。通过对它的讲解,我们可以了解在应用开发中这一技术的实做经验。首先说明Struts插件扩展技术的特点:

Struts框架的一大优势在于它允许开发人员根据实际需要来扩展框架,定制客户化的功能。

Struts1.1框架提供了动态插入和加载组件的功能,这种组件被称为Struts插件。Struts插件实际上就是一个Java类,它在Struts应用启动时Struts框架调用每个插件的init()方法进行初始化,在插件的初始化阶段可以完成一些初始化的操作,如建立数据库连接,和远程系统建立连接,在当前的应用范围内加入插件类自身的实例等。在应用关闭时Struts框架会调用每个插件的 destroy()方法,destroy()方法可以用来完成释放资源的任务,如关闭数据库连接,断开与远程的连接等。任何作为插件的Java类都应该实现org.apache.struts.action.PlugIn接口。PlugIn接口包括两个方法:

       public interface PlugIn {

        /**

        *当struts应用启动时,下面的方法将被调用执行

        */

        public void init(ActionServlet servlet, ApplicationConfig config)

              throws ServletException;

       /**

       *当struts应用关闭时,将调用下面的方法,以释放资源。

       */

        public void destroy();

       } 

相关资源

 

相关评论

标题: 实际项目中的StrutsPlugIn插件扩展  作者: lian  创建时间: 2005-08-30 16:03:36  最近更新: 2005-08-30 16:03:36  编辑  删除 

内容

我们在learndiaryV1.0这个项目中使用了Struts框架的PlugIn插件扩展来实现ServiceFactory类。ServiceFactory为应用中的业务逻辑工厂类,它将提供创建各种业务逻辑类实例的方法,我们是通过对业务逻辑类实例的方法调用最终实现后台的商业逻辑及业务数据的检索和持久化的。关于持久层的存取更新请参阅《Hibernate 存取及批量更新删除》这一章节。ServiceFactory 工厂类实现了 Struts 的 PlugIn 接口并在 Struts 的配置文件struts-config中对其进行了配置描述,使其在Struts系统启动时自动被加载。而在 ServiceFactory 工厂类所覆盖的 PlugIn 的 init() 方法中,此工厂类将其自身加入到应用的 ServletContext 实例当中去。在具体的项目中,因为ServiceFactory 工厂类已经被启动并加载,在加载的过程中init() 方法又将ServiceFactory 工厂类自身的实例加入到ServletContext当中,我们便可以通过servlet.getServletContext().getAttribute(Constants.SERVICE_FACTORY_KEY)这样的方法对此ServiceFactory工厂类进行引用。通常我们也可以在struts-config文件中的ServiceFactory工厂类插件配置项<plug-in>中加入插件类的启动参数<set-property>,在当前的应用中我们没有采用这样的方式。听上去可能会糊里糊途的,我们还是从代码中找到灵感吧! 

相关资源 

标题: 实际项目中的StrutsPlugIn插件扩展  作者: lian  创建时间: 2005-08-30 16:04:34  最近更新: 2005-08-30 16:04:34  编辑  删除 

内容

首先我们构建出你的ServiceFactory类所要去实现的接口类,这有利于实现商业应用的面向接口的编程,这是一种良好的JAVA开发规范。在今后的开发环节当中我们还会遇到类似的开发案例。

  

        package com.learndiary.website.services;

import java.lang.IllegalAccessException;

import java.lang.ClassNotFoundException;

import java.lang.InstantiationException;

/**

 * 业务逻辑工厂的接口

 * 应用程序开发后期将会扩充此工厂接口,

 * 设置各种createService()方法,

 * 返回均为此业务逻辑方法的接口。

 */

public interface IServiceFactory {

public IBusinessService createService() throws ClassNotFoundException,

IllegalAccessException,InstantiationException;

public IUserService createUserService(String serviceName) throws ClassNotFoundException,

IllegalAccessException,InstantiationException;

public IUserService createUserService() throws ClassNotFoundException,

    IllegalAccessException,InstantiationException;

public void destroy();

}

你会发现上面的代码中所有方法返回的实例都定义为业务逻辑接口形式,如IBusinessService createService() 。在各类的IBusinessService接口中我们定义了这一类业务逻辑接口所要实现的方法。例如IUserService接口为我们定义了如下的一些方法。 

相关资源 

标题: 实际项目中的StrutsPlugIn插件扩展  作者: lian  创建时间: 2005-08-30 16:05:43  最近更新: 2005-08-30 16:05:43  编辑  删除 

内容

      public interface IUserService extends IBusinessService{

public User saveUser (User user) throws BusinessException;

public User findUserById(Long id) throws BusinessException;

public User findUserByName(String name) throws BusinessException;

public User findUserByEmail(String email) throws BusinessException;

public User findUserByPassword(String name, String password) throws BusinessException ;

public void saveOrUpdateUser(User user) throws BusinessException;

public List getUsers() throws BusinessException;

public int getAllUserNum() throws BusinessException;

}

此外IServiceFactory接口的定义中还存在着IUserService createUserService()的重载形式IUserService createUserService(String serviceName),这是为了方便大家对于这一应用形式的重构和扩展。

ServiceFactory的具体实现类如下:

  package com.learndiary.website.services;

import javax.servlet.ServletException;

import java.lang.InstantiationException;

import java.lang.IllegalAccessException;

import org.apache.struts.action.ActionServlet;

import org.apache.struts.action.PlugIn;

import org.apache.struts.config.ModuleConfig;

import com.learndiary.website.Constants;

import net.sf.hibernate.*;

import net.sf.hibernate.cfg.Configuration;

/**

 *业务逻辑工厂,ServiceFactory工厂类实现了struts 的PlugIn接口,

 *使其将在系统启动时,自动被加载;在工厂类所覆盖的PlugIn的init()方法中,

 *此工厂类将其自身加入到应用的ServletContext实例当中去。

 */

public class ServiceFactory implements IServiceFactory,PlugIn {

    

//由init()方法中传入ActionServlet实例

private ActionServlet servlet =null;

private String serviceClassname = "com.learndiary.website.services.ORMService";

/*

* 创建业务逻辑实例的模板

*/

public IBusinessService createService() throws ClassNotFoundException,

IllegalAccessException, InstantiationException {

IBusinessService serInstance =

(IBusinessService)Class.forName(serviceClassname).newInstance();

serInstance.setServletContext(servlet.getServletContext());

return serInstance;

}

/*

* 根据给定的服务类名,创建服务类的对象。

* 以接口IBusinessService型式返回。

*/

public IUserService createUserService(String serviceName) throws ClassNotFoundException,

IllegalAccessException, InstantiationException{

IUserService serInstance=

(IUserService)Class.forName(serviceName).newInstance();

serInstance.setServletContext(servlet.getServletContext());

return serInstance;

}

public IUserService createUserService() throws ClassNotFoundException,

    IllegalAccessException,InstantiationException{

IUserService serInstance = new UserService();

serInstance.setServletContext(servlet.getServletContext());

return serInstance;

}

public void destroy() {

}

/*

* 扩展Struts PlugIn接口的 init()方法

* Struts框架会在启动系统时,自动加载扩展了PlugIn接口的组件。

* 并调用此组件中的init()方法,对其进行初始化。

*

*/

public void init(ActionServlet svt, ModuleConfig conf)

throws ServletException {

this.servlet = svt;

/*

* 此处,利用组件初始化时,将本工厂实例保存于当前的ServletContext中。

* 此后,我们便可以在应用当中,调用此工厂实例。即调用ServiceFactory。

*/

servlet.getServletContext().setAttribute(Constants.SERVICE_FACTORY_KEY,this);

}



相关资源 

标题: 实际项目中的StrutsPlugIn插件扩展  作者: lian  创建时间: 2005-08-30 16:07:10  最近更新: 2005-08-30 16:07:10  编辑  删除 

内容

其中的public IBusinessService createService() throws ClassNotFoundException,

IllegalAccessException, InstantiationException {

IBusinessService serInstance =

(IBusinessService)Class.forName(serviceClassname).newInstance();

serInstance.setServletContext(servlet.getServletContext());

return serInstance;

}

为构建业务逻辑实现类的模板。业务逻辑实现类的具体的实例采用IBusinessService serInstance =

(IBusinessService)Class.forName(serviceClassname).newInstance();

的方式构建。关于具体的业务逻辑实现类是怎么样实现业务功能的,将在后续的章节中介绍。

在你的应用中加入了以上ServiceFactory工厂类之后,我们要把它作为Struts应用的插件加入到Struts配置文件当中, Struts框架在启动时将根据插件类相关的配置信息来初始化插件。与插件对应的配置元素为 <plug-in>,在struts-config.xml中对ServiceFactory插件类进行的如下配置:

  

  <plug-in className="com.learndiary.website.services.ServiceFactory">

  </plug-in>

根据Struts 配置文件的DTD 定义,在Struts配置文件中, <plug-in>元素必须位于其他配置元素的后面,此外,如果在配置文件中布署了多个插件, Struts框架将按照它们在配置文件中的先后顺序来依次初始化它们。

合理的使用好Struts的插件类扩展,将使我们的应用更加健壮,功能上具有良好的可扩展性和可移植性。在本文中也许存有疏漏错误之处,请开发员朋友们不吝恩教,吾人当励行而改之!

以上代码均为开源社区learndiary.com 1.0版本下测试通过的实际应用代码,你可以联系作者取得相关原码文件。

联系本文作者:QQ 284508610 

(转贴)Struts的多模块设计

Struts的多模块设计

Struts在1.1以后的版本引入了模块(Module)的概念,克服了1.0的并行开发所遇到的问题。但是模板的规划往往又是比较麻烦,如果不注意,可能适得其反,影响你的开发速度。下面我们看看如何去规划一个对模块的Struts项目。

首先我们需要建立一个web的项目,接下来就要进行目录规划。如下图:

(http://www.learndiary.com/pictures/j_struts_module.gif)

 

1 首先确定项目的模块,如此项目中包含两个模块:mFirst和mSecond,当然还有缺省模板。

2 本例子中考虑到使用XDoclet自动生成Struts配置和校验文件,所以有些特殊性。在WEB-INF下建立两个目录mFirst和mSecond,用于模块配置文件的存放。同时建立merge目录,并包含相应的模块目录,主要存放XDoclet生成Struts配置文件所需要的合并文件。模板的java源码和测试代码也分别存放,这样便于管理。为了包含某些不允许从浏览器端直接访问的jsp文件,我们在WEB-INF下同时建立webpages目录,该目录下同时包含模块目录,主要存放各个模块的受限文件。

3 本例中为了集成方便,所有编译后的代码均存在同一目录下(WEB-INF\classes),编译后的测试代码同样存在同一目录下。

4 经过以上的设置,为XDoclet生成配置文件提供了方便,我们的原则是同一个模块只有一个配置文件(struts-config.xml)和校验文件(validation.xml)。

 

 

5 接下来我们只需在web.xml中进行模块声明即可,其他信息请参考struts的sample。

<init-param>

<param-name>config</param-name>

<param-value>WEB-INF/struts-config.xml</param-value>

</init-param>

<init-param>

<param-name>config/mFirst</param-name>

<param-value>WEB-INF/mFirst/struts-config.xml</param-value>

</init-param>

<init-param>

<param-name>config/mSecond</param-name>

<param-value>WEB-INF/mSecond/struts-config.xml</param-value>

</init-param>

6 完成这些信息以后,我们要注意一些事情:

struts-config.xml文件中的Controller声明,由于我们将模板的jsp文件隐藏到WEB-INF目录下,而不是在根目录下直接建立模板目录,所以必须设置forwardPattern,详细信息请参考Struts文档。请在每个模块的struts-config.xml文件中添加以下代码,在本例中为:

<controller forwardPattern="/WEB-INF/webpages/$M$P"/>

在每个模块的properties资源文件中可能都有配置Struts默认的出错信息,因为这些模块都是独立的。

7 接下来就是模块的之间的切换问题,因为在现时过程必须需要解决的问题。其实很简单,如果你想使用项目下绝对路径(包含模块目录信息),只需将forward的contextRelative属性值设置为true即可,这样模块之间切换也很容易实现。

<forward contextRelative="true" name="success"

path="/mSecond/second.do" redirect="false"/>

8 接下来就是你的代码啦,可能你要在编码中适当地考虑到项目模块之间的关系。

总结:多模块设计不太难,但是你也的考虑周全点,这样会给你的开发带来方便。在IntelliJ IDEA下,虽然在模块比较多的情况下目录很乱,通过设置excluded,让你的目录更整洁,这样就可以关注你的模块。在有些情况下,取消excluded,这样你有可以把握项目全局。

 

posted on 2005-08-17 09:03 风太少 阅读(34) 评论(0)  编辑 收藏

a difficut:struts module

For my viewpoint,struts module should be a useful technique.It offer a framework to resolve a important aspect of OOP.

So,I think we can import this technique in our future Learndiary Version for extension goal.And,I have tried to use this in fileSharing trial system(there are problem in this using for my inapprehension on this technique.)

But,from some resource of learning it,I found there are many restricts on this-all of a module:include action,jsp,messageresource,datasource...,are added the module prefix automatically!e.g.,a path of jsp is:/WEB-INF/amodule/test.jsp,it will be /amodule/WEB-INF/amodule/test.jsp.And,the action is so too.

I feel the struts module is a bit complex.

Struts开发技巧

/*看到这篇文章不错,害怕后来被删除了,于是把它保存在这里。*/

  Struts开发技巧

Struts配置文件

事件对应的类主要有Action、ActionForm

struts开发中一些的规范

Struts开发技巧

谢?

在经历了《中国电信大客户贴心服务》项目的开发以及目前正在开发中的《中国电信经营分析》项目,已累计了一些对于Struts1.1和Tiles开发的一些技术和技巧,特写出来,方便以后的开发,同时也相信能给读者在开发Struts方面提供一些帮助。

在经历了《中国电信大客户贴心服务》项目的开发以及目前正在开发中的《中国电信经营分析》项目,已累计了一些对于Struts1.1和Tiles开发的一些技术和技巧,特写出来,方便以后的开发,同时也相信能给读者在开发Struts方面提供一些帮助。

模块配置

1.     Struts配置文件定义

   对于系统中的某个模块,需要在开发前定义该模块的配置,该struts的配置文件命名为:

struts-config-xxx.xml

xxx为模块的小写英文名或缩写,如:struts-config-sysman.xml

注意:中间为"-",而不是"_"连接符

统一保存在"WEB-INF\xml"文件夹下,并需要在web.xml中添加相应的配置文件

地址,具体如下例:

       ...

  <init-param>

      <param-name>config</param-name>

      <param-value>/WEB-INF/struts-config.xml, /WEB-INF/xml/struts-config-pages.xml,/WEB-INF/xml/struts-config-sysman.xml</param-value>

       </init-param>

...

注意:需要用","连接符隔开各个配置文件名

另外,所有的静态jsp需要通过配置文件定义其".do"形式的访问,保存在

struts-config-pages.xml文件中,内容如下例:

  ...

  <!--主页转向-->

  <action path="/main" type="org.apache.struts.actions.ForwardAction" parameter="/main.jsp"/>

  ...

2.         Tiles配置文件定义

系统的框架配置文件为tiles-defs_zh_CN.xml(通过.properties属性文件支持国际化应用,默认是tiles-defs.xml),模块的框架结构需要定义在里面,如下例:

...

<!-- 定义默认首页 -->

    <definition name="default.frame" path="/layouts/defaultLayout.jsp">

        <put name="title"  value="欢迎进入电信经营分析系统" />

        <put name="header" value="/top.jsp" />

        <put name="body"   value="default.body" />

        <put name="footer" value="/buttom.jsp" />

    </definition>

<!-- 定义默认首页的body -->  

    <definition name="default.body" path="/layouts/main.jsp" >

  <put name="logon"   value="/logon.jsp" />

  <put name="date" value="/layouts/date.jsp" />

       <put name="linkSite"   value="/layouts/link.html" />

    </definition>

...

框架命名规范按"系统(子系统).功能模块.页面模块",如上面的"default.frame"

在struts-config-pages.xml文件中的设置的页面action可以这样写:

<action path="/main" type="org.apache.struts.actions.ForwardAction" parameter=" default.frame "/>

这样就不必单独写一个tiles:insert的页面,如下:

<tiles:insert definition="vip.warn.day" flush="true" />

3.         模块中的注释

不但需要在程序中添加必要的注释,在定义配置文件的时候也必须需要添加相应注释,主要是在struts-config-xxx.xml和tiles- defs_zh_CN.xml这些文件中添加注释,要把action或配置模块的功能解释清楚,放在配置项的前面,参见上面的配置文件

4.         对于配置文件的编辑

不能使用Jbuilder里面的xml编辑功能,因为JB会自动地改变xml里面的编码和内容,因此,对xml配置文件的编辑,要使用编辑软件,如UE等

事件定义

事件对应的类主要有Action、ActionForm,还有jsp中提交的".do"定义,以及页面动作的提交,以login登录为例:

1.  类的命名定义(首字母需大写)

形式为"动作名+Action/Form"

如:LoginAction.class、LoginForm.class

2.  页面地址定义(首字母需小写)

如果有两个单词以上,第二个单词首字母大写,依此类推

形式为"动作名"

如:login.do或loginSys.do

jsp文件命名也按此规范

3.  页面动作定义

因为jsp页面中的Form对应ActionForm,其本身有action这个属性,所以页面动作如果定义也为action,会引起不必要的麻烦,所以,把页面动作统一定义为"act",

如需要编辑某条记录,地址如下:

"/editRecord.do?act= Edit"

如需要删除,地址如下:

"/editRecord.do?act=Delete"

4.  对于菜单和操作事件触发的控制机制

由于系统中的菜单和操作都是由".do"形式向服务端发请求的,因此需要一套机制来控制哪些是对菜单的事件请求,哪些是对操作的事件请求;

我们在系统中引入了Filter过滤器,对所有请求进行控制,以及判断用户是否登录和是否有对资源(菜单等)访问权限等;

约定:

jsp页面上对于系统中菜单的请求都是"GET"方法,对于操作的Action都是"POST"方法;

有了这样的约定,在Filter中先判断request的请求方法,如果是"GET"方法,则认为是对菜单的请求,所以去"菜单表"根据请求地址读取相应的记录,并读取用户的权限表,判断用户的菜单权限;

如果是"POST"的方法,则认为是对操作的请求,并提取request中的"act"动作,进行对用户的权限点的判定。

 

参数信息获取

1.         公共参数信息通过Plugin方式在Web服务启动时将变量放入application中,使得在任何需要该变量的jsp中都可以调用;

方式如下:

public void setServletContext(ActionServlet actionServlet) {

try {

        ServletContext sc = actionServlet.getServletContext();

        //SysInitPwd

   sc.setAttribute(Constants.SYS_INIT_PWD,SelectLists.getSysConfig("PWDINIT"));

...

在action等程序中的调用方式:

getServlet().getServletContext().getAttribute("...");

 

2.         对于页面上需要展示的数据尽量存放在request这个范围里,可以减轻服务器端内存负载,方式如下:

//调用员工处理类

StaffDeal sd=new StaffDeal();

//根据员工状态查询员工

ArrayList al=sd.qryStaff(strState);

//放入request

    request.setAttribute("staffInfo",al);

3.         私有的或需要根据用户的属性来获取参数信息的,可以在tiles的定义中使用"controlClass=xxx"这个方式获取,配置如下例:

<definition name="vip.welcome" path="/vip/welcome.jsp" controllerClass="viptx.logic.vip.welcomeAction" />

需implements Controller中的perform方法,代码如下例:

public void perform(ComponentContext componentContext,

                      HttpServletRequest request,

                      HttpServletResponse response,

                      ServletContext servletContext) throws IOException,ServletException  {

    HttpSession session = request.getSession();

    // Get current session.

    User user = (User) session.getAttribute(Constants.USER_KEY);

    if (user == null) {

      return null;

    }

    String uid = user.getUserid();

    String sql = "select userid,content from ti_salutatory where userid='"+uid+"'";

    try {

      ...

    }

    catch (Exception ex) {

      throw new ServletException(ex.getMessage());

    }

}

4.         对于后台出错信息在前台页面显示的技巧

首先在properties配置"message.common={0}"

然后在Action类中使用ActionErrors或ActionMessages时,方法如下:

...

ActionMessages ams = new ActionMessages(); //例外处理

Try{

...

}

catch (Exception ex) {

    ex.printStackTrace();

    ams.add(ActionMessages.GLOBAL_MESSAGE,

                 new ActionMessage("message.common", ex.getMessage()));

}

                finally {

if (!ams.isEmpty()) {

        saveMessages(request, ams);

     }

}

...

        在jsp页面中使用方法如下:

        <html:messages id="msg" message="true">

               <font color="red"><bean:write name="msg"/></font>

        </html:messages>

        如果有后台的messages产生,前台页面就可以出现报错信息

5.         系统配置文件

系统参数如数据库连接等在sysConfi.xml文件中配置,存放在"WEB-INF/xml"文件夹下,请参见该文件。

开发规范和公用方法

关于java的开发规范参见《Java 编程规范.doc》,这里仅给出用struts开发中一些的规范:

1.         java文件存放按业务逻辑划分,并用模块作为包名的形式,如:telecombi.logic.sysman.security

包名都为小写形式

所有的Action和ActionForm都存放在同一包下,便于管理,不要跨包调用

2.         所有ActionForm中的属性均为"首单词小写+第二个单词首字母大写+..."的形式,如:staffId、staffName,不允许使用"_"为单词连接符

3.         需要验证的页面,均需要客户端和服务端两次验证(即对jsp中的Form进行javascript验证和Action中的excute方法中进行验证),不能只采用其中一种方法,防止客户绕过js直接提交;

在验证登录提交的form时,必须使用staticJavascript="false",否则就会把javascript写到页面里,如:

<html:javascript formName="logonForm"

        dynamicJavascript="true"

         staticJavascript="false"/>

<script language="Javascript1.1" src="staticJavascript.jsp"></script>

验证的formName必须和validation.xml中的Form的名字对应起来,否则验证无效

4.         ActionForm是代表html中的Form的,其中的变量需要和Form中的属性对应起来,如:要在jsp中使用<form:text property="userName"/>,则使用的ActionForm中就必须有userName这个变量

5.         对于Action中的逻辑,如果处理方法在一个以上,需要另外新建一个处理类,负责对Action中的逻辑集中处理,命名为xxxDeal,如:LoginDeal;

Action通过调用该处理类的方法,实现业务逻辑处理

6.         对数据库的操作使用DBManager这个类,对其中的一些方法,具体介绍如下:

n         查询结果对象化的Select操作,使用Select(String sql,String className)方法

StringBuffer sql = new StringBuffer(

        "select staff_id staffId from ts_m_staff ")

        .append("where staff_id='").append(uid).append("'");

    try {

/**

*       User是一个用户对象类,其中有staffId这个属性,以及对应的get/set方法,通过

*        DBManager的Select方法获得一个User的ArrayList集合

*/

ArrayList rs = DBManager.Select(sql.toString(), User.class.getName());

/**

*   如果确定返回的只有一个对象,则可以使用

*

*/

User user=(User)rs.get(0);

    }

    catch (Exception ex) {

      throw new ServletException(ex.getMessage());

}

取出来的数据可以存放在session或page等里,供jsp页面调用,方法为session.setAttribute("user",user1)

...

n         Insert或Update等操作

使用DBManager里面的executeSql(String sql)方法,如果是批量处理,使用executeBatchSql(String[] sqls)方法,返回成功标志为Constants.OPERATE_SUCCESS

失败标志为Constants.OPERATE_FAILED

暂无其它信息返回

n         ResultSet对象向Hashtable集合对象的转化,使用select(String sql)方法:

除了可以使用DBManager的Select把查询结果转为对象以外,还可以使用以前的直接使用ResultSet对象的方式,不过这里返回的数据集对象为Hashtable;

Hashtable存放的数据结构为:

columnName1 ? ArrayList1(该字段的结果集)

columnName2 ? ArrayList2(该字段的结果集)

...

        系统中使用该方法的比较多的是用在生成下拉框数据,从select方法返回的Hashtable取到字段值,并生成LabelValueBean,具体方法如下:

        /**公用函数 Hashtable 转换成 ArrayList (LabelValueBean)*/

   private static ArrayList hashToLVB(Hashtable ht, String id, String name,boolean hasBlank) {

      if (ht!=null){

         ArrayList al = new ArrayList();

         ArrayList alId = (ArrayList) ht.get(id.toUpperCase());

         ArrayList alName = (ArrayList) ht.get(name.toUpperCase());

         int iLen = alId.size();

         if (hasBlank)

            al.add(new LabelValueBean("未知", "-1"));

         for (int i = 0; i < iLen; i++) {

            al.add(new LabelValueBean( (String) alName.get(i),

                                      (String) alId.get(i)));

         }

         return al;

      }

      else{

         return null;

      }

   }

n         AutoSetForm(String sql, Object frm)方法介绍:

a)         该方法可以返回一个查询数据库后已对其中的属性赋值的对象,使用方法如下:

User user=DBManager. AutoSetForm(sql,new User());

sql为查询语句

b)        该方法还可以对页面操作后的Form进行赋值,比如在页面上提交一个对某条记录进行编辑的操作,当Action得到该条记录的Id号并查询数据库成功后,需要把各个详细信息set到ActionForm的属性变量中去,这个时候就可以使用该方法,方法如下:

form= DBManager. AutoSetForm(sql,form);

form为Action的excute方法中传入的ActionForm

 

7.         调用存储过程

使用DBManager中的execProc(String procName,ArrayList procPrts)方法

procName为存储过程名,procPrts是该存储过程的入口参数集,返回的是ProcOuts的对象,其中有Result和ExceptionInfo两个属性,表示返回的处理标记和异常信息(如果有的话)

8.         数据操作返回信息的处理

在对数据操作完成后,需要返回操作是否成功等信息,具体步骤如下:

n         使用属性文件中的"messages.comm"这个key,可以对该key添加具体返回信息

n         程序中使用"ActionMessages"这个对象,java程序如下:

ActionMessages ams = new ActionMessages();

...

//执行结果

         ProcOuts pResult=null;

//是否调用成功

         if (pResult.getResult() == -1) {

               ams.add(ActionMessages.GLOBAL_MESSAGE,

                       new ActionMessage("message.common",

                                         pResult.getExceptionInfo()));

         }

if (!ams.isEmpty()) {

            saveMessages(request, ams);

         }

Jsp中调用方法如下:

<html:messages id="msg" message="true">

  <font color="red"><bean:write name="msg"/></font>

</html:messages>

 

- 作者: 张丘 2004年12月21日, 星期二 15:26  回复(0) |  引用(0) 加入博

池连接碰到的一个问题

我用weblogic + jbuilder + mssqlsever2000 采用池联接。我们的JDBC联系数不断在增加(根我判断,是因为我用完一个方法以后,这个连接还是标识为忙。)。但是我已经对它作了释放处理了,不过还是没有用啊。

我从中抽出一部份代码如下

package com.csbook.documentsystem;

import javax.naming.*;

import javax.sql.*;

import java.io.*;

import java.sql.*;

import java.util.*;

import java.text.SimpleDateFormat;

import java.util.Calendar;

import java.util.*;

public class Vistit {

  Context ctx = null;

  DataSource ds = null;

  SysLog log = null;

  ChangeEncoding ce = null;

//构造函数

  public Vistit() {

    //从连接池中获取数据库连接

    try {

      ctx = new InitialContext();

      ds = (DataSource) ctx.lookup("MyDataSource");

    }

    catch (NamingException e) {

      e.printStackTrace();

    }

    // 建立一个日志类的实例

    log = new SysLog();

  }

  public void addInFactoryReg(String no, String name, String company,

                              String people, String reason, String certif) {

    Connection con = null;

    PreparedStatement ps = null;

    String temptime = "";

    String intime = "";

    //temptime = TimeString.getNowTime("HH:mm:ss");

    //intime =temptime.substring(8);

    //System.out.println("company"+company);

    try {

      StringTokenizer st = null;

      ArrayList temp = getTemp();

      Object data[] = temp.toArray();

      String card_number = "";

      System.out.println("data.length" + data.length);

      for (int i = 0; i < data.length; i++) {

        st = new StringTokenizer((String) data[i]);

        card_number = ce.changeCharset(st.nextToken());

        int card_no = getNoCount("card", "card_no");

        card_no++;

        addInFactoryReg(card_no, no, card_number);

        changeState(card_number);

      }

      //String sqlInsert = "insert into visit(visit_no,visit_mark,visit_name,visit_company,visit_reason,visit_certif,visit_intime) values (" +no+ "," +mark+ "," +name+ "," +company+ "," +reason+ "," +certif+ "," +intime+ ")";

      // String sqlInsert = "insert into visit(visit_no,visit_mark,visit_name,visit_company,visit_peopleCount,visit_reason,visit_certif,visit_intime) values (?,?,?,?,?,?,?,'" +intime+ "')";

      String sqlInsert = "insert into visit(visit_no,visit_name,visit_company,visit_peopleCount,visit_reason,visit_certif) values (?,?,?,?,?,?)";

      con = ds.getConnection();

      ps = con.prepareStatement(sqlInsert);

      ps.setString(1, no);

      ps.setString(2, name);

      ps.setString(3, ce.changeCharset(company));

      ps.setString(4, people);

      ps.setString(5, ce.changeCharset(reason));

      ps.setString(6, certif);

      //System.out.println("sqlInsert" + sqlInsert);

      //System.out.println("no" + "visit_no");

      ps.executeUpdate();

      delData();

    }

    catch (Exception e) {

      e.printStackTrace();

    }

    finally {

      Close.connnectionClose(con);

      Close.prepareStatementClose(ps);

    }

  }

package com.csbook.documentsystem;

import javax.sql.*;

import java.sql.*;

public class Close {

  public void close(){

  }

  public static void connnectionClose(Connection con){

  if (con != null)

    try {

      con.close();

    }

   catch (SQLException ignore) {}

}

public static void  prepareStatementClose(PreparedStatement ps){

  if(ps != null)

    try{

      ps.close();

    }

  catch(SQLException e) {}

}

public static void resultSetClose(ResultSet rs){

  if(rs != null){

    try{

      rs.close();

    }

    catch(SQLException e){}

  }

}

问题:jsp中javabean的方法命名疑惑(未解决)

    应朋友的建议,今天加上用户帐号管理的功能。在之中,出现了一个关于javabean方法命名规范的问题。

formbean中有一个变量名为rNewPsd,意为新密码验证,其中的get方法为public getRNewPsd();

在jsp容器中运行报错说属性rNewPsd没有get方法。明明有啊,怪事。

    后来,把变量名改为rewPsd(可以不改),get方法名改为getRewPsd();一切ok。

    我翻了一下<<thinking in java,3rd>>,没有看到javabean的命名有这个限制,不知是怎么一回事?也许跟jsp容器有关。