本套代码实现功能如下:
1.请求路由功能
2.Bean注入
3.执行匿名及命名参数sql语句
package com.hongyuan.core; import java.lang.reflect.Method; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @SuppressWarnings("serial") public class WebServlet extends HttpServlet { protected HttpServletRequest request; protected HttpServletResponse response; protected Map<String,String> cfgParams=new HashMap<String,String>(); protected Map<String,String> dbSqls=new HashMap<String,String>(); protected Map<String,String> msgs=new HashMap<String,String>(); public void init(){} @Override public final void init(ServletConfig config) throws ServletException { @SuppressWarnings("unchecked") Enumeration<String> names = config.getInitParameterNames(); while(names.hasMoreElements()){ String name=names.nextElement(); if(name.startsWith("Bean_")){ //为servlet注入Bean对象 String beanName=name.substring("Bean_".length()); String beanClass=config.getInitParameter(name); try { Object bean = Class.forName(beanClass).newInstance(); bean.getClass().getMethod("setServlet",new Class[]{WebServlet.class}).invoke(bean,this); this.getClass().getField(beanName).set(this,bean); } catch (Exception e) { e.printStackTrace(); } }else if(name.startsWith("Sql_")){ String sqlName=name.substring("Sql_".length()); String sql=config.getInitParameter(name); dbSqls.put(sqlName,sql); }else if(name.startsWith("Message_")){ String msgName=name.substring("Message_".length()); String msg=config.getInitParameter(name); msgs.put(msgName,msg); }else if(name.startsWith("Param_")){ String paramName=name.substring("Param_".length()); String paramVal=config.getInitParameter(name); cfgParams.put(paramName,paramVal); } } } @Override public final void service(HttpServletRequest request, HttpServletResponse response){ this.request=request; this.response=response; try { //根据路由参数将请求转交到指定方法执行 String routeParam=cfgParams.get("routeParam"); String action=this.get((routeParam==null||"".equals(routeParam))?"action":routeParam,"init"); Method method=this.getClass().getMethod(action); method.invoke(this); } catch (Exception e) { this.init(); } } /** * 展示指定页面 * @param page */ protected void show(String page){ try { String pagePath=cfgParams.get("pagePath"); request.getRequestDispatcher(((pagePath==null||"".equals(pagePath))?"/WEB-INF/pages/":pagePath)+page).forward(request,response); } catch (Exception e) { e.printStackTrace(); } } /** * 获取指定名称的请求参数 * @param name * @param def * @return */ protected String get(String name,String def){ String value=request.getParameter(name); if(value!=null&&!"".equals(value.trim())){ return value; }else{ return def; } } /** * 向页面输出指定参数 * @param name * @param value */ protected void put(String name,Object value){ request.setAttribute(name,value); } /** * 获取指定名称的消息内容(可设置默认值) * @param name * @param def * @return */ protected String getMsg(String name,String def){ String msg=msgs.get(name); if(msg!=null&&!"".equals(msg.trim())){ return msg; }else{ return def; } } /** * 获取指定名称的消息内容 * @param name * @param def * @return */ protected String getMsg(String name){ return this.getMsg(name,""); } }
package com.hongyuan.core; public class WebBean { protected DBUtil dbUtil=new DBUtil(); private WebServlet servlet; public WebServlet getServlet() { return servlet; } public void setServlet(WebServlet servlet) { this.servlet = servlet; } public String getSql(String sqlName){ return servlet.dbSqls.get(sqlName); } }
package com.hongyuan.core; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.sql.Types; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.sql.DataSource; import com.mysql.jdbc.jdbc2.optional.MysqlDataSource; public class DBUtil { private static DataSource dataSource = null; static{ /** * 初始化数据源,不同的数据库获取数据源的方式不同,可参考相应数据库的说明文档。 */ MysqlDataSource mds=new MysqlDataSource(); mds.setURL("jdbc:mysql://localhost:3306/test"); mds.setUser("root"); mds.setPassword("123456"); dataSource=mds; } /** * 获取数据库连接 * @return * @throws SQLException */ public static Connection getConnection() throws SQLException { return dataSource.getConnection(); } /** * 关闭数据库连接资源 * @param conn * @param s * @param rs * @throws SQLException */ public static void close(Connection conn, Statement s, ResultSet rs) throws SQLException { if (rs != null) rs.close(); if (s != null) s.close(); if (conn != null) conn.close(); } /** * 执行数据库查询语句 * @param sql 查询sql,匿名参数用?表示,命名参数使用“:参数名”表示 * @param params 查询参数 * @return * @throws SQLException */ @SuppressWarnings("unchecked") public List<Map<String,Object>> select(String sql,Object... params) throws SQLException{ return (List<Map<String,Object>>)this.executeSql(sql,params); } /** * 执行数据库记录变更语句(增,删,改) * @param sql 查询sql,匿名参数用?表示,命名参数使用“:参数名”表示 * @param params 查询参数 * @return * @throws SQLException */ public int update(String sql,Object... params) throws SQLException{ return (Integer)this.executeSql(sql,params); } /** * 通用Sql执行方法 * @param sql 查询sql,匿名参数用?表示,命名参数使用“:参数名”表示 * @param params 命名参数 * @return * @throws SQLException */ public Object executeSql(String sql, Object... params) throws SQLException { //处理命名参数 if(params!=null&¶ms[0] instanceof Map){ List<Object> pList=new ArrayList<Object>(); Map<String,Object> pMap=(Map<String, Object>)params[0]; Matcher pMatcher = Pattern.compile(":(\\w+)").matcher(sql); while(pMatcher.find()){ String pName=pMatcher.group(1); pList.add(pMap.get(pName)); } sql=pMatcher.replaceAll("?"); params=pList.toArray(); } Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { conn = DBUtil.getConnection(); ps = conn.prepareStatement(sql); if (null != params) { //初始化查询参数 for(int i=0;i<params.length;i++){ Object param = params[i]; if(param!=null){ ps.setObject(i+1,param); }else{ ps.setNull(i+1,Types.NULL); } } } //处理结果集 boolean isResultSet = ps.execute(); List<Object> result = new ArrayList<Object>(); do { if (isResultSet) { List<Map<String,Object>> tableData=new ArrayList<Map<String,Object>>(); ResultSet resultSet=ps.getResultSet(); while(resultSet.next()){ Map<String,Object> rowData=new HashMap<String,Object>(); for(int i=1;i<=resultSet.getMetaData().getColumnCount();i++){ rowData.put(resultSet.getMetaData().getColumnName(i),resultSet.getObject(i)); } tableData.add(rowData); } result.add(tableData); } else { result.add(new Integer(ps.getUpdateCount())); } } while ((isResultSet = ps.getMoreResults()) == true || ps.getUpdateCount() != -1); //处理返回结果 if (result.size() == 0) { return null; } else if (result.size() == 1) { return result.get(0); } else { return result; } } catch (SQLException e) { throw new SQLException("无法执行的sql语句!"); } finally { DBUtil.close(conn, ps, rs); } } }
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app [ <!ENTITY webServlet SYSTEM "web-servlets.part"> <!ENTITY webServletMapping SYSTEM "web-servlet-mapping.part"> ]> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> &webServlet; &webServletMapping; <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
<servlet> <servlet-name>SimpleServlet</servlet-name> <servlet-class>com.hongyuan.test.SimpleServlet</servlet-class> <!-- 为servlet注入Bean实例 --> <init-param> <param-name>Bean_simpleBean</param-name> <param-value>com.hongyuan.test.SimpleBean</param-value> </init-param> <!-- sql语句,匿名参数 --> <init-param> <param-name>Sql_queryUserById</param-name> <param-value>select * from user where id=?</param-value> </init-param> <!-- sql语句,命名参数 --> <init-param> <param-name>Sql_queryUserByUserId</param-name> <param-value>select * from user where user_id=:userId</param-value> </init-param> <init-param> <param-name>Message_hello</param-name> <param-value>Hello Servlet!!!!</param-value> </init-param> <init-param> <param-name>Param_config</param-name> <param-value>this is a config param.</param-value> </init-param> </servlet>