JSP学习笔记

本文分享了Java Web开发中的实用技巧,包括使用SpringMVC和Strust2框架的区别,线程安全处理,模糊查询实现,以及如何在JSP页面中集成layer弹窗组件和My97日期选择器,导出数据到Excel,前端验证码生成与校验,和数据库主键等值的重复校验。

学习笔记:

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;
    })
})

 

转载于:https://www.cnblogs.com/HuangJie-sol/p/10839769.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值