`
竹临仙
  • 浏览: 37828 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

特殊情况(ActionForm,Servlet, Filter, Listener)下,SSH

    博客分类:
  • SSH
 
阅读更多

Spring一段时间,理解了一些Spring的注入对象的原理和实例,自己也写过一些用Spring进行注入对象,特别在SSH整合中这种Spring的注入才体现的淋漓尽致(个人认为),在学习的过程中,难免有些不习惯,原先通过new实例化的对象现在要使用Spring进行bean注入,不过这也应该是Spring的统一管理的细度和好处。(个人理解Spring还不是太深,如果有高人愿意指点一下,非常愿意向您请教)

         Spring的注入过程中,有些特殊情况下市不能使用常用的方法进行注入的。最近做个小东西,就发现了一些特殊情况下不能使用平常我们注入的方法进行注入。

特殊情况一:ActionForm

思考源泉:最近在写一个程序,要用到Struts1.x中的ActionForm进行一定的验证,而验证要使用到数据库中的数据库,而我也是和平常一样使用setXXX来进行注入,但是这个时候就出现了异常,空指针异常。上网搜了很多,虽然没有具体的,但还是有点思路的。

思路有两种:

第一种:将你需要注入的参数设置为static的,然后将设值方法setXXX的返回值设置为非void型,比如你的

protected IDaoService daoService;  

改为

protected static IDaoService daoService;  

设值方法setXXX,为:

public static boolean setDaoService(IDaoService daoService) {

    LookuserForm.daoService = daoService;

    return true;

}

然后在spring配置文件中设值:

 

<bean id="BaseBoolean"

class="org.shan.student.form.LookuserForm"

factory-method="setDaoService"

depends-on="daoService">

<constructor-arg ref="daoService"></constructor-arg>

</bean>

这样就实现了daoService的注射。

 

我的实例代码如下:

//下面的是ActionForm里面注入对象的写法

private  static UsersManager um;//静态,一定

 

public static boolean setUm(UsersManager um)//void型的,建议是boolean

{

         RegisterForm.um = um;

         return true;

}

//下面是通过Spring bean的注入,其中id就随便了,class就是你的ActionForm的类,factory-method就是你的非void型注入对象的方法,depends-on就是你要注入对象使用的beanconstructor-arg ref="XXX"也是一样了。

<bean id="RegisterForm" class="com.usc.struts.form.RegisterForm" factory-method="setUm" depends-on="UserManager">

         <constructor-arg ref="UserManager"></constructor-arg>

</bean>

 

这样配置后应该是可以的。我的ActionForm进行用户验证的代码也贴给大家了

/*

 * Generated by MyEclipse Struts

 * Template path: templates/java/JavaClass.vtl

 */

package com.usc.struts.form;

 

import javax.servlet.ServletContext;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import org.apache.struts.action.ActionErrors;

import org.apache.struts.action.ActionForm;

import org.apache.struts.action.ActionMapping;

import org.apache.struts.action.ActionMessage;

import org.apache.struts.action.ActionServlet;

import org.springframework.context.ApplicationContext;

import org.springframework.web.context.support.WebApplicationContextUtils;

 

import com.usc.dao.User;

import com.usc.service.UsersManager;

 

/**

 * MyEclipse Struts Creation date: 06-26-2009

 *

 * XDoclet definition:

 *

 * @struts.form name="registerForm"

 */

public class RegisterForm extends ActionForm

{

    /*

     * Generated fields

     */

    private  static UsersManager um;

 

    public static boolean setUm(UsersManager um)

    {

       RegisterForm.um = um;

       return true;

    }

 

//  public UsersManager getUm()

//  {

//     return um;

//  }

 

//  @Override

//  public void setServlet(ActionServlet servlet)

//  {

//     ServletContext context = servlet.getServletContext();

//     ApplicationContext ctx = WebApplicationContextUtils

//            .getWebApplicationContext(context);

//     this.um = ((RegisterForm) ctx.getBean("RegisterForm")).getUm();

//     super.setServlet(servlet);

//  }

 

    /** password property */

    private String password;

 

    /** username property */

    private String username;

 

    /** repassword property */

    private String repassword;

 

    /*

     * Generated Methods

     */

 

    /**

     * 注册验证 Method validate

     *

     * @param mapping

     * @param request

     * @return ActionErrors

     */

    public ActionErrors validate(ActionMapping mapping,

           HttpServletRequest request)

    {

       ActionErrors errors = new ActionErrors();

       // 用户名不能为空或者空格组成

       if (null == username || "".equals(username.trim())

              || username.trim().length() == 0)

       {

           errors.add("username", new ActionMessage("username.required"));

           // System.out.println("username is required");

       } else if (username.trim().length() < 5

              || username.trim().length() > 12)

       {

           errors.add("username", new ActionMessage("username.error"));

       } else if (!um.checkUserName(username))

       {

           errors.add("username", new ActionMessage("username.error.exist"));

       }

//     else

//     {

//         errors.clear();

//      }

       if (null == password || "".equals(password.trim())

              || password.trim().length() == 0)

       {

           errors.add("password", new ActionMessage("password.required"));

       } else if (!password.trim().equals(repassword))

       {

           errors.add("repassword", new ActionMessage("repassword.error"));

       }

      

       return errors;

    }

 

    /**

     * Method reset

     *

     * @param mapping

     * @param request

     */

    public void reset(ActionMapping mapping, HttpServletRequest request)

    {

       // TODO Auto-generated method stub

    }

 

    /**

     * Returns the password.

     *

     * @return String

     */

    public String getPassword()

    {

       return password;

    }

 

    /**

     * Set the password.

     *

     * @param password

     *            The password to set

     */

    public void setPassword(String password)

    {

       this.password = password;

    }

 

    /**

     * Returns the username.

     *

     * @return String

     */

    public String getUsername()

    {

       return username;

    }

 

    /**

     * Set the username.

     *

     * @param username

     *            The username to set

     */

    public void setUsername(String username)

    {

       this.username = username;

    }

 

    /**

     * Returns the repassword.

     *

     * @return String

     */

    public String getRepassword()

    {

       return repassword;

    }

 

    /**

     * Set the repassword.

     *

     * @param repassword

     *            The repassword to set

     */

    public void setRepassword(String repassword)

    {

       this.repassword = repassword;

    }

}

 

 

第二种:重写ActionFormpublic void setServlet(ActionServlet servlet)方法。

public void setServlet(ActionServlet servlet) {

ServletContext context = servlet.getServletContext();

ApplicationContext ctx = WebApplicationContextUtils

.getWebApplicationContext(context);

LookuserFormtemp = (LookuserForm) ctx.getBean("LookuserForm");

this.daoService = temp.getDaoService ();

 

super.setServlet(servlet);

}

这样,每次产生一个LookuserForm实例,都会向spring维护的实例请求注入参数。

我的代码实例如下:

private  static UsersManager um;

 

public static boolean setUm(UsersManager um)

{

         RegisterForm.um = um;

         return true;

}

 

<bean id="RegisterForm" class="com.usc.struts.form.RegisterForm" factory-method="setUm" depends-on="UserManager">

         <constructor-arg ref="UserManager"></constructor-arg>

</bean>

 

 

综合上面的的注入方法,我个人建议使用第一种,第一种还是和我们以前注入对象的习惯有点类似了。

 

 

特殊情况二:服务器启动以后,(Servlet容器启动)创建了许多对象,如 servlet filter listenerspring等等那么如何使用这些对象呢

思考源泉:也是在这个程序中用到的,我要使用AJAX技术进行异步验证,其中有些是要和数据库进行交互的,网上一般这种情况有两种验证思路

思路一:在Javascript中使用JQuery来创建一个XMLHttpRequest对象,再在Action中进行验证,我使用这个思路做了好久,就是没有结果,网上也给了很多类似的代码,但是感觉就没有一个能够真正的运行,没办法,考虑使用思路二了。

思路二:使用Servlet进行验证,这种思路很适合AJAX验证的思路,不过问题出现了,还是空指针异常,Spring注入的对象根本没有实例化。一开始还以为和Servlet的生命周期有点关系,后来在网上搜了一些东西,还是感觉可以通过Spring进行注入的。

下面介绍在Servlet(或者Filter,或者Listener)中使用springIOC容器默认情况下Servlet容器创建spring容器对象,注入到servletContext中,servletContext对象又是注入到session对象中,session对象又是注入到request对象中,request对象又是注入到servlet对象中,(其实不是很标准的注入,是传参数,或者对属性直接付值)。层层依赖可以得到spring容器对象。

代码如下:

ServletContext   servletContext   =   request.getSession().getServletContext();          

                   ApplicationContext   ctx   =   WebApplicationContextUtils.getWebApplicationContext(servletContext   );

                   UsersManager   um   =   (UsersManager)ctx.getBean( "UserManager");

 

这个时候的验证我在Mozilla Foxfire Google Chrome中都通过验证了,但是在遨游里没有通过,我不知道是什么原因,望高手指点,谢谢。

 

上面是我自己写一个程序中遇到到一些小问题,这应该对理解Spring的依赖注入有很大的好处,通过这个程序,至少让我们知道了差不多Spring注入对象的一些情况,以后有什么问题了,就非常容易解决。

 

这里面的代码都可以给大家了,大家如果需要的话,请下载

http://usc.googlecode.com/files/UsersManagerWithAJAX.rar),

 

分享到:
评论

相关推荐

    特殊情况(ActionForm,Servlet, Filter, Listener)下Spring如何注入对象

    总之,面对ActionForm、Servlet、Filter、Listener这些特殊情况,我们需要灵活运用Spring的DI机制,结合静态字段、工厂方法以及Web容器的特性,以确保对象的正确注入和管理。同时,随着技术的发展,如Spring Boot和...

    STRUTS ActionForm乱码,servlet全局过滤器转义编码。

    Struts框架中的ActionForm乱码问题以及Servlet全局过滤器的转义编码处理是Java Web开发中常见的字符编码问题。在开发基于Struts的Web应用时,乱码主要出现在三个方面:页面显示乱码、参数传递乱码以及国际化资源文件...

    JAVA六个版本基层增删改(包含mvc, servlet,struts2,ssh )

    在"JAVA六个版本基层增删改(包含mvc, servlet, struts2, ssh)"这个资源中,我们可以深入探讨JavaEE的多个核心组件和技术,包括Model-View-Controller(MVC)、Servlet、Struts2以及Spring、Hibernate、Struts(SSH...

    ActionForm

    【ActionForm】是Java Web开发中的一个概念,主要在Struts框架中被广泛使用。它是一种模型层对象,用于接收用户从视图层(通常是一个HTML表单)传递过来的数据,并将这些数据转发到控制器(Controller)进行业务逻辑...

    java中SSH框架主要说明SSH各部分的作用

    在SSH框架中,需要配置Struts的ActionServlet,指定struts-config.xml的位置,并设置调试级别。接着,配置Spring的ContextLoaderListener监听器,指定Spring的配置文件位置。Spring的CharacterEncodingFilter则用于...

    Struts1框架执行原理(附Action、ActionServlet、ActionForm工作机制)

    6. `Action`执行完成后,会返回一个`ActionForward`对象,该对象指示`ActionServlet`下一步应转向哪个结果页面(可能是JSP、另一个Servlet或者静态资源)。 7. 最后,`ActionServlet`将控制权交给指定的页面,展示...

    验证ActionForm存到了request中

    接下来,当请求到达Servlet容器时,Struts拦截器会负责将ActionForm对象绑定到Servlet请求(HttpServletRequest)中,通常是通过`request.setAttribute("formName", actionForm);`这样的调用来完成。这里的"formName...

    员工查询系统SSH架构+SQL2005

    6. **Servlet**:虽然SSH框架提供了处理HTTP请求的能力,但在某些情况下,如初始化配置或处理不涉及业务逻辑的请求时,可能会直接使用Servlet。例如,Servlet可能用来处理登录验证。 7. **资源齐全**:这意味着项目...

    Struts_学习笔记之ActionForm

    Struts学习笔记之ActionForm ActionForm是Struts框架中的一种重要组件,用于封装和处理用户的表单数据。在Struts中,ActionForm是继承自JavaBeans的,主要用于处理用户的表单数据和业务逻辑。下面是ActionForm的...

    SSH整合jar包

    SSH整合jar包是一个集合了所有在Java开发中用于Spring、Struts和Hibernate(SSH)集成应用所需的库文件的压缩包。SSH是Java企业级开发中非常流行的一种框架组合,它能够帮助开发者快速构建高效、可维护的企业级Web...

    ssh1 ssh2 整合登录代码及说明

    Spring的IoC容器管理了应用中的对象及其相互依赖关系,而AOP允许我们在不修改代码的情况下,对程序进行横向切面的增强,如日志、事务管理等。 **Hibernate** 是一个强大的对象关系映射(ORM)框架,简化了Java应用...

    SSH整合Jar包

    SSH整合在JavaWeb开发中是一项重要的技术组合,它包含了三个主要的开源框架:Spring、Struts和Hibernate。这些框架分别负责应用的业务逻辑管理、视图层控制和数据持久化。接下来,我们将深入探讨SSH整合的关键知识点...

    java ssh jar包

    - 在jar包中,`struts-core.jar`包含了Struts的核心组件,如ActionServlet和ActionForm等。 2. **Spring**: - Spring是一个全面的企业级应用开发框架,提供依赖注入(DI)和面向切面编程(AOP)等功能。 - ...

    ActionForm里的get和set方法

    ActionForm是Struts框架中的一个接口,实现了Servlet API中的HttpServletForm接口。它的主要目的是封装HTTP请求中的参数,将这些参数与业务对象关联起来。当用户在表单中填写数据并提交时,Struts框架会创建一个...

    ssh框架jar包大全

    掌握SSH框架需要对Java、Servlet、JSP有基础了解,同时需要学习Spring的核心概念,如IoC和AOP,Struts的MVC模式和Action机制,以及Hibernate的实体映射和查询语句。实践中,开发者可以通过创建简单的SSH项目,逐步...

    ssh.war 资源分享

    8. **安全**:理解SSH框架下的安全性问题,如CSRF防护、XSS防护、SQL注入预防等,并学习如何配置Spring Security增强应用的安全性。 9. **持续集成/持续部署(CI/CD)**:了解如何将SSH项目集成到Git、Maven或Gradle...

    Struts Hibernate Spring 集成开发宝典 actionform

    本集成开发宝典主要关注如何将这三者有效地结合,以ActionForm为切入点,深入讲解它们的整合过程。 Struts 是一个基于MVC(Model-View-Controller)设计模式的Web应用框架,它主要用于控制应用的流程,处理用户请求...

    SSH笔试题 j2ee笔试题

    - **核心组件**:ActionForm用于封装用户请求数据,ActionServlet作为入口点,ActionMapping负责映射请求,Action类处理业务逻辑。 2. **Spring框架**: - **IoC/DI**:Spring的核心是控制反转(IoC)和依赖注入...

    java(j2ee、jsp&servlet、ssh)面试题

    在面试中,对于J2EE、JSP&Servlet以及SSH(Struts、Spring、Hibernate)的知识考察是常见的环节,因为这些技术在实际开发中占据了核心地位。以下是关于这些主题的详细知识点: 1. **Java J2EE**: - **概念**:...

Global site tag (gtag.js) - Google Analytics