1

これがどこかで尋ねられた場合は申し訳ありませんが、私は周りを見回していくつかの答えを見つけましたが、完全な例ではなく、私はまだこれに疑問を持っています。

そこで、Springコントローラーからjspに自動入力リストを追加し、javascript/jquery関数内のリストに項目を追加したいと思います。出来ますか?

以下のコードを試して機能をテストしましたが、機能しませんでした(生成されたhtmlにリスト要素がまったく表示されませんでした)。したがって、Imがjavascrit / spring / jsp構文を台無しにしたのか、それとも不可能なのかはわかりません。

コードは次のとおりです。

コントローラーコード:

@RequestMapping(value="/create_custobject.html",method = RequestMethod.GET)
public ModelAndView showCreateCustObjectPage() {
    Map<String, Object> model = new HashMap<String, Object>();

    CreateObjectForm form = new CreateObjectForm();
    model.put("createObjectform", form);

    return new ModelAndView("create_custobject", model) ;

}

フォームコード:

public class CreateObjectForm {

      private AutoPopulatingList<Criteria> ruleArray = new AutoPopulatingList<Criteria>(Criteria.class);

     public AutoPopulatingList<Criteria> getRuleArray() {
    return ruleArray;
        }

         public void setRuleArray(AutoPopulatingList<Criteria> ruleArray) {
    this.ruleArray = ruleArray;
        }

         public CreateObjectForm() {}
      }

基準コード:

public class Criteria{

   String attribute;

    String operator;
       //... constructor + getters and setters
}

javascript / jqueryコード(jspのものと同じページにあります):

<script type="text/javascript">
$(document).ready(function(){
    //startup functionality

 var i = 0;
 document.getElementById("addCriteria").onclick = function() {

         $("#msgid").html("${ruleArray[i].attribute}");

        ${ruleArray[i].attribute} = $('#attributeValue').val();             
        ${ruleArray[i].operator} = $('#operatorValue').val(); 

                    i++;            

      }
   }
4

4 に答える 4

3

フォーム内の既存のアイテムには、jstlを次のように使用します

<c:forEach items="${form.items}" var="item" varStatus="status" >
<span class="count" > 
<form:input   path="items[${status.index}].field" />

これはこのようなフォームをレンダリングします

<form id = "idform" >
<span class="count" > 
    <input   name="items[0].field"  id="items0.field" />
</span>
</form>

次に、対応するインデックスを持つ新しいフォーム「行」をjavascriptで追加するだけです。

例えば

 var is = $('.count').size()
 $('#idform span:last').after('<span class="count" ><input name="items[' + is + '].field"' + is + '.field" /></span>')

Spring 3 +を使用している場合は、AutopopulatingListを使用する必要はないと思います。どのコレクションでも、十分なはずです。

于 2012-11-13T12:01:40.293 に答える
1

JSPELとJavascriptの不適切な混合。var iつまり、JSP表現内では使用できません。${ruleArray[i].operator}。JSTLを使用してリストを反復処理し、スクリプト内に属性を作成することをお勧めします。

この時点0で、式内で文字列リテラルを使用するようにスクリプトを設定できます。これよりも堅牢な機能が必要だと思いますが、もっと詳しく説明していただけますか。

$(document).ready(function(){
     document.getElementById("addCriteria").onclick = function() {

     $("#msgid").html("${ruleArray[0].attribute}");

     //I assume you wanted to set the element to the value pulled from JSP EL
     $('#attributeValue').val(${ruleArray[0].attribute});           
     $('#operatorValue').val(${ruleArray[0].operator});           

     }
 }

JSTLを使用すると、ソリューションは次のようになります。

<script>
 var criteria = [];
 <c:forEach var="criteria" items=${ruleArray}>
    criteria.push({attr:${criteria.attribute}, oper: ${criteria.operator});
 </c:forEach>

 for(var i = 0; i < criteria.length; i++){
  alert(criteria[i].attribute);
 }
</script>

このソリューションは基本的にJSTLを使用してJavascriptを記述します。コントローラを変更してJSONを返し、ページの読み込み時にAjax呼び出しを行う方がよい場合があります。

于 2012-11-13T10:30:01.500 に答える
0

次の行ではi、jspコードで参照していますが、iは定義されていません。

$("#msgid").html("${ruleArray[i].attribute}");

定義するjavascriptコードiは、クライアント(つまりブラウザ)で実行されます。jspコードは、レンダリングされたhtmlがクライアントに送信される前に、サーバー上で実行されます。

于 2012-11-13T10:38:53.793 に答える
0

このスレッドは古く、正しく回答されていますが、初心者の方のために、また追加された行の削除を実現するためのロジックを説明するために。

最小限のコードと、firstName、email、userName、genderの各フィールドを使用したユーザーの例で説明します。
コントローラからusersListに3つの空のユーザーを送信しているとすると、これにより3つの空の行が作成されます。次に、行を追加し、追加した行をmodelAttributeに動的にバインドします。

(最初の3行の場合)ページソースを検査/表示すると、次のように表示されます。

  • のような<input> tags異なるIDを持つRows( )list0.firstName list1.firstName
  • のような<input> tags異なる名前のRows( )list[0].firstName list[1].firstName

フォームが送信されるたびに、 IDはサーバーによって考慮されません(クライアント側の検証を支援するためにのみ追加されます)が、name属性は要求パラメーターとして解釈され、modelAttributeを構築するために使用されるため、行を挿入する際に属性名は非常に重要です。

行を追加する

では、新しい行を作成/追加するにはどうすればよいですか?
UIから6人のユーザーを送信すると、コントローラーはusersListから6人のユーザーオブジェクトを受け取る必要があります。同じことを実現するための手順を以下に示します。1。ページソースの表示を
右クリックします。このような行が表示されます(最初の行と2番目の行で確認できます)-> *[0].**[1].*

<tr>
    <td><input id="list0.firstName" name="list[0].firstName" type="text" value=""/></td>
    <td><input id="list0.email" name="list[0].email" type="text" value=""/></td>
    <td><input id="list0.userName" name="list[0].userName" type="text" value=""/></td>
    <td>
        <span>
            <input id="list0.gender1" name="list[0].gender" type="radio" value="MALE" checked="checked"/>Male
        </span>
        <span>
            <input id="list0.gender2" name="list[0].gender" type="radio" value="FEMALE"/>Female
        </span>
    </td>
</tr>

<tr>
    <td><input id="list1.firstName" name="list[1].firstName" type="text" value=""/></td>
    <td><input id="list1.email" name="list[1].email" type="text" value=""/></td>
    <td><input id="list1.userName" name="list[1].userName" type="text" value=""/></td>
    <td>
        <span>
            <input id="list1.gender1" name="list[1].gender" type="radio" value="MALE" checked="checked"/>Male
        </span>
        <span>
            <input id="list1.gender2" name="list[1].gender" type="radio" value="FEMALE"/>Female
        </span>
    </td>
</tr>
  1. 最初の行をコピーしてJavaScript文字列を作成し、「0」を変数名インデックスに置き換えます。以下のサンプルに示されているように
'<tr>'+
    '<td><input id="list'+ index +'.firstName" name="list['+ index +'].firstName" type="text" value=""/></td>'+
    '<td><input id="list'+ index +'.email" name="list['+ index +'].email" type="text" value=""/></td>'+
    ...
'</tr>';
  1. 構築された行をに追加し<tbody>ます。フォームの送信時にも行がUIに追加され、新しく追加された行がコントローラーで受信されます。

行を削除しています

行の削除は少し複雑です、私は最も簡単な方法で説明しようとします

  • row0、row1、row2、row3、row4、row5を追加したとします。
  • row2、row3を削除しました。行を非表示にするだけでなく、イベントをキャッチしてDOMから削除します。
  • これで、row0、row1、row4、row5が送信されますが、コントローラーではuserListに6つのユーザーオブジェクトがありますが、user [2] .firstNameはnullになり、user[3].firstNameはnullになります。
  • したがって、コントローラーでnullを繰り返して確認し、ユーザーを削除します(ユーザーオブジェクトを削除するためにforeachを使用しないでください)。

初心者に役立つコードを投稿する。

//  In Controller
@RequestMapping(value = "/app/admin/add-users", method = RequestMethod.GET)
public String addUsers(Model model, HttpServletRequest request)
{
    List<DbUserDetails> usersList = new ArrayList<>();

    ListWrapper userListWrapper = new ListWrapper();
    userListWrapper.setList(usersList);


    DbUserDetails user;
    for(int i=0; i<3;i++)
    {
        user = new DbUserDetails();
        user.setGender("MALE"); //Initialization of Radio button/ Checkboxes/ Dropdowns
        usersList.add(user);
    }


    model.addAttribute("userListWrapper", userListWrapper);
    model.addAttribute("roleList", roleList);

    return "add-users";
}

@RequestMapping(value = "/app/admin/add-users", method = RequestMethod.POST)
public String saveUsers(@ModelAttribute("userListWrapper") ListWrapper userListWrapper, Model model, HttpServletRequest request)
{
    List<DbUserDetails> usersList = userListWrapper.getList();
    Iterator<DbUserDetails> itr = usersList.iterator();

    while(itr.hasNext())
    {
        if(itr.next().getFirstName() == null)
        {
            itr.remove();
        }
    }

    userListWrapper.getList().forEach(user -> {
        System.out.println(user.getFirstName());
    });
    return "add-users";
}

//POJO
@Entity
@Table(name = "userdetails")
@XmlRootElement(name = "user")
public class DbUserDetails implements Serializable
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String  firstName;
    private String  userName;
    private String  email;
    private String  gender;

    //setters and getters
}

//list wrapper
public class ListWrapper
{
    private List<DbUserDetails> list;

    //setters and getters
}

JSPでは

<form:form method="post" action="${pageContext.request.contextPath}/app/admin/add-users" modelAttribute="userListWrapper">
    <table class="table table-bordered">
        <thead>
            <tr>
                <th><spring:message code="app.userform.firstname.label"/></th>
                <th><spring:message code="app.userform.email.label"/></th>
                <th><spring:message code="app.userform.username.label"/></th>
                <th><spring:message code="app.userform.gender.label"/></th>
            </tr>
        </thead>
        <tbody id="tbodyContainer">
            <c:forEach items="${userListWrapper.list}" var="user" varStatus="loop">
                <tr>
                    <td><form:input path="list[${loop.index}].firstName" /></td>
                    <td><form:input path="list[${loop.index}].email" /></td>
                    <td><form:input path="list[${loop.index}].userName" /></td>
                    <td>
                        <span>
                            <form:radiobutton path="list[${loop.index}].gender" value="MALE" /><spring:message code="app.userform.gender.male.label"/>
                        </span>
                        <span>
                            <form:radiobutton path="list[${loop.index}].gender" value="FEMALE" /><spring:message code="app.userform.gender.female.label"/>
                        </span>
                    </td>
                </tr>
            </c:forEach>
        </tbody>
    </table>
    <div class="offset-11 col-md-1">
        <button type="submit" class="btn btn-primary">SAVE ALL</button>     
    </div>
</form:form>

JavascriptをJSPに含める必要があります

var currentIndex = 3; //equals to initialRow (Rows shown on page load)
function addRow()
{
    var rowConstructed = constructRow(currentIndex++);
    $("#tbodyContainer").append(rowConstructed);
}

function constructRow(index)
{
    return '<tr>'+
    '<td><input id="list'+ index +'.firstName" name="list['+ index +'].firstName" type="text" value=""/></td>'+
    '<td><input id="list'+ index +'.email" name="list['+ index +'].email" type="text" value=""/></td>'+
    '<td><input id="list'+ index +'.userName" name="list['+ index +'].userName" type="text" value=""/></td>'+
    '<td>'+
        '<span>'+
            '<input id="list'+ index +'.gender1" name="list['+ index +'].gender" type="radio" value="MALE" checked="checked"/>Male'+
        '</span>'+
        '<span>'+
            '<input id="list'+ index +'.gender'+ index +'" name="list['+ index +'].gender" type="radio" value="FEMALE"/>Female'+
        '</span>'+
    '</td>'+
'</tr>';
}
于 2019-09-05T03:22:40.067 に答える