去掉if/else

系统里原来代码基本所有请求都集中在一个servlet里处理,然后用一大堆的if/else调用相应方法,这让我看得很不爽,于是就给切掉了...

就是根据注解来决定调用哪个方法,这样不管有多少个方法只要单纯地往上加就行了,不用管原来的(当然同名不行...)

对于需要访问权限的方法再加上Security注解,如果权限有分级,可以对Security扩展一下属性,再修改一下判断的方法...

其实哪有把这么多方法都放一个servlet里的........历史遗留...

以下具体步骤:

先是写了一个注解

Alias.java:

 
  
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* 在servlet的方法中设置别名注解,以方便反射获得转发方法
*
@author hlw
*
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @ interface Alias
{
/**
* url请求中的方法别名
*
@return 方法别名
*/
String value();
}

 

再在每个方法上现加上注解, 比如:

 
  
@SuppressWarnings( " unused " )
@Alias(
" methoda " )
private void method1(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
OOXX;
}
@SuppressWarnings(
" unused " )
@Alias(
" methodb " )
private void method2(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
OOXX;
}
......

 

对于需要访问权限的方法再写一个注解

Security.java:

 
  
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* 指明访问此资源需要权限
*
@author hlw
*
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @ interface Security
{
boolean value() default true ;
}

 

接着

 
  
@SuppressWarnings( " unused " )
@Security
@Alias(
" methodc " )
private void method3(HttpServletRequest request, HttpServletResponse response) throws ServletException,
IOException{
OOXX;
}
......

 

然后是转发:

 
  
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException,
IOException
{
request.setCharacterEncoding(
" UTF-8 " );
String methodName
= request.getParameter( " method " );
dispatch(methodName, request, response);
}
private void dispatch(String methodName, HttpServletRequest request, HttpServletResponse response){
if (Utils.isBlank(methodName)) {
logger.warn(
" 反射需要的方法名为空! " );
// 这里依具体情况输出提示
write( " errormethod " , response);
return ;
}
if ( ! methods.containsKey(methodName)) {
logger.warn(
" [ " + methodName + " ]对应的方法不存在! " );
// 这里依具体情况输出提示
write( " errormethod " , response);
return ;
}
try
{
Method method
= methods.get(methodName);
boolean visitable = true ;
if (method.isAnnotationPresent(Security. class ))
{
if ( ! method.isAccessible()){
method.setAccessible(
true );
}
if (method.getAnnotation(Security. class ).value()){
visitable
= ContextUtils.signed(request); // 这里判断权限
}
}
// 检查权限
if (visitable){
method.invoke(
this , request, response);
}
else {
// 这里依具体情况输出提示
write( " deny " , response);
}
}
catch (IllegalArgumentException e)
{
// 除非方法参数设计错误,否则不会发生!
throw new ControllerException(e);
}
catch (IllegalAccessException e)
{
// 已在反射获取时处理,不会发生!
throw new ControllerException(e);
}
catch (InvocationTargetException e)
{
throw new ControllerException(e);
}
catch (ControllerException e){
logger.error(
" 反射调用方法出错! " , e);
}
}

 

最后是初始化方法:

 
  
public OOXXServlet(){
super ();
initMethods();
}

private void initMethods()
{
methods
= new HashMap < String, Method > ();
for (Method method : getClass().getDeclaredMethods())
{
if (method.isAnnotationPresent(Alias. class ))
{
if ( ! method.isAccessible())
method.setAccessible(
true );
methods.put(method.getAnnotation(Alias.
class ).value(), method);
}
}
}

 

当以OOXXServlet?method=methoda访问的时候就调用method1方法了...

 

 

还有一个是DBUnit根据hibernate配置来创建IDatabaseConnection的方法,有点难看:

 
  
/**
* 根据classpath文件db.properties中的db.hibernate.dialect
* 属性获取相应的DatabaseConnection
*
@param conn 数据库连接
*
@param schema 数据表
*
@return 供dbunit使用的数据库连接
*
@throws DatabaseUnitException
*/
public static IDatabaseConnection getIDatabaseConnection(Connection conn, String schema)
throws DatabaseUnitException
{
IDatabaseConnection connection;
try
{
Properties props
= PropertiesUtils.loadProperties( " db.properties " );
String sqlDialect
= props.getProperty( " db.hibernate.dialect " );
String methodName
= " get "
+ sqlDialect.substring(sqlDialect.lastIndexOf( ' . ' ) + 1 , sqlDialect.indexOf( " Dialect " )) + " Connection " ;
System.out.println(methodName);
Method method
= DbUnitUtils. class .getMethod(methodName, Connection. class , String. class );
if ( ! method.isAccessible())
{
method.setAccessible(
true );
}
connection
= (IDatabaseConnection) method.invoke( null , conn, schema);
}
catch (IOException e)
{
throw new RuntimeException(e);
}
catch (SecurityException e)
{
throw new RuntimeException(e);
}
catch (IllegalArgumentException e)
{
throw new RuntimeException(e);
}
catch (NoSuchMethodException e)
{
throw new RuntimeException(e);
}
catch (IllegalAccessException e)
{
throw new RuntimeException(e);
}
catch (InvocationTargetException e)
{
throw new RuntimeException(e);
}
catch (RuntimeException e)
{
logger.error(
" 调用方法名错误! " , e);
connection
= new DatabaseConnection(conn, schema);
e.printStackTrace();
}
return connection;
}
/*
* 获取 MySQLInnoDB DatabaseConnection
*/
public static IDatabaseConnection getMySQLInnoDBConnection(Connection conn, String schema)
throws DatabaseUnitException
{
return new MySqlConnection(conn, schema);
}
/*
* 获取 MySQL5InnoDB DatabaseConnection
*/
public static IDatabaseConnection getMySQL5InnoDBConnection(Connection conn, String schema)
throws DatabaseUnitException
{
return getMySQLInnoDBConnection(conn, schema);
}
/*
* 获取 MySQL DatabaseConnection
*/
public static IDatabaseConnection getMySQLConnection(Connection conn, String schema)
throws DatabaseUnitException
{
return getMySQLInnoDBConnection(conn, schema);
}
/*
* 获取 MySQL5 DatabaseConnection
*/
public static IDatabaseConnection getMySQL5Connection(Connection conn, String schema)
throws DatabaseUnitException
{
return getMySQLInnoDBConnection(conn, schema);
}
/*
* 获取 MySQL5InnoDB DatabaseConnection
*/
public static IDatabaseConnection getMySQLMyISAMConnection(Connection conn, String schema)
throws DatabaseUnitException
{
return getMySQLInnoDBConnection(conn, schema);
}
/*
* 获取 SQLServer DatabaseConnection
*/
public static IDatabaseConnection getSQLServerConnection(Connection conn, String schema)
throws DatabaseUnitException
{
return new MsSqlConnection(conn, schema);
}
/*
* 获取 PostgreSQL DatabaseConnection
*/
public static IDatabaseConnection getPostgreSQLConnection(Connection conn, String schema)
throws DatabaseUnitException
{
IDatabaseConnection connection
= new DatabaseConnection(conn, schema);
connection.getConfig().setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY,
new PostgresqlDataTypeFactory());
return connection;
}
/*
* 获取 Cgrs DatabaseConnection
*/
public static IDatabaseConnection getCgrsConnection(Connection conn, String schema)
throws DatabaseUnitException
{
return getPostgreSQLConnection(conn, schema);
}
/*
* 获取 PostgresPlus DatabaseConnection
*/
public static IDatabaseConnection getPostgresPlusConnection(Connection conn, String schema)
throws DatabaseUnitException
{
return getPostgreSQLConnection(conn, schema);
}
/*
* 获取 Oracle DatabaseConnection
*/
public static IDatabaseConnection getOracleConnection(Connection conn, String schema)
throws DatabaseUnitException
{
return new OracleConnection(conn, schema);
}
/*
* 获取 Oracle8i DatabaseConnection
*/
public static IDatabaseConnection getOracle8iConnection(Connection conn, String schema)
throws DatabaseUnitException
{
return getOracleConnection(conn, schema);
}
/*
* 获取 Oracle9 DatabaseConnection
*/
public static IDatabaseConnection getOracle9Connection(Connection conn, String schema)
throws DatabaseUnitException
{
return getOracleConnection(conn, schema);
}
/*
* 获取 Oracle9i DatabaseConnection
*/
public static IDatabaseConnection getOracle9iConnection(Connection conn, String schema)
throws DatabaseUnitException
{
return getOracleConnection(conn, schema);
}
/*
* 获取 Oracle10g DatabaseConnection
*/
public static IDatabaseConnection getOracle10gConnection(Connection conn, String schema)
throws DatabaseUnitException
{
IDatabaseConnection connection
= new OracleConnection(conn, schema);
connection.getConfig().setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY,
new Oracle10DataTypeFactory());
return connection;
}
/*
* 获取 H2 DatabaseConnection
*/
public static IDatabaseConnection getH2Connection(Connection conn, String schema)
throws DatabaseUnitException
{
return new H2Connection(conn, schema);
}
/*
* 获取 HSQL DatabaseConnection
*/
public static IDatabaseConnection getHSQLConnection(Connection conn, String schema)
throws DatabaseUnitException
{
return new HsqldbConnection(conn, schema);
}
/*
* 获取 DB2 DatabaseConnection
*/
public static IDatabaseConnection getDB2Connection(Connection conn, String schema)
throws DatabaseUnitException
{
return new Db2Connection(conn, schema);
}

 

使用的时候:

 
  
Connection conn = org.springframework.jdbc.datasource.DataSourceUtils.getConnection(dataSource);
IDatabaseConnection connection
= getIDatabaseConnection(conn, "" );
    try
{
    .....
    ......
    }
catch (IOException e)
{
logger.warn(xmlPath
+ " file not found " , e);
}
    finally
{
org.springframework.jdbc.datasource.DataSourceUtils.releaseConnection(conn, dataSource);
}

 

转载于:https://www.cnblogs.com/adaikiss/archive/2010/07/12/1775932.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值