Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring обработка контроллером POST сообщения / 7 сообщений из 7, страница 1 из 1
20.02.2014, 14:45
    #38567594
Lisichkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring обработка контроллером POST сообщения
Добрый день!
Пишу простое приложение Spring MVC, которое должно отображать в браузере список информации. Информация берется из MS SQL в виде хранимой процедуры со списком параметров (фильтры для данных).
Форма представления реализована в jspx с формой (тег form:form) и кнопкой "submit" для изменения фильтра.
Первоначальное отображение представления происходит с помощью GET метода;
отправка данных формы осуществляется с помощью POST.

Обрабатывает форму контроллер который имеет две процедуры для GET и POST методов.

При нажатии в браузере кнопки "обновить" появляется сообщение "To display the web page again, IE needs to resend the information you've previously subbmited".

Как обойти это?

С Уважением,
Александр.

list.jspx:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<div xmlns:jsp="http://java.sun.com/JSP/Page" 
     xmlns:c="http://java.sun.com/jsp/jstl/core" 
     xmlns:spring="http://www.springframework.org/tags"
     xmlns:form="http://www.springframework.org/tags/form"     
     version="2.0">
    <jsp:directive.page contentType="text/html;charset=UTF-8"/>
    <jsp:output omit-xml-declaration="yes"/>  

    <div id="outrunFilters">
    <form:form modelAttribute="filters" id="outrunFiltersForm" method="post">
    
		<table border = "0">
    		<tr>
        		<td><b>
        			<form:label path="date">Дата:</form:label>
        		</b></td>
        		<td>
        			<form:input path="date" id="date"/>
        		</td>
    		</tr>
    		<tr>		    
        		<td><b>
        			<form:label path="cls">Вид:</form:label>
        		</b></td>
        		<td>
		            <form:select path = "cls">
		            	<form:options items="${classList}" />
		            </form:select>
		        </td>
    		</tr>        
    		<tr>
        		<td colspan = "2"><input type = "submit" value = "Фильтр"/></td>
    		</tr>
    	</table>
    </form:form>   
	</div>
	
    <div id="outruns">
	<table>
    	<thead>
    		<tr>
    			<th>Город</th>
    			<th>Название</th>
    		</tr>
    	</thead>
    	<tbody>
    		<c:forEach items="${outruns}" var="outrun">
	    		<tr>
	    			<td>${outrun.city}</td>
	    			<td>${outrun.name}</td>
	    		</tr>
    		</c:forEach>
    	</tbody>
    </table>  
	</div>
    
</div>


OutrunController.java:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
@Controller
public class OutrunController {
	
	private static final Logger logger = LoggerFactory.getLogger(OutrunController.class);

	@Autowired
	private OutrunDao outrunDao;
	
	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String listGet(Model model, OutrunFilters filter) {
		logger.info("GET outruns");
		return	process(model, filter);
	}

	@RequestMapping(value = "/", method = RequestMethod.POST)
	public String listPost(Model model, OutrunFilters filter) {
		logger.info("POST outruns");
		return	process(model, filter);
	}
	
	static final String CLASS_LOADING = "0";
	static final String CLASS_LOADED = "1";
	
	static Map<String, String> classList = new HashMap<String, String>();
	static {
		classList.put(CLASS_LOADING, "Загружается");
		classList.put(CLASS_LOADED, "Загружено");
	}
	
	private String process(Model model, OutrunFilters filter) {
		Date date = new Date();
		DateFormat dateTimeFormat = DateFormat.getDateTimeInstance();
		model.addAttribute("serverTime", dateTimeFormat.format(date));

		if (filter.getDate()==null || filter.getDate()=="") {
			DateFormat dateFormat = DateFormat.getDateInstance();
			filter.setDate(dateFormat.format(date));
		}
		if (filter.getCls()==null || filter.getCls()=="")
			filter.setCls(CLASS_LOADING);
		logger.info("Filter: date="+filter.getDate()+
				" class="+filter.getCls());
		model.addAttribute("filters", filter);
		model.addAttribute("classList", classList);
		
		List<Outrun> outruns = outrunDao.findAll(Integer.parseInt(filter.getCls()), new java.sql.Date(date.getTime()));
		model.addAttribute("outruns", outruns);		
		logger.info("No. of outruns: " + outruns.size());
		
		return "list";
	}
} 
...
Рейтинг: 0 / 0
20.02.2014, 14:47
    #38567596
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring обработка контроллером POST сообщения
...
Рейтинг: 0 / 0
20.02.2014, 14:52
    #38567605
Lisichkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring обработка контроллером POST сообщения
Blazkowicz
А Как это реализовать в Spring????
...
Рейтинг: 0 / 0
20.02.2014, 14:55
    #38567609
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring обработка контроллером POST сообщения
Lisichkin Blazkowicz
А Как это реализовать в Spring????
Вот так
...
Рейтинг: 0 / 0
20.02.2014, 16:27
    #38567777
Lisichkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring обработка контроллером POST сообщения
Да RTFM, это очень мудро :\ но, про "работу напильником", там почему-то нет…

После применения PRG pattern не хочет сохраняться данные в RedirectAttributes…
При выполнении POST – данные фильтра одни, помещаю их с помощью addFlashAttribute и делаю редирект на GET… данные фильтра другие ((

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
@Controller
public class OutrunController {
	
	private static final Logger logger = LoggerFactory.getLogger(OutrunController.class);

	@Autowired
	private OutrunDao outrunDao;
	
	@RequestMapping(value={"/", "/list"}, method = RequestMethod.GET)
	public String listGet(Model model, OutrunFilters filter)	{
		logger.info("GET outruns");
		return	process(model, filter, null);
	}

	@RequestMapping(value={"/", "/list"}, method = RequestMethod.POST)
	public String listPost(Model model, OutrunFilters filter,
			RedirectAttributes redirectAttributes) {
		logger.info("POST outruns");
		return	process(model, filter, redirectAttributes);
	}
	
	static final String CLASS_LOADING = "0";
	static final String CLASS_LOADED = "1";
	
	static Map<String, String> classList = new HashMap<String, String>();
	static {
		classList.put(CLASS_LOADING, "Загружается");
		classList.put(CLASS_LOADED, "Загружено");
	}
	
	private String process(Model model, OutrunFilters filter, 
			RedirectAttributes redirectAttributes) {
		Date date = new Date();
		DateFormat dateTimeFormat = DateFormat.getDateTimeInstance();
		model.addAttribute("serverTime", dateTimeFormat.format(date));

		if (filter.getDate()==null || filter.getDate()=="") {
			DateFormat dateFormat = DateFormat.getDateInstance();
			filter.setDate(dateFormat.format(date));
		}
		if (filter.getCls()==null || filter.getCls()=="")
			filter.setCls(CLASS_LOADING);
		logger.info("Filter: date="+filter.getDate()+
				" class="+filter.getCls());
		if (redirectAttributes==null) {
			model.addAttribute("filters", filter);
			model.addAttribute("classList", classList);
		} else {
			redirectAttributes.addFlashAttribute("filters", filter);
			return "redirect:/list";
		}
		
		List<Outrun> outruns = outrunDao.findAll(Integer.parseInt(filter.getCls()), new java.sql.Date(date.getTime()));
		model.addAttribute("outruns", outruns);		
		logger.info("No. of outruns: " + outruns.size());
		
		return "list";
	}
}



P.S. В servlet-context.xml строчка "<mvc:annotation-driven />" есть...
P.S.S. Я использую "org.springframework.web.servlet.view.UrlBasedViewResolver" id="tilesViewResolver"
...
Рейтинг: 0 / 0
20.02.2014, 17:36
    #38567890
Lisichkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring обработка контроллером POST сообщения
Прорыл Интернет ... по всем "examples" должно работать... ((
Может дело в "org.springframework-version" = 3.1.1.RELEASE ??????

Помогите!
...
Рейтинг: 0 / 0
24.02.2014, 10:51
    #38570160
Lisichkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring обработка контроллером POST сообщения
Переписал с использованием @SessionAttributes - работает

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
@Controller
@SessionAttributes("filters")
public class OutrunController {
	
	private static final Logger logger = LoggerFactory.getLogger(OutrunController.class);

	@Autowired
	private OutrunDao outrunDao;
	
	@RequestMapping(value={"/", "/list"}, method = RequestMethod.GET)
	public String listGet(Model model)	{
		logger.info("GET outruns");
		
		Date date = new Date();
		DateFormat dateTimeFormat = DateFormat.getDateTimeInstance();
		model.addAttribute("serverTime", dateTimeFormat.format(date));

		OutrunFilters filters;
		if (!model.containsAttribute("filters"))
			model.addAttribute("filters", filters = new OutrunFilters());
		else
			filters = (OutrunFilters)model.asMap().get("filters");
		
		if (filters.getDate()==null || filters.getDate()=="") 
			filters.setDate(date);
		if (filters.getCls()==null || filters.getCls()=="")
			filters.setCls(OutrunFilters.CLASS_LOADING);
		logger.info("Filter: "+filters.toString());
		
		model.addAttribute("filters", filters);
		model.addAttribute("classList", OutrunFilters.classList);
		model.addAttribute("cityList", outrunDao.getCitys());
		
		List<Outrun> outruns = outrunDao.findAll(filters);
		model.addAttribute("outruns", outruns);		
		logger.info("No. of outruns: " + outruns.size());
		
		return "list";
		
	}

	@RequestMapping(value={"/", "/list"}, method = RequestMethod.POST)
	public String listPost(Model model, @ModelAttribute("filters") OutrunFilters filters) {
		logger.info("POST outruns");
		logger.info("Filter: "+filters.toString());		
		return "redirect:/list";		
	}
	
}
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring обработка контроллером POST сообщения / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]