【问题标题】:How create Master-Detail in the Play 2 java如何在 Play 2 java 中创建 Master-Detail
【发布时间】:2014-09-28 02:10:51
【问题描述】:

如何做到这一点?我将 armazer 的所有“细节”转换为 json 并将其发送到控制器?那么该怎么做呢?

主实体是学生

@Entity
@SuppressWarnings("serial")
public class Student extends EntityBase {

    @Constraints.Required
    public String name;

    private String rg;

    @CPF
    @Constraints.Required
    @Column(unique = true)
    private String cpf;

    @Constraints.Required
    @Temporal(TemporalType.DATE)
    private Date dateBirth;

    private String photoPath;

    @ManyToOne(optional = false)
    @JoinColumn(name = "academy_id")
    private Academy academy;

    @ManyToMany(mappedBy = "students", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private List<Address> addresses; 

    private static Finder<Long, Student> find = new Finder<Long, Student>(
        Long.class, Student.class);

    //methods getters, setters and others

详细实体是地址

@Entity
@SuppressWarnings("serial")
public class Address extends Model {

    @Id
    private Long id;

    private String complement;

    private String cep;

    private String reference;

    @Size( max = 15 )
    private String number;

    @Size( max = 50 )
    @Constraints.Required
    private String neighborhood;

    @NotNull
    private Boolean principal;

    @ManyToMany
    private List<Student> students;

    private static Finder<Long, Address> find = new Finder<Long, Address>(
            Long.class, Address.class);

   //methods getters, setters and others

视图示例:

我的问题是如何在视觉中执行此操作以及如何发送到控制器。

谢谢!

【问题讨论】:

  • 这个问题与javascript有关吗?我看到的所有代码都是java?
  • 还涉及到js。我需要一个“详细信息”的 json 发送到服务器。

标签: java playframework playframework-2.0


【解决方案1】:

我正在使用 jquery 为 Controller 发送“详细信息”的 JSON:

HTML 详细信息:

<!-- Endereço -->
<div class="panel panel-default">
    <div class="panel-heading">Endereço</div>
        <div class="panel-body">
            <div class="form-group">
                <label class="col-sm-2 control-label" for="complement">
                * Complemento: </label>
                <div class="col-sm-6">
                    <input type="text" class="form-control" id="complement" name="complement">
                </div>

                <label class="col-sm-2 control-label" for="cep"> CEP: </label>
                    <div class="col-sm-2">
                        <input type="text"
                            pattern="[0-9]{2}[\.]?[0-9]{3}[-]?[0-9]{3}"
                            title="Formato: xx.xxx-xxx ou xxxxxxxx"
                            placeholder="xx.xxx-xxx ou xxxxxxxx" class="form-control"
                            id="cep" name="cep">
                    </div>
                </div>

                <div class="form-group">
                    <label class="col-sm-2 control-label" for="reference">
                                        Referência: </label>
                        <div class="col-sm-6">
                            <input type="text" class="form-control" id="reference"
                                name="reference">
                        </div>

                    <label class="col-sm-2 control-label" for="number">
                            Número: </label>
                    <div class="col-sm-2">
                        <input type="text" class="form-control" id="number"
                                name="number" pattern="[0-9]">
                    </div>
                </div>

                <div class="form-group">
                    <label class="col-sm-2 control-label" for="neighborhood">*
                            Bairro: </label>
                    <div class="col-sm-7">
                        <input type="text" class="form-control" id="neighborhood"
                                    name="neighborhood">
                    </div>
                    <label class="col-sm-2 control-label" for="principal">*
                            Principal: </label>
                    <div class="col-md-1">
                        <input type="checkbox" name="principal" class="form-control"
                                id="principal"
                                title="Informa se o endereço é o principal ou não">
                    </div>
                </div>

    <div class="form-group">
        <div class="col-sm-offset-2 col-sm-10">
                <div class="pull-right">
                    <button type="button" id="add_row"
                    class="btn btn-primary glyphicon glyphicon-plus">Adicionar</button>
        </div>
    </div>
</div>

表格 HTML - 详细信息:

<div class="panel panel-default">
    <div class="panel-body">
        <div class="row clearfix">
            <div class="col-md-12 table-responsive">
                <table class="table table-bordered table hover table-sortable" id="tab_logic">
                    <thead>
                        <tr>
                            <th class="text-center">CEP</th>
                            <th class="text-center">Complemento</th>
                            <th class="text-center">Referência</th>
                            <th class="text-center">Número</th>
                            <th class="text-center">Bairro</th>
                            <th class="text-center">Endereço principal</th>
                            <th class="td-actions text-center">
                            @Messages("table.column.option")
                            <th>                        
                        </tr>
                    </thead>
                    <tbody id="bodyTable">
                        <tr id='addr0' data-id="0" class="hidden">
                            <td data-name="cep"></td>
                            <td data-name="complement"></td>
                            <td data-name="reference"></td>
                            <td data-name="number"></td>
                            <td data-name="neighborhood"></td>
                            <td data-name="principal"></td>
                            <td data-name="del">
                                <button name="del0" 
                                class='btn btn-danger glyphicon glyphicon-remove row-remove'>
                                </button>
                            </td>
                        </tr>
                     <tbody>
                </table>
            </div>
        </div>
    </div>
</div>

我的代码js:

<script src="@routes.StudentController.jsRoutes()" type="text/javascript"></script>
<script type="text/javascript">

var jsonObj = [];

$(document).ready(function() {

        $("#add_row").on("click", function() {

            item = {}
            item["complement"] = $('#complement').val();
            item["cep"] = $('#cep').val();          
            item["reference"] = $('#reference').val();
            item["number"] = $('#number').val();
            item["neighborhood"] = $('#neighborhood').val();
            item["principal"] = $('#principal').is(':checked') ? "Sim" : "Não";     

            // Get max row id and set new id
            var newid = 0;
            $.each($("#tab_logic tr"), function() {
                if (parseInt($(this).data("id")) > newid) {
                    newid = parseInt($(this).data("id"));
                }
            });
            newid++;

            var tr = $("<tr></tr>", {
                id: "addr"+newid,
                "data-id": newid
            });                                         

            // loop through each td and create new elements with name of newid
            $.each($("#tab_logic tbody tr:nth(0) td"), function() {                         

                var cur_td = $(this);
                var children = cur_td.children();               

                // add new td and element if it has a nane
                if ($(this).data("name") != undefined) {
                    var td = $("<td></td>", {
                        "data-name": $(cur_td).data("name"),
                        "text" : item[$(cur_td).data("name")]
                    });

                    var c = $(cur_td).find($(children[0]).prop('tagName')).clone().val("");
                    c.attr("name", $(cur_td).data("name") + newid);
                    c.appendTo($(td));
                    td.appendTo($(tr));                 
                }
            });

            // add the new row
            $(tr).appendTo($('#tab_logic'));

            $(tr).find("td button.row-remove").on("click", function() {
                $(this).closest("tr").remove();
            });        

            item['principal'] = $('#principal').is(':checked') ? true : false;
            jsonObj.push(item);

            //Access to the Controller StudentController using js Routes
            appRoutes.controllers.StudentController.createAddress().ajax({
                data : JSON.stringify(jsonObj),
                contentType : 'application/json',
                success : function (obj) {
                    console.log(obj);
                }
            });
    });

        // Sortable Code
        var fixHelperModified = function(e, tr) {
            var $originals = tr.children();
            var $helper = tr.clone();


            $helper.children().each(function(index) {
                $(this).width($originals.eq(index).width())
            });

            return $helper;
        };

        $(".table-sortable tbody").sortable({
            helper: fixHelperModified      
        }).disableSelection();

        $(".table-sortable thead").disableSelection();

        $("#add_row").trigger("click");
    }); 
</script>

我的控制器:

@Security.Authenticated(PlayAuthenticatedSecured.class)
public class StudentController extends Controller {

    private static final Form<Student> studentForm = Form.form(Student.class);

    private static List<Address> addresses;

    @Transactional
    public static Result gravar() throws IOException {
        Form<Student> form = studentForm.bindFromRequest();

       //Hidden Codes

        Student student = form.get();

        student.getAddresses().addAll(addresses);

        student.save();

        flash("success", Messages.get("msg.success2"));
        return redirect(routes.StudentController.lista());
    }

    public static Result createAddress() {
        addresses = new ArrayList<Address>(3);
        JsonNode json = request().body().asJson();
        for (Iterator<JsonNode> item = json.iterator(); item.hasNext();) {
            Address address = Json.fromJson(item.next(), Address.class);
            addresses.add(address);
        }                   
        return ok();
    }

    public static Result jsRoutes() {
        response().setContentType("text/javascript");
        return ok(Routes.javascriptRouter("appRoutes",
                routes.javascript.StudentController.createAddress()
                ));
    }

    //Other methods

}

【讨论】:

    猜你喜欢
    • 2017-07-13
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 2015-11-11
    • 2014-05-04
    • 2017-11-24
    相关资源
    最近更新 更多