Dilis
Dilis

Reputation: 267

How to validate specific action using XML configuration in Struts 2

I want to validate specific method only in action class.

Action method is this

public String add() throws Exception {

// aflag = true;

org.setAoName(aoName);
orgBo.addOrg(org);
orglist = orgBo.searchOrg(organisationSearch);
setAoName("");
setAflag("viewaddorgs");

return "add";
}

Problem is currently I have many action methods in action class. When I call those methods it validate this method. Please help me to validate only this method by XML.

This is my OraganisationAction-validation.xml:

    <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator 1.0.3//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">

<validators>

    <field name="aoName">
        <field-validator type="requiredstring">
            <message>
                The name is required!
            </message>
        </field-validator>
        
        <field-validator type="requiredfield">
            <message>
                The name is required!
            </message>
        </field-validator>
    </field>


</validators>

This is my JSP :

    <s:form id="post" action="addorgs" validate="true" >

    <s:textfield name="aoName" label="Add Organisations"  />

</s:form>

struts xml :

<package name="default" extends="struts-default">


        <result-types>
            <result-type name="tiles"
                class="org.apache.struts2.views.tiles.TilesResult" />
        </result-types>
        
        <action name="*security" class="com.ast.action.admin.SecurityAction"
            method="{1}">
            <result name="second" type="tiles">secondTemplate</result>
            <result name="pass" type="tiles">orgTemplate</result>
        </action>


        <action name="*orgs" class="com.ast.action.admin.OraganisationAction"
            method="{1}">
            
            <result name="viewadd" type="tiles">orgAddTemplate</result>
            <result name="input" type="tiles">orgAddTemplate</result>
            <result name="add" type="tiles">orgAddTemplate</result>
            <result name="addtbl" type="tiles">orgAddTemplate</result>
            <result name="search" type="tiles">orgTemplate</result>
            <result name="delete" type="tiles">orgTemplate</result>
            <result name="viewedit" type="tiles">orgEditTemplate</result>
            <result name="edit" type="tiles">orgEditTemplate</result>
            <result name="edittbl" type="tiles">orgEditTemplate</result>
            <result name="orgmenu" type="tiles">orgTemplate</result>
            <result name="view" type="tiles">orgViewTemplate</result>
        </action>

it works with annotations, but with XML has no success yet.

Upvotes: 0

Views: 3095

Answers (3)

Andrea Ligios
Andrea Ligios

Reputation: 50203

Use an action alias: map different methods of an Action to different action aliases in struts.xml, and instead of the single yourAction-validation.xml file, add a yourAction-yourAlias-validation.xml for the validators you want to perform for that method only.

Read more here.

EDIT

No its not validation anything now.

<validators> 
    <field name="aoName">
        <field-validator type="required"> 
            <message>You cannot leave the aoName address field empty.</message>
        </field-validator> 
    </field>
</validators>

name is OraganisationAction-add-validation.xml and put it with action class package. Is there anything to enable validation in struts.xml ?

If you have a correctly configured (for example the default) Interceptor Stack, validation is already enabled. If you are using a file named OraganisationAction-add-validation.xml, that means that:

  • your action CLASS must be named OraganisationAction.java;
  • your action mapping in struts.xml must be the following:

    <action name="add" class="your.package.OraganisationAction" method="add">
        <result>yourResult.jsp</result>
    </action>
    

Look for typos, check your Interceptor Stack, and it will work automatically.

Upvotes: 0

Anish
Anish

Reputation: 1

I had similar problems but then these are couple of things that i rectified :

1) DOCTYPE in the yourAction-yourAlias-validation.xml should be

    <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN"
    "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">

2)Created a custom interceptor to exclude the methods that need not be validated.Below is a sample for my candidate registration where i had to skip validation for district method which fetched districts for a state.

 <interceptor-stack name="clientValidation">
  <interceptor-ref name="basicStack"/>
   <interceptor-ref name="validation">
     <param name="excludeMethods">input,district</param>
    </interceptor-ref>
  <interceptor-ref name="workflow"/>
</interceptor-stack>


<package name="registration" namespace="/candidate" extends="struts-default">
            <action name="candidateRegistration" class="com.app.action.CandidateAction">
            <interceptor-ref name="clientValidation"/>
                <result name="input">/jsps/student/studentregistration.jsp</result>
                <result name="failure1">/jsps/student/registrationfailure.jsp</result>
                <result name="cancelRegistration">/jsps/login.jsp</result>
                <result name="district">/jsps/includes/dropdown_districts_regoffice.jsp</result>
            </action>
        </package>

Upvotes: 0

Roman C
Roman C

Reputation: 1

To exclude some methods from validation you can override parameters of the validation interceptor. For example in interceptor stack you can write

<interceptor-ref name="validation">
  <param name="excludeMethods">input,back,cancel,browse,yourmethod</param>
</interceptor-ref>

in the action configuration you can use above code and

<interceptor-ref name="defaultStack">
  <param name="validation.excludeMethods">input,back,cancel,browse,yourmethod</param>
</interceptor-ref>

Note yourmethod is a method name.

You can specify a validation.xml for only one action by a postfix of action name in this file. For example AcrionClass-add-validation.xml will work only for the action name add in the action config. Note here add is an action name, not a method name.

Often, the name attribute matches the method name, but they may also differ.

Upvotes: 0

Related Questions