写crud的servlet业务遇到的一些问题及注意事项,当然少不了BUG(一会看看能不能把之前留的几个问题答案补上)

0830

说说js刷新的几种方式,

一般是在业务执行完成后回到当前界面,需要实现返回的情况.

在此之前预习一下超链接调js函数

1.<a oncilck="fun()" style="样式">超链接</a></p>
2.<a οnclick="fun()" href="#">超链接</a>
3.<a href="javascript:fun()">超链接</a>

以上是几种刷新方式

就是利用history对象(说这个就不得说一说游览器对象window包括history,navigator,screen,location,document)

[外链图片转存失败(img-tyQNa4em-1567191606149)(C:\Users\15566\AppData\Roaming\Typora\typora-user-images\1567154639448.png)]

<!DOCTYPE html>
<html lang="en" xmlns:http="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>成功页面</title>
    <script>
        function goback() {
            window.history.back();
        }
        //4.只是用来定时,没有刷新
/*
        function go(){
            window.history.go(-1);
        }
        setTimeout("go()",3000);
*/
    </script>
</head>
<body>
    <h1>成功</h1>
    <input type="button" value="Back" onclick="goback()"/>
    <!-- 1.a标签-->
    <a href="javascript:history.back(-1);">back返回上一页</a>
    <a href="javascript:"; onclick="history.go(-1)">go返回上一页</a>
    <!-- 2.按钮-->
    <input type="button" name="Submit" οnclick="javascript:history.back(-1);" value="返回上一页">
    <!-- 3.图片-->
    <a href="javascript :;" onClick="javascript :history.back(-1);"><img src="图片路径" border="0" title="返回上一页"></a>

    <!-- 返回上一页面刷新-->
    <a href="javascript:self.location=document.referrer">返回上一页</a>



</body>
</html>

servlet的增删查改的业务逻辑

增、改、查通常与查分开,这也刚好对应数据库的的数据操纵语言DCL和数据查询语言DQL

注:为什么分开,这里我谈一下自己的见解.对于业务的处理不管是增加修改还是删除都是对用户的信息进行逻辑操作的处理,没有涉及到对数据的处理与分析,更多的是对信息的维护,你也不知道这些维护的数据是否正确,需不需要修改,或者有新的数据添加进来这都是都数据的维护.而查询则更注重数据信息的处理,对数据信息的筛选,能否从中提炼出来有价值的,可以用于其他领域的,能带来经济效益的数据变得至关重要.因此将其单独拿出来作为一个模块.

增:增加,把前台请求的数据经过相应的步骤进行封装,添加到数据库.

在servlet中:

1.获取客户端提交过来的数据. 如果是表单的话且post提交的话,考虑用request.getParamMap接收,使用BeanUtils类进行封装处理;get提交的话,直接用request.getParameter(String name)接受,通常来说get提交一般不适合大量数据的传输,一般用来业务逻辑的实现

2.对接受的特殊类型作处理

DateConverter dc = new DateConverter();//创建日期转化器
dc.setPatterns(new String[]{"yyyy-MM-dd","yyyy-MM-dd HH:mm:ss"});//设置接受日期格式
ConvertUtils.register(dc,Date.class);//注册日期类转化器

3.对接受的数据开始封装,特别注意将表单的name属性与实体类一一对应.

4.调用业务层处理想关的业务逻辑代码.等待结果返回web层.

5.业务层去数据库中调用需要的数据处理.等待结果返回业务层service.

6.数据层dao开始根据相关sql语句执行对数据的操作.

其中sql语句的拼接也在这里完成.mybatis一个流行的因素就是的半自动化sql,程序员可以自己对sql语句拼接,相比于hibernate的全自动化虽然麻烦了一点,但是更加灵活(dao的效率关系着整个应用的友好性.开始涉及到sql优化,数据库的调优,相应的并发,集群问题也来啦)

7.返回给web层的结果.开始进行逻辑判断.

8.最后就是做相应的跳转.

BUG问题

1.对象最好先初始化,不然无法用到该值.Student stu = new Student();

一开始没有初始化是因为我想着的是先声明一下用的时候就可以初始化啦,看起来或许比较方便.但是最基础的东西忘了,那就是对象的使用必须先声明在初始化.(这次遇见内部服务器500,不着急刷会手机就行啦,嘻嘻.如果真的遇见内部服务器报500一般来说基本都是逻辑出错误,或者语法有问题.)提醒一点,如果报空,注意变量是否赋值啦.因此特地建议变量一定要进行初始化养成良好习惯

 @Override
    public Student query(int id) {
        QueryRunner qr = new QueryRunner (C3P0Util.getDataSource ());
        String sql = "select * from student where id = ?";
        Student stu = new Student();
        Map<String,Object> map = null;
        try {
            map = qr.query (sql,new MapHandler (),id);
        } catch (SQLException e) {
            e.printStackTrace ( );
        }

            for(Map.Entry<String,Object> entry:map.entrySet()){

                if("id".equals(entry.getKey())){
                    stu.setId((int)entry.getValue());
                }else if("name".equals(entry.getKey())){
                    stu.setName((String)entry.getValue());
                }else if("age".equals(entry.getKey())){
                    stu.setAge((int)entry.getValue());
                }else if("birthday".endsWith(entry.getKey())){
                    stu.setBirthday((Date)entry.getValue());
                }else if("course".equals(entry.getKey())){
                    String str = (String)entry.getValue();
                    if(str!="" && str!=null){
                        str = str.substring(0,str.length()-1);
                        String[] ss = str.split("#");
                        stu.setCourse(ss);
                    }
                }
            }
        return stu;
    }

2.mysql本身是不支持数据类型的插入,因此插入之前必须将其进行转化.

存入的时候,将数组转化为字符串,每个元素之间最好利用分界符分开,便于取出;

取出来的时候,将字符串转化为数组,使用String的split方法

3.如果使用BeanUtils中自带的日期转化类型转换器DateConverter对于null或者""拷贝时会出现异常.

解决方式自定义日期转化类型# 0830

说说js刷新的几种方式,

一般是在业务执行完成后回到当前界面,需要实现返回的情况.

在此之前预习一下超链接调js函数

1.<a oncilck="fun()" style="样式">超链接</a></p>
2.<a οnclick="fun()" href="#">超链接</a>
3.<a href="javascript:fun()">超链接</a>

以上是几种刷新方式

就是利用history对象(说这个就不得说一说游览器对象window包括history,navigator,screen,location,document)

[外链图片转存失败(img-zbEWucWw-1567191607256)(C:\Users\15566\AppData\Roaming\Typora\typora-user-images\1567154639448.png)]

<!DOCTYPE html>
<html lang="en" xmlns:http="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>成功页面</title>
    <script>
        function goback() {
            window.history.back();
        }
        //4.只是用来定时,没有刷新
/*
        function go(){
            window.history.go(-1);
        }
        setTimeout("go()",3000);
*/
    </script>
</head>
<body>
    <h1>成功</h1>
    <input type="button" value="Back" onclick="goback()"/>
    <!-- 1.a标签-->
    <a href="javascript:history.back(-1);">back返回上一页</a>
    <a href="javascript:"; onclick="history.go(-1)">go返回上一页</a>
    <!-- 2.按钮-->
    <input type="button" name="Submit" οnclick="javascript:history.back(-1);" value="返回上一页">
    <!-- 3.图片-->
    <a href="javascript :;" onClick="javascript :history.back(-1);"><img src="图片路径" border="0" title="返回上一页"></a>

    <!-- 返回上一页面刷新-->
    <a href="javascript:self.location=document.referrer">返回上一页</a>



</body>
</html>

servlet的增删查改的业务逻辑

增、改、查通常与查分开,这也刚好对应数据库的的数据操纵语言DCL和数据查询语言DQL

注:为什么分开,这里我谈一下自己的见解.对于业务的处理不管是增加修改还是删除都是对用户的信息进行逻辑操作的处理,没有涉及到对数据的处理与分析,更多的是对信息的维护,你也不知道这些维护的数据是否正确,需不需要修改,或者有新的数据添加进来这都是都数据的维护.而查询则更注重数据信息的处理,对数据信息的筛选,能否从中提炼出来有价值的,可以用于其他领域的,能带来经济效益的数据变得至关重要.因此将其单独拿出来作为一个模块.

增:增加,把前台请求的数据经过相应的步骤进行封装,添加到数据库.

在servlet中:

1.获取客户端提交过来的数据. 如果是表单的话且post提交的话,考虑用request.getParamMap接收,使用BeanUtils类进行封装处理;get提交的话,直接用request.getParameter(String name)接受,通常来说get提交一般不适合大量数据的传输,一般用来业务逻辑的实现

2.对接受的特殊类型作处理

DateConverter dc = new DateConverter();//创建日期转化器
dc.setPatterns(new String[]{"yyyy-MM-dd","yyyy-MM-dd HH:mm:ss"});//设置接受日期格式
ConvertUtils.register(dc,Date.class);//注册日期类转化器

3.对接受的数据开始封装,特别注意将表单的name属性与实体类一一对应.

4.调用业务层处理想关的业务逻辑代码.等待结果返回web层.

5.业务层去数据库中调用需要的数据处理.等待结果返回业务层service.

6.数据层dao开始根据相关sql语句执行对数据的操作.

其中sql语句的拼接也在这里完成.mybatis一个流行的因素就是的半自动化sql,程序员可以自己对sql语句拼接,相比于hibernate的全自动化虽然麻烦了一点,但是更加灵活(dao的效率关系着整个应用的友好性.开始涉及到sql优化,数据库的调优,相应的并发,集群问题也来啦)

7.返回给web层的结果.开始进行逻辑判断.

8.最后就是做相应的跳转.

BUG问题

1.对象最好先初始化,不然无法用到该值.Student stu = new Student();

一开始没有初始化是因为我想着的是先声明一下用的时候就可以初始化啦,看起来或许比较方便.但是最基础的东西忘了,那就是对象的使用必须先声明在初始化.(这次遇见内部服务器500,不着急刷会手机就行啦,嘻嘻.如果真的遇见内部服务器报500一般来说基本都是逻辑出错误,或者语法有问题.)提醒一点,如果报空,注意变量是否赋值啦.因此特地建议变量一定要进行初始化养成良好习惯

 @Override
    public Student query(int id) {
        QueryRunner qr = new QueryRunner (C3P0Util.getDataSource ());
        String sql = "select * from student where id = ?";
        Student stu = new Student();
        Map<String,Object> map = null;
        try {
            map = qr.query (sql,new MapHandler (),id);
        } catch (SQLException e) {
            e.printStackTrace ( );
        }

            for(Map.Entry<String,Object> entry:map.entrySet()){

                if("id".equals(entry.getKey())){
                    stu.setId((int)entry.getValue());
                }else if("name".equals(entry.getKey())){
                    stu.setName((String)entry.getValue());
                }else if("age".equals(entry.getKey())){
                    stu.setAge((int)entry.getValue());
                }else if("birthday".endsWith(entry.getKey())){
                    stu.setBirthday((Date)entry.getValue());
                }else if("course".equals(entry.getKey())){
                    String str = (String)entry.getValue();
                    if(str!="" && str!=null){
                        str = str.substring(0,str.length()-1);
                        String[] ss = str.split("#");
                        stu.setCourse(ss);
                    }
                }
            }
        return stu;
    }

2.mysql本身是不支持数据类型的插入,因此插入之前必须将其进行转化.

存入的时候,将数组转化为字符串,每个元素之间最好利用分界符分开,便于取出;

取出来的时候,将字符串转化为数组,使用String的split方法

3.如果使用BeanUtils中自带的日期转化类型转换器DateConverter对于null或者""拷贝时会出现异常.

解决方式自定义日期转化类型# 0830

说说js刷新的几种方式,

一般是在业务执行完成后回到当前界面,需要实现返回的情况.

在此之前预习一下超链接调js函数

1.<a oncilck="fun()" style="样式">超链接</a></p>
2.<a οnclick="fun()" href="#">超链接</a>
3.<a href="javascript:fun()">超链接</a>

在这里插入图片描述

以上是几种刷新方式

就是利用history对象(说这个就不得说一说游览器对象window包括history,navigator,screen,location,document)

<!DOCTYPE html>
<html lang="en" xmlns:http="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>成功页面</title>
    <script>
        function goback() {
            window.history.back();
        }
        //4.只是用来定时,没有刷新
/*
        function go(){
            window.history.go(-1);
        }
        setTimeout("go()",3000);
*/
    </script>
</head>
<body>
    <h1>成功</h1>
    <input type="button" value="Back" onclick="goback()"/>
    <!-- 1.a标签-->
    <a href="javascript:history.back(-1);">back返回上一页</a>
    <a href="javascript:"; onclick="history.go(-1)">go返回上一页</a>
    <!-- 2.按钮-->
    <input type="button" name="Submit" οnclick="javascript:history.back(-1);" value="返回上一页">
    <!-- 3.图片-->
    <a href="javascript :;" onClick="javascript :history.back(-1);"><img src="图片路径" border="0" title="返回上一页"></a>

    <!-- 返回上一页面刷新-->
    <a href="javascript:self.location=document.referrer">返回上一页</a>



</body>
</html>

servlet的增删查改的业务逻辑

增、改、查通常与查分开,这也刚好对应数据库的的数据操纵语言DCL和数据查询语言DQL

注:为什么分开,这里我谈一下自己的见解.对于业务的处理不管是增加修改还是删除都是对用户的信息进行逻辑操作的处理,没有涉及到对数据的处理与分析,更多的是对信息的维护,你也不知道这些维护的数据是否正确,需不需要修改,或者有新的数据添加进来这都是都数据的维护.而查询则更注重数据信息的处理,对数据信息的筛选,能否从中提炼出来有价值的,可以用于其他领域的,能带来经济效益的数据变得至关重要.因此将其单独拿出来作为一个模块.

增:增加,把前台请求的数据经过相应的步骤进行封装,添加到数据库.

在servlet中:

1.获取客户端提交过来的数据. 如果是表单的话且post提交的话,考虑用request.getParamMap接收,使用BeanUtils类进行封装处理;get提交的话,直接用request.getParameter(String name)接受,通常来说get提交一般不适合大量数据的传输,一般用来业务逻辑的实现

2.对接受的特殊类型作处理

DateConverter dc = new DateConverter();//创建日期转化器
dc.setPatterns(new String[]{"yyyy-MM-dd","yyyy-MM-dd HH:mm:ss"});//设置接受日期格式
ConvertUtils.register(dc,Date.class);//注册日期类转化器

3.对接受的数据开始封装,特别注意将表单的name属性与实体类一一对应.

4.调用业务层处理想关的业务逻辑代码.等待结果返回web层.

5.业务层去数据库中调用需要的数据处理.等待结果返回业务层service.

6.数据层dao开始根据相关sql语句执行对数据的操作.

其中sql语句的拼接也在这里完成.mybatis一个流行的因素就是的半自动化sql,程序员可以自己对sql语句拼接,相比于hibernate的全自动化虽然麻烦了一点,但是更加灵活(dao的效率关系着整个应用的友好性.开始涉及到sql优化,数据库的调优,相应的并发,集群问题也来啦)

7.返回给web层的结果.开始进行逻辑判断.

8.最后就是做相应的跳转.

BUG问题

1.对象最好先初始化,不然无法用到该值.Student stu = new Student();

一开始没有初始化是因为我想着的是先声明一下用的时候就可以初始化啦,看起来或许比较方便.但是最基础的东西忘了,那就是对象的使用必须先声明在初始化.(这次遇见内部服务器500,不着急刷会手机就行啦,嘻嘻.如果真的遇见内部服务器报500一般来说基本都是逻辑出错误,或者语法有问题.)提醒一点,如果报空,注意变量是否赋值啦.因此特地建议变量一定要进行初始化养成良好习惯

 @Override
    public Student query(int id) {
        QueryRunner qr = new QueryRunner (C3P0Util.getDataSource ());
        String sql = "select * from student where id = ?";
        Student stu = new Student();
        Map<String,Object> map = null;
        try {
            map = qr.query (sql,new MapHandler (),id);
        } catch (SQLException e) {
            e.printStackTrace ( );
        }

            for(Map.Entry<String,Object> entry:map.entrySet()){

                if("id".equals(entry.getKey())){
                    stu.setId((int)entry.getValue());
                }else if("name".equals(entry.getKey())){
                    stu.setName((String)entry.getValue());
                }else if("age".equals(entry.getKey())){
                    stu.setAge((int)entry.getValue());
                }else if("birthday".endsWith(entry.getKey())){
                    stu.setBirthday((Date)entry.getValue());
                }else if("course".equals(entry.getKey())){
                    String str = (String)entry.getValue();
                    if(str!="" && str!=null){
                        str = str.substring(0,str.length()-1);
                        String[] ss = str.split("#");
                        stu.setCourse(ss);
                    }
                }
            }
        return stu;
    }

2.mysql本身是不支持数据类型的插入,因此插入之前必须将其进行转化.

存入的时候,将数组转化为字符串,每个元素之间最好利用分界符分开,便于取出;

取出来的时候,将字符串转化为数组,使用String的split方法

3.如果使用BeanUtils中自带的日期转化类型转换器DateConverter对于null或者""拷贝时会出现异常.

解决方式自定义日期转化类型

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章