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.
Search Blog
Sunday, January 29, 2012
GWT - Spring Integration
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment