学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就是你要注入对象使用的bean,constructor-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;
}
}
第二种:重写ActionForm的public 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, listener,spring等等那么如何使用这些对象呢
思考源泉:也是在这个程序中用到的,我要使用AJAX技术进行异步验证,其中有些是要和数据库进行交互的,网上一般这种情况有两种验证思路
思路一:在Javascript中使用JQuery来创建一个XMLHttpRequest对象,再在Action中进行验证,我使用这个思路做了好久,就是没有结果,网上也给了很多类似的代码,但是感觉就没有一个能够真正的运行,没办法,考虑使用思路二了。
思路二:使用Servlet进行验证,这种思路很适合AJAX验证的思路,不过问题出现了,还是空指针异常,Spring注入的对象根本没有实例化。一开始还以为和Servlet的生命周期有点关系,后来在网上搜了一些东西,还是感觉可以通过Spring进行注入的。
下面介绍在Servlet(或者Filter,或者Listener)中使用spring的IOC容器默认情况下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如何注入对象,本文源码下载地址http://usc.googlecode.com/files/UsersManagerWithAJAX.rar
STRUTS ActionForm乱码,servlet全局过滤器转义编码
NULL 博文链接:https://fangyong2006.iteye.com/blog/749337
Struts框架的主要组件包括ActionServlet、ActionMapping和ActionForm。Struts框架的优点是可以将业务逻辑从视图层中分离出来,使得应用程序更加灵活和可维护。 在这个SSH教程中,我们可以看到Struts框架的应用过程...
Struts_学习笔记之ActionForm,简单配置即可达到效果
Struts Hibernate Spring 集成开发宝典 actionform 有研究或探讨或开源的请加群:37424970 或联系本人MSN或邮箱:zhuseahui@yahoo.com.cn
SSH 错误集锦是一个常见的 SSH 错误总结,涵盖了 Struts1.x 中的常见错误,包括 ServletException、ActionForm 等问题,本文将对这些错误进行详细的分析和解决方法。 1. javax.servlet.ServletException: Must ...
验证ActionForm存到了request中.rar
关于ssh的详细讲解和有关面试题 MVC模式: web应用程序启动时就会加载并初始化ActionServler。用户提交表单时,一个配置好的ActionForm对象被创建,并被填入表单相应的数据,ActionServler根据Struts-config.xml文件...
ActionForm里的get和set方法
一个Jsp两个ActionForm分别提交.rar一个Jsp两个ActionForm分别提交.rar一个Jsp两个ActionForm分别提交.rar一个Jsp两个ActionForm分别提交.rar一个Jsp两个ActionForm分别提交.rar
主要是actionForm的基本验证,重写validate方法,返回actionErrors,然后根据资源文件显示错误。 这是一个demo例子,直接导入eclispe中即可。 并且这部分内容会在相应的博客中介绍,稍后会更新博客。
struts1配合,实体,action ,详细代码
struts1使用actionform实现表单验证,表单验证失败追加信息。
用SSH框架做的一个小小的登录例子!! public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { LoginForm loginForm = ...
本文选用的数据库为Oracle 9i,当然你可以在不改动代码的情况下,通过配置文件的调整将其移植到任何具有Blob字段类型的数据库上,如MySQL,SQLServer等。 总体实现 上传文件保存到T_FILE表中,T_FILE表结构...
员工查询功能,使用SSH架构,并实现延迟查询,多条件查询,本例子简单精悍!表示层代码简洁,业务逻辑清晰, 资源齐全
struts 视频 struts视频 actionform
有助于加强我们对Struts1的理解和学习,让我们从原理把握Struts1之后可以更方便更容易的学习Struts2
struts提供了标签来显示整个ActionErrors的错误信息。但要在struts-config.xml中设置<action ...