首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

struts2的校验框架有有关问题还是小弟我的代码有有关问题

2012-10-31 
struts2的校验框架有问题还是我的代码有问题?问题是这样的,我在struts2的项目中,添加了validation的xml验

struts2的校验框架有问题还是我的代码有问题?
问题是这样的,我在struts2的项目中,添加了validation的xml验证框架,自己认为自己的代码是没有问题的,也在网上搜了很多资料,有很多也遇到过像我一样的问题,都是都没有最后解决,以下是我的代码和配置文件,请大家帮忙看看到底是struts2的validation的bug,还是是我的代码或配置文件错了呢


UserAction

public class UserAction extends ActionSupport{private static final long serialVersionUID = 1L;private UserDao userDao;private String username;private String password;public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public void setUserDao(UserDao userDao) {this.userDao = userDao;}public String login() throws Exception {if (userDao.login(username, password)) {return SUCCESS;} else {return INPUT;}}}

UserDao
public class UserDao extends HibernateEntityExtendDao<User> {public boolean login(String username,String password){if(username==null)return false;if(username.equals("11")){return true;}else{return false;}}}

struts.xml
<struts><constant name="struts.custom.i18n.resources" value="i18n.messageResource" /><constant name="struts.enable.DynamicMethodInvocation" value="true" /><constant name="struts.devMode" value="true" /><package name="default" extends="struts-default"><action name="UserLogin"  method="login"><result name="success">/index.jsp</result><result name="input">/login.jsp</result></action></package></struts>

补充:userAction和userDao都已经在springbean中定义
UserAction-UserLogin-validation.xml
<validators><field name="username"><field-validator type="requiredstring"><message>000</message></field-validator></field><field name="password"><field-validator type="requiredstring"><message>22</message></field-validator></field></validators>

JSP
<body><center><table><tr><td><s:form action="UserLogin!login"><s:textfield name="username" label="%{getText('login.username')}" /><s:textfield name="password" label="%{getText('login.password')}" /><s:submit value="%{getText('login.btnSubmit')}" /></s:form></td></tr></table></center></body>


在jsp中我使用的是服务器端认证,所以理论上来说,不论用户的用户名是否输对,都应该会去执行UserAction的login方法,但是事实上,并没有去执行,而是直接验证失败,在页面上显示验证失败的信息了。很奇怪,也很郁闷。因为如果我把UserAction-UserLogin-validation.xml从actin包中移除的话,其他配置和代码都不改,这样程序中提交的时候,就可以跳入UserAction的login方法, 这到底是为什么呢? 为什么加了这个校验文件之后,就无法执行action了??
        <action name="*Product"  method="{1}">
            <result name="input" type="dispatcher">/main.jsp</result>
            <result name="success">/success.jsp</result>
        </action>
</package>
下面是Action
package ssh.struts.action;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.log4j.Logger;

/**
*
* @author Administrator
*/
public class ProductAction extends ActionSupport{
   
    private final static Logger log=Logger.getLogger(ProductAction.class);
    @Override
    public String execute(){
        log.info("Execute:"+ProductAction.class.getName()+"------execute()");
        log.info(this);
        return SUCCESS;
    }  
    public String add(){
        log.info("Execute:"+ProductAction.class.getName()+"-----add()");
        log.info(this);
        return SUCCESS;
    }
    private String name;
    private double price;
    private int quality;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public int getQuality() {
        return quality;
    }

    public void setQuality(int quality) {
        this.quality = quality;
    }
    @Override
    public String toString(){
        return "\n"+"产品名:"+this.name+"\n"+"价格:"+this.price+"\n"+"数量:"+this.quality;
    }
    @Override
    public void validate(){
        super.validate();
    }
}
验证文件名ProductAction-addProduct-validation.xml
(1)刚开始的时候怎么都不行,无论是验证对还是错都返回input搞的我不知所措,所以查看ActionSupport的源文件,发现validate方法是空实现。所以想想应该是容器去调用的。
(2)然后我把配置改成
<package name="product"  namespace="/product" extends="struts-default">
        <action name="addProduct"  method="add">
            <result name="input" type="dispatcher">/main.jsp</result>
            <result name="success">/success.jsp</result>
        </action>
</package>
验证文件名改成ProductAction-validation.xml
成功了
(3)又把action配置改成通配符形式
又成功了(这个肯定能成功)
(4)之后我把验证文件名又改成ProductAction-add.xml又成功了
(5).所以我认为,应该是验证文件名的问题
32 楼 ywbanm 2008-11-07   终于知道为什么了!!!!!!
搞了一天多!!!
相信很多人都是因为这个原因,validation一直转到input page!!!!

s:form 里面的feilde要严格匹配Class里的!!!
包括大小写!!!!

很多人在jsp里习惯写小写(loginid),在Class里是(loginId),所以出问题!!! 33 楼 vivid_gxp 2008-11-07   "在jsp中我使用的是服务器端认证,所以理论上来说,不论用户的用户名是否输对,都应该会去执行UserAction的login方法,但是事实上,并没有去执行,而是直接验证失败,在页面上显示验证失败的信息了。很奇怪,也很郁闷。因为如果我把UserAction-UserLogin-validation.xml从actin包中移除的话,其他配置和代码都不改,这样程序中提交的时候,就可以跳入UserAction的login方法, 这到底是为什么呢? 为什么加了这个校验文件之后,就无法执行action了?? "

Struts2的交验框架有很多要求的。
1.命名规则:带交验Action名 + "-validation.xml"。
2.必须放在同Action的目录中。Struts2回去自己寻找并且加载验证。 34 楼 ywbanm 2008-11-07   把validation文件和Action放在一起感觉很乱,有办法指定其读取路径么?哪怕在action下多一层也好得多。 35 楼 baobeituping 2008-12-01   UserAction-validation.xml
验证文件的名称必须是你的ACTION名加上"-"加上validation.xml组成,而且你的验证文件似乎要和你的ACTION放在同一个目录下 36 楼 wexl 2008-12-05   struts2和Spring集成的时候,用IOC方式注入session,response,request居然不起作用了。。 37 楼 maodun1978 2008-12-15   UserAction-UserLogin-validation.xml应该改名为UserAction-validation.xml吧 38 楼 kjj 2008-12-18  
所以理论上来说,不论用户的用户名是否输对,都应该会去执行UserAction的login方法,
==================================================================
要这样的话还要验证搞屁 39 楼 346061983 2008-12-18   struts2是这样子运行的先进行

类型转换=>数据校验->执行方法

所以你的校验是运行在执行前的,当有一条错误时,就会把这条错误添加到linkedmap中
如果这个map中有值了,那么他就会直接反回input这个页面 40 楼 huangxingzhe 2008-12-24   表单没有设着validate 属性为TRUE 41 楼 xpice 2008-12-26   UserAction-validation.xml 42 楼 weid0907 2009-04-19   我也遇到了类似问题,只不过我是在代码中重写validate方法了。看到回复中spring配置的bean的scope改为prototype,我尝试了一下,问题就解决了。

热点排行