I'm new to Struts 2 overall and would like to know, if there is a way to get a list of all the namespaces and actions for each namespace that is defined in the xml?
I have a package and I am including configurations for each namespace:
<include file="struts_someNamespace1.xml" />
<include file="struts_someNamespace2.xml" />
<include file="struts_someNamespace3.xml" />
Each of those XML files is defined similar to this (this has less code):
<package name="somePackage" namespace="/someNamespace1" extends="default">
<action name="firstAction" class="com.someAction">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="json"> </interceptor-ref>
<result type="json"> </result>
</action>
<action name="secondAction" class="com.otherAction">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="json"> </interceptor-ref>
<result type="json"> </result>
</action>
</package>
Is there a way using some utility class where I can get a list or of each namespace and its actions?
Example Results (in JSON)
{
"someNamespace1": ["firstAction","secondAction"},
"someNamespace2": ["about","home"]
}
Take a look on the Config Browser plugin, it allows browse (almost) all configuration options.
https://git-wip-us.apache.org/repos/asf?p=struts.git;a=blob;f=plugins/config-browser/src/main/java/org/apache/struts2/config_browser/ConfigurationHelper.java;h=536435f84a7bd818c3051b92fdc94c06cdaa40f6;hb=refs/heads/develop
Related
I have a form where the user is only allowed to upload pdf files. I use the following struts action to limit the size and file type, but only the size limit works. Any ideas on what I am missing? Thanks!
<action name="commentAction" class = "gov.mo.dnr.rat.controller.comment.CommentAction">
<interceptor-ref name="validUserStack">
<param name="fileUpload.maximumSize">5242880</param>
<param name="allowedTypes">application/pdf</param>
</interceptor-ref>
<result name="success" type="tiles">comment</result>
<result name="input" type="tiles">comment</result>
</action>
I found the problem. The allowedTypes should be fileUpload.allowedTypes, in this case.
<action name="commissioner_info" method="commissioner_info" class="foo.bar.AdminInfoAction">
<result name="json" type="json">
<param name="includeProperties">
commissioner_info\[\d+\]\.fname,
commissioner_info\[\d+\]\.designation,
commissioner_info\[\d+\]\.pathlocation
</param>
</result>
</action>
Above code giving Result:
{"commissioner_info":[{"designation":"IG1","fname":"BS Bassi ","pathlocation":"http:\/\/103.231.125.106\/nesos\/imagerepresentatives\/151021104556Bhim.jpg"}]}
But I want only array not json object,like
[{"designation":"IG1","fname":"BS Bassi ","pathlocation":"http:\/\/103.231.125.106\/nesos\/imagerepresentatives\/151021104556Bhim.jpg"}]
You need to specify the object you want to be serialized as the root object:
<result name="json" type="json">
<param name="root">
commissioner_info
</param>
</result>
Otherwise the whole action will be serialized. Read more here.
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 no success yet.
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.
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>
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.
I'm trying to create an Interceptor able to change the language but I can not change it.
Relevant Interceptor code:
public String intercept(ActionInvocation invocation) throws Exception {
ActionMapping mapping = (ActionMapping) invocation
.getInvocationContext()
.get(ServletActionContext.ACTION_MAPPING);
Map<String, Object> params = mapping.getParams();
if (params != null) {
Locale locale = (Locale) params.remove(LOCALE_PARAMETER);
if (locale != null) {
ActionContext.getContext().setLocale(locale);
}
}
return invocation.invoke();
}
struts.xml:
<package name="default" extends="struts-default" namespace="/">
<result-types>
<result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult" />
</result-types>
<interceptors>
<interceptor name="navigator"
class="it.apps.mca.web.interceptors.NavigatorInterceptor">
</interceptor>
<interceptor name="locale"
class="it.apps.mca.web.interceptors.internationalizations.LocaleInterceptor">
</interceptor>
<interceptor-stack name="customStack">
<interceptor-ref name="navigator" />
<interceptor-ref name="locale" />
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<action name="locale"
class="it.apps.mca.web.actions.internationalizations.LocaleAction">
<interceptor-ref name="customStack"></interceptor-ref>
<result name="success" type="redirect">
<param name="location">${target}</param>
<param name="parse">true</param>
</result>
</action>
<action name="login"
class="it.apps.mca.web.actions.authentication.LoginAction">
<result name="success" type="tiles">/welcome.tiles</result>
<result name="input">index.jsp</result>
<result name="error">index.jsp</result>
</action>
</package>
I know i18n interceptor already exists.
I added an interceptor that performs redirections. After adding this interceptor, I lose the location of the page.
The same thing happens if I perform a redirect through the action. You know tell me the reason?
That Interceptor already exists: i18n Interceptor
It is part of the defaultStack, so you don't have to manually include it.
Example of usage
Other info in this answer.
I am trying to create a custom type converter to convert a Collection of objects back and forth from a String. I have a text area in my form and want to create a new object in the Collection for every line break in the text area on my save. When displaying the information, I want to loop through the objects in the Collection and turn it into a String with line breaks for my text area. So far, I am unable to even get my converter to fire or receive any kind of errors based on the annotations that I have. Below is my class definition:
#Conversion()
public class FormsEdit extends JWebCrud{
Inside this class I have a List:
private List<Formfield> formFields;
Inside the Formnfield class I have a Set:
private Set<Formfieldopts> formfieldoptses = new HashSet<Formfieldopts>(0);
#TypeConversion(converter = "com.webexchange.actions.tpa.setup.forms.FormFieldOptsConverter")
public void setFormfieldoptses(Set<Formfieldopts> formfieldoptses) {
this.formfieldoptses = formfieldoptses;
}
Can someone please direct me on how to properly setup these annotations to get the Converter to fire?
Struts 2 Version: 2.2.1
Struts Interceptor Stack:
<interceptor-stack name="stackWithSecurity">
<interceptor-ref name="closeHibernateSession" />
<!--catches exceptions pre or post action class-->
<interceptor-ref name="exceptionInterceptor" />
<interceptor-ref name="security">
<param name="excludeMethods">executeNoSecurity,executeNoSecurityOrValidation</param>
</interceptor-ref>
<interceptor-ref name="alias" />
<interceptor-ref name="servletConfig" />
<!-- Puts HTTPResponse and HTTPRequest objects on the action -->
<interceptor-ref name="openHibernateSession" />
<!-- Opens a db connection and creates a hibernate session -->
<interceptor-ref name="prepare" />
<interceptor-ref name="checkbox" /> <!-- Sets unchecked values into the action with a value of 'false' -->
<interceptor-ref name="params" /><!-- Sets the parameters from the HTTP request to the action -->
<interceptor-ref name="staticParams" />
<interceptor-ref name="conversionError" />
<!-- adds a field error when the value can't be converted to the right type -->
<interceptor-ref name="chain">
<!-- these properties should not be copied from one action to another on a chain -->
<param name="excludes">dao</param>
</interceptor-ref>
<interceptor-ref name="validation">
<param name="excludeMethods">
input,back,cancel,browse,delete,executeNoValidation,executeNoSecurityOrValidation,edit
</param>
<param name="validateAnnotatedMethodOnly">true</param>
</interceptor-ref>
<interceptor-ref name="workflow">
<param name="excludeMethods">
input,back,cancel,browse,delete,executeNoValidation,executeNoSecurityOrValidation,edit
</param>
</interceptor-ref>
</interceptor-stack>
Action Mapping:
<action name="formsSave"
class="com.webexchange.actions.tpa.setup.forms.FormsEdit"
method="save">
<result name="success">/jsp/centers/tpa/setup/forms/EditForms.jsp
</result>
<result name="input">/jsp/centers/tpa/setup/forms/EditForms.jsp
</result>
</action>
Thanks Dave for your help. My s:textarea was not pointing at the Collection I was trying to convert. After I did that the converter started to fire. What a total FAIL on my part, sorry.