学习笔记:
1、基于Servlet MVC实现,代表框架:Spring MVC
2、基于Filter MVC实现,代表框架:Strust2
线程:
step1:Servlet线程不安全,不要定义共享成员变量;因为Servlet是单例模式
step2:Strust2的Action类线程安全,因为它用到了Threadlocal线程副本
1、prepareStatement实现模糊查询
public List<Leave> sercher(String keywords) { List<Leave> leaveList = new ArrayList<Leave>(); Leave leave; String sql = "select * from `leave` where "; StringBuffer stringBufferqlsb = new StringBuffer(); stringBufferqlsb.append("leave_id like ? or "); stringBufferqlsb.append("opinion like ?"); sql+=stringBufferqlsb; try { int index = 1; conn = DBUtils.getConnection(); ps = conn.prepareStatement(sql); ps.setString(index++,"%"+keywords+"%");//自动添加单引号 (包装后的参数) ps.setString(index++,"%"+keywords+"%");//自动添加单引号 (包装后的参数) rs = ps.executeQuery(); while (rs.next()) { index = 1; leave = new Leave(); leave.setLeaveId(rs.getString(index++)); leave.setStudentId(rs.getString(index++)); leave.setDepartmentId(rs.getString(index++)); leave.setCourseId(rs.getString(index++)); leave.setReason(rs.getString(index++)); leave.setDaynum(rs.getInt(index++)); leave.setApplyTime(rs.getDate(index++)); leave.setAuditTime(rs.getDate(index++)); leave.setStatus(rs.getInt(index++)); leave.setOpinion(rs.getString(index++)); leaveList.add(leave); } } catch (SQLException e) { e.printStackTrace(); } finally { DBUtils.close(rs,ps,conn); } return leaveList; }
2、jsp页面使用layer弹窗组件
- 官网下载连接
- 导入(My97DatePicker的压缩包文件目录不能改变)
<script src="<%=path%>/js/layer/layer.js"></script>
- 使用
1、请求页面function openDetails(leaveId) { // alert('jQuery版本:' + $.fn.jquery + '--jQuery1.8必须以上'); layer.open({ type: 2, area: ['90%', '90%'], fix: false, //不固定 title: '请假单详情', maxmin: true, content: '<%=path%>/page/business/leave/leaveDetails.jsp?leaveId=' + leaveId }); }
2、响应页面$(function () { var flag_1 = "<%=leave.getLeaveId()%>"; if (flag_1 != '' && flag_1 != undefined) { //如果用户信息不存在,直接关闭 $('#submit').attr('disabled', 'disabled'); layer.msg('查看成功', {//样式 icon: 1 }); /* 此处用setTimeout演示ajax的回调*/ setTimeout(function () { parent.location.reload();/*刷新父页面*/ layer.close(index);/*关闭当前layer弹出层*/ }, 1000); } });
3、jsp页面使用MY97日期组件
- 官网下载连接
- 导入(My97DatePicker的压缩包文件目录不能改变)
<script src="<%=path%>/js/My97DatePicker/My97DatePicker/WdatePicker.js"></script>
- 使用
<input type="text" class="Wdate" name="applyTime" style="width: 240px; color: #0000AA;" onfocus="WdatePicker({lang:'zh-cn', dateFmt:'yyyy-MM-dd'})"/>
4、jsp页面导出excel
- 导入文件下载需要的poi-4.1.0.jar
- 我的业务方法是在jsp页面写的
<%-- Created by IntelliJ IDEA. User: soldier Date: 19-5-9 Time: 下午5:45 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page import="com.soldier.tool.CreateExcel" %> <%@ page import="com.soldier.db.DBUtils" %> <%@ include file="/common/base.jsp"%> <%@ include file="/common/DBUtils/database.jsp"%> <%@ page import="com.soldier.entity.Leave" %> <%@ page import="java.util.List" %> <%@ page import="java.util.ArrayList" %> <%@ page import="java.sql.SQLException" %> <%@ page import="org.apache.poi.hssf.usermodel.HSSFWorkbook" %> <%@ page import="java.io.*" %> <% /** * 导出excel */ String getExportIds = request.getParameter("exportIds"); String[] exportIds = getExportIds.split(",");//切割 List<Leave> leaveList = new ArrayList<Leave>(); //TODO 第一步:声明excel的文档对象 HSSFWorkbook leaveExcel=null; for (String leaveId : exportIds) { Leave leave = new Leave(leaveId).getLeaveById(); leaveList.add(leave); } try { //TODO 第二步:获取excel的文档对象 leaveExcel = CreateExcel.createLeaveExcel(leaveList);//查询的结果,插入Excel填充数据 } catch (SQLException e) { System.out.println("请假单文件内容写入或者创建失败失败!"); e.printStackTrace(); } response.setCharacterEncoding("utf-8"); request.setCharacterEncoding("utf-8"); response.setHeader("content-disposition", "attachment;filename=学生请假单.xls" ); if (leaveExcel!=null){ //TODO 第三步:获取response的输出流,赋值到缓冲输出流里 BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(response.getOutputStream()); //TODO 第四步:调用excel文档对象的写入方法,间接传入HTTP的输出流 leaveExcel.write(bufferedOutputStream); //TODO 第五步:设置响应头的内容类型 response.setContentType("application/vnd.ms-excel");//此项内容随文件类型而异(http://tool.oschina.net/commons/) //TODO 第六步:写入刷新并关闭 bufferedOutputStream.flush(); bufferedOutputStream.close(); } /** * 由于jsp container在处理完成请求后会调用releasePageContent方法释放所用的PageContext object, * 并且同时调用getWriter方法,由于getWriter方法与在jsp页面中使用流相关的getOutputStream方法冲突,所以会造成这种异常,解决办法: */ out.clear(); out = pageContext.pushBody(); // process(request,response,"/page/business/leave/leaveList.jsp"); process(request,response,"/action/business/leave/action_list.jsp"); %>
- 上面的java代码片段调用的类方法
package com.soldier.tool; import com.soldier.entity.Course; import com.soldier.entity.Department; import com.soldier.entity.Leave; import com.soldier.entity.Student; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.ss.usermodel.HorizontalAlignment; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.io.OutputStream; import java.sql.SQLException; import java.util.List; /** * @author soldier * @title: CreateExcel * @projectName study * @description: TODO 文件导出Excel * @date 19-5-9下午5:34 */ public class CreateExcel { public static HSSFWorkbook createLeaveExcel(List<Leave> leaveList) throws SQLException { // 创建一个Excel文件 HSSFWorkbook workbook = new HSSFWorkbook();//excel的文档对象 // 创建一个工作表 HSSFSheet sheet = workbook.createSheet("学生请假单"); // 添加表头行 HSSFRow hssfRow = sheet.createRow(0); // 设置单元格格式居中 HSSFCellStyle cellStyle = workbook.createCellStyle(); cellStyle.setAlignment(HorizontalAlignment.CENTER); // 添加表头内容 HSSFCell headCell = hssfRow.createCell(0); headCell.setCellValue("请假编号"); headCell.setCellStyle(cellStyle); headCell = hssfRow.createCell(1); headCell.setCellValue("请假学生"); headCell.setCellStyle(cellStyle); headCell = hssfRow.createCell(2); headCell.setCellValue("所属学院"); headCell.setCellStyle(cellStyle); headCell = hssfRow.createCell(3); headCell.setCellValue("课程名称"); headCell.setCellStyle(cellStyle); headCell = hssfRow.createCell(4); headCell.setCellValue("请假事由"); headCell.setCellStyle(cellStyle); headCell = hssfRow.createCell(5); headCell.setCellValue("天数"); headCell.setCellStyle(cellStyle); headCell = hssfRow.createCell(6); headCell.setCellValue("请假时间"); headCell.setCellStyle(cellStyle); headCell = hssfRow.createCell(7); headCell.setCellValue("审核时间"); headCell.setCellStyle(cellStyle); headCell = hssfRow.createCell(8); headCell.setCellValue("审核情况"); headCell.setCellStyle(cellStyle); headCell = hssfRow.createCell(9); headCell.setCellValue("审核意见"); headCell.setCellStyle(cellStyle); // 添加数据内容 for (int i = 0; i < leaveList.size(); i++) { hssfRow = sheet.createRow((int) i + 1); Leave leave = leaveList.get(i); // 创建单元格,并设置值 HSSFCell cell = hssfRow.createCell(0); cell.setCellValue(leave.getLeaveId()); cell.setCellStyle(cellStyle); cell = hssfRow.createCell(1); Student student = new Student(leave.getStudentId()).getStudentByJobNumber();//获取名称 cell.setCellValue(student.getStudentName()); cell.setCellStyle(cellStyle); cell = hssfRow.createCell(2); Department department = new Department(leave.getDepartmentId()).getDepartmentById(); cell.setCellValue(department.getDepartmentName()); cell.setCellStyle(cellStyle); cell = hssfRow.createCell(3); Course course = new Course(leave.getCourseId()).getCourseById(); cell.setCellValue(course.getCourseName()); cell.setCellStyle(cellStyle); cell = hssfRow.createCell(4); cell.setCellValue(leave.getReason()); cell.setCellStyle(cellStyle); cell = hssfRow.createCell(5); cell.setCellValue(leave.getDaynum()); cell.setCellStyle(cellStyle); cell = hssfRow.createCell(6); cell.setCellValue(DateTool.dateFormat(leave.getApplyTime())); cell.setCellStyle(cellStyle); cell = hssfRow.createCell(7); cell.setCellValue(DateTool.dateFormat(leave.getAuditTime())); cell.setCellStyle(cellStyle); cell = hssfRow.createCell(8); cell.setCellValue(leave.getStatus()==0 ? "未审核" : leave.getStatus()==1 ? "已同意" : "不同意"); cell.setCellStyle(cellStyle); cell = hssfRow.createCell(9); cell.setCellValue(leave.getOpinion()); cell.setCellStyle(cellStyle); } try { return workbook; } catch (Exception e) { e.printStackTrace(); } return null; } }
5、数据库主键等值的重复校验
$(function () { $("#unitFrom").validate({ errorClass:"errorInfo", //默认为错误的样式类为:error errorElement:"em", focusInvalid: false, //当为false时,验证无效时,没有焦点响应 onkeyup: false, submitHandler: function(form){ //表单提交句柄,为一回调函数,带一个参数:form form.submit(); //提交表单 }, rules:{ "model.unitId":{ required:true, remote: { type: "post", //数据发送方式 url: "<%=path %>/biz/Unit_checkUnitId.action", data: { "model.unitId": function() { return $("#unitId").val(); } }, dataType: "html", dataFilter: function(data, type) { if (data == "true"){ return true; }else{ return false; } } }, rangelength:[1,100] }, "model.unitName":{ required:true, }, "model.unitPerson":{ required:true } }, messages:{ "model.unitId":{ required:"请输入教研室编号", remote:"该教研室编号已经存在" }, "model.unitName":{ required:"请输入教研室名称", remote:"该教研室名称已经存在" } } }); });
6、js前端验证码校验
// Test Code $(function () { var show_num = []; draw(show_num); $("#canvas").on('click', function () { draw(show_num); }) $('#loginBtn').on('click', function () { var val = $("#code").val().toLowerCase();//输入的验证码 var num = show_num.join("");//join() 方法用于把数组中的所有元素放入一个字符串 if (val == '') { alert('请输入验证码!'); } else if (val == num) { // alert('验证码输入正确!'); $(".input-val").val(''); draw(show_num); return true; } else { alert('验证码错误!请重新输入!'); $(".input-val").val(''); draw(show_num); } return false; }) }) function draw(show_num) { var canvas_width = $('#canvas').width(); var canvas_height = $('#canvas').height(); var canvas = document.getElementById("canvas");//获取到canvas的对象,演员 var context = canvas.getContext("2d");//获取到canvas画图的环境,演员表演的舞台 canvas.width = canvas_width; canvas.height = canvas_height; var sCode = "A,B,C,E,F,G,H,J,K,L,M,N,P,Q,R,S,T,W,X,Y,Z,1,2,3,4,5,6,7,8,9,0"; var aCode = sCode.split(","); var aLength = aCode.length;//获取到数组的长度 for (var i = 0; i <= 3; i++) { var j = Math.floor(Math.random() * aLength);//获取到随机的索引值 var deg = Math.random() * 30 * Math.PI / 180;//产生0~30之间的随机弧度 var txt = aCode[j];//得到随机的一个内容 show_num[i] = txt.toLowerCase(); var x = 10 + i * 20;//文字在canvas上的x坐标 var y = 20 + Math.random() * 8;//文字在canvas上的y坐标 context.font = "bold 23px 微软雅黑"; context.translate(x, y); context.rotate(deg); context.fillStyle = randomColor(); context.fillText(txt, 0, 0); context.rotate(-deg); context.translate(-x, -y); } for (var i = 0; i <= 5; i++) { //验证码上显示线条 context.strokeStyle = randomColor(); context.beginPath(); context.moveTo(Math.random() * canvas_width, Math.random() * canvas_height); context.lineTo(Math.random() * canvas_width, Math.random() * canvas_height); context.stroke(); } for (var i = 0; i <= 30; i++) { //验证码上显示小点 context.strokeStyle = randomColor(); context.beginPath(); var x = Math.random() * canvas_width; var y = Math.random() * canvas_height; context.moveTo(x, y); context.lineTo(x + 1, y + 1); context.stroke(); } } function randomColor() {//得到随机的颜色值 var r = Math.floor(Math.random() * 256); var g = Math.floor(Math.random() * 256); var b = Math.floor(Math.random() * 256); return "rgb(" + r + "," + g + "," + b + ")"; }
7、其他校验
// Test Code $(function () { $('#addBtn').on('click', function () { /** * 校验密码 * @type {*|jQuery} */ var loginPassword = $("#pw1").val();//输入的登录密码 var loginPassword_check = document.getElementById("pw2").value;//验证密码 if (loginPassword != loginPassword_check) { alert('两次输入的密码不一致!'); return false; } /** * 校验邮箱 * @type {RegExp} */ var reg = new RegExp("^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$"); //正则表达式 var obj = document.getElementById("email"); //要验证的对象 if(obj.value === ""){ //输入不能为空 alert("输入不能为空!"); return false; }else if(!reg.test(obj.value)){ //正则验证不通过,格式不对 alert("邮箱格式不正确!") return false; } /** * 校验手机号 * @type {RegExp} */ var myreg=/^[1][3,4,5,7,8][0-9]{9}$/; var mobile = document.addForm.mobile.value; if (!myreg.test(mobile)) { alert("手机号格式不正确!") return false; } return true; }) })