`
windflee
  • 浏览: 6292 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

gwt 和spring结合的登录实例

阅读更多

把GWT和SPRING结合使用,其中参考了yongyuan.jiang的例子,也参考网上其他人的例子,代码如下:

/**

*

*/

package org.fungchoi.server;



import java.io.ByteArrayOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.net.MalformedURLException;

import java.net.URL;

import java.text.ParseException;

import java.util.HashMap;

import java.util.Map;

import java.util.zip.GZIPOutputStream;



import javax.servlet.ServletConfig;

import javax.servlet.ServletContext;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;



import org.springframework.web.context.WebApplicationContext;



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;

import com.google.gwt.user.server.rpc.SerializationPolicy;

import com.google.gwt.user.server.rpc.SerializationPolicyLoader;



/**

* @author dolang

*

*/

public class MyGWTServer extends RemoteServiceServlet {

private final String ACCEPT_ENCODING = "Accept-Encoding";
private final String CHARSET_UTF8 = "UTF-8";
private final String CONTENT_ENCODING = "Content-Encoding";
private final String CONTENT_ENCODING_GZIP = "gzip";
private final String CONTENT_TYPE_TEXT_PLAIN_UTF8 = "text/plain; charset=utf-8";
private final String GENERIC_FAILURE_MSG = "The call failed on the server; see server log for details";
private final ThreadLocal perThreadRequest = new ThreadLocal();
private final ThreadLocal perThreadResponse = new ThreadLocal();
private WebApplicationContext springContext;
@Override
public void init(ServletConfig Config) throws ServletException {
super.init(Config);
springContext = (WebApplicationContext) Config
.getServletContext()
.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
if (springContext == null) {
throw new RuntimeException(
"Check Your Web.Xml Setting, No Spring Context Configured");
}
}
@Override
protected SerializationPolicy doGetSerializationPolicy(HttpServletRequest request,
String moduleBaseURL, String strongName) {
System.out.print("begin doGetSerializationPolicy procedure ...\n");
System.out.print("moduleBaseURL" + moduleBaseURL + "...\n");
System.out.print("strongName" + strongName + "...\n");
if (request == null) {
System.out.print("request is null...");
}
return super.doGetSerializationPolicy((HttpServletRequest) perThreadRequest.get(),
moduleBaseURL, strongName);
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
try {
System.out.print("Begin service procedure...");
perThreadRequest.set(req);
perThreadResponse.set(resp);
/*
if (req == null){
System.out.print("request is null");
}
//String pathInfo = req.getPathInfo();
//System.out.print("request path is :" + pathInfo + "........");
System.out.print("request URL is :" + req.getRequestURL() + "........");
*/
int i = req.getRequestURL().indexOf("/login");
String pathInfo = req.getRequestURL().substring(i);
//System.out.print(" the pathInfo is: " + pathInfo + "...");
while (pathInfo.startsWith("/")) {
pathInfo = pathInfo.substring(1);
}
RemoteService service = (RemoteService) springContext.getBean(pathInfo);
/*
if (service == null) {
System.out.print("get service bean fail!.....");
} else {
System.out.print("get service bean ok!......\n");
}
*/
String requestPayload = readPayloadAsUtf8(req);
// System.out.print(requestPayload + "....\n");
// Let subclasses see the serialized request.
//
onBeforeRequestDeserialized(requestPayload);
// Invoke the core dispatching logic, which returns the serialized
// result.
//
String responsePayload = processCall(service, requestPayload);
// Let subclasses see the serialized response.
//
onAfterResponseSerialized(responsePayload);
// Write the response.
//
writeResponse(req, resp, responsePayload);
} catch (Throwable e) {
// Give a subclass a chance to either handle the exception or
// rethrow it
//
doUnexpectedFailure(e);
} finally {
// HttpRequestContext.ThreadLocalHttpRequestContext.remove();
perThreadRequest.set(null);
perThreadResponse.set(null);
}
}
/**
* rewrite processCall
*
* @param bean
* @param payload
* @return
* @throws SerializationException
*/
public String processCall(RemoteService bean, String payload)
throws SerializationException {
try {
System.out.print("begin processCall procedure ...\n");
RPCRequest rpcRequest = RPC.decodeRequest(payload, bean.getClass(),
this);
return RPC.invokeAndEncodeResponse(bean, rpcRequest.getMethod(),
rpcRequest.getParameters(), rpcRequest
.getSerializationPolicy());
} catch (IncompatibleRemoteServiceException ex) {
getServletContext()
.log("An IncompatibleRemoteServiceException was thrown while processing this call.",
ex);
return RPC.encodeResponseForFailure(null, ex);
}
}
private String readPayloadAsUtf8(HttpServletRequest request)
throws IOException, ServletException {
int contentLength = request.getContentLength();
if (contentLength == -1) {
// Content length must be known.
throw new ServletException("Content-Length must be specified");
}

String contentType = request.getContentType();
boolean contentTypeIsOkay = false;
// Content-Type must be specified.
if (contentType != null) {
// The type must be plain text.
if (contentType.startsWith("text/plain")) {
// And it must be UTF-8 encoded (or unspecified, in which case we assume
// that it's either UTF-8 or ASCII).
if (contentType.indexOf("charset=") == -1) {
contentTypeIsOkay = true;
} else if (contentType.indexOf("charset=utf-8") != -1) {
contentTypeIsOkay = true;
}
}
}
if (!contentTypeIsOkay) {
throw new ServletException(
"Content-Type must be 'text/plain' with 'charset=utf-8' (or unspecified charset)");
}
InputStream in = request.getInputStream();
try {
byte[] payload = new byte[contentLength];
int offset = 0;
int len = contentLength;
int byteCount;
while (offset < contentLength) {
byteCount = in.read(payload, offset, len);
if (byteCount == -1) {
throw new ServletException("Client did not send " + contentLength
+ " bytes as expected");
}
offset += byteCount;
len -= byteCount;
}
return new String(payload, "UTF-8");
} finally {
if (in != null) {
in.close();
}
}
}
private void writeResponse(HttpServletRequest request,
HttpServletResponse response, String responsePayload) throws IOException {
byte[] reply = responsePayload.getBytes(CHARSET_UTF8);
String contentType = CONTENT_TYPE_TEXT_PLAIN_UTF8;

if (acceptsGzipEncoding(request)
&& shouldCompressResponse(request, response, responsePayload)) {
// Compress the reply and adjust headers.
//
ByteArrayOutputStream output = null;
GZIPOutputStream gzipOutputStream = null;
Throwable caught = null;
try {
output = new ByteArrayOutputStream(reply.length);
gzipOutputStream = new GZIPOutputStream(output);
gzipOutputStream.write(reply);
gzipOutputStream.finish();
gzipOutputStream.flush();
response.setHeader(CONTENT_ENCODING, CONTENT_ENCODING_GZIP);
reply = output.toByteArray();
} catch (IOException e) {
caught = e;
} finally {
if (null != gzipOutputStream) {
gzipOutputStream.close();
}
if (null != output) {
output.close();
}
}

if (caught != null) {
getServletContext().log("Unable to compress response", caught);
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
return;
}
}

// Send the reply.
//
response.setContentLength(reply.length);
response.setContentType(contentType);
response.setStatus(HttpServletResponse.SC_OK);
response.getOutputStream().write(reply);
}

private boolean acceptsGzipEncoding(HttpServletRequest request) {
assert (request != null);

String acceptEncoding = request.getHeader(ACCEPT_ENCODING);
if (null == acceptEncoding) {
return false;
}
return (acceptEncoding.indexOf(CONTENT_ENCODING_GZIP) != -1);
}

}


在初始化时装入spring,在处理请求时调用服务Bean.在客户端调用服务时,与一般的调用没什么区别。

下面是客户端调用, 


public LoginServiceAsync getLoginService() {

LoginServiceAsync instance = (LoginServiceAsync) GWT

.create(LoginService.class);

/*

if (instance == null) {

System.out.print("async instance is null!");

}

*/

ServiceDefTarget target = (ServiceDefTarget) instance;

System.out.print(GWT.getModuleBaseURL() + LoginService.SERVICE_URI);

target.setServiceEntryPoint(GWT.getModuleBaseURL() + LoginService.SERVICE_URI);

return instance;

}


这个方法得到异步接口,

LoginServiceAsync laa = getLoginService();

laa.IsValidateUser(tbUser.getText(), psd.getText(), new AsyncCallback(){



public void onFailure(Throwable arg0) {

// TODO Auto-generated method stub

Window.alert("Call romote service fail!");

}



public void onSuccess(Object arg0) {

// TODO Auto-generated method stub

Boolean login = (Boolean) arg0;

if (login.booleanValue()) {

Cookies.setCookie("loginPMC", tbUser.getText());

loginPanel.dispose();

createClient();

} else {

Window.alert("Login Fail! Username or password is error!");

}

}
});


这样调用就OK,比yongyuan.jiang的例子的客户端调用要简单一点。

客户端用到了一个第三方包,MyGwt,用它做的客户端要美观一些。可在它的网站上下载:www.mygwt.net

在Servic类里,调用DAO来检测登录,这里只用了很简单的实现类,也可以把它的实现类用Hibernate来实现。

附上这个工程的源码。还请大家多多指点。

  • pmc.rar (1.2 MB)
  • 下载次数: 1098
分享到:
评论
4 楼 zhangcheng 2008-11-02  
liutianhao 写道
exyral 写道
能不能把用到的lib列一下,貌似包里没有。

还有,为什么我用MyEclipse 6打开时,会说web.xml里的<web-app id="WebApp_ID">这句有错误?


对啊,我这也有错



你用下WTP或者JavaEE版本的打开看看?
3 楼 liutianhao 2008-06-27  
exyral 写道
能不能把用到的lib列一下,貌似包里没有。

还有,为什么我用MyEclipse 6打开时,会说web.xml里的<web-app id="WebApp_ID">这句有错误?


对啊,我这也有错

2 楼 exyral 2008-02-27  
能不能把用到的lib列一下,貌似包里没有。

还有,为什么我用MyEclipse 6打开时,会说web.xml里的<web-app id="WebApp_ID">这句有错误?
1 楼 cloudyofsky 2008-01-05  
先下载来看一下

相关推荐

    gxt、gwt与spring结合使用

    同时,Spring的ApplicationContext可以在启动时初始化所有必要的组件,包括GXT或GWT的配置和组件实例。 总的来说,将GXT、GWT与Spring结合使用,可以充分利用各自的优势,构建出功能强大、易于维护的企业级Web应用...

    Ext-Gwt(GWT)开发实例(整合Spring +Hibernate)

    标题 "Ext-Gwt(GWT)开发实例(整合Spring +Hibernate)" 涉及到的是一个实际项目开发的教程,其中结合了三个重要的技术框架:Google Web Toolkit (GWT),Spring 和 Hibernate。这个实例旨在展示如何在Web应用开发中...

    gwt spring整合资源下载

    2. **gwt_spring.zip** - 类似于上面的文件,这可能是一个GWT与Spring集成的实例,但以ZIP格式提供,更适合Windows和Mac用户。它可能包括了项目的类文件、资源、配置文件等。 3. **springgwt_sudoku.zip** - 从名字...

    GWT+Spring2+Spring Security2+Hibernate3实例

    一个GWT+Spring2+Spring Security2+Hibernate3的实例,数据库为mssql.在/GwtWeb/WebRoot/WEB-INF/lib 目录下RequiredJar.txt有需要用到的库说明 修改一下applicationContext.xml的数据库设定就可以使用

    gwt-spring

    要深入了解这个压缩包的内容,你可以解压并查看源代码,理解GWT和Dojo的结合方式,以及它们是如何与Spring框架交互的。此外,博文链接中的"https://eric2007.iteye.com/blog/209563"可能会提供更详细的使用说明和...

    smartgwt+mybatis+spring的整合

    它可以通过ApplicationContext来管理SmartGwt的视图和服务,同时通过Bean配置管理Mybatis的SqlSessionFactory和Mapper实例。Spring的AOP可以方便地实现日志记录、权限控制等功能。 整合步骤通常包括以下几个部分: ...

    Spring4GWT技术资料

    Spring4GWT是将Spring框架与Google Web Toolkit (GWT) 结合的一种技术,它旨在帮助开发者在GWT应用中更好地实现服务层管理和依赖注入,从而提升开发效率和代码的可维护性。以下是对Spring4GWT技术的详细说明: 1. *...

    基于Java的实例开发源码-Spring4GWT.zip

    【标题】"基于Java的实例开发源码-Spring4GWT.zip" 提供了一个结合了Spring框架和Google Web Toolkit (GWT) 的实际项目案例,旨在帮助开发者了解如何在Java环境中构建可伸缩且高性能的Web应用。 【描述】这个压缩包...

    基于Java的实例源码-Spring4GWT.zip

    【标题】"基于Java的实例源码-Spring4GWT.zip"是一个压缩包,其中包含了一个使用Java语言开发的示例项目,该项目整合了Spring框架和Google Web Toolkit(GWT)技术。Spring是一个广泛使用的开源Java框架,它主要用于...

    GWT通信机制初探

    总结来说,本文可能会涵盖GWT的通信机制,包括RequestBuilder和AsyncCallback的使用,以及如何将GXT与Spring框架集成,利用Spring的功能如依赖注入、服务代理、安全控制和数据持久化来增强GWT应用的功能和性能。...

    Pro web 2.0 application development with GWT

    本书通过具体的项目实例,深入讲解了如何利用GWT与Spring框架构建完整的Web 2.0应用。这些案例涵盖了从简单的页面展示到复杂的用户交互逻辑,帮助读者全面了解整个开发流程。 #### 七、性能优化技巧 除了基础知识...

    drunken-avenger

    【描述】"gwt-spring-hibernate-tutorial" 明确地告诉我们,这是一个教程,主要讲解如何在同一个项目中有效地结合 GWT、Spring 和 Hibernate。这三个技术都是 Java 开发中的重要组件,它们各自扮演着不同的角色: 1...

    SpringMVC学习笔记

    总的来说,SpringMVC是Java Web开发的强大工具,结合GWT可以在保持Java开发效率的同时,构建出交互性强、用户体验良好的Web应用。深入学习和掌握SpringMVC,不仅可以提升开发效率,也有助于理解Web应用的底层工作...

    async-api:Java和GWT应用程序的异步实用程序

    通过结合Java的异步API和GWT的异步机制,开发者可以构建出高效、响应式的Web应用,同时保持良好的用户体验。 **更多阅读** 了解Java EE中的异步功能对使用async-api会有很大帮助。Java EE 7引入了`@Asynchronous`...

    Packt.Google.Web.Toolkit.2.Application.Development.Cookbook.Source.Code

    - 不同类型的GWT应用实例,如单页应用(SPA)、富互联网应用(RIA)等。 - 使用GWT的事件处理、UI布局、数据绑定和状态管理的示例。 - 如何集成GWT与其他技术,如RESTful服务、JSON数据交换、服务器端框架(如Spring...

    JAVA上百实例源码以及开源项目源代码

    数字证书:从文件中读取数字证书,生成文件输入流,输入文件为c:/mycert.cer,获取一个处理X.509证书的证书工厂…… Java+ajax写的登录实例 1个目标文件 内容索引:Java源码,初学实例,ajax,登录 一个Java+ajax写的...

    JSF 资源 managed bean 课件

    - **培训课程**:提供定制化的Java EE培训课程,包括Servlets、JSP、Struts、JSF/MyFaces/Facelets、Ajax、GWT、Spring、Hibernate/JPA等,由知名作者和开发者亲自授课。 ### 结论 通过对JSF Managed Beans的深入...

    Ajax经典实例大全

    **Ajax经典实例大全** Ajax(Asynchronous JavaScript and XML)是一种在无需刷新整个网页的情况下,能够更新部分网页的...通过学习和实践这些经典实例,开发者可以更好地掌握Ajax技术,提高Web应用的性能和用户体验。

    jbpm开发JAR包

    3. **jbpm-persistence**: 与数据库交互,支持流程实例和相关数据的持久化。jbpm默认使用JPA(Java Persistence API)来存储流程实例信息,确保数据在系统重启后仍可恢复。 4. **jbpm-human-task**: 专注于人类参与...

Global site tag (gtag.js) - Google Analytics