随着应用程序的增长,Struts 2 验证无法正常工作 [英] Struts 2 validation not working properly as application grows

查看:26
本文介绍了随着应用程序的增长,Struts 2 验证无法正常工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在构建复杂的 Web 应用程序时是否有任何替代验证框架?或任何验证指南.示例链接不是必需的,因为它适用于简单的表单,但不适用于具有多个链接的复杂表单.

这是我的动作类

package com.tpc.action;导入 java.util.ArrayList;导入 java.util.List;导入 com.opensymphony.xwork2.ActionSupport;导入 com.tpc.domain.LeadFacultyModel;导入 com.tpc.service.LeadFacultyServiceInterface;公共类 LeadFacultyAction 扩展了 ActionSupport {private static final long serialVersionUID = 1L;私人 LeadFacultyModel LeadFacultyModel;私人字符串lead_faculty_formAction;//注入leadFacultyServiceImpl beanLeadFacultyServiceInterface LeadFacultyServiceImpl;//变量存储动作消息通过get请求传递给其他页面私人字符串 action_msg = null;私人列表LeadFacultyModelList = new ArrayList();公共字符串执行()抛出异常{返回成功;}public String formAction() 抛出异常{如果(lead_faculty_formAction.equals(保存")){System.out.println("内部更新");返回 this.updateLeadFaculty();}否则如果(lead_faculty_formAction.equals(提交")){System.out.println("里面保存");返回 this.saveLeadFaculty();}否则如果(lead_faculty_formAction.equals(删除")){System.out.println("内部删除");返回 this.deleteLeadFaculty();}别的{返回成功;}}公共字符串 saveLeadFaculty() 抛出异常 {布尔结果 =leadFacultyServiceImpl.createLeadFaculty(leadFacultyModel);如果(结果 == 真){addActionMessage(getText("message.save_success"));返回 "SAVE_SUCCESS";}别的 {addActionError(getText("message.save_error"));返回保存错误";}}公共字符串 viewAllLeadFaculty(){//TODO 自动生成的方法存根System.out.println("查看所有方法被调用");尝试{LeadFacultyModelList = LeadFacultyServiceImpl.getAllLeadFaculty();System.out.println("操作页面"+leadFacultyModelList.size());返回成功;}catch(异常前){ex.printStackTrace();返回错误;}}//该类中的getter/setter方法部分公共无效setLeadFacultyModel(LeadFacultyModelleadFacultyModel){this.leadFacultyModel =leadFacultyModel;}公共 LeadFacultyModel getLeadFacultyModel() {返回leadFacultyModel;}公共字符串 getLead_faculty_formAction() {返回lead_faculty_formAction;}公共无效setLead_faculty_formAction(字符串lead_faculty_formAction){this.lead_faculty_formAction =lead_faculty_formAction;}public void setLeadFacultyServiceImpl(LeadFacultyServiceInterface LeadFacultyServiceImpl) {this.leadFacultyServiceImpl = LeadFacultyServiceImpl;}public void setAction_msg(String action_msg) {this.action_msg = action_msg;}公共列表getLeadFacultyModelList() {返回leadFacultyModelList;}public void setLeadFacultyModelList(ListleadFacultyModelList){this.leadFacultyModelList = LeadFacultyModelList;}公共字符串 getAction_msg() {返回 action_msg;}}

这是 LeadFacultyAction-validation.xml:

<!DOCTYPE 验证器 PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"><验证器><field name="leadFacultyModel.lead_string_FacultyName"><field-validator type="requiredstring"><message>名称为必填项.</message></field-validator></field></验证器>

这是 struts.xml 文件:

<!--/** 定义实现tile的结果类型**/--><结果类型><结果类型名称=瓷砖"class="org.apache.struts2.views.tiles.TilesResult"/></结果类型><全局结果><result name="error">/404_error.jsp</result></global-results><动作名称=""><结果></结果></动作><action name="baseTemplate" ><result type="tiles">baseTemplate</result></动作><action name="setup_lead_faculty"><result type="tiles">setup_lead_faculty</result></动作><action name="setup_LeadFacultyAction" class="com.tpc.action.LeadFacultyAction" method="formAction"><result name="SAVE_SUCCESS" type="tiles">setup_lead_faculty</result><result name="UPDATE_SUCCESS" type="tiles">setup_lead_faculty</result><result name="DELETE_SUCCESS" type="tiles">setup_lead_faculty</result><result name="SAVE_ERROR" type="tiles">setup_lead_faculty</result><result name="UPDATE_ERROR" type="tiles">setup_lead_faculty</result><result name="DELETE_ERROR" type="tiles">setup_lead_faculty</result><result name="input" type="tiles">setup_lead_faculty</result></动作><action name="setup_LeadFaculty_list_view_Action" class="com.tpc.action.LeadFacultyAction" method="viewAllLeadFaculty"><result type="tiles" name="success">setup_lead_faculty_list_view</result></动作><action name="setup_LeadFacultyAction_selected_from_list" class="com.tpc.action.LeadFacultyAction" method="getByIdLeadFaculty"><result type="tiles" name="success">setup_lead_faculty</result></动作></包>

这是我的 JSP 文件:

 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><%@ page language="java" contentType="text/html; charset=ISO-8859-1"pageEncoding="ISO-8859-1"%><%@ taglib prefix="s" uri="/struts-tags"%><c:set value="/lms/" var="baseUrl"/><s:form method="post" action="setup_LeadFacultyAction"><div class="buttontab"><input type="submit" name="lead_faculty_formAction" value="保存"class="form_button"/>&nbsp;&nbsp;&nbsp;<输入类型=提交"name="lead_faculty_formAction" value="提交" class="form_button"/>&nbsp;&nbsp;&nbsp;<input type="submit" name="lead_faculty_formAction"value="Delete" class="form_button"/>&nbsp;&nbsp;&nbsp;<输入type="submit" name="lead_faculty_formAction" value="Reset" disabled="disabled"class="form_button"/>&nbsp;&nbsp;&nbsp;<span class="span"样式=浮动:右;"><i><a href="${baseUrl}lead/setup_LeadFaculty_list_view_Action">

<div id="content_wrap"><div class="unidiv1"><s:if test="hasActionErrors()"><div class="errors"><s:actionerror/>

</s:if><div><p><s:actionmessage/></p>

</s:if><s:if test="hasFieldErrors()"><div><p><s:fielderror/></p>

</s:if><div class="field_wrapper"><div class="left_box"><label>ID</label>

<div class="right_box"><input type="text" name="leadFacultyModel.lead_string_FacultyId" value="${leadFacultyModel.lead_string_FacultyId}"class="input_id"/>

<div class="field_wrapper"><div class="left_box"><label>Faculy</label>

<div class="right_box"><input type="text" name="leadFacultyModel.lead_string_FacultyName" value="${leadFacultyModel.lead_string_FacultyName }"/>

<div class="field_wrapper"><div class="left_box"><label>备注</label>

<div class="right_box"><textarea name="leadFacultyModel.lead_string_FacultyRemarks"class="textarea_address">${leadFacultyModel.lead_string_FacultyRemarks}</textarea>

解决方案

区别仅在于当 Struts 在拦截它处理这些注解的操作时发现验证注解,以通过应用注解公开的验证规则来执行验证.解析-validation.xml 时也是如此.您可以同时使用基于 xml 和基于注解的验证方法,也可以添加自定义验证(不包括自定义验证器).

例如,如果我有一个 phone 字段并且我想验证它不是空的并且包含预定义的格式,我将在其上添加两个注释.

 私人字符串电话;公共字符串 getPhone() {回电话;}@RequiredStringValidator(type= ValidatorType.FIELD, message=需要电话.")@RegexFieldValidator(type= ValidatorType.FIELD, message=Invalid Phone",regexExpression="\\([0-9][0-9][0-9]\\)\\s[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]")公共无效setPhone(字符串电话){this.phone = 电话;}

然后我有一个 execute 动作我不想验证

 @SkipValidation公共字符串执行()抛出异常{

然后我有另一个操作 save 我想验证 questions 但我不想验证 phone.

 private String myQuestionq1;私人字符串 myQuestionq2;公共字符串 getMyQuestionq1() {返回 myQuestionq1;}public void setMyQuestionq1(String myQuestionq1) {this.myQuestionq1 = myQuestionq1;}公共字符串 getMyQuestionq2() {返回 myQuestionq2;}public void setMyQuestionq2(String myQuestionq2) {this.myQuestionq2 = myQuestionq2;}@Action(值=保存",结果= {@Result(name="input", location = "/default.jsp"),@Result(名称=返回",类型=重定向",位置=/")},interceptorRefs = @InterceptorRef(value=defaultStack", params = {validation.validateAnnotatedMethodOnly", true"}))@Validations(requiredFields = {@RequiredFieldValidator(type = ValidatorType.FIELD, fieldName = "myQuestionq1", message = "You must enter a value for field myQuestionq1."),@RequiredFieldValidator(type = ValidatorType.FIELD, fieldName = "myQuestionq2", message = "You must enter a value for field myQuestionq2.")})public String save() 抛出 SQLException {

这将仅在此操作上执行验证器.

您总能在 Apache 网站上找到更多示例:使用注释示例进行验证.

Is there any alternative validation framework while building complex web app? Or any guide for validation. Links to example is not required as it working on simple Form but not in complex Form with multiple links.

This is my action class

package com.tpc.action;

 import java.util.ArrayList;
 import java.util.List;

 import com.opensymphony.xwork2.ActionSupport;
 import com.tpc.domain.LeadFacultyModel;
 import com.tpc.service.LeadFacultyServiceInterface;

  public class LeadFacultyAction extends ActionSupport {


private static final long serialVersionUID = 1L;


private LeadFacultyModel leadFacultyModel;

private String lead_faculty_formAction;

// Injecting leadFacultyServiceImpl bean 
LeadFacultyServiceInterface leadFacultyServiceImpl;


//variable to store the action message to pass to other pages through get request
private String action_msg = null;

private List<LeadFacultyModel> leadFacultyModelList = new ArrayList<LeadFacultyModel>();


public String execute() throws Exception {
    return SUCCESS;
}


public String formAction() throws Exception
{
    if(lead_faculty_formAction.equals("Save"))
    {
        System.out.println("Inside Update");
        return this.updateLeadFaculty();
    }
    else if(lead_faculty_formAction.equals("Submit"))
    {
        System.out.println("Inside Save");
        return this.saveLeadFaculty();      
    }
    else if(lead_faculty_formAction.equals("Delete"))
    {
        System.out.println("Inside Delete");
        return this.deleteLeadFaculty();
    }
    else
    {
        return SUCCESS;
    }           

}

public String saveLeadFaculty() throws Exception {

    boolean result =leadFacultyServiceImpl.createLeadFaculty(leadFacultyModel);
    if(result == true)
    {
        addActionMessage(getText("message.save_success"));
        return "SAVE_SUCCESS";
    }
    else {
        addActionError(getText("message.save_error"));
        return  "SAVE_ERROR";
    }

}

public String viewAllLeadFaculty(){
    // TODO Auto-generated method stub
    System.out.println("view all method is called");
    try{
        leadFacultyModelList = leadFacultyServiceImpl.getAllLeadFaculty();
        System.out.println("Action page "+leadFacultyModelList.size());
        return SUCCESS;
    }catch(Exception ex){
        ex.printStackTrace();
        return ERROR;
    }


}



//Section of getter/setter methods in this class

public void setLeadFacultyModel(LeadFacultyModel leadFacultyModel) {
    this.leadFacultyModel = leadFacultyModel;
}

public LeadFacultyModel getLeadFacultyModel() {
    return leadFacultyModel;
}

public String getLead_faculty_formAction() {
    return lead_faculty_formAction;
}
public void setLead_faculty_formAction(String lead_faculty_formAction) {
    this.lead_faculty_formAction = lead_faculty_formAction;
}

public void setLeadFacultyServiceImpl(
        LeadFacultyServiceInterface leadFacultyServiceImpl) {
    this.leadFacultyServiceImpl = leadFacultyServiceImpl;
}

public void setAction_msg(String action_msg) {
    this.action_msg = action_msg;
}

public List<LeadFacultyModel> getLeadFacultyModelList() {
    return leadFacultyModelList;
}

public void setLeadFacultyModelList(List<LeadFacultyModel> leadFacultyModelList) {
    this.leadFacultyModelList = leadFacultyModelList;
}

public String getAction_msg() {
    return action_msg;
}   
}

This is LeadFacultyAction-validation.xml:

<!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="leadFacultyModel.lead_string_FacultyName">
    <field-validator type="requiredstring">
     <message>Name is required.</message>
    </field-validator>
    </field>
  </validators>

this is struts.xml file:

<?xml version="1.0" encoding="UTF-8"?>

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

<!-- /** defining result types for implementing tiles **/ -->
    <result-types>
        <result-type name="tiles"
            class="org.apache.struts2.views.tiles.TilesResult" />
    </result-types>
    <global-results>
        <result name="error">/404_error.jsp</result>
    </global-results>
    <action name="">
        <result></result>
    </action>
    <action name="baseTemplate" >
        <result type="tiles">baseTemplate</result>
    </action>


    <action name="setup_lead_faculty">
        <result type="tiles">setup_lead_faculty</result>
    </action>

    <action name="setup_LeadFacultyAction" class="com.tpc.action.LeadFacultyAction" method="formAction">
        <result name="SAVE_SUCCESS" type="tiles">setup_lead_faculty</result>
        <result name="UPDATE_SUCCESS" type="tiles">setup_lead_faculty</result>
        <result name="DELETE_SUCCESS" type="tiles">setup_lead_faculty</result>
        <result name="SAVE_ERROR" type="tiles">setup_lead_faculty</result>
        <result name="UPDATE_ERROR" type="tiles">setup_lead_faculty</result>
        <result name="DELETE_ERROR" type="tiles">setup_lead_faculty</result>
        <result name="input" type="tiles">setup_lead_faculty</result>
    </action>

    <action name="setup_LeadFaculty_list_view_Action" class="com.tpc.action.LeadFacultyAction" method="viewAllLeadFaculty">
        <result type="tiles" name="success">setup_lead_faculty_list_view</result>
    </action>

    <action name="setup_LeadFacultyAction_selected_from_list" class="com.tpc.action.LeadFacultyAction" method="getByIdLeadFaculty">
        <result type="tiles" name="success">setup_lead_faculty</result>
    </action>

</package>

This is my JSP file:

 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
 <c:set value="/lms/" var="baseUrl" />
<s:form method="post" action="setup_LeadFacultyAction">
<div class="buttontab">
    <input type="submit" name="lead_faculty_formAction" value="Save"
        class="form_button" /> &nbsp;&nbsp;&nbsp; <input type="submit"
        name="lead_faculty_formAction" value="Submit" class="form_button" />
    &nbsp;&nbsp;&nbsp; <input type="submit" name="lead_faculty_formAction"
        value="Delete" class="form_button" /> &nbsp;&nbsp;&nbsp; <input
        type="submit" name="lead_faculty_formAction" value="Reset"     disabled="disabled"
        class="form_button" /> &nbsp;&nbsp;&nbsp; <span class="span"
        style="float: right;"> <i><a   href="${baseUrl}lead/setup_LeadFaculty_list_view_Action"> <img
            src="${baseUrl}icons/gridview.png" width="12px" height="12px" /></a> </i> </span>&nbsp;&nbsp;&nbsp;
    <span class="span" style="float: right;"> <i><img
            src="${baseUrl}icons/formview.png" width="12px" height="12px" /> </i> </span>&nbsp;&nbsp;&nbsp;
    <span class="span" style="float: right;"> <i><img
            src="${baseUrl}icons/tileview.png" width="12px" height="12px" /> </i> </span>&nbsp;&nbsp;&nbsp;
</div>
<div id="content_wrap">
    <div class="unidiv1">

        <s:if test="hasActionErrors()">
            <div class="errors">
                <s:actionerror/>
            </div>
        </s:if>
        <s:if test="hasActionMessages()">
            <div>
                <p><s:actionmessage/></p>
            </div>      
        </s:if>
        <s:if test="hasFieldErrors()">
            <div>
                <p><s:fielderror/></p>
            </div>      
        </s:if>

        <div class="field_wrapper">
            <div class="left_box">
                <label>ID</label>
            </div>
            <div class="right_box">
                <input type="text" name="leadFacultyModel.lead_string_FacultyId" value="${leadFacultyModel.lead_string_FacultyId}"
                    class="input_id" />
            </div>
        </div>
        <div class="field_wrapper">
            <div class="left_box">
                <label>Faculy</label>
            </div>
            <div class="right_box">
                <input type="text" name="leadFacultyModel.lead_string_FacultyName" value="${leadFacultyModel.lead_string_FacultyName }" />
            </div>

        </div>
        <div class="field_wrapper">
            <div class="left_box">
                <label>Remarks</label>
            </div>
            <div class="right_box">
                <textarea name="leadFacultyModel.lead_string_FacultyRemarks"
                    class="textarea_address">${leadFacultyModel.lead_string_FacultyRemarks}</textarea>
            </div>
        </div>


    </div>
</div>

解决方案

The difference is only if Struts discover validation annotations while intercepting the action it processes those annotations to perform validations by applying validation rules exposed by annotations. The same thing is when parsing -validation.xml. You can use both validation methods xml based and annotation based together, or with addition to custom validation (excluding custom validators).

For example, if I have a phone field and I want to validate it is not empty and contains a predefined format I will just put two annotations on it.

  private String phone;

  public String getPhone() {
    return phone;
  }

  @RequiredStringValidator(type= ValidatorType.FIELD, message="Phone required.")
  @RegexFieldValidator(type= ValidatorType.FIELD, message="Invalid Phone",
    regexExpression="\\([0-9][0-9][0-9]\\)\\s[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]")
  public void setPhone(String phone) {
    this.phone = phone;
  }

then I have an execute action I don't want to validate

  @SkipValidation
  public String execute() throws Exception {

then I have another action save that I want to validate questions but I don't want to validate a phone.

  private String myQuestionq1;
  private String myQuestionq2;

  public String getMyQuestionq1() {
    return myQuestionq1;
  }

  public void setMyQuestionq1(String myQuestionq1) {
    this.myQuestionq1 = myQuestionq1;
  }

  public String getMyQuestionq2() {
    return myQuestionq2;
  }

  public void setMyQuestionq2(String myQuestionq2) {
    this.myQuestionq2 = myQuestionq2;
  }

  @Action(value="save", results = {
    @Result(name="input", location = "/default.jsp"),
    @Result(name="back", type="redirect", location = "/")

  },interceptorRefs = @InterceptorRef(value="defaultStack", params = {"validation.validateAnnotatedMethodOnly", "true"}))
  @Validations(requiredFields = {
      @RequiredFieldValidator(type = ValidatorType.FIELD, fieldName = "myQuestionq1", message = "You must enter a value for field myQuestionq1."),
      @RequiredFieldValidator(type = ValidatorType.FIELD, fieldName = "myQuestionq2", message = "You must enter a value for field myQuestionq2.")
  })
  public String save() throws SQLException {

this will execute only validators on this action.

More examples you could always find on Apache web site: Validation using annotations examples.

这篇关于随着应用程序的增长,Struts 2 验证无法正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆