前后端分离

前言:

          之前写web项目,使用的基本都是jsp,使用的 jstl 标签库。使用这种模式的话,后端工程师将业务逻辑和数据写好后,发到页面上,还需要将页面进行数据显示,后端工程师所做的事情较多。而前后端分离的意思就是,后端工程师不需要取了解前端的页面,前端工程师将所需要的数据提前告诉后端工程师,后端工程师只需要将数据返回即可,不用考虑页面是如何的,这样后端工程师就可以把更多的精力放在逻辑处理上了。

         下面直接用几个小demo,来实现下简单的前后台数据是如何进行交互的。

环境:以下案例使用了bootstrap、vue、jquery    需要提前导好相关脚本。

 

将前台数据传到服务端

  • 页面

页面是利用bootstrap简单搭建的一个登录的小demo,利用了模态框来将登录页面显示出来。

 

  • 目的:将用户名和密码传给服务器  js脚本(可以另外写给js文件,在html中引入就行了,我这里是直接写在body中的)
<script>
// 这个函数是整个script里最先运行的,类似与Java里的main方法。
$(function(){
	$('#btn1').on('click',function(){
		add();	
	});
})


function add(){
// 获取请求的参数	
// form表单可以用serialize()将表单中的参数转换为:username=xxx&password=yyyy;
var p=$('form').serialize(); 

//将请求的参数发送至服务端 
$.post('login',p,function(data){
	if(data=='1'){
		console.log('登录成功');
	}else if(data=='0'){
		alert('登录失败')
	}
	
});
}

</script>

 

服务端代码:

	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		System.out.println("login:" + username+password);
		
		// 返回数据给前端  
		// json格式的字符串  需要用到jar包,网上有很多关于json转换的方法,可以自行去了解一个
		// 得到数据后应该取服务层校验,然后根据是否成功返回相应数据  我这里假设成功返回1,失败返回2
		String json = new Gson().toJson(1);
		response.setContentType("application/json");
		response.getWriter().write(json);
		
	}

*******

过程:用户浏览页面,点击登录,输入用户名和密码后,点提交按钮,这里触发了按钮的事件。

原因:在js中的主方法($function(){})里给该按钮注册了click事件。click事件中调用了add函数。

add函数:首先利用了serialize()方法将表单中的参数转换为username=xxx&password=yyyy形式存到 p 变量中。

                用$.post将p传递到了服务器  $.post('','','')三个参数:

  1. 第一个是url  ,即你要传输服务端的路径映射,
  2. 第二是你要传输到服务端的数据,数据可以是json格式、json格式字符串、标准参数模式(即本demo中用到的)。
  3. 第三个是一个回显函数,即数据传输过去,服务器响应给你数据,前端利用回显函数接受数据,data就是服务端所返回的数据,是json格式的字符串。

在测试的时候要多利用浏览器的开发者模式,主要看Console和Network。

 

加上vue 将前台数据传输到后台

vue是一个渐进式框架,它有一个很重要的点就是,MVVM(Model-View-ViewModel),可以实现视图-模型之间数据的双向绑定。 大家有兴趣可也取了解下,vue还可以自定义组件开发。https://cn.vuejs.org/

  • 使用了vue后将html中两个输入框都进行了绑定,已经提交按钮绑定了事件
<!-- v-model是绑定vue中data里数据的指令
     v-on绑定事件 -->

<input v-model="log.username" type="text" name="username" class="form-control" placeholder="用户名" aria-describedby="helpId">

<input v-model="log.password" type="password" name="password" class="form-control" placeholder="密码" aria-describedby="helpId">

<button v-on:click="login" type="button" class="btn btn-primary">提交</button>


  • 加上vue后的js脚本
<script>
    let vm = new Vue({
        el:'#app',
        data:{
            log:{username:'',password:''},
        },
        methods: {
            login:function() {
                const _this = this;
                console.log('测试');
                $.post('login',_this.log,function(data){
                    if(data = '1') {
                        $('#login').modal('hide');
                        _this.log.username = '';
                        _this.log.password = '';
                    }else {
                        console.log('错误');
                    }
                    
                })
            },
        },
    });

</script>

这里主要是用了vue数据双向绑定的特点,没了解过vue的可以跳过。

后台代码同上

 

用$.get拿到后台数据并加以渲染

  • 页面 加了一个表格用于显示数据
    <div class="container">
        <table class="table" id="data_table">
            <thead>
                <tr>
                    <th>id</th>
                    <th>username</th>
                    <th>password</th>
                </tr>
            </thead>
            <tbody id="tbody">
            </tbody>
        </table>
    </div>
  • js部分还是使用的是vue

思路:要想浏览这个页面就能看到表格的数据,那么肯定要先进行数据渲染,而且方法只能写到主方法中($function(){}),但是这里用到的是vue,vue中有一个叫挂载mounted(){},可以将加载数据的方法写到这里。

<script>
    let vm = new Vue({
        el:'#app',
        data:{
            log:{id:'',username:'',password:''},
        },
        mounted() {
            this.load();
        },
        methods: {
            load:function() {
                $.get('login',{},function(data){
                    console.info('后台返回的数据:'+data);
                    
                    // 渲染数据到表格中
                    //let tbody = $('#tbody');
                    for(const b of data) {
                    	let tr = $('<tr>')
                    		.append($('<td>').text(b.id))
                    		.append($('<td>').text(b.username))
                    		.append($('<td>').text(b.password));
                    $('#tbody').append(tr);
                    };
                })
            },
            login:function() {
                const _this = this;
                console.log('登录');
                $.post('login',_this.log,function(data){
                    if(data = '1') {
                        // 控制模态框关闭
                        $('#login').modal('hide');
                        _this.log.username = '';
                        _this.log.password = '';
                    }else {
                        console.log('cuowu');
                    }
                    
                })
            },
        },
    });

</script>

load方法使用的是get请求,那么我们要在服务器的get中将数据返回过来,这样回显函数中的data才会有数据。

  • 服务端返回数据

	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		// 模拟从数据库拿到数据
		List<User> list = new ArrayList<>();
		list.add(new User(001, "root", "root"));
		list.add(new User(002, "kai", "123"));
		list.add(new User(003, "que", "456"));
		//将list转换成json格式字符串
		String json = new Gson().toJson(list);
		System.out.println(json);
		response.setContentType("application/json");
		response.getWriter().write(json);
		
	}

这里我用到的渲染是循环添加html元素,并没有用到vue中的data。

 

ajax进行交互

<script>
    let vm = new Vue({
        el:'#app',
        data:{
            form_log:{username:'',password:''},
            log:[]
        },
        mounted() {
            this.load();
        },
        methods: {
            load:function() {
            	const _this = this;
                $.get('login',{},function(data){
                    console.info('后台返回的数据:'+data);
                    console.log('log:' + _this.log);
                    for(const c of data){
                        _this.log.push(c);
                    }
                   
                })
            },
            login:function() {
                const _this = this;
                var f = $('form').serialize();
                $.ajax({
                    url:'login',
                    method:'post',
                    data:f,
                    success:function(data) {
                    	if(data == '1'){
	                        $('#login').modal('hide');
                    	}
                    },
                    dataType:'json'
                });
            },

        },
    });

</script>

后端工程师还是需要了解下前端的一些框架以及知识的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值