JSP i Spring MVC przekazywanie parametrów.

0

Witam, dopiero zacząłem się uczyć Spring i chciałem sobie napisać prostą aplikację webową która będzie obliczała BMI wartości z jsp przekazuje zwykłym form'em

<form method="get" action="${pageContext.request.contextPath}/bmi">
					<table>
						<tr>
							<td>Waga (kg):</td>
							<td><input name="weight" type="double" /></td>
						</tr>
						<tr>
							<td>Wzrost (m):</td>
							<td><input name="height" type="double" /></td>
						</tr>
						<tr>
							<td></td>
							<td><input value="Oblicz" type="submit" /></td>
						</tr>
					</table>
				</form>

Kontroler w Spring

@RequestMapping(value="/bmi",  method = RequestMethod.GET)
	public ModelAndView calculateBmi(@ModelAttribute("bmi") ValueBmi vbmi ){
		
		ModelAndView mv = new ModelAndView();
		System.out.println("wzrost:" + vbmi.getHeight() + " waga: " + vbmi.getWeight());
		result = vbmi.getWeight() / (vbmi.getHeight()*vbmi.getHeight());
		result *=100;
		result = Math.round(result);
		result /= 100;
		mv.addObject("result",result);
		mv.addObject("height",vbmi.getHeight());
		mv.addObject("weight",vbmi.getWeight());
		
		
		return mv;
	}

Klasa ValueBmi

public class ValueBmi {

	private double height;
	private double weight;
	
	public double getHeight() {
		return height;
	}
	public void setHeight(double height) {
		this.height = height;
	}
	public double getWeight() {
		return weight;
	}
	public void setWeight(double weight) {
		this.weight = weight;
	}

Chciałbym się dowiedzieć czy jest to dobrze napisane szczególnie kontroler i czy moge w taki sposób to wykonywać? Dlaczego jak forma zmienię na metodę post i w kontrolerze amienie na post to dostaję błąd?

0

Przysięgam ze zbanuje kolejnego użytkownika który będzie twierdził że używa JSP w powiązaniu ze Spring MVC tylko dlatego że pliki z szablonami JSTL maja rozszerzenie JSP. Czy uważasz że jakbym nadał takiemu plikowi rozszerzenie .cpp to nagle stanie sie to plik z kodem c++?

Błąd zapewne wynika z tego że masz tylko jedną metode kontrolera. Jak ktoś wchodzi na stronę poprzez wpisanie adresu albo kliknięcie w link to automatycznie jest to GET. Musisz mieć więc kontroler który łapie takiego GETa bo inaczej skąd miałby wiedzieć co wyświetlic użytkownikowi? Więc zrób metodę która dla GET pokazuje pusty formularz do wpisania danych.

0

Racja mój błąd :/
@RequestMapping(value="/bmi", method = RequestMethod.GET)
public String calculateBmi(){
return "bmi";
}
taka metoda może być?
a czy w taki sposób mogę te parametry przekazywać?

0

Może być, ale ja bym tej metody nie nazwał "calculateBmi" to wcale tego nie robi :P Wyświetla tylko formularz. Poza tym tworząc modelAndView podawałbym jednak nazwę widoku do wyświetlenia ;)

0

Poprawione dzięki za pomoc :)

0

Zmodyfikowałem sobie metodę calculateBmi i dodałem walidację jednak podczas przesyłania formularza dostaję błąd: HTTP Status 500 - Request processing failed; nested exception is javax.validation.UnexpectedTypeException: HV000030: No validator could be found for type: java.lang.Double. i nie mam pojęcia czym on może być spowodowany

Metoda:
@RequestMapping(value="/bmi", method = RequestMethod.POST)
public String calculateBmi(@Valid ValueBmi vbmi, BindingResult re){

	if(re.hasErrors()){
		List<ObjectError> errors = re.getAllErrors();
		
		for(ObjectError error: errors){
			System.out.println(error.getDefaultMessage());
		}
		return "bmi";
	}
	else{
		
	ModelAndView mv = new ModelAndView();
	System.out.println("wzrost:" + vbmi.getHeight() + " waga: " + vbmi.getWeight());
	result = vbmi.getWeight() / (vbmi.getHeight()*vbmi.getHeight());
	result *=100;
	result = Math.round(result);
	result /= 100;
	mv.addObject("result",result);
	mv.addObject("height",vbmi.getHeight());
	mv.addObject("weight",vbmi.getWeight());
	}
	
	return "bmi";
}

Klasa ValueBmi
@NotBlank
private double height;

0

No tym ze @NotBlank sprawdza czy pole oznaczone ta adnotacja nie jest nullem i nie jest puste, a ty masz pole typu double

0

To co w tym przypadku radzisz żeby pasowało do double i przeszlo?

0

zmienić double na Double, zmienić @NotBlank na @NotNull, albo zostawić double wyrzucić @NotBlank, a dodać inną formę walidacji

http://docs.jboss.org/hibernate/validator/5.2/reference/en-US/html_single/#validator-defineconstraints-spec

0

Ok dzieki za pomoc bedę próbowal. Jeszcze jedno pytanie mam dropdown list w html:

Wybierz płeć: <select> <option value="woman">Kobieta</option> <option value="man">Mężczyzna</option> </select> i po wybraniu wysyłam do spring i chcialbym odczytać tę wartość value czyli woman lub man a nie sprawdzać obiekt klasy getSex() w metodzie kontrolera jak to zrobic?
0

Pokaż jak to teraz wczytujesz. Bez kontrolera to mogę najwyżej z fusów wróżyć...

0
@RequestMapping(value="/calories",  method = RequestMethod.POST)
	public ModelAndView calculateBmi(@ModelAttribute("calories") ValueCalories vcal){
						
		ModelAndView mv = new ModelAndView();
		
		if(vcal.getSex() == "Mężczyzna"){
			result = 66.5 + (13.75 * vcal.getWeight()) + (5.003 * vcal.getHeight()) - (6.775 * vcal.getAge());
		} else{
			result = 655.1 + (9.563 * vcal.getWeight()) + (1.85 * vcal.getHeight()) - (4.676 * vcal.getAge());
		}
		
		result *=100;
		result = Math.round(result);
		result /= 100;
		mv.addObject("result",result);
		mv.addObject("height",vcal.getHeight());
		mv.addObject("weight",vcal.getWeight());
		mv.addObject("sex",vcal.getSex());
		mv.addObject("age",vcal.getAge());
		
		return mv;
	}

public class ValueCalories {

	private String sex;
	private double weight;
	private double height;
	private int age;
	private String activity;
	
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public double getWeight() {
		return weight;
	}
	public void setWeight(double weight) {
		this.weight = weight;
	}
	public double getHeight() {
		return height;
	}
	public void setHeight(double height) {
		this.height = height;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getActivity() {
		return activity;
	}
	public void setActivity(String activity) {
		this.activity = activity;
	}
	
	
}
0

Jeśli dobrze cię rozumiem, a nie jest to łatwe bo nie potrafisz jako opisać swoich problemów..., to chcesz mieć w kontrolerze więcej niż jeden model attribute? Da sie to zrobić za pomocą bindowania w jstl ale jest to dość nieczytelne i nie daje żadnych sensownych korzyści. Pytanie brzmi: po co chcesz to zrobić? Dużo wygodniej jest operować na wszystkich polach formularza z poziomu jednego obiektu.

0

To zacznę od początku chcę obliczyć zapotrzebowanie kaloryczne dla człowieka i podaję mu w formularzu płeć, wiek, wagę, wzrost i poziom aktywności. Płeć i poziom aktywności chcę wybierać z listy. Następnie te dane przesyłam do kontrolera i nie potrafię ich zczytać. Po zczytaniu trzeba wykonać wyliczenie i zwrócić do widoku.

0

To jest moja ostatnia odpowiedź w twoich tematach dopóki nie nauczysz się pisać jak człowiek. Co to niby znaczy nie potrafię ich zczytać? Mam zgadywać? Pojawia się błąd? Różowe słonie wyskakują z monitora? Mam woła cię na obiad kiedy próbujesz uruchomić ten kod który pokazałeś wyżej? Szkoda mojego czasu...
Moze o to ci chodzi: http://www.mkyong.com/spring-mvc/spring-mvc-dropdown-box-example/ ?

0

Gdy w kontrolerze wpiszę:

System.out.println(vcal.getSex());

to w consoli dostaję wartość null

0

Moja cierpliwość ma swoje granice. Pokaż CAŁY formularz a nie tylko to jedno pole. Bo zaraz sie okaże że tego swojego selecta masz w ogóle poza formularzem...

0
<form method="post" action="${pageContext.request.contextPath}/calories">
					<table>
						<tr>
							<td>Wybierz płeć:</td>
							<td><select>
									<option value="women">Kobieta</option>
									<option value="man">Mężczyzna</option>
								</select>
							</td>
						</tr>
						<tr>
							<td>Waga (kg):</td>
							<td><input name="weight" type="double" /></td>
						</tr>
						<tr>
							<td>Wzrost (cm):</td>
							<td><input name="height" type="double" /></td>
						</tr>
						<tr>
							<td>Wiek:</td>
							<td><input name="age" type="int" /></td>
						</tr>
						
						<tr>
							<td></td>
							<td><input value="Oblicz" type="submit" /></td>
						</tr>
					</table>
				</form>
0

No i teraz pokaż mi w tym swoim formularzu gdzie informujesz do jakiego pola należy wpisać wartość z tego twojego selecta.
user image

0

Racja mój błąd :/ zrobiłem tak:

<select name="sex">
									<option value="woman">Kobieta</option>
									<option value="man">Mężczyzna</option>
							</select>

po przetworzeniu danych w kontrolerze chciałbym żeby wysłane dane wróciły do widoku i były wyświetlone na stronie. W przypadku

Płeć: ${sex}

wyświetla mi się woman lub man a chciałbym, żeby to było po polsku jak to można zrobić?
Próbowałem

<% if(sex == "woman") %>
Kobieta 

ale nic z tego nie wyszło.

0

Słabo mi. A nie mozesz w value tego selecta dać kobieta/mężczyzna w takim razie? o_O

Tak na marginesie to ja bym zrobił enuma a nie klepał takie stringi z palca wszędzie, ale to póki co chyba "za wysokie progi" dla ciebie, skoro programujesz metodą prób i błędów.

0

Nie mogę bo powstają mi krzaki. A kodowanie mam UTF-8 jakby co. Tylko nie wiem jak się do tego enuma odwołać później. Dopiero się uczę wszystkiego i dlatego pytam kolegów po fachu.

0 użytkowników online, w tym zalogowanych: 0, gości: 0