Как управлять кнопками с одинаковым значением, но разными именами весной

У меня есть динамически созданная таблица, в которой есть ряд фильмов. Он имеет столбец заголовка, столбец типа мультимедиа, столбец рейтинга и столбец, содержащий кнопку "Просмотр". Когда одна из этих кнопок просмотра нажата, я хотел бы перейти на страницу, содержащую все детали этого фильма, отправив заголовок на контроллер, чтобы я мог запросить его в mySql. Проблема в том, что для всех этих кнопок значение всегда будет "view". Поэтому мое решение состоит в том, чтобы сделать имя кнопки другим, как показано в приведенном ниже коде (это необработанный html, сгенерированный из jsp):

<form action="someAction">
 <table>
 <tbody><tr>
 <th>title</th>
 <th>type</th>
 <th>rating</th>
 </tr>
 <tr>
 <td>title1</td>
 <td>DVD</td>
 <td>R</td>
 
 </tr>
 <tr>
 <td>title2</td>
 <td>DVD</td>
 <td>R</td>
 
 </tr>
 <tr>
 <td>title3</td>
 <td>BLU-RAY</td>
 <td>PG-13</td>
 
 </tr>
 </tbody></table>
 </form>

Затем я мог бы использовать параметрMap, чтобы выяснить, какое представление было нажато. Это грязно, и у Весны должен быть какой-то способ сделать это. Я думал, что что-то вроде этого будет работать в контроллере:

@RequestMapping("someAction", params = "mediaType.{title}=view")
public ModelAndView loadPage(String title) {
 // use title to query mysql
 // build Model
 // return ModelAndView
}

Однако это не сработает. Есть ли что-то, что я могу использовать весной, было бы проще и чище, чем выше, вместо того, чтобы получать параметрMap из запроса?

3 ответа

Если я правильно понимаю это, у вас есть строки информации, организованной в таблицу. Вы перебираете какую-то коллекцию, которая имеет побочный эффект создания каждого поля ввода с похожими атрибутами "имя". В результате трудно определить, какие поля ввода вам действительно интересны. Затем вы решили использовать кнопку в качестве идентификатора (предположительно, потому что только одна кнопка, которую вы на самом деле нажимаете, добавляется в запрос -all, другие не передаются), чтобы определить, какая строка и последующий ввод поля.

Я думаю, что это может привести к тому, к какой кнопке вы пользуетесь. Если вы используете буквенный тег ввода (type = "submit" или "button"), атрибут "value" - это то, что пользователь видит в качестве текста на кнопке -so, вы вынуждены играть в shenanigans с помощью ' name '(предположительно, добавив индекс в имя, разделив строку после ее получения из запроса и используя этот идентификатор, чтобы получить другие параметры из запроса, которые также имеют тот же идентификатор, добавленный к их "имени", атрибут).

JSP

Источник HTML

Вероятно, вы должны использовать тег кнопки. Он позволяет текст, который пользователь видит, отличается от значения, которое представлено в запросе.

JSP

<button type="submit" name="view" value="${varStatus.index}">View</button>

Источник HTML

<button type="submit" name="view" value="3">View</button>

Это дает вам идентификатор для строки.

Как весна вписывается в это: я играл с аннотациями @RequestMapping и @RequestParam, и мне не удалось получить Spring, чтобы дать мне значения непосредственно в контроллере. Но я смог сделать это, написав собственный HandlerMethodArgumentResolver вместе с пользовательской аннотацией.

Примечание. Я использую аннотации и конфигурацию java вместо xml config. И, что еще более важно, -this был быстрым и грязным примером, чтобы заставить его работать. отрегулируйте его по мере необходимости для вашей ситуации.

HandlerMethodArgumentResolver

аннотирование

Метод контроллера


Решение заключается в этом утверждении: "У меня есть динамически созданная таблица, в которой есть строки фильмов".

Предположительно, вы просматриваете список фильмов и генерируете таблицу в файле jsp, и каждая строка имеет уникальный идентификатор. Добавьте скрытый, чтобы идентифицировать выбранную строку. Задайте значение скрытого значения в обработчике onclick из кнопок отправки. Вот пример:

<form ...="">
<c:foreach blah="" var="row">
 
 ...
 
</c:foreach>

</form>



// the id is used by JavaScript to find the object in the DOM.
// the name is what appears in the request.

@RequestMapping("someAction")
public ModelAndView loadPage(
 @RequestParameter("blammy") final String blammy)
{
 ...
}


Вместо того, чтобы помещать таблицу в одну форму, вы можете поместить несколько форм внутри таблицы в TRs:

<form action="someAction">
 title1
 DVD
 R
 
 </form>

Тогда каждое название имеет свою собственную форму и вы отправляете в названии (всегда с именем параметра title) от скрытого ввода.

licensed under cc by-sa 3.0 with attribution.