业务

自定义数据库工具包
    JdbcUtils
        package util;
        import java.sql.Connection;
        import javax.sql.DataSource;
        import com.mchange.v2.c3p0.ComboPooledDataSource;
        /**
         * Jdbc连接的工具包
         * @author Administrator
         *
         */
        public class JdbcUtils {
            //数据源
            private static ComboPooledDataSource dataSource = new ComboPooledDataSource("myConfig");
            /**
             * 返回数据源对象
             * @return
             */
            public static DataSource getDataSource(){
                return dataSource;
            }
            /**
             * 返回连接对象
             */
            public static Connection getConnection(){
                try{
                    return dataSource.getConnection();
                }catch(Exception e){
                    throw new RuntimeException(e);
                }
            }
        }
    DbUtils
        package util;
        import java.sql.Connection;
        import java.sql.PreparedStatement;
        import java.sql.ResultSet;
        import java.sql.Statement;
        import java.util.List;
        import javax.sql.DataSource;
        /**
         * 数据库工具包
         * @author Administrator
         *
         */
        public class DbUtils {
            /**
             * 通过数据源返回连接对象
             * @param dataSource
             */
            private static Connection getConnection(DataSource dataSource){
                try {
                    return dataSource.getConnection();
                } catch (Exception e) {
                    e.printStackTrace();
                    throw new RuntimeException(e);
                }
            }
            /**
             * 关闭数据库资源
             * @param conn 
             * @param st 
             * @param re 
             */
            public static void close(Connection conn, Statement st, ResultSet re){
                //关闭ResultSet对象
                try{
                    if(re != null){
                        re.close();
                    }
                }catch(Exception e1){
                    System.out.println("关闭ResultSet对象异常");
                }finally{
                    //关闭Statement对象
                    try{
                        if(st != null){
                            st.close();
                        }
                    }catch(Exception e2){
                        System.out.println("关闭Statement对象异常");
                    }finally{
                        //关闭Connection对象
                        try{
                            if(conn != null){
                                conn.close();
                            }
                        }catch(Exception e3){
                            System.out.println("关闭Connection对象异常");
                        }
                    }
                }
            }
            /**
             * 设置参数
             * @param st 预编译对象
             * @param params 参数数组
             * @throws SQLException
             */
            private static void setParam(PreparedStatement st,Object[] params) throws SQLException{
                if(params != null){
                    for (int i = 1; i <= params.length; i++) {
                        //java.util.Date --> java.sql.Date
                        if(params[i-1]!=null && params[i-1].getClass() == java.util.Date.class){
                            java.util.Date date = (java.util.Date)params[i-1];
                            params[i-1] = new java.sql.Date(date.getTime());
                        }
                        st.setObject(i, params[i - 1]);
                    }
                }
            }
            /**
             * 查询单个值
             * @param dataSource 数据源
             * @param sql 要执行的sql语句
             * @param params sql语句的参数
             * @return 单个值
             */
            public static Object queryObject(DataSource dataSource, String sql, Object... params){
                Connection conn = getConnection(dataSource);
                PreparedStatement st = null;
                ResultSet re = null;
                try {
                    //获得预处理对象
                    st = conn.prepareStatement(sql);
                    //设置参数
                    setParam(st,params);
                    //执行
                    re = st.executeQuery();
                    if (re.next()) {
                        return re.getObject(1);
                    }
                    return null;
                } catch (Exception e) {
                    e.printStackTrace();
                    throw new RuntimeException(e);
                }finally{
                    //释放资源
                    close(conn,st,re);
                }
            }
            /**
             * 查询并封装为javaBean
             * @param dataSource 数据源
             * @param sql 要执行的sql语句
             * @param beanClass 目标转换类型的字节码对象
             * @param params sql语句的参数
             * @return 指定javaBean
             */
            public static <T> T queryBean(DataSource dataSource, String sql, Class<T> beanClass, Object... params){
                Connection conn = getConnection(dataSource);
                PreparedStatement st = null;
                ResultSet re = null;
                try {
                    //获得预处理对象
                    st = conn.prepareStatement(sql);
                    //设置参数
                    setParam(st,params);
                    //执行
                    re = st.executeQuery();
                    if (re.next()) {
                        //将结果集转换为对象
                        return BeanUtils.getBean(re, beanClass);
                    }
                    return null;
                } catch (Exception e) {
                    e.printStackTrace();
                    throw new RuntimeException(e);
                }finally{
                    //释放资源
                    close(conn,st,re);
                }
            }
            /**
             * 查询 并封装成一个含有指定javaBean的集合
             * @param dataSource 数据源
             * @param sql 要执行的sql语句
             * @param beanClass 目标转换类型的字节码对象
             * @return 包含指定类型javaBean的集合
             */
            public static <T> List<T> queryList(DataSource dataSource, String sql, Class<T> beanClass, Object... params) {
                Connection conn = getConnection(dataSource);
                PreparedStatement st = null;
                ResultSet re = null;
                try {
                    //获得预处理对象
                    st = conn.prepareStatement(sql);
                    //设置参数
                    setParam(st,params);
                    //执行
                    re = st.executeQuery();
                    //将数据转换为集合
                    return BeanUtils.getBeanList(re, beanClass);
                } catch (Exception e) {
                    e.printStackTrace();
                    throw new RuntimeException(e);
                }finally{
                    //释放资源
                    close(conn,st,re);
                }
            }
            /**
             * 更新
             * @param dataSource 数据源
             * @param sql 要执行的sql语句
             * @param params 参数
             * @return 更新是否成功
             */
            public static int update(DataSource dataSource, String sql, Object... params) {
                Connection conn = getConnection(dataSource);
                try {
                    return updateNotClose(conn, sql, params);
                }finally{
                    //释放资源
                    close(conn,null,null);
                }
            }
            /**
             * 更新,不关闭数据库连接(用于事务)
             * @param conn
             * @param sql
             * @param params
             * @return
             */
            public static int updateNotClose(Connection conn, String sql, Object... params) {
                PreparedStatement st = null;
                try {
                    //获得预处理对象
                    st = conn.prepareStatement(sql);
                    //设置参数
                    setParam(st,params);
                    //执行并返回结果
                    return st.executeUpdate();
                } catch (Exception e) {
                    e.printStackTrace();
                    throw new RuntimeException(e);
                }finally{
                    //释放资源
                    close(null,st,null);
                }
            }
            /**
             * 批量更新
             * @param dataSource 数据源
             * @param sql
             * @param params
             * @return
             */
            public static int[] updateBatch(DataSource dataSource, String sql, Object[][] params){
                Connection conn = getConnection(dataSource);
                try {
                    return updateBatchNotClose(conn, sql, params);
                }finally{
                    //释放资源
                    close(conn,null,null);
                }
            }
            /**
             * 批量更新,不关闭数据库连接(用于事务)
             * @param conn
             * @param sql
             * @param params
             * @return
             */
            public static int[] updateBatchNotClose(Connection conn, String sql, Object[][] params){
                PreparedStatement st = null;
                try {
                    //获得预处理对象
                    st = conn.prepareStatement(sql);
                    //设置参数
                    if(params != null){
                        for(int i=0;i<params.length;i++){
                            //设置参数
                            setParam(st,params[i]);
                            st.addBatch();
                        }
                    }
                    //执行并返回结果
                    return st.executeBatch();
                } catch (Exception e) {
                    e.printStackTrace();
                    throw new RuntimeException(e);
                }finally{
                    //释放资源
                    close(null,st,null);
                }
            }
        }
    BeanUtils
        package util;
        import java.lang.reflect.Method;
        import java.sql.ResultSet;
        import java.sql.ResultSetMetaData;
        import java.util.ArrayList;
        import java.util.HashMap;
        import java.util.List;
        import java.util.Map;
        /**
         * javaBean工具包
         * @author Administrator
         *
         */
        public class BeanUtils {
            //记录类中 属性名称和对应的set方法 
            private static Map<Class<?>,Map<String,Method>> beanClass_setMethod_Map 
                                        = new HashMap<Class<?>, Map<String,Method>>();
            /**
             * 将类中属性名称和对应的set方法 添加到map中
             * @param beanClass 目标类的字节码对象
             */
            private static void map_put(Class<?> beanClass){
                try {
                    Map<String,Method> methodMap = new HashMap<String, Method>();
                    //遍历属性
                    Method[] methodArr = beanClass.getMethods();//获取所有公共方法
                    for (Method method : methodArr) {
                        //获取set方法
                        if(method.getName().startsWith("set")){
                            //属性名
                            String attrName = StringUtils.getAttrName(method.getName());
                            //添加到map中
                            methodMap.put(attrName, method);
                        }
                    }
                    beanClass_setMethod_Map.put(beanClass, methodMap);
                } catch (Exception e) {
                    e.printStackTrace();
                    throw new RuntimeException(e);
                }
            }
            /**
             * 将结果集当前行封装为一个javaBean
             * @param re 结果集
             * @param beanClass 目标javaBean的字节码对象
             * @return javaBean
             */
            public static <T> T getBean(ResultSet re, Class<T> beanClass){
                try {
                    //获得类中的属性名称和对应的set方法
                    if(!beanClass_setMethod_Map.containsKey(beanClass)){
                        map_put(beanClass);
                    }
                    Map<String,Method> setMethodMap = beanClass_setMethod_Map.get(beanClass);
                    //获取所有列名
                    ResultSetMetaData meta = re.getMetaData();
                    int columnCount = meta.getColumnCount();
                    List<String> columnNames = new ArrayList<String>();
                    for(int i=1;i<=columnCount;i++){
                        columnNames.add(meta.getColumnName(i));
                    }
                    //创建目标对象并填充
                    T t = beanClass.newInstance();
                    for(String attrName : setMethodMap.keySet()){
                        if (columnNames.contains(attrName)) {
                            //如果结果集中存在同名列,则将值填充到对象的属性
                            // * 填充
                            Object value = re.getObject(attrName);
                            if(value!=null){
                                Method method = setMethodMap.get(attrName);
                                Class<?> paramType = method.getParameterTypes()[0];//参数类型
                                method.invoke(t, cast(value,paramType));
                            }
                        }
                    }
                    return t;
                } catch (Exception e) {
                    e.printStackTrace();
                    throw new RuntimeException(e);
                }
            }
            /**
             * 将结果集封装为含有javaBean的集合
             * @param re 结果集
             * @param beanClass 目标javaBean的字节码对象
             * @return 包含javaBean的集合
             */
            public static <T> List<T> getBeanList(ResultSet re, Class<T> beanClass) {
                try {
                    List<T> beanList = new ArrayList<T>();
                    //获得类中的属性名称和对应的set方法
                    if(!beanClass_setMethod_Map.containsKey(beanClass)){
                        map_put(beanClass);
                    }
                    Map<String,Method> setMethodMap = beanClass_setMethod_Map.get(beanClass);
                    
                    //获取所有列名
                    ResultSetMetaData meta = re.getMetaData();
                    int columnCount = meta.getColumnCount();
                    List<String> columnNames = new ArrayList<String>();
                    for(int i=1;i<=columnCount;i++){
                        columnNames.add(meta.getColumnName(i));
                    }
                    //创建javaBean并填充属性
                    while (re.next()) {
                        // * 创建javaBean
                        T t = beanClass.newInstance();
                        // * 填充值
                        for(String attrName : setMethodMap.keySet()){
                            // * 填充
                            if (columnNames.contains(attrName)) {
                                Object value = re.getObject(attrName);
                                if(value!=null){
                                    Method method = setMethodMap.get(attrName);
                                    Class<?> paramType = method.getParameterTypes()[0];//参数类型
                                    method.invoke(t, cast(value,paramType));
                                }
                            }
                        }
                        beanList.add(t);
                    }
                    return beanList;
                } catch (Exception e) {
                    e.printStackTrace();
                    throw new RuntimeException(e);
                }
            }
            /**
             * 利用map填充对象的属性
             * @param t 目标对象
             * @param map 包含属性值的map
             */
            @SuppressWarnings("rawtypes")
            public static <T> void stuffBean(T t,Map map){
                //获得类中的属性名称和对应的set方法
                if(!beanClass_setMethod_Map.containsKey(t.getClass())){
                    map_put(t.getClass());
                }
                Map<String,Method> setMethodMap = beanClass_setMethod_Map.get(t.getClass());
                //填充值
                try {
                    for(String attrName : setMethodMap.keySet()){
                        if (map.containsKey(attrName)) {
                            //如果map中存在同名属性,则填充对象的属性
                            // * 处理值
                            Object value = map.get(attrName);
                            String valueStr = null;
                            if(value.getClass()==String.class){
                                valueStr = (String)value;
                            }else if(value.getClass()==String[].class){
                                String[] values = (String[])value;
                                valueStr = values[0];
                                for(int i=1;i<values.length;i++){
                                    valueStr+=","+values[i];
                                }
                            }else{
                                throw new RuntimeException("stuffBean的参数map的value必须为String或String[]");
                            }
                            // * 填充(需要进行值类型的转换)
                            if(StringUtils.isNotEmpty(valueStr)){
                                Method method = setMethodMap.get(attrName);
                                Class<?> paramType = method.getParameterTypes()[0];//参数类型
                                method.invoke(t, cast(valueStr,paramType));
                            }
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    throw new RuntimeException(e);
                }
            }
            /**
             * 为对象指定属性赋值
             * @param t 要填充的对象
             * @param propertyName 属性名称
             * @param value 属性值
             */
            public static <T> void setProperty(T t, String propertyName, Object value){
                if(value == null){
                    return;
                }
                //获得set方法
                Method method = null; 
                if(!beanClass_setMethod_Map.containsKey(t.getClass())){
                    //从对象中查找
                    Method[] methodArr = t.getClass().getMethods();//获取所有公共方法
                    for (Method m : methodArr) {
                        if(m.getName().equals(StringUtils.getSetMethodName(propertyName))){
                            method = m;
                        }
                    }
                }else{
                    //从缓存获取
                    Map<String,Method> setMethodMap = beanClass_setMethod_Map.get(t.getClass());
                    if(setMethodMap.containsKey(propertyName)){
                        method = setMethodMap.get(propertyName);
                    }
                }
                if(method==null){
                    throw new RuntimeException("对象不存在"+propertyName+"属性");
                }
                try {
                    // * 填充(需要进行值类型的转换)
                    Class<?> paramType = method.getParameterTypes()[0];//参数类型
                    method.invoke(t, cast(value,paramType));
                } catch (Exception e) {
                    e.printStackTrace();
                    throw new RuntimeException(e);
                }
            }
            /**
             * 将对象转换为指定类型
             * @param obj 要转换的对象
             * @param clazz 目标类型
             */
            private static Object cast(Object obj, Class<?> clazz){
                //如果是目标类型 或 目标类型的子类,则直接返回
                if(clazz.isAssignableFrom(obj.getClass())){
                    return obj;
                }
                //转换类型
                Object obj2 = null;
                if(clazz == int.class || clazz == Integer.class){
                    obj2 = Integer.valueOf(obj.toString());
                }else if(clazz == double.class || clazz == Double.class){
                    obj2 = Double.valueOf(obj.toString());
                }else if(clazz == long.class || clazz == Long.class){
                    obj2 = Long.valueOf(obj.toString());
                }else if(clazz == byte.class || clazz == Byte.class){
                    obj2 = Byte.valueOf(obj.toString());
                }else if(clazz == boolean.class || clazz == Boolean.class){
                    obj2 = Boolean.valueOf(obj.toString());
                }else if(clazz == java.util.Date.class){
                    String str = obj.toString();
                    if(str.length()<=10){
                        obj2 = DateUtils.stringToShortDate(str);
                    }else{
                        obj2 = DateUtils.stringToLongDate(str);
                    }
                }
                if(obj2!=null){
                    return obj2;
                }else{
                    throw new RuntimeException("待转换类型在cast方法中未指定");
                }
            }
        }
    StringUtils
        package util;
        /**
         * 字符串工具包
         * @author Administrator
         *
         */
        public class StringUtils {
            /**
             * 判断字符串是否为非空的
             * @param str
             * @return
             */
            public static boolean isNotEmpty(String str){
                return str!=null && !str.equals("");
            }
            /**
             * 将字符串转换为Integer
             * @param str 要转换的字符串
             * @param defaultVal 转换失败后的默认值
             * @return
             */
            public static Integer StringToInteger(String str,Integer defaultVal){
                if(isNotEmpty(str)){
                    try{
                        return Integer.parseInt(str);
                    }catch(Exception e){}
                }
                return defaultVal;
            }
            /**
             * 返回UUID
             * @return
             */
            public static String getUUID(){
                return UUID.randomUUID().toString().replace("-", "");
            }
            /**
             * 返回字符串的md5算法加密结果
             * @param str
             * @return
             */
            public static String getMD5Value(String str){
                try {
                    //获得算法
                    MessageDigest digest = MessageDigest.getInstance("md5");
                    //加密数据--返回的数组为十进制结果
                    byte[] md5Value = digest.digest(str.getBytes());
                    //转换为十六进制
                    return new BigInteger(1,md5Value).toString(16);
                } catch (Exception e) {
                    System.out.println("md5加密失败");
                    throw new RuntimeException(e);
                }
            }
            /**
             * 根据属性名称返回set方法名称
             * @param fieldName
             * @return
             */
            public static String getSetMethodName(String attrName){
                String setMethodName = "set"
                        + attrName.substring(0, 1).toUpperCase()
                        + attrName.substring(1);
                return setMethodName;
            }
            /**
             * 根据属性名称返回get方法名称
             * @param fieldName
             * @return
             */
            public static String getGetMethodName(String attrName){
                String getMethodName = "get"
                        + attrName.substring(0, 1).toUpperCase()
                        + attrName.substring(1);
                return getMethodName;
            }
            /**
             * 根据set或get方法名称返回属性名称
             * @param fieldName
             * @return
             */
            public static String getAttrName(String methodName){
                String attrName = methodName.substring(3, 4).toLowerCase()
                        + methodName.substring(4);
                return attrName;
            }
        }
    



条件查询
    思想
        将条件放置到javabean中,传递给service层方法
        将sql语句修改为:select * from 表 where 1=1
        组装sql语句:判断对象的属性是否为空,不为空就追加条件和参数
    示例
        public List<User> findUserListByCondition(User user){
            StringBuilder builder = new StringBuilder("select * from user where 1=1");
            List<Object> paramsList = new ArrayList<Object>();
            if(user.getUsername()!=null && !user.getUsername().equals("")){
                builder.append(" and username like ?");
                paramsList.add("%"+user.getUsername()+"%");
            }
            if(user.getAge()!=null){
                builder.append(" and age = ?");
                paramsList.add(user.getAge());
            }
            String sql = builder.toString();
            Object[] params = paramsList.toArray();
            DataSource ds = JdbcUtils.getDataSource();
            return DbUtils.queryList(ds, sql, User.class, params);
        }



分页查询
    mssql:
        例: select top 每页显示个数 * from t_user where id not in (select top 开始索引 id from t_user order by id asc ) order by id asc
    mysql:
        格式: select ... from ... limit 开始索引,每页显示个数
    oracle:
        例: select *
            from (select rownum r,e1.*
                from (select * from emp order by sal desc) e1
                where rownum<=开始索引+每页显示个数) e2
            where r>=开始索引
    思想
        service层参数: pageNum,pageSize(如果要显示总页数,则还需要allDataCount)
        dao层参数: startIndex,pageSize
        计算: startIndex = (pageNum - 1) * pageSize;
    自定义工具类Page
        package util;
        import java.util.List;
        /**
         * 分页工具类
         * @author Administrator
         *
         */
        public class Page<T> {
            //必须
            private Integer pageNum;        //当前页
            private Integer pageSize;       //每页显示个数
            private Integer allDataNum;     //总记录数
            //计算
            private Integer startIndex;     //开始索引
            private Integer allPageNum;     //总页数
            private List<T> data;           //查询的数据
            //扩展
            private Integer showPageCount = 10; //页面显示页码数(大于总页数的话表示全显示)
            private Integer showPageStart;      //遍历开始页码
            private Integer showPageEnd;        //遍历结束页码
            //构造方法
            public Page(int pageNum, int pageSize, int allDataNum){
                //赋值
                this.pageNum = pageNum;
                this.pageSize = pageSize;
                this.allDataNum = allDataNum;
                //计算-总页数
                allPageNum = (allDataNum + pageSize - 1) / pageSize;
                if(allPageNum < 1){
                    allPageNum = 1;
                }
                //赋值-当前页
                if(this.pageNum < 1){
                    this.pageNum = 1;
                }else if(this.pageNum > allPageNum){
                    this.pageNum = allPageNum;
                }
                //计算-开始索引
                startIndex = (this.pageNum - 1) * pageSize;
                //计算showPageStart 和 showPageEnd
                if(allPageNum < showPageCount){
                    showPageStart = 1;
                    showPageEnd = allPageNum;
                }else{
                    showPageStart = this.pageNum - (showPageCount)/2;
                    showPageEnd = this.pageNum + (showPageCount+1)/2 - 1;
                    if(showPageStart < 1){
                        showPageStart = 1;
                        showPageEnd = showPageCount;
                    }else if(showPageEnd > allPageNum){
                        showPageEnd = allPageNum;
                        showPageStart = allPageNum - showPageCount + 1;
                    }
                }
            }
            public Integer getPageNum() {
                return pageNum;
            }
            public void setPageNum(Integer pageNum) {
                this.pageNum = pageNum;
            }
            public Integer getPageSize() {
                return pageSize;
            }
            public void setPageSize(Integer pageSize) {
                this.pageSize = pageSize;
            }
            public Integer getAllDataNum() {
                return allDataNum;
            }
            public void setAllDataNum(Integer allDataNum) {
                this.allDataNum = allDataNum;
            }
            public Integer getStartIndex() {
                return startIndex;
            }
            public void setStartIndex(Integer startIndex) {
                this.startIndex = startIndex;
            }
            public Integer getAllPageNum() {
                return allPageNum;
            }
            public void setAllPageNum(Integer allPageNum) {
                this.allPageNum = allPageNum;
            }
            public List<T> getData() {
                return data;
            }
            public void setData(List<T> data) {
                this.data = data;
            }
            public Integer getShowPageCount() {
                return showPageCount;
            }
            public void setShowPageCount(Integer showPageCount) {
                this.showPageCount = showPageCount;
            }
            public Integer getShowPageStart() {
                return showPageStart;
            }
            public void setShowPageStart(Integer showPageStart) {
                this.showPageStart = showPageStart;
            }
            public Integer getShowPageEnd() {
                return showPageEnd;
            }
            public void setShowPageEnd(Integer showPageEnd) {
                this.showPageEnd = showPageEnd;
            }
        }
    使用示例
        dao层
            public Page<User> selectListWithPage(int pageNum,int pageSize){
                DataSource ds = JdbcUtils.getDataSource();
                //查询总记录数
                String sql = "select count(*) from t_user";
                int allDataNum = new Integer(DbUtils.queryObject(ds, sql).toString());
                //封装page对象
                Page<User> page = new Page<User>(pageNum,pageSize,allDataNum);
                int startIndex = page.getStartIndex();
                //分页查询
                /**mssql start*/
                sql = "select top "+pageSize+" * from t_user where id not in (select top "+startIndex+" id from t_user order by id asc ) order by id asc";
                List<User> list = DbUtils.queryList(ds, sql, User.class);
                /**mssql end*/
                /**mysql start*/
                //sql = "select * from t_user limit ?,?";
                //List<User> list = DbUtils.queryList(ds, sql, User.class, startIndex, pageSize);
                /**mysql end*/
                page.setData(list);
                return page;
            }
            注意:mssql的top子句不能预编译参数
        jsp页面(跟上面不是一个例子)
            注意:先在servlet中将page对象存入域中
            <%@ page pageEncoding="utf-8"%>
            <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
            <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
            <html>
            <head>
            <meta charset="utf-8">
            <meta http-equiv="pragma" content="no-cache">
            <meta http-equiv="cache-control" content="no-cache">
            <meta http-equiv="expires" content="0">
            <style>
                .top { margin-bottom:3px; width:900px;}
                .input1 { width:60px;}
                .top span { float:right;}
                .content { height:400px;}
                .pageDiv { width:900px; text-align:center;}
                .pageDiv a { margin:0 8px;}
                table { width:900px; text-align:center;}
                table td { border:1px solid; height:24px;}
                a,a :visited { color:#06c; text-decoration:none; font-size:14px;}
            </style>
            <script>
                function submitForm(num){
                    var oForm1 = document.getElementById('form1');
                    var pageNum = document.getElementById('pageNum');
                    pageNum.value = num;
                    oForm1.submit();
                }
            </script>
            </head>
            <body>
                <div class="top">
                    <form id="form1" action="huiYuanServlet_findYongHuByCondition.do" method="post">
                        会员类别:
                        <select name="huiYuanLeiBieId">
                            <option value="">全部</option>
                            <c:forEach items="${huiYuanLeiBieList}" var="huiYuanLeiBie">
                                <option value="${huiYuanLeiBie.id}" ${ huiYuanLeiBie.id==huiYuanLeiBieId?"selected":""}>${huiYuanLeiBie.mingCheng}</option>
                            </c:forEach>
                        </select> 
                        会员号:<input name="huiYuanHao" value="${huiYuanHao }"> 
                        姓名:<input name="xingMing" value="${xingMing }">
                        <input id="pageNum" type="hidden" name="pageNum" value="1">
                        <input type="submit" value="查询" />
                    </form>
                </div>
                
                <c:if test="${page!=null && page.data.size()>0 }">
                    <div class="content">
                        <table cellpadding="0" cellspacing="0">
                            <tr>
                                <td>创建日期</td>
                                <td>会员号</td>
                                <td>会员类别</td>
                                <td>姓名</td>
                                <td>电话</td>
                                <td>生日</td>
                                <td>积分</td>
                                <td>免费小时数</td>
                                <td>操作</td>
                            </tr>
                            <c:forEach items="${page.data}" var="huiYuan">
                                <tr>
                                    <td>${huiYuan.chuangJianRiQiTemp}</td>
                                    <td>${huiYuan.huiYuanHao}</td>
                                    <td>${huiYuan.huiYuanLeiBie.mingCheng}</td>
                                    <td>${huiYuan.xingMing}</td>
                                    <td>${huiYuan.dianHua}</td>
                                    <td>${huiYuan.shengRiTemp}</td>
                                    <td>${huiYuan.jiFen}</td>
                                    <td>${huiYuan.mianFeiXiaoShi}</td>
                                    <td><a href="menuServlet_getHuiYuanById.do?id=${huiYuan.id }">详细信息</a></td>
                                </tr>
                            </c:forEach>
                        </table>
                    </div>
                    <div class="pageDiv">
                        <c:if test="${page.pageNum == 1}">
                            <a href="javascript:;" disabled="true">首页</a>
                            <a href="javascript:;" disabled="true">上一页</a>
                        </c:if>
                        <c:if test="${page.pageNum > 1}">
                            <a href="javascript:;" οnclick="submitForm(1)">首页</a>
                            <a href="javascript:;" οnclick="submitForm(${page.pageNum -1})">上一页</a>
                        </c:if>
                        <c:forEach begin="${page.showPageStart}" end="${page.showPageEnd}" var="num">
                            <c:if test="${num != page.pageNum}">
                                <a href="javascript:;" οnclick="submitForm(${num})">[${num}]</a>
                            </c:if>
                            <c:if test="${num == page.pageNum}">
                                <a href="javascript:;">${num}</a>
                            </c:if>
                        </c:forEach>
                        <c:if test="${page.pageNum == page.allPageNum}">
                            <a href="javascript:;" disabled="true">下一页</a>
                            <a href="javascript:;" disabled="true">尾页</a>
                        </c:if>
                        <c:if test="${page.pageNum < page.allPageNum}">
                            <a href="javascript:;" οnclick="submitForm(${page.pageNum + 1})" ${page.pageNum < page.allPageNum ? "":"disabled"}>下一页</a>
                            <a href="javascript:;" οnclick="submitForm(${page.allPageNum})" ${page.pageNum < page.allPageNum ? "":"disabled"}>尾页</a>
                        </c:if>
                        <br>
                        当前第${page.pageNum}页,共${page.allPageNum}页。总记录数:${page.allDataNum}条
                    </div>
                </c:if>
                <c:if test="${page==null || page.data.size()==0 }">
                    <h4 style="width:900px; text-align:center;">没有匹配的数据</h4>
                </c:if>
            </body>
            </html>




MD5加密
    静态方法
        /**
         * 返回字符串的md5算法加密结果
         * @param str
         * @return
         */
        public static String getMD5Value(String str){
            try {
                //获得算法
                MessageDigest digest = MessageDigest.getInstance("md5");
                //加密数据--返回的数组为十进制结果
                byte[] md5Value = digest.digest(str.getBytes());
                //转换为十六进制(构造方法中的1为不考虑负号的情况,即结果没有负号)
                return new BigInteger(1,md5Value).toString(16);
            } catch (Exception e) {
                System.out.println("md5加密失败");
                throw new RuntimeException(e);
            }
        }



记住账号或记住密码
    原理:登录成功后,将账号或密码保存到本地cookie,下一次从cookie中获取
    示例
        jsp
            用户名:<input name="username" value="${cookie.username.value}">
            <input type="checkbox" ${not empty cookie.username.value?"checked='checked'":""} name="rememberMe">记住账号
        java代码(登录成功后)
            String rememberMe = request.getParameter("rememberMe");
            if(rememberMe!=null){
                //勾选了记住账号,添加cookie
                Cookie a=new Cookie("username","xxx");
                a.setMaxAge(60*60*24*7);//保存一周
                a.setPath("/");//任何路径都可以访问到此cookie
                response.addCookie(a);
            }else{
                //没有勾选记住账号,删除cookie
                Cookie[] cookies=request.getCookies();
                for(Cookie cookie : cookies){
                    if(cookie.getName().equals("username")){
                        cookie.setMaxAge(0);
                    }
                }
            }



BaseServlet
    目的
        减少代码量,一个Servlet可以完成多个功能
    原来
        通过继承和反射调用Servlet中指定的方法
    代码
        package sss.web.servlet;
        import java.io.IOException;
        import java.lang.reflect.Method;
        import javax.servlet.ServletException;
        import javax.servlet.http.HttpServlet;
        import javax.servlet.http.HttpServletRequest;
        import javax.servlet.http.HttpServletResponse;
        /**
         * BaseServlet,所有servlet的父类(使用参数调用对应servlet类的方法)
         * @author Administrator
         *
         */
        public class BaseServlet extends HttpServlet {
            /**
             * 
             */
            private static final long serialVersionUID = 7010325434298365394L;
            @Override
            public final void doGet(HttpServletRequest req, HttpServletResponse resp)
                    throws ServletException, IOException {
                doPost(req,resp);
            }
            @Override
            public final void doPost(HttpServletRequest request, HttpServletResponse response)
                    throws ServletException, IOException {
                //获取方法名称
                String methodName = request.getParameter("method");
                if(methodName == null){
                    methodName = "defaultMethod";
                }
                //通过反射执行方法
                try {
                    // * 获取方法
                    Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
                    // * 执行方法
                    method.invoke(this, request, response);
                } catch (Exception e) {
                    e.printStackTrace();
                    throw new RuntimeException(e);
                }
            }
            /**
             * 默认方法(请求中没有提供参数时执行此方法)
             * @param req
             * @param resp
             */
            public void defaultMethod(HttpServletRequest request, HttpServletResponse response)
                    throws ServletException, IOException {
                response.getWriter().print("默认方法被执行");
                System.out.println("默认方法被执行");
            }
        }
    使用
        jsp
            请求路径加参数method,将会执行method参数的值表示的方法
            PetServlet?method=findPetByCategory
            PetServlet?method=findPetById
        java代码
            创建Servlet继承BaseServlet,然后去除原本的doGet和doPost方法,创建自定义方法即可,自定义方法没有返回值,参数为HttpServletRequest 和 HttpServletResponse
            public class PetServlet extends BaseServlet {
                /**
                 * 默认方法
                 */
                public void defaultMethod(HttpServletRequest request,
                        HttpServletResponse response) throws ServletException, IOException {
                    super.defaultMethod(request, response);
                }
                private static PetService petService = new PetService();
                public void findPetByCategory(HttpServletRequest request,
                        HttpServletResponse response) throws ServletException, IOException {
                }
                public void findPetById(HttpServletRequest request,
                        HttpServletResponse response) throws ServletException, IOException {
                }
            }



细节
    防止注入js代码,在页面显示时可使用<c:out value="${username}"></c:out>
    当表单上传时,request.getParameter方法不能获取方法体传递的参数,可以在表单的action后面使用?追加参数


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值