自定义数据库工具包 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后面使用?追加参数
业务
最新推荐文章于 2023-04-10 15:34:37 发布