Search Blog

Search duranek.blogspot.com

Sunday, January 29, 2012

GWT - Spring Integration

GWT and Spring
1)    Spring MVC class larini kullanacagiz.29
2)    web.xml e Spring MVC servletini ekle

    <!-- Initialise the Spring MVC DispatcherServlet -->
    <servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!-- Map the DispatcherServlet to only intercept RPC requests -->
    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>*.rpc</url-pattern>
    </servlet-mapping>
    
3)    DispatcherServlet in web.xml'deki name'i xxx ise xxx-servlet.xml adinda kendi bean xml'ini arar. Burada spring-servlet.xml olacak.

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

    <!-- The application context definition for the DispatcherServlet -->

    <!-- Maps the request through to a concrete controller instance -->
    <bean id="urlMapping"
        class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <value>
                /**/login.rpc=loginController
            </value>
        </property>
    </bean>

    <!-- GwtRpcController wraps our service in order to decode the incoming -->
    <!-- request then delegates processing of the call to the POJO service -->
    <!-- and then encodes the return value forwarding the response. -->
    <bean id="loginController" class="com.deploymentplan.server.user.GwtRpcController">
        <property name="remoteService">
            <bean class="com.deploymentplan.server.user.LoginWindowImpl" />
        </property>
    </bean>

</beans>

4)    Annotation ile servise belirt

@RemoteServiceRelativePath("login.rpc")
public interface LoginWindowService extends RemoteService{

bu login.rpc, web.xml de servlet-mapping'de spring servlet'i ile map edecek o da yine web.xml de servlet tag'inde tanimladigimiz
DispatcherServlet'i cagiracak. DispatcherServlet spring-servlet.xml'i kullanacak, login.rpc'nin map ettigi controller'i bulacak.
yine spring-servlet.xml'de o controller'a remoteservice olarak LoginServiceImpl oarak map edecegiz.

5)    Simdi server tarafini yazalim.

public class LoginWindowImpl implements LoginWindowService {

Fakat normalde bu sekildeydi ??

public class LoginWindowImpl extends RemoteServiceServlet implements LoginWindowService {

6)    Yazilana gore bunun Deploymentplan.gwt.xml'e eklenmesi gerekiyor. Fakat ben eklememistim calisiyordu. Simdilik eklemeden deneyelim.

<!-- RPC service servlet declarations                             -->
<servlet path="/login.rpc"
    class="com.deploymentplan.server.user.LoginWindowImpl"/>
    
7)     GwtRpcController'in yazilmasi. Bu sekilde spring-mvc DispatcherServler in handle ini RemoteServiceServlet'e atiyoruz. RemoteServiceServlet'in processCall'unu
da biz yapiyoruz. Bunu yapmamizin nedeni ise, remoteService'i spring-servlet.xml de biz atamistik. Onunla cagirsin diye.

package org.example.gwtwisdom.server;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.context.ServletContextAware;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException;
import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.SerializationException;
import com.google.gwt.user.server.rpc.RPC;
import com.google.gwt.user.server.rpc.RPCRequest;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;

public class GwtRpcController extends RemoteServiceServlet implements
        Controller, ServletContextAware {

    private ServletContext servletContext;

    private RemoteService remoteService;

    private Class remoteServiceClass;

    public ModelAndView handleRequest(HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        super.doPost(request, response);
        return null;
    }

    @Override
    public String processCall(String payload) throws SerializationException {
        try {

            RPCRequest rpcRequest = RPC.decodeRequest(payload,
                    this.remoteServiceClass);

            // delegate work to the spring injected service
            return RPC.invokeAndEncodeResponse(this.remoteService, rpcRequest
                    .getMethod(), rpcRequest.getParameters());
        } catch (IncompatibleRemoteServiceException ex) {
            getServletContext()
                    .log(
                            "An IncompatibleRemoteServiceException was thrown while processing this call.",
                            ex);
            return RPC.encodeResponseForFailure(null, ex);
        }
    }

    @Override
    public ServletContext getServletContext() {
        return servletContext;
    }

    public void setServletContext(ServletContext servletContext) {
        this.servletContext = servletContext;
    }

    public void setRemoteService(RemoteService remoteService) {
        this.remoteService = remoteService;
        this.remoteServiceClass = this.remoteService.getClass();
    }

}

8)    Client tarafinda async'i cagirirken

GWT.create(LoginWindowService.class);

9)    Islerimizi spring in DispatcherServlet'i ile halledegimiz icin, artik gwt nin integrated tomcat'ini 
kullanamayiz. web.xml'lerimiz farkli artik. Hosted mode'un -noserver switch'i bizi kurtariyor.
Burada bir alicengiz yapiyoruz. Bir kereligine tomcat'imize deploy etmemiz lazim ki, tomcat application'imizi bilsin.
O bildikten sonra, eclipse uzerinden workspace den calisabilir olacagiz. Tomcat'e bir kere deploy edip
calisip calismadigina bakiyoruz.

10)    Eclipse den Run configurations diyoruz.
program arguments a bakiyoruz.
Daha once su yaziyordu

-remoteUI "${gwt_remote_ui_server_port}:${unique_id}" -startupUrl DeploymentPlan.html -logLevel INFO -port 8888 -war D:\dev2\git\dpgwt\DeploymentPlan\war -codeServerPort 9997 com.deploymentplan.DeploymentPlan

simdi,

-startupUrl http://localhost:8080/DeploymentPlan -noserver -remoteUI "${gwt_remote_ui_server_port}:${unique_id}" -logLevel INFO -codeServerPort 9997 -war D:\dev2\git\dpgwt\DeploymentPlan\war com.deploymentplan.DeploymentPlan

bunu su sekilde de diyorlar, startupUrl i degistir ve sonuna -noserver koy

11)    Bu sekilde client i debug edebilirsin.
server'i debug etmek icin remote debug eklemen lazim.

No comments: