Web4J之试用

Web4J之试用

Web4J是一个比较新潮的Web框架,具体信息可以参考官网的相关说明: http://www.web4j.com/,下面是我的简单试用
1、数据库准备(MySQL):
创建一个数据库和一个单表:
create   database  test4j;
use  test4j;

create   table  tbl_log(
    log_id mediumint unsigned auto_increment 
primary   key ,
    log_msg 
varchar ( 100 not   null ,
    log_date date
)type
= innodb;

insert   into  tbl_log  values ( 1 , ' good job ' ,curdate());

2、web4j.jar改进:
将AppInfo等7个类打包到web4j.jar中

3、开始试用:
配置web.xml:
< servlet-name > Controller </ servlet-name >
< servlet-class > hirondelle.web4j.Controller </ servlet-class >
< init-param >
    
< description >
</ description >
    
< param-name > ImplicitMappingRemoveBasePackage </ param-name >
    
< param-value > test </ param-value >
</ init-param >
< init-param >
    
< param-name > ImplementationFor.hirondelle.web4j.ApplicationInfo </ param-name >
    
< param-value > test.main.AppInfo </ param-value >
    
< description >
    
</ description >
</ init-param >
< init-param >
    
< description >
</ description >
    
< param-name > LoggingDirectory </ param-name >
    
< param-value > E:\jdev\eclipse\workspace\My4JTest\log\ </ param-value >
</ init-param >
< init-param >
    
< param-name > DefaultDbConnectionString </ param-name >
    
< param-value > java:comp/env/jdbc/test4j </ param-value >
</ init-param >
..
< resource-ref >
< description > DB Connection Pool For Main Application </ description >
< res-ref-name > jdbc/test4j </ res-ref-name >
< res-type > javax.sql.DataSource </ res-type >
< res-auth > Container </ res-auth >
</ resource-ref >

相应的tomcat部署文件test4j.xml为:
< Context  path ="/test4j"  docBase ="E:\jdev\eclipse\workspace\My4JTest\WebContent"
    debug
="5"  reloadable ="true"  crossContext ="true" >
    
< Resource  name ="jdbc/test4j"  auth ="Container"  type ="javax.sql.DataSource"
        username
="root"  password ="root"  driverClassName ="org.gjt.mm.mysql.Driver"
        url
="jdbc:mysql://localhost:3306/test4j?useServerPrepStmts=false"
        maxActive
="10"  maxIdle ="5"   />
</ Context >

主干文件的编写:
MODEL:
package  test.main;

import   static  hirondelle.web4j.util.Consts.FAILS;
import  hirondelle.web4j.model.Check;
import  hirondelle.web4j.model.Id;
import  hirondelle.web4j.model.ModelCtorException;
import  hirondelle.web4j.model.ModelUtil;
import  hirondelle.web4j.security.SafeText;

import  java.util.Date;

public   final   class  Log  {
    
private Id logId;
    
private SafeText logMsg;
    
private Long logDate;

    
private void validate() throws ModelCtorException {
        ModelCtorException ex 
= new ModelCtorException();
        
if (FAILS == Check.optional(logMsg, Check.range(0100))) {
            ex.add(
"Message cannot be longer than 1,000 characters.");
        }


        
if (ex.isNotEmpty()) {
            
throw ex;
        }

    }


    
public Id getLogId() {
        
return logId;
    }


    
public SafeText getLogMsg() {
        
return logMsg;
    }


    
public Date getLogDate() {
        
return new Date(logDate);
    }


    
public Log(Id id, SafeText msg, Date date) throws ModelCtorException {
        
this.logId = id;
        
this.logMsg = msg;
        
this.logDate = date == null ? null : date.getTime();
        validate();
    }


    @Override
    
public String toString() {
        
return ModelUtil.toStringFor(this);
    }

}

ACTION:
package  test.main;

import  hirondelle.web4j.action.ActionTemplateListAndEdit;
import  hirondelle.web4j.action.ResponsePage;
import  hirondelle.web4j.database.DAOException;
import  hirondelle.web4j.database.SqlId;
import  hirondelle.web4j.model.ModelCtorException;
import  hirondelle.web4j.model.ModelFromRequest;
import  hirondelle.web4j.request.RequestParameter;
import  hirondelle.web4j.request.RequestParser;
import  hirondelle.web4j.util.Util;

import  java.util.logging.Logger;

public   final   class  LogAction  extends  ActionTemplateListAndEdit  {
    
private static final ResponsePage FORWARD = TmplPage.get("Log""view.jsp", LogAction.class);
    
private static final ResponsePage REDIRECT = new ResponsePage("LogAction.list");
    
private LogDAO fDAO = new LogDAO();
    
private Log fModel;
    
private static final Logger fLogger = Util.getLogger(LogAction.class);

    
public static final RequestParameter MSG = RequestParameter.withLengthCheck("LogMsg");
    
public static final RequestParameter ID = RequestParameter.withLengthCheck("LogId");
    
public static final RequestParameter DATE = RequestParameter.withLengthCheck("LogDate");

    
public static final SqlId LIST_LOG = new SqlId("LIST_LOG");
    
public static final SqlId FETCH_LOG = new SqlId("FETCH_LOG");
    
public static final SqlId ADD_LOG = new SqlId("INSERT_LOG");
    
public static final SqlId CHANGE_LOG = new SqlId("UPDATE_LOG");
    
public static final SqlId DELETE_LOG = new SqlId("DELETE_LOG");

    
public LogAction(RequestParser aRequestParser) {
        
super(FORWARD, REDIRECT, aRequestParser);
    }


    @Override
    
protected void attemptAdd() throws DAOException {
        fLogger.fine(
"Attempting to add new Spending item.");
        fDAO.add(fModel);
        addMessage(
"Item added successfully.");
    }


    @Override
    
protected void attemptChange() throws DAOException {
        fLogger.fine(
"Attempting to change an existing log item.");
        
boolean success = fDAO.change(fModel);
        
if (success) {
            addMessage(
"Item changed successfully.");
        }
 else {
            addError(
"No update occurred. Item likely deleted by another user.");
        }

    }


    @Override
    
protected void attemptDelete() throws DAOException {
        fLogger.fine(
"Attempting to delete an existing log item.");
        fDAO.delete(getIdParam(ID));
        addMessage(
"Item deleted successfully.");
    }


    @Override
    
protected void attemptFetchForChange() throws DAOException {
        fLogger.fine(
"Attempting to fetch an existing log item.");
        Log model 
= fDAO.fetch(getIdParam(ID));
        
if (model == null{
            addError(
"Item no longer exists. Likely deleted by another user.");
        }
 else {
            addToRequest(ITEM_FOR_EDIT, model);
        }

    }


    @Override
    
protected void doList() throws DAOException {
        fLogger.fine(
"Listing all log items.");
        addToRequest(ITEMS_FOR_LISTING, fDAO.list());
    }


    @Override
    
protected void validateUserInput() {
        fLogger.fine(
"Validating user input.");
        ModelFromRequest builder 
= new ModelFromRequest(getRequestParser());
        
try {
            fModel 
= builder.build(Log.class, ID, MSG, DATE);
        }
 catch (ModelCtorException ex) {
            addError(ex);
        }

    }


}


DAO:
package  test.main;

import   static  test.main.LogAction.ADD_LOG;
import   static  test.main.LogAction.CHANGE_LOG;
import   static  test.main.LogAction.DELETE_LOG;
import   static  test.main.LogAction.FETCH_LOG;
import   static  test.main.LogAction.LIST_LOG;
import  hirondelle.web4j.database.DAOException;
import  hirondelle.web4j.database.Db;
import  hirondelle.web4j.model.Id;
import  hirondelle.web4j.util.Util;

import  java.util.List;

final   class  LogDAO  {
    
private Object[] baseParamsFrom(Log aLog) {
        
return new Object[] { aLog.getLogMsg() };
    }


    List
<Log> list() throws DAOException {
        
return Db.list(Log.class, LIST_LOG);
    }


    Log fetch(Id aId) 
throws DAOException {
        
return Db.fetch(Log.class, FETCH_LOG, aId);
    }


    
void add(Log aLog) throws DAOException {
        Db.add(ADD_LOG, baseParamsFrom(aLog));
    }


    
boolean change(Log aLog) throws DAOException {
        Object[] params 
= Db.addIdTo(baseParamsFrom(aLog), aLog.getLogId());
        
return Util.isSuccess(Db.edit(CHANGE_LOG, params));
    }


    
void delete(Id aId) throws DAOException {
        Db.delete(DELETE_LOG, aId);
    }


}


statements.sql文件:
LIST_LOG {
 
SELECT  log_id, log_msg, log_date
 
FROM  tbl_log
 
ORDER   BY  log_date  DESC
}

FETCH_LOG {
 
SELECT  log_id, log_msg, log_date
 
FROM  tbl_log
 
WHERE  log_id  =
}

INSERT_LOG  {
 
INSERT   INTO  tbl_log (log_msg, log_date)  VALUES  (?,curdate())
}

UPDATE_LOG {
  
UPDATE  tbl_log  SET  log_msg = WHERE  log_id = ?
}

DELETE_LOG {
  
DELETE   FROM  tbl_log  WHERE  log_id = ?
}

视图view.jsp文件:
<% -- List-and-edit form for Electricity Spending. -- %>
<% @ include file="/JspHeader.jsp" %>

< c:set  value ='LogAction'  var ='baseURL'  />
< tags:setFormTarget  using ='${baseURL}'  />

<% -- Form for adds and edits. -- %>

< form  action ='${formTarget}'  method ="post"  class ="user-input" >
< table  align ="center" >
    
< w:populate  using ="itemForEdit" >
        
< input  name ="LogId"  type ="hidden" >
        
< input  name ="LogDate"  type ="hidden" >
        
< tr >
            
< td >< label > LOG MSG: </ label ></ td >
            
< td >< input  name ="LogMsg"  type ="text"  maxlength ='100' ></ td >
        
</ tr >
    
</ w:populate >
    
< tr >
        
< td  align ="center" >< input  type ="submit"  value ="Add/Edit" >
        
</ td >
    
</ tr >
</ table >
</ form >

< P > <% -- Listing of all items. -- %>
< table  class ="report"  align ="center" >
    
< caption > Here is The Logs </ caption >
    
< tr >
        
< th  title ="Line Number" > # </ th >
        
< th  title ='Log  Msg' > Log Msg </ th >
        
< th  title ='Log  Date' > Log Date </ th >
        
< th ></ th >
    
</ tr >
    
< w:alternatingRow >
        
< c:forEach  var ="item"  items ="${itemsForListing}"  varStatus ="index" >
            
< tr  class ="row_highlight" >
                
< td  title ="Line Number" > ${index.count} </ td >
                
< td > ${item.logMsg} </ td >
                
< td  align ='right' >< c:set  value ="${item.logDate}"  var ="paidOn"   />
                
< w:showDate  name ='paidOn'  pattern ='yyyy-MM-dd'  /></ td >
                
< tags:editLinks  baseURL ='${baseURL}'  id ='${item.logId}'  />
            
</ tr >
        
</ c:forEach >
    
</ w:alternatingRow >
</ table >

更多内容请参考附件,接下就是将test4j.xml文件拷贝到conf\Catalina\localhost路径下,启动tomcat之后,访问http://localhost:8080/test4j即可看到效果
下载附件请点击此处(内容为eclipse工程的压缩包): MyWeb4JTest

你可能感兴趣的:(Web4J之试用)