分享

Vaadin框架學習(login DEMO)

 dinghj 2014-12-10

vaadin是一個基於組件(Component)的表現層框架,具體的編程風格和CS很像,採取事件觸發式編程(event-listener)。所有的客戶端請求被vaadin框架內的ApplicationServlet捕獲,找到對應的application實例,然後通過GoogleToolKit轉化成普通HTML。所有的操作都在服務器端完成,包括js。vaadin的界面風格比較美觀,由於所有代碼都由java寫成,對平台的顧慮較少,可以用於移動和web應用,但是對服務器端要求較高。
下面是簡單的login demo,步驟4、5可以跳過自行實現驗證方式:
1、首先需要在web.xml加入vaadin的核心servlet:
<!--可有可無的配置,如果是正式發布建議設為true,開發環境設為false-->
<context-param>
<description>
Vaadin production mode</description>
<param-name>productionMode</param-name>
<param-value>false</param-value>
</context-param>
<!--vaadin的核心servlet,如有需要可複寫-->
<servlet>
<servlet-name>Vaadinui Application</servlet-name>
<servlet-class>com.vaadin.terminal.gwt.server.ApplicationServlet</servlet-class>
<!-- 默認vaadin的web應用首頁,取代welcome-file-list,這裡是demo裡面用到的類-->
<init-param>
<description>Vaadin application class to start</description>
<param-name>application</param-name>
<param-value>com.arlen.ui.applications.VaadinTrialApplication</param-value>
</init-param>
</servlet>
<!--路徑映射,需要就改-->
<servlet-mapping>
<servlet-name>Vaadinui Application</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
2、編寫application類,繼承Application:
import com.arlen.ui.component.windows.*;
import com.vaadin.Application;

public class VaadinTrialApplication extends Application {
/**
*
*/
private static final long serialVersionUID = 1654864768764L;

@Override
public void init() {
LoginWindow lw = new LoginWindow();
this.setMainWindow(lw);
}

}
3、Window是最基礎的組件,所有組件都需要附著在window上,編寫LoginWindow類:
import java.sql.SQLException;
import static com.vaadin.ui.Window.Notification.TYPE_ERROR_MESSAGE;
import com.arlen.dbUtil.DataOp;
import com.vaadin.ui.Button;
import com.vaadin.ui.FormLayout;
import com.vaadin.ui.PasswordField;
import com.vaadin.ui.TextField;
import com.vaadin.ui.Window;
import com.vaadin.ui.Button.ClickEvent;

public class LoginWindow extends Window {
private static final long serialVersionUID = 1L;
private TextField loginField;
private PasswordField passwordField;
private Button submitButton;
public LoginWindow() {
loginField = new TextField("Login", "jack");
passwordField = new PasswordField("Password");
submitButton = new Button("Submit");
submitButton.addListener(ClickEvent.class, this, "authenticate");
setCaption("Twaattin Login");
FormLayout formLayout = new FormLayout();
formLayout.setMargin(true);
formLayout.addComponent(loginField);
formLayout.addComponent(passwordField);
formLayout.addComponent(submitButton);
addComponent(formLayout);
}
public void authenticate(ClickEvent event) {
String login = (String) loginField.getValue();
String psw = (String) passwordField.getValue();
boolean isValid=false;
DataOp op = null;
try {
op=new DataOp();
//簡單的驗證(通過數據庫SQLServer)
isValid=op.retrieveRowNum("UUM_USER", "user_psw='"+psw+"' and user_ID='"+login+"'")==0?false:true;
} catch (SQLException e) {
e.printStackTrace();
}
finally{
if(op!=null){
op.close();
}
if(isValid){
this.showNotification("Welcome back!"+login+" ,you will be redirected...");
//這裡可以跳轉,比如定義一個跳轉的頁面為SearchWindow,用戶驗證通過後就可以跳轉,這裡不再列SearchWindow代碼
this.getApplication().setMainWindow(new SearchWindow());
this.getApplication().removeWindow(this);
}
else{
showNotification("Login failed,please try again!",TYPE_ERROR_MESSAGE);
}
}
}
}
4、簡單的數據庫連接類DataOp,通過tomcat取得datasource。
4、1 tomcat的context中需要加入,定義數據源:
<Resource name="jdbc/webframe" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="sa" password="" driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://localhost:1433;database=arlen"/>

4、2 web.xml加入,加入數據源:
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/webframe</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
4、3 DataOp類
package com.arlen.dbUtil;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.sql.DataSource;

import org.apache.log4j.Logger;

public class DataOp {
public final static String MSS_CLASS_NAME ="com.microsoft.sqlserver.jdbc.SQLServerDriver";
// private static String DB_USER ="sa";
// private static String DB_PASSWORD ="";
// private static String DB_NAME ="arlen";
// private static String HOST_NAME ="localhost";
private Connection conn = null;
private Statement stmt = null;
private Logger logger=Logger.getLogger(DataOp.class);
private Connection getConnection()throws SQLException{
Connection conn=null;
DataSource ds = DataSourcePool.getDataSource();
conn = ds.getConnection();
// Class.forName(MSS_CLASS_NAME);
// StringBuffer urlString=new StringBuffer("jdbc:sqlserver://").append(HOST_NAME)
// .append(";database=").append(DB_NAME);
// conn = DriverManager.getConnection(urlString.toString(),DB_USER,DB_PASSWORD);
return conn;
}
/**
* get an instance of
* @return
* @throws Exception
*/
public DataOp()throws SQLException{
conn=getConnection();
stmt=conn.createStatement();
}
/**
* to retrieve rows,you need append parameter like COLUMN_NAME1=COLUMN_VALUE1 AND/OR COLUMN_NAME2=COLUMN_VALUE2....
* @param tableName table name stored in the database
* @param condition condition string which appended to "where" cluster
* @return
*/
public ResultSet retrieveRows(String tableName,String condition) throws SQLException{
ResultSet rs=null;
if(conn==null||stmt!=null){
StringBuffer sb=new StringBuffer("select * from ");
sb.append(tableName);
if(condition!=null&&condition.trim()!=null){
sb.append(" where ").append(condition);
}
logger.debug(sb.toString());
rs=stmt.executeQuery(sb.toString());
}
return rs;
}
public ResultSet executeSQL(String SQLSatatement) throws SQLException{
ResultSet rs=null;
if(conn==null||stmt!=null){
logger.debug(SQLSatatement);
rs = stmt.executeQuery(SQLSatatement);
}
return rs;
}
public ResultSet retrieveRows(String SQLSatatement) throws Exception{
logger.debug(SQLSatatement);
return stmt.executeQuery(SQLSatatement);
}

public int retrieveRowNum(String tableName,String condition) throws SQLException{
ResultSet rs=null;
int count = 0;
if(conn==null||stmt!=null){
StringBuffer sb=new StringBuffer("select count(1) from ");
sb.append(tableName);
if(condition!=null&&condition.trim()!=null){
sb.append(" where ").append(condition);
}
logger.debug(sb.toString());
rs=stmt.executeQuery(sb.toString());
if(rs!=null&&rs.next())
count=rs.getInt(1);
}
else{
logger.debug("Connection not initialized!!");
}
if(rs!=null)
rs.close();
return count;
}
public void close(){
if(conn!=null){
try {
conn.close();
if(stmt!=null)
stmt.close();
} catch (SQLException e) {
logger.debug("Can not close datasource!");
e.printStackTrace();
}
}
}
}
4、4 DataSourcePool類
package com.arlen.dbUtil;

import javax.sql.DataSource;

import org.springframework.jndi.support.SimpleJndiBeanFactory;

public class DataSourcePool {
private static final SimpleJndiBeanFactory sb = new SimpleJndiBeanFactory();
public static DataSource getDataSource(){
return (DataSource)sb.getBean("jdbc/webframe",DataSource.class);
}
public static DataSource getDataSource(String JNDIPath){
return (DataSource)sb.getBean("JNDIPath");
}
}
5、打開任意瀏覽器運行

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多