One of the screen requests that is quite annoying when creating a system with a Web application is what is called ** tabular input **.
This looks pretty easy ** it was a hassle to implement in the first place **, but in fact it has been possible since Struts 2 was released.
However, from that point on, there were some implementations that stopped working depending on the version due to various factors such as security fixes and potential bugs, so I will introduce them here.
Struts2 stores request parameters in member variables of the Action class. When storing in a member variable, it automatically tries to convert to the type (class) of the member variable of Action class. The types (classes) that are automatically converted are as follows.
… In other words, most things are converted automatically. Also, since the field of the class is automatically searched and the value is stored, for example, prepare the following field in the Action class.
private List<SampleProduct> products;
public void setProducts(List<SampleProduct> products) {
this.products = products ;
}
public List<String> getProducts () {
return products;
}
By doing this, you can handle both the response to the screen and the request from the screen as an array, and you can also handle the class whose contents are prepared independently.
<table class="table table-bordered">
<thead>
<th>id</th>
<th>product name</th>
</thead>
<tbody>
<tr th:each="product,status : ${products}">
<td>
<input type="text" value="X-45" name="id" class="form-control" th:name="'products[' + ${status.getIndex()} + '].id'" th:value="${product.getId()}" />
</td>
<td>
<input type="text" value="X-45" name="name" class="form-control" th:name="'products[' + ${status.getIndex()} + '].name'" th:value="${product.getName()}" />
</td>
</tr>
</tbody>
</table>
You can repeatedly output List etc. by using <tr th: each>
.
Unlike JSTL etc., the object that manages the number of repetitions and the current line number can be referenced by the name declared on the right side separated by commas. It's easy.
In the above example, the actual output HTML is as follows.
<table class="table table-bordered">
<thead>
<th>id</th>
<th>product name</th>
</thead>
<tbody>
<tr>
<td>
<input type="text" class="form-control" name="products[0].id" value="0th id value" />
</td>
<td>
<input type="text" class="form-control" name="products[0].name" value="0th name value" />
</td>
</tr>
<tr>
<td>
<input type="text" class="form-control" name="products[1].id" value="1st id value" />
</td>
<td>
<input type="text" class="form-control" name="products[1].name" value="1st name value" />
</td>
</tr>
........After that, repeat.......
</tbody>
</table>
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<body>
<s:form action="update" theme="simple">
<s:iterator value="products" var="product" status="status">
<s:textfield name="products[%{#status.index}].id"></s:textfield>
<s:textfield name="prodocts[%{#status.index}].name"></s:textfield>
</s:iterator>
<s:submit />
</s:form>
</body>
</html>