Spring MVC – 07 – RequestMapping – 01

Merhaba Arkadaslar
Bu bolumde @Controller ve @RequestMapping annotation’i inceleyecegiz.
Ilk ornegimizde bu annotation’lari kullanarak ornek bir uygulama yapmistik. Burada daha detayli olarak incelemeye baslayacagiz.

Annotation-based Controller son derece esnektir. Bunun icin @Controller annotation kullanarak sinifimizi Controller olarak tanimlayabiliriz.
@RequestMapping annotation’ini method ve class taniminda kullanabiliriz.
(org.springframework.web.bind.annotation.RequestMapping)

Hatirlayacagimiz gibi , Spring MVC yapisinda FrontController olarak DispatcherServlet gorev almaktadir.
DispatcherServlet gelen istegin URL adresine bakar ve bu istegi karsilayacak uygun controller’i bulur.  Yani bir nevi istek (request) ile controller’i eslestirir (mapping).
Iste bu kavrama uygun olacak sekilde @RequestMapping annotation’ini kullanabiliriz.

Oncelikle bu orneklerimizde kullanacagimiz XML konfigurasyon dosyamizi olusturalim ve web.xml dosyamizda duzenlememizi yapalim.
@RequestMapping annotation’ini kullandigimiz metotlara request mapped method , mapped method ya da handler method isimleri verilir.

06.requestMapping.xml

<context:component-scan> tag’ini kullanarak Spring’in otomatik olarak @Controller annotation’larini  bulmasini saglayabiliriz.
Bu sayede sadece @Controller degil , stereotype denilen @Repository , @Service , @Component gibi annotation’lari da bulacaktir.
Bunun icin package bilgisini vermemiz yeterli olacaktir. Ilk uygulamamizda da incelemistik.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

	<!--Auto-scanning ozelligini aktif ettigimizde bean tanimlamasini xml dosyamizada 
	yapmamiza gerek kalmaz. @Controller  @Service gibi annotation icin yeterli olacaktir. -->
	<context:component-scan base-package="_06.requestMapping.controller" />
	
	<bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/jsp/" />
		<property name="suffix" value=".jsp" />
	</bean>

</beans>

web.xml

....
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>

<init-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>
	<!-- 
	 /WEB-INF/01.appContext.xml			 
	 /WEB-INF/02.00.appContext.xml			
	 /WEB-INF/03.multiActionController.xml
	 /WEB-INF/04.propertiesMethodNameResolver.xml			 	
	 /WEB-INF/05.parameterMethodNameResolver.xml
	-->		
	 /WEB-INF/06.requestMapping.xml
	</param-value> 
 </init-param>

<load-on-startup>1</load-on-startup>
</servlet>
....

Simdi de bu annotation’larin kullanim alanlarina ve attribute’lere gore olusacak senaryolari inceleyelim ;

  • class
    @RequestMapping(“/test”)
  • method
    @RequestMapping(method = {RequestMethod.GET})
  • description
    Tum HTTP GET istekleri /test URL icin bu metot tarafindan karsilanacaktir.
    Bunun disindaki HTTP istekleri karsilanmayacaktir. (HTTP POST vs )

TestController.java

package _06.requestMapping.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/test")
public class TestController {

	@RequestMapping(method = {RequestMethod.GET})
	public String testMethod(Model model) {
		model.addAttribute("message", "testMethod...");
		return "06.requestMapping.view/testPage";
	}
	
}

WEB-INF/06.requestMapping.view dizininde basit jsp dosyalarimiz yer alacaktir.
Ornegimizi calistirdigimizda;

http://localhost:8080/injavawetrust.springmvc/test

requestmapping 1

  • class
    @RequestMapping(“/test”)
  • method
    @RequestMapping(method = {RequestMethod.GET} , value=”/test2″)
  • description
    HTTP GET istekleri /test/test2 URL icin bu metot tarafindan karsilanacaktir.
package _06.requestMapping.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/test")
public class TestController {
        //
        //	
	@RequestMapping(method = {RequestMethod.GET} , value="/test2")
	public String testMethodWithValue(Model model) {
		model.addAttribute("message", "testMethodWithValue...");
		return "06.requestMapping.view/testPage";
	}
	
}

Ornegimizi calistirdigimizda ;

http://localhost:8080/injavawetrust.springmvc/test/test2

requestmapping 2

Onceki bolumlerde MultiActionController sinifini kullandik. Benzer sekilde ayni ornegi @Controller ve @RequestMapping annotation’i kullanarak yapabiliriz.

OrderController.java

package _06.requestMapping.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping("/order")
public class OrderController {

	@RequestMapping("/add")
	// http://localhost:8080/injavawetrust.springmvc/order/add
	public String add(Model model) {
		model.addAttribute("message", "OrderController#add");
		return "06.requestMapping.view/addOrder";
	}

	@RequestMapping(value = "/list", method = RequestMethod.GET)
	// http://localhost:8080/injavawetrust.springmvc/order/list
	public String list(ModelMap modelMap) {
		modelMap.addAttribute("message", "OrderController#list");
		return "06.requestMapping.view/getOrderList";
	}

	@RequestMapping(value = { "/remove", "/delete" }, method = RequestMethod.GET)
	// http://localhost:8080/injavawetrust.springmvc/order/delete
	// http://localhost:8080/injavawetrust.springmvc/order/remove
	public ModelAndView remove() {
		ModelAndView mv = new ModelAndView();
		mv.setViewName("06.requestMapping.view/removeOrder");
		mv.addObject("message", "OrderController#remove");
		return mv;
	}
}

@RequestMapping annotation’i metotlarla birlikte kullaniyoruz. value attributte’u kullanarak birden fazla path bilgisi verebiliriz.
method attribute ile karsilanacak HTTP metodunu belirtebiliriz , boylelikle ozellikle HTTP POST ve HTTP GET isteklerini kolaylikla birbirinden ayirabiliriz.

Metotlara dikkat edecek olursak Model , ModelMap ve ModelAndView tiplerini kullandik.

  • org.springframework.ui.Model  
    arabirimdir. Spring 2.5.1 versiyonundan beri vardir.
  • org.springframework.ui.ModelMap
    Map arabirimini uygulayan bir siniftir. Map’in sahip oldugu metotlara sahip olacaktir. Spring 2.0 versiyonunda beri vardir.
  • org.springframework.web.servlet.ModelAndView
    ModelMap ve view objelerini tutar.

Ornegimizi calistirdigimizda;

 http://localhost:8080/injavawetrust.springmvc/order/add
 http://localhost:8080/injavawetrust.springmvc/order/list

value attribute ile birden fazla URL bilgisi verebiliriz ;

http://localhost:8080/injavawetrust.springmvc/delete
http://localhost:8080/injavawetrust.springmvc/remove

Github kaynak kodlar / source folder
Injavawetrust-springmvc-tutorial

Yazimi burada sonlandiriyorum.
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *