Edgar后端学习--复现一个热乎的json、ajax、重定向相关的bug以及引起的一些思考

躺了很长时间,起来也不想学习。好久也咩更新了,开了音响,开干!

接上回jsp小项目,现在进程多是业务上的逻辑的设计。前端就是DOM元素的增加、修改,用一用模态框之类的。纯原生代码,注解还是热乎的(带着当时的感叹),没去总结。。
下面主要是我近期项目的前端做法,触发函数,函数包一个ajax然后返回的result再去解析。

这块先跳过,看完bug再回来看!!!!直接看复现bug标题

解析变成前端的过程总结:
1.首先你得有一个基础位置,比如说在一个既定好的table里面加动态显示表格,你就得先id找到他(具体是什么什么选择器,(css选择器??)) 然后找到各种元素,比如说输入框,
这块输入框你可以之前写在既定位置,也可以后来再绑到表格上。。。说远了。说上前端了。。(随便粘点,体会一下)

 $.ajax({
     
                url:"${path}/back/admin/getModuleWithOne",
                // json 数据从后端拿出来???
                // 后端没取到这个id  没有通过this传过来  11.5  后来又尼玛传过来了 真是神奇
                data:"id="+$(this).attr("id"),
                type:"post",
                dataType:"JSON",
                success:function (result) {
     
                    buildModual(result);
                }
            });
            // 模态框按钮触发
            $('#bt1').click();
        });
        function buildModual(result){
     
            var table=$("#table tbody");
            table.empty();
            var admin=result.admin;
            var roles=result.roles;
            var inputAdmin=$("#inputAdmin");
            var inputaid=$("#inputaid1");
            inputAdmin.val(admin.name);
            inputaid.val(admin.id);
            buildModule(result);
        }
        function buildModule(result){
     
            var admin=result.admin;
            var roles=result.roles;
            var table=$("#table");
            $.each(roles,function (index,role) {
     
                if(admin.role.id==role.id){
     
                    var input=$("");
                    input.attr("value",role.id);
                }else{
     
                    var input=$("");
                    input.attr("value",role.id);
                }
                var tr=$("");
                var inputtd=$("");

刚看了一下,上篇文章是上个阶段的开发日志的梳理,并没有发现json、ajax的踪影,所以这篇文章来梳理下最近学到技术。。。

复现bug–ing

大概描述一下业务场景:
1.用户实现基本注册,基本信息填写完毕后,选择一个管理权限就好了。
2.然后注册完毕后,用户直接跳转到用户管理展示页面就好了。
用到技术:
整体:jsp的MVC框架
前端:表格提交(这块用的不是sublimet类型,就是一个按钮类型)按钮 绑定一个js函数,函数里写一个ajax请求。重点在 success这块:因为平时就是这么在前端Debug,所以先预留了一个弹窗(后面其实还有一个小bug在这里想说。。)

	function add(){
     
		   $.ajax({
     
	        url:"${path}/back/admin/addadmin",
	        data:$("#form").serialize(),
			type:"post",
			dataType:"JSON",
			success:function (result) {
     
			// 后端验证结果
			aletr(result.successed)
	}
});
 <form id="form">
 .....
 <span class="spmess">  <input type="button" value="确认" onclick="add()"></span>
 </form>

后端部分–主要在控制层

dao层就不说了,dao层和service因为可以模块测试,我一般就自己写一个主函数先试一试
dao和service层经验分享
举个例子

 public boolean addroleWithaid(int addid,int rid){
     
        String sql1="INSERT INTO admin_role VALUES(?,?);";
        try {
     
            PreparedStatement preparedStatement=connection.prepareStatement(sql1);
            preparedStatement.setInt(1,addid);
            preparedStatement.setInt(2,rid);
            preparedStatement.execute();
       .....
    }
    public static void main(String[] args) {
     
        // 11.9 测试
//        roledao roledao=new roledao();
//        roledao.addroleWithaid(16,4);
    }
}

控制层了————高潮来了

因为我知道业务逻辑里面要求转到新的页面,所以想都没想直接在后端加了一个重定向。
那么好戏开始!!
看这个代码,乍一看,一点毛病没有吧。json也封装好了,json封装好,这样ajax就有回传了吧。而且我这不也放在打印流里面了,,怎么前端迟迟不弹窗??
最早我想的是:是不是我有段时间没写重定向了,写错了??路径问题,打印看了下??没问题啊??

后来去找老师问下,我们解决的步骤基本是这样的:

1.首先说前端那么写他看的很别扭,他准备加sublime来提交,发现我没在form里面定义action: 后来把ajax的url填到action里面,仍然不跳转。。。(但是页面有抖动了)(思路:先还一个初级做法)–(他直接说后端没问题??我也不知道为啥这么说)

2.后来他又说:删打印流,还是没动静(杨师傅又陷入沉思。。。)(不过这时候已经很靠近答案了) 3.在说出正确答案之前,我们讨论下业务与技术,他说你不就想实现一个跳转嘛,那为啥用ajax发送请求呢?

**

引一波ajax使用场景问题:

我们都知道我们使用ajax主要解决异步加载问题,但是深入思考其实就是,我们还要这个页面留着看呢,但是我这个业务事注册提交之后事跳转到新的页面,所以完全没有必要,为了使用ajax使用啊!!!
**
3.最后,终于想明白了冲突问题(我归结为冲突问题–)
ajax的回传 我们用打印流回传,但其实还是绑定response(或者与response平级)(我猜的)给到前端。
然后底下你来个重定向(他确实是绑在response上吧),java一下子懵了,我TM到底去哪里???

						String text="注册成功,马上跳转";
                        jsonObject.put("successed",text);
                        writer.print(jsonObject);
                        String  urltest=request.getContextPath()+"/back/userManager.jsp";
                        System.out.println("1111:: "+urltest);
                       response.sendRedirect(urltest); 

4.最后的解决方案,我当时忘了ajax自己就可以做重定向啊!!
加一句不就完了吗??但是不思考这个过程,就不会发现这快其实真没有必要加ajax吧。。。

 success:function (result) {
     
		console.log(result.successed)
		window.location="userManager.jsp"
		}

第二个bug–json对象在控制层最好分开

还是控制层出现的bug(说回来jsp写到这个时候,服务层和dao层真的不应该出bug了。)
当时就,我为了代码的简洁,就把json对象写在外面了。 基本上是下面这样,把service层、json对象、回传流都放在外面了,出现的现象也是死活不显示json。。。
后来大龙哥指导,把json都拿到if里面去,真就好了(不是不能这么用,但是有大概率会出问题)(我写前两个业务是没有问题的,后面到第三个出问题了。。)(暂时不清楚原因,大概理解成json一根管子你不要塞太多不同类型,不然到前端解析的时候,json看太复杂就罢工了)

  // 过滤url  进行下一步选择功能模块
        String url1=request.getRequestURI();
        String url2=url1.substring(url1.lastIndexOf("/")+1,url1.length());
        adminService adminService=new adminService();
        roleService roleService=new roleService();
        JSONObject jsonObject=new JSONObject();
        PrintWriter writer=response.getWriter();
        // 用户管理--整体展示
        if ("getall".equals(url2)){
     
         }
        //  json  11.5  json不同业务还不能放一个json  前端会不响应的
        if("getModuleWithOne".equals(url2)){
     
       
        }
        //  添加用户
        if("addadmin".equals(url2)){
     
                }
            }else{
     
                // 不合法
                // 11.9 等待 加入正则表达包
            }
        }

第三个问题 还是ajax问题

ajax问题的话,我遇到的问题大概现在有这么几种
1.第一种最基础的就是 jar包没打到服务器上,导致解析不出来 所以前端会显示根本不支持你这个方法。
2.第二种就是,后端代码有问题,导致的不回传,所以ajax会一直等待。。。。(包括你不把json放到ajax里面)

还有一种测试方法要分享,直接上url这种。现在我已经没法复现bug了。
隐约记得,前端控制台只是报错–内容只是服务器拒绝服务,这时候你可以这样,直接别用ajax去打这个url ,一步就去直接上ajax里面的url,我记得这种报错信息会很明显。

json后续还要多了解,但是本质上就是一种编码格式,一种集合而已。

好好好,边听歌边码字,让我有想写bug了,不说,打码!

你可能感兴趣的:(jsp,servlet,java)